内连接
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)]
网友评论