SQL中连接(Join)用于将两个或多个表中的数据关联起来。连接可以分为内连接和外连接,它们的区别在于如何处理没有匹配上的数据。
内连接
内连接(Inner Join)将两个表中匹配的行关联起来,只输出匹配的行。语法如下:
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
其中table1
和table2
是需要连接的两个表格,INNER JOIN
表示内连接,ON
表示连接条件,即需要连接的列。
接下来,我们通过两个示例来理解内连接的作用:
示例1:连接两个表中的公共数据
下面是orders
表格:
OrderID | OrderDate | CustomerID |
---|---|---|
10248 | 1996-07-04 | 4 |
10249 | 1996-07-05 | 3 |
10250 | 1996-07-08 | 1 |
下面是customers
表格:
CustomerID | CustomerName | ContactName | Country |
---|---|---|---|
1 | Alfreds | Maria | Germany |
2 | Ana Trujillo | Ana | Mexico |
3 | Antonio | Antonio | Mexico |
我们可以通过内连接,将两个表格中的公共数据(即customers
表格中CustomerID
列和orders
表格中CustomerID
列相同的数据)关联起来,用于统计每个客户下订单的总数。代码如下:
SELECT customers.CustomerName, COUNT(orders.OrderID) AS OrderCount
FROM customers
INNER JOIN orders
ON customers.CustomerID = orders.CustomerID
GROUP BY customers.CustomerName;
输出结果如下:
CustomerName | OrderCount |
---|---|
Alfreds | 1 |
Antonio | 1 |
Ana Trujillo | 0 |
示例2:连接三个表格
下面是orders
表格:
OrderID | OrderDate | CustomerID |
---|---|---|
10248 | 1996-07-04 | 4 |
10249 | 1996-07-05 | 3 |
10250 | 1996-07-08 | 1 |
下面是customers
表格:
CustomerID | CustomerName | ContactName | Country |
---|---|---|---|
1 | Alfreds | Maria | Germany |
2 | Ana Trujillo | Ana | Mexico |
3 | Antonio | Antonio | Mexico |
下面是order_details
表格:
OrderDetailID | OrderID | ProductID | Quantity |
---|---|---|---|
1 | 10248 | 11 | 12 |
2 | 10248 | 42 | 10 |
3 | 10249 | 14 | 9 |
4 | 10250 | 51 | 5 |
我们需要查询每个顾客下的所有订单的详细信息,以及对应的产品信息。代码如下:
SELECT customers.CustomerName, orders.OrderID, order_details.ProductID
FROM customers
INNER JOIN orders ON customers.CustomerID = orders.CustomerID
INNER JOIN order_details ON orders.OrderID = order_details.OrderID
ORDER BY customers.CustomerName;
输出结果如下:
CustomerName | OrderID | ProductID |
---|---|---|
Alfreds | 10248 | 11 |
Alfreds | 10248 | 42 |
Antonio | 10249 | 14 |
外连接
外连接(Outer Join)则是将两个表中匹配和不匹配的行都关联起来,不匹配的行用空值填充。外连接有三种,分别是左外连接、右外连接和全外连接。
左外连接
左外连接(Left Outer Join)将左表中所有行都关联到右表中匹配的行,并将右表中不匹配的行用空值填充。语法如下:
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
接下来,我们通过示例来理解左外连接的作用:
示例3:查询数据表中部分无法匹配的数据
下面是orders
表格:
OrderID | OrderDate | CustomerID |
---|---|---|
10248 | 1996-07-04 | 4 |
10249 | 1996-07-05 | 3 |
10250 | 1996-07-08 | 1 |
下面是customers
表格:
CustomerID | CustomerName | ContactName |
---|---|---|
1 | Alfreds | Maria |
2 | Ana Trujillo | Ana |
3 | Antonio | Antonio |
我们可以通过左外连接,查询那些在orders
表格中出现的但无法找到匹配数据的客户的信息以及其对应的订单号。代码如下:
SELECT *
FROM customers
LEFT JOIN orders
ON customers.CustomerID = orders.CustomerID;
输出结果如下:
CustomerID | CustomerName | ContactName | OrderID | OrderDate | CustomerID |
---|---|---|---|---|---|
1 | Alfreds | Maria | 10250 | 1996-07-08 | 1 |
2 | Ana Trujillo | Ana | NULL | NULL | NULL |
3 | Antonio | Antonio | 10249 | 1996-07-05 | 3 |
右外连接
右外连接(Right Outer Join)与左外连接类似,只是将右表中所有行都关联到左表中匹配的行,并将左表中不匹配的行用空值填充。语法如下:
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
示例4:查询数据表中全部的订单信息
下面是orders
表格:
OrderID | OrderDate | CustomerID |
---|---|---|
10248 | 1996-07-04 | 4 |
10249 | 1996-07-05 | 3 |
10250 | 1996-07-08 | 1 |
下面是customers
表格:
CustomerID | CustomerName | ContactName |
---|---|---|
1 | Alfreds | Maria |
2 | Ana Trujillo | Ana |
3 | Antonio | Antonio |
我们可以通过右外连接,查询所有的订单信息以及其所对应的客户信息。代码如下:
SELECT *
FROM customers
RIGHT JOIN orders
ON customers.CustomerID = orders.CustomerID;
输出结果如下:
CustomerID | CustomerName | ContactName | OrderID | OrderDate | CustomerID |
---|---|---|---|---|---|
1 | Alfreds | Maria | 10250 | 1996-07-08 | 1 |
NULL | NULL | NULL | 10248 | 1996-07-04 | 4 |
3 | Antonio | Antonio | 10249 | 1996-07-05 | 3 |
全外连接
全外连接(Full Outer Join)则是将两个表中所有的行都关联起来。语法如下:
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name;
但是MySQL和SQLite并不支持FULL OUTER JOIN
,可以通过左右外连接的方式模拟实现。
综上所述,内连接和外连接是关系型数据库中两种基本的连接方式。在实际应用中,我们应该结合实际情况,选择合适的连接方式,以便处理出更加准确有用的数据。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SQL中内连接和外连接的区别 - Python技术站