SQL JOIN的类型
SQL JOIN
一个 SQL Join 用于基于定义的条件从两个或多个表中提取或合并数据(行或列)。
表1:Order
OrderID | CustomerID | OrderName | ProductName |
---|---|---|---|
12025 | 101 | Peter | ABC |
12030 | 105 | Robert | XYX |
12032 | 110 | James | XYZ |
12034 | 115 | Andrew | PQR |
12035 | 120 | Mathew | AAA |
表2:Customer
CustomerID | CustomerName | Country |
---|---|---|
100 | Messy | Maxico |
101 | Prince | Taiwan |
103 | Maria Fernandez | Turkey |
105 | Jasmine | Paris |
110 | Faf Weasel | Indonesia |
120 | Romen Rocket | Russia |
现在,我们有两个表格 Order 和 Customer 。这两个表格中都有一个共同的 CustomerID 列。因此,编写SQL查询来定义通用关系,以选择两个表格中匹配记录的内容。
Select Order.OrderID, Customer.CustomerName, Customer.Country, Order.ProductName from Order INNER JOIN Customer ON Order.CustomerID = Customer.CustomerID;
在执行以上SQL查询后,会产生以下输出:
OrderID | CustomerName | Country | ProductName |
---|---|---|---|
12025 | Prince | Taiwan | ABC |
12030 | Jasmine | Paris | XYX |
12032 | Faf Weasel | Indonesia | XYZ |
12035 | Romen Rocket | Russia | AAA |
SQL的连接类型
SQL中有不同类型的连接:
- 内连接/简单连接
- 左外连接/左连接
- 右外连接/右连接
- 全外连接
- 交叉连接
- 自连接
内连接
内连接用于选择在两个表中匹配的所有行或列,只要在SQL中满足定义的条件。
语法:
Select column_1, column_2, column_3 FROM table_1 INNER JOIN table_2 ON table_1.column = table_2.column;
我们可以通过以下方式用Venn图表示内连接:
表格1:学生
Student_ID | StudentName | Subject | TeacherID |
---|---|---|---|
101 | Alexandra | Computer Science | T201 |
102 | Charles | Economics | T202 |
103 | Tom Cruise | Computer Science | T201 |
104 | Aron Finch | Electronics | T203 |
105 | Siemen Bajoff | Web designing | T204 |
106 | Christopher | English Literature | T205 |
107 | Denim | Fashion Designer | T206 |
表2:教师
TeacherID | TeacherName | TeacherEmail |
---|---|---|
T201 | Mr Davis | stash |
T202 | Mrs Jonas | stash |
T201 | Mr Davis | stash |
T204 | Mrs Lopez | stash |
T205 | Mrs Wiley | stash |
T206 | Mr Bean | stash |
我们有两个表: 学生表 和 教师表 。让我们使用 INNER JOIN 编写SQL查询来连接这两个表,如下所示:
Select Student_ID, StudentName, TeacherName, TeacherEmail FROM Students INNER JOIN Teachers ON Students.TeacherID = Teachers.TeacherID;
执行查询后,生成以下表格。
自然连接
它是一种基于相同列名并在两个或多个表中具有相同数据类型的内连接类型。
语法:
Select * from tablename1 Natural JOIN tablename_2;
我们有两个表: 学生表 和 教师表 。让我们使用 自然连接 编写SQL查询来联接这两个表,如下所示:
Select * from Students Natural JOIN Teachers;
执行上述查询后,将产生以下表格。
左连接
使用 左连接 从左表(表1)检索所有记录以及与右表(表2)匹配的行或列。如果两个表都不包含任何匹配的行或列,则返回NULL。
语法:
Select column_1, column_2, column(s) FROM table_1 LEFT JOIN table_2 ON table_1.column_name = table_2.column_name;
我们还可以通过维恩图来表示左连接,如下所示:
注意:在一些数据库中,LEFT JOIN 也称为 LEFT OUTER JOIN。
表 1:产品详情
ProductID | ProductName | Amount |
---|---|---|
Pro101 | Laptop | 56000 |
Pro102 | Mobile | 38000 |
Pro103 | Headphones | 5000 |
Pro104 | Television | 25000 |
Pro105 | iPad | 60000 |
表2:Customer_Details
CustomerName | CustomerAddress | CustomerAge | ProductID |
---|---|---|---|
Martin Guptill | San Francisco, USA | 26 | Pro101 |
James | Australia | 29 | Pro103 |
Ambati Williamson | New Zealand | 27 | Pro102 |
Jofra Archer | South Africa | 24 | Pro105 |
Kate Wiley | Australia | 20 | Pro103 |
我们有两个表: Product_Details 和 Customer_Details 表。让我们编写SQL查询来使用 LEFT JOIN 连接表,如下所示:
Select ID, ProductName, CustomerName, CustomerAddress, Amount FROM Product_Details LEFT JOIN Customer_Details ON Product_Details.ID = Customer_Details.ProductID;
在执行查询后,将生成以下表格。
RIGHT JOIN或RIGHT Outer JOIN:
RIGHT JOIN 用于从右表(table2)检索所有记录以及左表(table1)中的匹配行或列。如果两个表都不包含任何匹配的行或列,则返回NULL。
语法:
Select column_1, column_2, column(s) FROM table_1 RIGHT JOIN table_2 ON table_1.column_name = table_2.column_name;
我们也可以通过维恩图来表示右连接,如下所示:
注意:在一些数据库中,RIGHT JOIN 也被称为 RIGHT OUTER JOIN。
Table 1: Product_Details
ID | ProductName | Amount |
---|---|---|
Pro101 | Laptop | 56000 |
Pro102 | Mobile | 38000 |
Pro103 | Headphones | 5000 |
Pro104 | Television | 25000 |
Pro105 | iPad | 60000 |
表格2:客户详细信息
CustomerName | CustomerAddress | CustomerAge | ProductID |
---|---|---|---|
马丁·古普蒂尔 | 美国旧金山 | 26 | Pro101 |
詹姆斯 | 澳大利亚 | 29 | Pro103 |
安巴蒂·威廉姆森 | 新西兰 | 27 | Pro102 |
乔夫拉·阿彻尔 | 南非 | 24 | Pro105 |
奥曼 | 英格兰 | 29 | Pro107 |
摩根 | 英格兰 | 20 | Pro108 |
我们有两个表: Product_Details 和 Customer_Details 表。让我们写一个使用 RIGHT JOIN 连接这两个表的 SQL 查询语句,如下所示:
Select ID, ProductName, CustomerName, CustomerAddress, Amount FROM Product_Details LEFT JOIN Customer_Details ON Product_Details.ID = Customer_Details.ProductID;
查询执行后,将产生以下表格。
FULL JOIN或FULL Outer JOIN:
它是LEFT JOIN和RIGHT JOIN的组合结果集。连接的表返回来自两个表的所有记录,如果在表中找不到匹配项,则将其置为NULL。它也被称为 FULL OUTER JOIN 。
语法:
Select column_1, column_2, column(s) FROM table_1 FULL JOIN table_2 ON table_1.column_name = table_2.column_name;
或者, FULL OUTER JOIN
Select column_1, column_2, column(s) FROM table_1 FULL OUTER JOIN table_2 ON table_1.column_name = table_2.column_name;
我们也可以通过维恩图来表示全外连接,如下所示:
表 1:产品详情
ID | ProductName | Amount |
---|---|---|
Pro101 | Laptop | 56000 |
Pro102 | Mobile | 38000 |
Pro103 | Headphones | 5000 |
Pro104 | Television | 25000 |
Pro105 | iPad | 60000 |
Table 2: 客户详细信息
CustomerName | CustomerAddress | CustomerAge | ProductID |
---|---|---|---|
Martin Guptill | San Francisco, USA | 26 | Pro101 |
James | Australia | 29 | Pro103 |
Ambati Williamson | New Zealand | 27 | Pro102 |
Jofra Archer | South Africa | 24 | Pro105 |
Omen | England | 29 | Pro107 |
Morgan | England | 20 | Pro108 |
我们有两个表: Product_Details 和 Customer_Details 表。让我们使用 FULL JOIN编写SQL查询来连接这两个表,如下所示:
Select ID, ProductName, CustomerName, CustomerAddress, Amount FROM Product_Details FULL JOIN Customer_Details ON Product_Details.ID = Customer_Details.ProductID;
执行查询后,生成下面的表格。
注意:MySQL不支持完全连接的概念,因此我们可以使用UNION ALL子句将两个表合并。
这是组合表的 UNION ALL 子句的语法。
Select ID, ProductName, CustomerName, CustomerAddress, Amount FROM Product_Details LEFT JOIN Customer_Details ON Product_Details.ID = Customer_Details.ProductID
UNION ALL
Select ID, ProductName, CustomerName, CustomerAddress, Amount FROM Product_Details RIGHT JOIN Customer_Details ON Product_Details.ID = Customer_Details.ProductID
跨连接
也被称为 CARTESIAN JOIN(笛卡尔积) ,它返回两个或多个连接表的笛卡尔积。跨连接 CROSS JOIN(叉连接) 产生一个将第一个表的每一行与第二个表的每一行合并的表。在CROSS JOIN中不需要包含任何条件。
语法:
Select * from table_1 cross join table_2;
或者,
Select column1, column2, column3 FROM table_1, table_2;
表格 1:产品详情
ID | ProductName | Amount |
---|---|---|
Pro101 | Laptop | 56000 |
Pro102 | Mobile | 38000 |
Pro103 | Headphones | 5000 |
Pro104 | Television | 25000 |
Pro105 | iPad | 60000 |
表2:顾客详细信息
CustomerName | CustomerAddress | CustomerAge | ProductID |
---|---|---|---|
Martin Guptill | San Francisco, USA | 26 | Pro101 |
James | Australia | 29 | Pro103 |
Ambati Williamson | New Zealand | 27 | Pro102 |
Jofra Archer | South Africa | 24 | Pro105 |
Omen | England | 29 | Pro107 |
Morgan | England | 20 | Pro108 |
我们有两个表: Product_Details 和 Customer_Details 表。让我们使用 FULL JOIN编写SQL查询来连接这两个表,如下所示:
Select ID, ProductName, CustomerName, CustomerAddress, Amount FROM Product_Details, Customer_Details;
执行查询后,生成如下表格。
自连接
这是一种自连接,用于通过将其自身连接起来来创建一个表,就像有两个表一样。它在SQL语句中至少给一个表起临时名称。
语法:
Select column1, column2, column(s) FROM table_1 Tbl1, table_2 Tbl2 WHERE condition;
Tbl1 和 Tbl2 是同一张表的两个不同的表别名。
表1:Product_Details
ID | ProductName | Amount |
---|---|---|
Pro101 | Laptop | 56000 |
Pro102 | Mobile | 38000 |
Pro103 | Headphones | 5000 |
Pro104 | Television | 25000 |
Pro105 | iPad | 60000 |
让我们编写SQL查询来使用 自连接 表作为下文的示例:
Select TB.ID, TB.ProductName FROM Product_Details TB, Product_Details TB2
WHERE TB.AMOUNT < TB2.AMOUNT;
执行查询后,会生成下面的表格。