MySQL- 7 表连接

参考网址: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;

上面的查询从customersorders表中选择客户名称和订单数量。customers表的别名命名为c,orders表的别名命名为o,这样,customersorders表中的字段可以通过表别名引用。 

表别名也常用于inner join,left join和子查询中。用于区别其可读性

Inner join

inner join可根据连接条件从多个表中查询数据。将一个表中的行与其他表中的行进行匹配,为表的交集中的内容

为select语句中的可选部分,紧跟在From后。

在使用MySQL INNER JOIN子句之前,必须指定以下条件:

  • 首先,必须指定出现在FROM子句中的主表。
  • 其次,您需要指定要与主表联接的表,该主表出现在INNER JOIN子句中。理论上,您可以连接具有多个表的表。但是,为了更好的查询性能,您应该限制要加入的表的数量。
  • 第三,您需要指定连接条件或连接谓词。连接条件的关键字ONINNER 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;

MySQL LEFT JOINå®ä¾åä¼ååæ

将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

发布了19 篇原创文章 · 获赞 1 · 访问量 2185

猜你喜欢

转载自blog.csdn.net/wella_liu/article/details/91877627