📜  SQL JOIN的类型

📅  最后修改于: 2020-11-12 00:53:24             🧑  作者: Mango

SQL JOIN的类型

SQL联接

SQL Join用于根据定义的条件从两个或多个表中获取或合并数据(行或列)。

表1:订单

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:客户

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;

我们可以通过维恩图表示内部联接,如下所示:

表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 abc@email.com
T202 Mrs Jonas jonas@email.com
T201 Mr Davis abc@email.com
T204 Mrs Lopez lopez@email.com
T205 Mrs Wiley wiley@email.com
T206 Mr Bean bean@email.com

我们有两个表:学生表和教师表。让我们使用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;

我们有两个表:学生表和教师表。让我们使用Natural JOIN编写SQL查询来联接表,如下所示:

Select * from Students Natural JOIN Teachers;

执行上述查询后,将产生下表。

左联接

LEFT JOIN用于从左表(表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:Product_Details

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表。让我们使用LEFT JOIN编写SQL查询来联接表,如下所示:

Select ID, ProductName, CustomerName, CustomerAddress, Amount FROM Product_Details LEFT JOIN Customer_Details ON Product_Details.ID = Customer_Details.ProductID;

执行查询后,它将产生下表。

正确的联接或正确的外部联接:

RIGHT JOIN用于从右表(表2)检索所有记录,并从左表(表1)检索匹配的行或列。如果两个表都不包含任何匹配的行或列,则返回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。

表1:Product_Details

ID 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
Omen England 29 Pro107
Morgan England 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;

执行查询后,将产生下表。

完全加入或完全外部加入:

它是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;

或者,完全外部联接

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:Product_Details

ID 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
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不支持FULL JOIN概念,因此我们可以使用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:Product_Details

ID 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
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;

执行查询后,将产生下表。

自我加入

这是一个SELF JOIN,用于通过连接自身来创建表,因为有两个表。它对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

让我们使用SELF JOIN编写SQL查询来联接表,如下所示:

Select TB.ID, TB.ProductName FROM Product_Details TB, Product_Details TB2
WHERE TB.AMOUNT < TB2.AMOUNT;

执行查询后,将产生下表。