SQL 交叉连接
- SQL中的连接操作用于将多个表合并到一个表中。
- 如果我们使用交叉连接来合并两个不同的表,则会获得连接表中行的笛卡尔乘积。当将第一个表的每一行与第二个表的每一行组合时,这被称为笛卡尔连接或交叉连接。
- 在执行交叉连接操作后,最终表中的行数将等于表1中行数与表2中行数的乘积。
- 例如: 如果表1中有两条记录,表2中有三条记录,则执行交叉连接操作后,最终表中将有六条记录。
- 让我们看一下在SQL中编写执行交叉连接操作的查询的语法。
SELECT TableName1.columnName1, TableName2.columnName2 FROM TableName1 CROSS JOIN TableName2 ON TableName1.ColumnName = TableName2.ColumnName;
现在让我们通过例子深入了解SQL中的交叉连接。所有例子中的查询都将使用MySQL数据库编写。
考虑我们有以下具有给定数据的表格:
表格1: MatchScore
Player | Department_id | Goals |
---|---|---|
Franklin | 1 | 2 |
Alan | 1 | 3 |
Priyanka | 2 | 2 |
Rajesh | 3 | 5 |
表格2:部门
Department_id | Department_name |
---|---|
1 | IT |
2 | HR |
3 | Marketing |
表3:员工
EmployeeID | Employee_Name | Employee_Salary |
---|---|---|
1 | Arun Tiwari | 50000 |
2 | Sachin Rathi | 64000 |
3 | Harshal Pathak | 48000 |
4 | Arjun Kuwar | 46000 |
5 | Sarthak Gada | 62000 |
表格4:部门
DepartmentID | Department_Name | Employee_ID |
---|---|---|
1 | Production | 1 |
2 | Sales | 3 |
3 | Marketing | 4 |
4 | Accounts | 5 |
表5:贷款
LoanID | Branch | Amount |
---|---|---|
1 | B1 | 15000 |
2 | B2 | 10000 |
3 | B3 | 20000 |
4 | B4 | 100000 |
表格 6: 借款人
CustID | CustName | LoanID |
---|---|---|
1 | Sonakshi Dixit | 1 |
2 | Shital Garg | 4 |
3 | Swara Joshi | 5 |
4 | Isha Deshmukh | 2 |
表格7:客户
Customer_ID | Name | Age | Salary |
---|---|---|---|
1 | Aryan Jain | 51 | 56000 |
2 | Arohi Dixit | 21 | 25000 |
3 | Vineet Garg | 24 | 31000 |
表8:订单
Order_ID | Order_Date | Cutomer_ID | Amount |
---|---|---|---|
1 | 2012-01-20 | 2 | 3000 |
2 | 2012-05-18 | 2 | 2000 |
3 | 2012-06-28 | 3 | 4000 |
示例 1:
编写一个查询,以将MatchScore表作为左表,Departments表作为右表执行交叉连接操作。
查询语句:
SELECT * FROM MatchScore CROSS JOIN Departments;
我们使用SELECT命令和星号来检索MatchScore和Departments表中的所有列。然后我们使用CROSS JOIN关键字在MatchScore和Departments表上执行交叉连接操作。由于MatchScore表中有4条记录,Departments表中有3条记录,执行交叉连接操作后,我们将得到12行数据。
执行此查询后,您将得到以下结果:
Player | Department_id | Goals | Depatment_id | Department_name |
---|---|---|---|---|
Franklin | 1 | 2 | 1 | IT |
Alan | 1 | 3 | 1 | IT |
Priyanka | 2 | 2 | 1 | IT |
Rajesh | 3 | 5 | 1 | IT |
Franklin | 1 | 2 | 2 | HR |
Alan | 1 | 3 | 2 | HR |
Priyanka | 2 | 2 | 2 | HR |
Rajesh | 3 | 5 | 2 | HR |
Franklin | 1 | 2 | 3 | Marketing |
Alan | 1 | 3 | 3 | Marketing |
Priyanka | 2 | 2 | 3 | Marketing |
Rajesh | 3 | 5 | 3 | Marketing |
每个来自MatchScore表的行都与Departments表的每一行组合在一起。由于MatchScore中有四条记录,Departments表中有三条记录,在执行交叉连接操作后,最终表中有12行。
示例2:
编写一个查询,将员工表作为左表,部门表作为右表,执行交叉连接操作。
查询:
mysql> SELECT *FROM employee CROSS JOIN department;
我们使用SELECT命令和星号来检索employee和department表中的所有列。然后我们使用CROSS JOIN关键字对employee和department表执行了交叉连接操作。由于employee表中有五条记录,department表中有四条记录,所以在执行交叉连接操作后,我们会得到20行结果。
执行该查询后,您将得到以下结果:
EmployeeID | Employee_Name | Employee_Salary | DepartmentID | Department_Name | Employee_ID |
---|---|---|---|---|---|
1 | Arun Tiwari | 50000 | 1 | Production | 1 |
1 | Arun Tiwari | 50000 | 2 | Sales | 3 |
1 | Arun Tiwari | 50000 | 3 | Marketing | 4 |
1 | Arun Tiwari | 50000 | 4 | Accounts | 5 |
2 | Sachin Rathi | 64000 | 1 | Production | 1 |
2 | Sachin Rathi | 64000 | 2 | Sales | 3 |
2 | Sachin Rathi | 64000 | 3 | Marketing | 4 |
2 | Sachin Rathi | 64000 | 4 | Accounts | 5 |
3 | Harshal Pathak | 48000 | 1 | Production | 1 |
3 | Harshal Pathak | 48000 | 2 | Sales | 3 |
3 | Harshal Pathak | 48000 | 3 | Marketing | 4 |
3 | Harshal Pathak | 48000 | 4 | Accounts | 5 |
4 | Arjun Kuwar | 46000 | 1 | Production | 1 |
4 | Arjun Kuwar | 46000 | 2 | Sales | 3 |
4 | Arjun Kuwar | 46000 | 3 | Marketing | 4 |
4 | Arjun Kuwar | 46000 | 4 | Accounts | 5 |
5 | Sarthak Gada | 62000 | 1 | Production | 1 |
5 | Sarthak Gada | 62000 | 2 | Sales | 3 |
5 | Sarthak Gada | 62000 | 3 | Marketing | 4 |
5 | Sarthak Gada | 62000 | 4 | Accounts | 5 |
每个员工表的行与部门表的每个行相结合。由于员工表中有五个记录,部门表中有四个记录,所以在执行交叉连接操作后,最终表中有20行。
示例3:
编写一个查询,将贷款表视为左表,将借款人表视为右表,执行交叉连接操作。
查询:
mysql> SELECT *FROM loan CROSS JOIN borrower;
我们使用带有星号的SELECT命令检索贷款表和借款人表中的所有列。然后,我们使用CROSS JOIN关键字在贷款表和借款人表上执行交叉连接操作。由于贷款表中有四条记录,借款人表中也有四条记录,在执行交叉连接操作后,我们将得到16行。
执行此查询后,您将得到以下结果:
LoanID | Branch | Amount | CustID | CustName | LoanID |
---|---|---|---|---|---|
1 | B1 | 15000 | 1 | Sonakshi Dixit | 1 |
2 | B2 | 10000 | 1 | Sonakshi Dixit | 1 |
3 | B3 | 20000 | 1 | Sonakshi Dixit | 1 |
4 | B4 | 100000 | 1 | Sonakshi Dixit | 1 |
1 | B1 | 15000 | 2 | Shital Garg | 4 |
2 | B2 | 10000 | 2 | Shital Garg | 4 |
3 | B3 | 20000 | 2 | Shital Garg | 4 |
4 | B4 | 100000 | 2 | Shital Garg | 4 |
1 | B1 | 15000 | 3 | Swara Joshi | 5 |
2 | B2 | 10000 | 3 | Swara Joshi | 5 |
3 | B3 | 20000 | 3 | Swara Joshi | 5 |
4 | B4 | 100000 | 3 | Swara Joshi | 5 |
1 | B1 | 15000 | 4 | Isha Deshmukh | 2 |
2 | B2 | 10000 | 4 | Isha Deshmukh | 2 |
3 | B3 | 20000 | 4 | Isha Deshmukh | 2 |
4 | B4 | 100000 | 4 | Isha Deshmukh | 2 |
每一行来自贷款表和借款人表的组合。由于贷款表有四条记录,借款人表也有四条记录,在执行交叉连接操作后,我们获得了16行。
示例4:
编写一条查询语句,将客户表作为左表,将订单表作为右表进行交叉连接操作。
查询语句:
mysql> SELECT *FROM customer CROSS JOIN orders;
我们使用带有星号的SELECT命令来检索顾客表和订单表中的所有列。然后我们使用CROSS JOIN关键字在顾客表和订单表上执行交叉连接操作。由于贷款表中有三条记录,订单表中也有三条记录,执行交叉连接操作后,我们将得到9行。
执行此查询后,您将得到以下结果:
Customer_ID | Name | Age | Salary | Order_ID | Order_Date | Customer_ID | Amount |
---|---|---|---|---|---|---|---|
1 | Aryan Jain | 51 | 56000 | 1 | 2012-01-20 | 2 | 3000 |
2 | Arohi Dixit | 21 | 25000 | 1 | 2012-01-20 | 2 | 3000 |
3 | Vineet Garg | 24 | 31000 | 1 | 2012-01-20 | 2 | 3000 |
1 | Aryan Jain | 51 | 56000 | 2 | 2012-05-18 | 2 | 2000 |
2 | Arohi Dixit | 21 | 25000 | 2 | 2012-05-18 | 2 | 2000 |
3 | Vineet Garg | 24 | 31000 | 2 | 2012-05-18 | 2 | 2000 |
1 | Aryan Jain | 51 | 56000 | 3 | 2012-06-28 | 3 | 4000 |
2 | Arohi Dixit | 21 | 25000 | 3 | 2012-06-28 | 3 | 4000 |
3 | Vineet Garg | 24 | 31000 | 3 | 2012-06-28 | 3 | 4000 |
每个客户表的行与每个订单表的行相结合。由于贷款表中有三条记录和订单表中有三条记录,执行交叉连接操作后,我们将获得9行。