参考网址:http://www.manongjc.com/mysql_basic/mysql-alias-basic.html
支持段别名和表别名
有时字段名称不具备可读性,需要给字段一个描述名称,可以使用字段别名。
SELECT
[column_1 | expression] AS descriptive_name
FROM table_name;
如果别名含有空格,则需要将别名用单引号。
组合生成全名,concat_ws功能来连接不同的栏位:
SELECT
CONCAT_WS(', ', lastName, firstname)
FROM
employees;
标题比较难阅读,可以为输出标题分配列名
CONCAT_WS(', ', lastName, firstname) AS `Full name`
在Mysql中,可使用别名命名order by和having子句中的列,(Having是一种筛选条件)
注意:不能在Where中使用字段别名,当计算到where时,可能尚未确认select子句中使用的值。
表别名
当两个表都相同的字符串时,列别名会冲突,需用表别名来指定字串
table_name AS table_alias
跟字段别名类似,AS是可选的,可以选择忽略它 ( customers c;orders o)
SELECT
customerName,
COUNT(o.orderNumber) total
FROM
customers c
INNER JOIN orders o ON c.customerNumber = o.customerNumber
GROUP BY
customerName
ORDER BY
total DESC;
上面的查询从customers
和orders
表中选择客户名称和订单数量。customers表的别名命名为c,orders表的别名命名为o,这样,
表customers
和orders
表中的字段可以通过表别名引用。
表别名也常用于inner join,left join和子查询中。用于区别其可读性
Inner join
inner join可根据连接条件从多个表中查询数据。将一个表中的行与其他表中的行进行匹配,为表的交集中的内容
为select语句中的可选部分,紧跟在From后。
在使用MySQL INNER JOIN子句之前,必须指定以下条件:
- 首先,必须指定出现在
FROM
子句中的主表。 - 其次,您需要指定要与主表联接的表,该主表出现在
INNER JOIN
子句中。理论上,您可以连接具有多个表的表。但是,为了更好的查询性能,您应该限制要加入的表的数量。 - 第三,您需要指定连接条件或连接谓词。连接条件的关键字O
N
在INNER JOIN
语句之后。连接条件是用于在主表和其他表之间匹配行的条件。
SELECT column_list
FROM t1
INNER JOIN t2 ON join_condition1
INNER JOIN t3 ON join_condition2
...
WHERE where_conditions;
为提高程式效率,优化查询方法,可将查询条件全部用循环的方式合并起来,具体参考原链接
Left Join
left join从两个或者多个数据库表中查询数据,为select中的可选部分,自爱FROM后出现,
SELECT
T1.c1, T1.c2, T2.c1, T2.c2
FROM
T1
LEFT JOIN
T2 ON T1.c1 = T2.c1;
将T1连接T2,如果左边的行不能匹配右边的行,左边的行也会被选择,并与右边的一个伪造的行合并,伪造的行包含Select子句中,且所有的值为null。
返回的行必须在where和Having子句中匹配,(若子句在查询中有使用的话)
SELECT
c.customerNumber,
c.customerName,
orderNumber,
o. STATUS
FROM
customers c
LEFT JOIN orders o ON c.customerNumber = o.customerNumber;
查询customer所有的订单,可left join函数
如125行中的订单数据均为:NULL。这意味着,这些客户在 order表中没有任何订单数据(他们没有下过订单)。
如果使用 INNER JOIN 子句来替换 LEFT JOIN 子句,那么只得到在 order 表有记录的客户,也就是说,只获得那些下过订单的客户(如125行将不被select)。
若需要查找null的所有值信息,使用以下方式进行查询:
SELECT
c.customerNumber,
c.customerName,
orderNumber,
o. STATUS
FROM
customers c
LEFT JOIN orders o ON c.customerNumber = o.customerNumber
WHERE
orderNumber IS NULL;
left join优化分析
可通过优化计算连接表的顺序,如将查询转换为普通连接。
自连接
将表连接到自身,称为自连接,有时需要一个机制来区分两个实例。
employment中有两个角色,manager和direct report,当需要显示其名字时,进行表格自连接
SELECT CONCAT(m.lastname,', ',m.firstname) AS 'Manager',
CONCAT(e.lastname,', ',e.firstname) AS 'Direct report'
FROM employees e
INNER JOIN employees m ON m.employeeNumber = e.reportsto
ORDER BY manager;
Top manager被inner join过滤掉了 ,可以使用IFNULL功能:当经理姓名为NULL时,显示高级经理的名字。
SELECT
IFNULL(CONCAT(m.lastname, ', ', m.firstname),
'Top Manager') AS 'Manager',
CONCAT(e.lastname, ', ', e.firstname) AS 'Direct report'
FROM
employees e
LEFT JOIN
employees m ON m.employeeNumber = e.reportsto
ORDER BY manager DESC