MySQL

MySQL 表连接

2020-04-13  本文已影响0人  RicherYY

内连接

MySQL中INNER JOIN表示一个表中的一行数据和另一个表中的数据进行匹配。简单来说就是想查两个表的数据,如果不用内连接的话查出的数据会有重复。产生笛卡儿积,所以要使用内连接。

用法

假设查询两个表的时候t1和t2

SELECT 
    column_list
FROM 
    t1
INNER JOIN t2 ON join_condition;

例子

数据库的ER图

[图片上传失败...(image-dcfd3c-1586784611965)]

SELECT 
    t1.productCode, 
    t1.productName, 
    t2.textDescription
FROM
    products t1
        INNER JOIN
    productlines t2 ON t1.productline = t2.productline;

查询结果

[图片上传失败...(image-441d5f-1586784611966)]

补充

USING

由于两个表的连接列是使用相同一个列:productline,因此可以使用以下语法

SELECT 
    productCode, 
    productName, 
    textDescription
FROM
    products
        INNER JOIN
    productlines USING (productline);

结果一样


联表查询

SELECT 
   t1.productCode, 
   t1.productName, 
   t2.textDescription
FROM
    products t1,
    productlines t2
WHERE
t1.productline = t2.productline;

结果一样

左连接 LEFT JOIN

左连接就是两个表或者多个表以上的数据,进行对比。左表和右表不匹配时值可以为空

用法

SELECT 
    t1.c1, 
    t1.c2, 
    t2.c1, 
    t2.c2
FROM
    t1
        LEFT JOIN
    t2 ON t1.c1 = t2.c1;

例子

两个表的ER 图如下所示

[图片上传失败...(image-b3d9fe-1586784611966)]

SELECT
 c.customerNumber,
 c.customerName,
 o.orderNumber,
 o.status
FROM
 customers c
LEFT JOIN orders o ON c.customerNumber = o.customerNumber;

结果

[图片上传失败...(image-4b6227-1586784611966)]

可以看到结果集中有的客户订单号为NULL也就是说有,有的客户根本没有买过任何东西,没有任何订单。

补充

USING

SELECT
 c.customerNumber,
 customerName,
 orderNumber,
 status
FROM
 customers c
LEFT JOIN orders USING (customerNumber);

结果一样

使用MySQL LEFT JOIN子句来查找不匹配的行

当您想要找到右表中与不匹配的左表中的行时,LEFT JOIN子句非常有用。要查询两个表之间的不匹配行,可以向SELECT语句添加一个WHERE子句,以仅查询右表中的列值包含NULL值的行。

例如,要查找没有下过订单的所有客户,请使用以下查询:

SELECT 
    c.customerNumber, 
    c.customerName, 
    o.orderNumber, 
    o.status
FROM
    customers c
        LEFT JOIN
    orders o ON c.customerNumber = o.customerNumber
WHERE
    orderNumber IS NULL;

结果

[图片上传失败...(image-74a095-1586784611966)]

上一篇 下一篇

猜你喜欢

热点阅读