本文主要是介绍SQL的多表联查,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这里我先附上两张表的数据:
Orders 表:
OrderID | CustomerID |
---|---|
1 | 3 |
2 | 1 |
3 | 2 |
4 | NULL |
Customers 表:
CustomerID | CustomerName |
---|---|
1 | Alice |
2 | Bob |
3 | Charlie |
4 | David |
INNER JOIN 🤝
概念: INNER JOIN(内连接)返回两个表中匹配的记录。如果某条记录在其中一个表中没有匹配项,那么它就不会出现在结果集中。
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
结果:
OrderID | CustomerName |
---|---|
1 | Charlie |
2 | Alice |
3 | Bob |
解释: 只显示了在两个表中都存在的匹配记录。订单4因为CustomerID
为NULL,在Customers
表中没有匹配,所以不显示。
LEFT JOIN 👈
概念: LEFT JOIN(左连接)返回左表(LEFT JOIN关键字左边的表)的所有记录,即使在右表中没有匹配。如果右表中没有匹配,则结果为NULL。
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
LEFT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
结果:
OrderID | CustomerName |
---|---|
1 | Charlie |
2 | Alice |
3 | Bob |
4 | NULL |
解释: 显示了Orders
表中的所有记录,对于CustomerID
为NULL的订单4,CustomerName
为NULL,因为没有匹配的顾客信息。
RIGHT JOIN 示例 👉
概念: RIGHT JOIN(右连接)与LEFT JOIN相反,它返回右表(RIGHT JOIN关键字右边的表)的所有记录,即使左表中没有匹配。如果左表中没有匹配,则结果为NULL。
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
RIGHT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
结果:
OrderID | CustomerName |
---|---|
1 | Charlie |
2 | Alice |
3 | Bob |
NULL | David |
解释: 显示了Customers
表中的所有记录,对于顾客David,因为没有对应的订单(OrderID
为NULL),依然会被列出
FULL JOIN 示例 ↔️ (以支持的数据库为例)
由于不是所有数据库都直接支持FULL JOIN,这里提供一个概念上的说明和一个可能的解决方案(比如在MySQL中使用UNION)。
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
FULL JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
概念上的结果:
OrderID | CustomerName |
---|---|
1 | Charlie |
2 | Alice |
3 | Bob |
4 | NULL |
NULL | David |
解释: 显示了Orders
和Customers
表中的所有记录,两边没有匹配的部分用NULL填充。
总结:
- INNER JOIN:匹配两边的记录,无匹配则不显示。
- LEFT JOIN:以左表为主,左表所有记录均显示,右表无匹配则NULL。
- RIGHT JOIN:以右表为主,右表所有记录均显示,左表无匹配则NULL。
- FULL JOIN:展示两边所有记录,任一边无匹配则对应侧为NULL。
这篇关于SQL的多表联查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!