SQL SET运算符
SET运算符是一种特殊类型的运算符,用于合并两个查询的结果。
涵盖在SET运算符下的运算符有:
- UNION(合并)
- UNION ALL(合并所有)
- INTERSECT(交集)
- MINUS(差集)
在SQL中使用集合操作符进行操作时,必须遵循一定的规则。规则如下:
- 列的数量和顺序必须相同。
- 数据类型必须兼容
让我们通过示例更详细地了解每个SET操作符。
所有示例将使用MySQL数据库编写。
考虑以下带有给定数据的表:
表1:t_employees
ID | Name | Department | Salary | Year_of_Experience |
---|---|---|---|---|
1 | Aakash Singh | Development | 72000 | 2 |
2 | Abhishek Pawar | Production | 45000 | 1 |
3 | Pranav Deshmukh | HR | 59900 | 3 |
4 | Shubham Mahale | Accounts | 57000 | 2 |
5 | Sunil Kulkarni | Development | 87000 | 3 |
6 | Bhushan Wagh | R&D | 75000 | 2 |
7 | Paras Jaiswal | Marketing | 32000 | 1 |
表2:t2_employees
ID | Name | Department | Salary | Year_of_Experience |
---|---|---|---|---|
1 | Prashant Wagh | R&D | 49000 | 1 |
2 | Abhishek Pawar | Production | 45000 | 1 |
3 | Gautam Jain | Development | 56000 | 4 |
4 | Shubham Mahale | Accounts | 57000 | 2 |
5 | Rahul Thakur | Production | 76000 | 4 |
6 | Bhushan Wagh | R&D | 75000 | 2 |
7 | Anand Singh | Marketing | 28000 | 1 |
表3:t_students
ID | Name | Hometown | Percentage | Favourite_Subject |
---|---|---|---|---|
1 | Soniya Jain | Udaipur | 89 | Physics |
2 | Harshada Sharma | Kanpur | 92 | Chemistry |
3 | Anuja Rajput | Jaipur | 78 | History |
4 | Pranali Singh | Nashik | 88 | Geography |
5 | Renuka Deshmukh | Panipat | 90 | Biology |
6 | Swati Kumari | Faridabad | 93 | English |
7 | Prachi Jaiswal | Gurugram | 96 | Hindi |
表格4: t2_students
ID | Name | Hometown | Percentage | Favourite_Subject |
---|---|---|---|---|
1 | Soniya Jain | Udaipur | 89 | Physics |
2 | Ishwari Dixit | Delhi | 86 | Hindi |
3 | Anuja Rajput | Jaipur | 78 | History |
4 | Pakhi Arora | Surat | 70 | Sanskrit |
5 | Renuka Deshmukh | Panipat | 90 | Biology |
6 | Jayshree Patel | Pune | 91 | Maths |
7 | Prachi Jaiswal | Gurugram | 96 | Hindi |
1. UNION:
- UNION将用于合并两个select语句的结果。
- 执行UNION操作后,结果中的重复行将被消除。
示例1:
编写一个查询来执行表t_employees和表t2_employees之间的并集。
查询:
mysql> SELECT *FROM t_employees UNION SELECT *FROM t2_employees;
在这个单一查询中,我们编写了两个SELECT查询。第一个SELECT查询将从t_employees表中获取记录,并与第二个SELECT查询从t2_employees表中获取的记录执行UNION操作。
您将获得以下输出:
ID | Name | Department | Salary | Year_of_Experience |
---|---|---|---|---|
1 | Aakash Singh | Development | 72000 | 2 |
2 | Abhishek Pawar | Production | 45000 | 1 |
3 | Pranav Deshmukh | HR | 59900 | 3 |
4 | Shubham Mahale | Accounts | 57000 | 2 |
5 | Sunil Kulkarni | Development | 87000 | 3 |
6 | Bhushan Wagh | R&D | 75000 | 2 |
7 | Paras Jaiswal | Marketing | 32000 | 1 |
1 | Prashant Wagh | R&D | 49000 | 1 |
3 | Gautam Jain | Development | 56000 | 4 |
5 | Rahul Thakur | Production | 76000 | 4 |
7 | Anand Singh | Marketing | 28000 | 1 |
由于我们在这两个表之间进行了联合操作,所以只显示了第一个和第二个表中的记录,重复记录除外。
示例2:
编写一个查询,执行表t_students和表t2_students之间的联合操作。
查询:
mysql> SELECT *FROM t_students UNION SELECT *FROM t2_students;
在这里,我们用一个查询写了两个SELECT查询。第一个SELECT查询将从t_students表中获取记录,并执行与第二个SELECT查询从t2_students表中获取的记录的UNION操作。
您将获得以下输出:
ID | Name | Department | Salary | Year_of_Experience |
---|---|---|---|---|
1 | Soniya Jain | Udaipur | 89 | Physics |
2 | Harshada Sharma | Kanpur | 92 | Chemistry |
3 | Anuja Rajput | Jaipur | 78 | History |
4 | Pranali Singh | Nashik | 88 | Geography |
5 | Renuka Deshmukh | Panipat | 90 | Biology |
6 | Swati Kumari | Faridabad | 93 | English |
7 | Prachi Jaiswal | Gurugram | 96 | Hindi |
2 | Ishwari Dixit | Delhi | 86 | Hindi |
4 | Pakhi Arora | Surat | 70 | Sanskrit |
6 | Jayshree Patel | Pune | 91 | Maths |
由于我们在两个表之间执行了并集操作,所以只显示来自第一个和第二个表的记录,重复记录除外。
2. UNION ALL
- 此运算符将合并两个查询的所有记录。
- 在执行 UNION ALL 操作后,结果中不会消除重复行。
示例1:
在表t_employees和表t2_employees之间执行并集all操作的查询。
查询:
mysql> SELECT *FROM t_employees UNION ALL SELECT *FROM t2_employees;
在这个单个查询中,我们编写了两个SELECT查询。第一个SELECT查询将从t_employees表中获取记录,并通过第二个SELECT查询从t2_employees表中获取记录进行UNION ALL操作。
您将获得以下输出:
ID | Name | Department | Salary | Year_of_Experience |
---|---|---|---|---|
1 | Aakash Singh | Development | 72000 | 2 |
2 | Abhishek Pawar | Production | 45000 | 1 |
3 | Pranav Deshmukh | HR | 59900 | 3 |
4 | Shubham Mahale | Accounts | 57000 | 2 |
5 | Sunil Kulkarni | Development | 87000 | 3 |
6 | Bhushan Wagh | R&D | 75000 | 2 |
7 | Paras Jaiswal | Marketing | 32000 | 1 |
1 | Prashant Wagh | R&D | 49000 | 1 |
2 | Abhishek Pawar | Production | 45000 | 1 |
3 | Gautam Jain | Development | 56000 | 4 |
4 | Shubham Mahale | Accounts | 57000 | 2 |
5 | Rahul Thakur | Production | 76000 | 4 |
6 | Bhushan Wagh | R&D | 75000 | 2 |
7 | Anand Singh | Marketing | 28000 | 1 |
因为我们在两个表之间执行了union all操作,所以显示了来自第一个和第二个表的所有记录,包括重复的记录。
例子2:
编写一个查询,执行表t_students和表t2_students之间的union all操作。
查询:
mysql> SELECT *FROM t_students UNION ALL SELECT *FROM t2_students;
在这里,我们通过一个查询同时写入了两个SELECT查询。第一个SELECT查询会从t_students表中获取记录,并通过UNION ALL操作与从t2_students表中获取的记录进行合并。
你将获得以下输出结果:
ID | Name | Hometown | Percentage | Favourite_Subject |
---|---|---|---|---|
1 | Soniya Jain | Udaipur | 89 | Physics |
2 | Harshada Sharma | Kanpur | 92 | Chemistry |
3 | Anuja Rajput | Jaipur | 78 | History |
4 | Pranali Singh | Nashik | 88 | Geography |
5 | Renuka Deshmukh | Panipat | 90 | Biology |
6 | Swati Kumari | Faridabad | 93 | English |
7 | Prachi Jaiswal | Gurugram | 96 | Hindi |
1 | Soniya Jain | Udaipur | 89 | Physics |
2 | Ishwari Dixit | Delhi | 86 | Hindi |
3 | Anuja Rajput | Jaipur | 78 | History |
4 | Pakhi Arora | Surat | 70 | Sanskrit |
5 | Renuka Deshmukh | Panipat | 90 | Biology |
6 | Jayshree Patel | Pune | 91 | Maths |
7 | Prachi Jaiswal | Gurugram | 96 | Hindi |
由于我们在两个表之间执行了union all操作,所以显示了第一个表和第二个表的所有记录,包括重复的记录。
3. 交集:
- 它用于组合两个SELECT语句,但它只返回两个SELECT语句中共同的记录。
示例1:
编写查询来执行表t_employees和表t2_employees之间的交集操作。
查询:
mysql> SELECT *FROM t_employees INTERSECT SELECT *FROM t2_employees;
在这里,我们一次查询中编写了两个SELECT查询。第一个SELECT查询将取回t_employees表中的记录,并与第二个SELECT查询从t2_employees表中取回的记录执行INTERSECT操作。
您将得到以下输出:
ID | Name | Hometown | Percentage | Favourite_Subject |
---|---|---|---|---|
2 | Abhishek Pawar | Production | 45000 | 1 |
4 | Shubham Mahale | Accounts | 57000 | 2 |
6 | Bhushan Wagh | R&D | 75000 | 2 |
自从我们在这两个表之间执行了交集操作,所以只有来自这两个表的公共记录会显示出来。
示例2:
编写一个查询,在表格t_students和表格t2_students之间执行交集操作。
查询:
mysql> SELECT *FROM t_students INTERSECT SELECT *FROM t2_students;
在这个单一的查询中,我们编写了两个SELECT查询语句。第一个SELECT查询语句将从t_students表中提取记录,并与第二个SELECT查询语句从t2_students表中提取的记录执行UNION操作。
你将得到以下输出:
ID | Name | Hometown | Percentage | Favourite_Subject |
---|---|---|---|---|
1 | Soniya Jain | Udaipur | 89 | Physics |
3 | Anuja Rajput | Jaipur | 78 | History |
5 | Renuka Deshmukh | Panipat | 90 | Biology |
7 | Prachi Jaiswal | Gurugram | 96 | Hindi |
由于我们在两个表之间执行了交集操作,所以只显示了两个表中的公共记录。
- MINUS
- 它显示了在第一个查询中存在但在第二个查询中不存在的行,且没有重复。
示例 1:
编写一个查询,在表t_employees和表t2_employees之间执行MINUS操作。
查询:
mysql> SELECT *FROM t_employees MINUS SELECT *FROM t2_employees;
在这个查询中,我们编写了两个SELECT查询。第一个SELECT查询将从t_employees表中获取记录,并执行MINUS操作,从t2_employees表中获取的记录中进行操作。
你将得到以下输出:
ID | Name | Department | Salary | Year_of_Experience |
---|---|---|---|---|
1 | Aakash Singh | Development | 72000 | 2 |
3 | Pranav Deshmukh | HR | 59900 | 3 |
5 | Sunil Kulkarni | Development | 87000 | 3 |
7 | Paras Jaiswal | Marketing | 32000 | 1 |
由于我们在两个表之间执行了Minus操作,所以只显示了两个表中不匹配的记录。
示例2:
编写一个查询来执行表t_students和表t2_students之间的Minus操作。
查询:
mysql> SELECT *FROM t_students MINUS SELECT *FROM t2_students;
在这个查询中,我们编写了两个SELECT查询。第一个SELECT查询将从t_employees表中获取记录,并在第二个SELECT查询从t2_employees表中获取的记录上执行UNION操作。
您将获得以下输出:
ID | Name | Hometown | Percentage | Favourite_Subject |
---|---|---|---|---|
2 | Harshada Sharma | Kanpur | 92 | Chemistry |
4 | Pranali Singh | Nashik | 88 | Geography |
6 | Swati Kumari | Faridabad | 93 | English |
由于我们在两个表之间执行了减法运算,所以仅显示来自两个表的不匹配的记录。