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)]
- 查询
products表中的productCode和productName列的值。 - 查询
productlines表产品线的描述textDescription列的值.
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)]
- 订单
(orders)表中的每个订单必须属于客户(customers)表中的客户。 - 客户
(customers)表中的每个客户在订单(orders)表中可以有零个或多个订单。
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)]