隐式连接
# 效果等同于inner join
SELECT 列名
FROM 表1, 表2
WHERE 表1.关联列 = 表2.关联列;
显示连接
INNER JOIN(内连接)
# 只返回两个表中关联键相匹配的行。
# 如果一行在一个表中有匹配项,而在另一个表中没有,则该行不会出现在结果集中。
# 结果集中只包含两个表中均有对应的记录
SELECT 列名
FROM 表1
INNER JOIN 表2 ON 表1.关联列 = 表2.关联列
WHERE 条件;
LEFT JOIN(左外连接)
# 返回左表(LEFT JOIN左边的表)的所有行,不管它们是否在右表中有匹配项。
# 如果左表的某行在右表中没有匹配项,那么右表中的列将以NULL值出现在结果集中。
# 包括左表的所有记录,即使在右表中没有匹配的记录。
SELECT 列名
FROM 表1
LEFT JOIN 表2 ON 表1.关联列 = 表2.关联列
WHERE 条件;
RIGHT JOIN(右外连接)
# 返回右表(RIGHT JOIN右边的表)的所有行,不管它们是否在左表中有匹配项。
# 如果右表的某行在左表中没有匹配项,那么左表中的列将以NULL值出现在结果集中。
# 包括右表的所有记录,即使在左表中没有匹配的记录
SELECT 列名
FROM 表1
RIGHT JOIN 表2 ON 表1.关联列 = 表2.关联列
WHERE 条件;
示例
表
cc_users用户表:
UserID | UserName | PhoneNumber | IdentityCard | Address |
1 | 小红 | 12345678901 | 110101199003070094 | 北京市 |
2 | 小明 | 12345678902 | 110101199003070095 | 上海市 |
3 | 小花 | 12345678903 | 110101199003070096 | 广州市 |
4 | 小李 | 12345678904 | 110101199003070097 | 深圳市 |
5 | 小张 | 12345678905 | 110101199003070098 | 成都市 |
cc_orders订单表:
OrderID | UserID | OrderTime |
1001 | 1 | 2022-01-01 10:00:00 |
1002 | 1 | 2022-01-02 10:00:00 |
1003 | 2 | 2022-01-03 10:00:00 |
1004 | 6 | 2022-01-04 10:00:00 |
1005 | 7 | 2022-01-05 10:00:00 |
cc_products产品表:
ProductID | ProductName | Price |
1 | 产品A | 50.00 |
2 | 产品B | 100.00 |
3 | 产品C | 150.00 |
4 | 产品D | 200.00 |
5 | 产品E | 250.00 |
cc_orderdetails订单详情表(同一订单有多个产品,分多笔数据):
OrderID | ProductID | Quantity |
1001 | 1 | 2 |
1001 | 2 | 1 |
1002 | 1 | 3 |
1003 | 4 | 2 |
1003 | 5 | 1 |
1004 | 2 | 3 |
1005 | 8 | 4 |
INNER JOIN
SELECT u.UserName, o.OrderID, od.ProductID, p.ProductName, od.Quantity
FROM cc_users u
INNER JOIN cc_orders o ON u.UserID = o.UserID
INNER JOIN cc_orderdetails od ON o.OrderID = od.OrderID
INNER JOIN cc_products p ON od.ProductID = p.ProductID
WHERE u.UserName = '小红';
UserName | OrderID | ProductID | ProductName | Quantity |
---|---|---|---|---|
小红 | 1001 | 1 | 产品A | 2 |
小红 | 1001 | 2 | 产品B | 1 |
小红 | 1002 | 1 | 产品A | 3 |
LEFT JOIN
SELECT u.UserName, o.OrderID, od.ProductID, p.ProductName, od.Quantity
FROM cc_users u
LEFT JOIN cc_orders o ON u.UserID = o.UserID
LEFT JOIN cc_orderdetails od ON o.OrderID = od.OrderID
LEFT JOIN cc_products p ON od.ProductID = p.ProductID
WHERE u.UserName = '小红';
UserName | OrderID | ProductID | ProductName | Quantity |
---|---|---|---|---|
小红 | 1001 | 1 | 产品A | 2 |
小红 | 1001 | 2 | 产品B | 1 |
小红 | 1002 | 1 | 产品A | 3 |
小红 | NULL | NULL | NULL | NULL |
RIGHT JOIN
SELECT u.UserName, o.OrderID, od.ProductID, p.ProductName, od.Quantity
FROM cc_users u
RIGHT JOIN cc_orders o ON u.UserID = o.UserID
RIGHT JOIN cc_orderdetails od ON o.OrderID = od.OrderID
RIGHT JOIN cc_products p ON od.ProductID = p.ProductID
WHERE od.Quantity = 1;
UserName | OrderID | ProductID | ProductName | Quantity |
---|---|---|---|---|
小红 | 1001 | 2 | 产品B | 1 |
NULL | 1005 | 4 | 产品D | 1 |