SQL EXCEPT运算符
SQL中的 EXCEPT 运算符用于检索存在于第一个表中的唯一记录,而不是两个表共同的记录。该运算符作为SQL UNION运算符的相反操作。
为了更好地理解,请考虑如下图所示的具有记录的两个表−
如果我们对上述两个表执行EXCEPT运算符来检索名称,它将只显示第一个表中与第二个表的记录不共有的记录。
在这里,“Dev”在两个表中都是相同的。因此,EXCEPT运算符将删除它,并仅检索“Sara”和“Jay”作为输出。
语法
以下是SQL中EXCEPT运算符的语法 −
SELECT column1, column2,…, columnN
FROM table1, table2,…, tableN
[Conditions] //optional
EXCEPT
SELECT column1, column2,…, columnN
FROM table1, table2,…, tableN
[Conditions] //optional
注意 - 两个SELECT语句中的列的数量和顺序应保持一致。
示例
首先,让我们使用以下查询创建一个名为“ STUDENTS ”的表 –
SQL> CREATE TABLE STUDENTS(
ID INT NOT NULL,
NAME VARCHAR(20) NOT NULL,
HOBBY VARCHAR(20) NOT NULL,
AGE INT NOT NULL,
PRIMARY KEY(ID)
);
表格创建完成后,我们可以使用以下查询语句向表格中插入一些值。
SQL> INSERT INTO STUDENTS(ID, NAME, HOBBY, AGE) VALUES(1, 'Vijay', 'Cricket', 18);
INSERT INTO STUDENTS(ID, NAME, HOBBY, AGE) VALUES(2, 'Varun', 'Football', 26);
INSERT INTO STUDENTS(ID, NAME, HOBBY, AGE) VALUES(3, 'Surya', 'Cricket', 19);
INSERT INTO STUDENTS(ID, NAME, HOBBY, AGE) VALUES(4, 'Karthik', 'Cricket', 25);
INSERT INTO STUDENTS(ID, NAME, HOBBY, AGE) VALUES(5, 'Sunny', 'Football', 26);
INSERT INTO STUDENTS(ID, NAME, HOBBY, AGE) VALUES(6, 'Dev', 'Cricket', 23);
让我们使用以下查询来验证“STUDENTS”表是否已创建 −
SQL> SELECT * FROM STUDENTS;
如下图所示,数据表已经在数据库中创建。
+-----+----------+--------------+-------+
| ID | NAME | HOBBY | AGE |
+-----+----------+--------------+-------+
| 1 | Vijay | Cricket | 18 |
| 2 | Varun | Football | 26 |
| 3 | Surya | Cricket | 19 |
| 4 | Karthik | Cricket | 25 |
| 5 | Sunny | Football | 26 |
| 6 | Dev | Cricket | 23 |
+-----+----------+--------------+-------+
让我们使用以下查询创建另一个名为“ ASSOCIATES ”的表:
SQL> CREATE TABLE ASSOCIATES(
ID INT NOT NULL,
NAME VARCHAR(20) NOT NULL,
SUBJECT VARCHAR(20) NOT NULL,
AGE INT NOT NULL,
HOBBY VARCHAR(20) NOT NULL,
PRIMARY KEY(ID)
);
一旦表格被创建,让我们使用以下查询向表格中插入一些值-
SQL> INSERT INTO ASSOCIATES(ID, NAME, SUBJECT, AGE, HOBBY) VALUES(1, 'Naina', 'Maths', 24, 'Cricket');
INSERT INTO ASSOCIATES(ID, NAME, SUBJECT, AGE, HOBBY) VALUES(2, 'Varun', 'Physics', 26, 'Football');
INSERT INTO ASSOCIATES(ID, NAME, SUBJECT, AGE, HOBBY) VALUES(3, 'Dev', 'Maths', 23, 'Cricket');
INSERT INTO ASSOCIATES(ID, NAME, SUBJECT, AGE, HOBBY) VALUES(4, 'Priya', 'Physics', 25, 'Cricket');
INSERT INTO ASSOCIATES(ID, NAME, SUBJECT, AGE, HOBBY) VALUES(5, 'Aditya', 'Chemistry', 21, 'Cricket');
INSERT INTO ASSOCIATES(ID, NAME, SUBJECT, AGE, HOBBY) VALUES(6, 'Kalyan', 'Maths', 30, 'Football');
让我们使用以下查询验证是否已创建表“ASSOCIATES”:
SQL> SELECT * FROM ASSOCIATES;
如下输出所示,表已经在数据库中创建。
+-----+----------+---------------+-------+----------+
| ID | NAME | SUBJECT | AGE | HOBBY |
+-----+----------+---------------+-------+----------+
| 1 | Naina | Mathematics | 24 | Cricket |
| 2 | Varun | Physics | 26 | Football |
| 3 | Dev | Mathematics | 23 | Cricket |
| 4 | Priya | Physics | 25 | Cricket |
| 5 | Adithya | Chemistry | 21 | Cricket |
| 6 | Kalyan | Mathematics | 30 | Football |
+-----+----------+--------------+-------+-----------+
让我们使用以下查询来检索仅在第一个表中唯一的记录:
SQL> SELECT NAME, HOBBY, AGE
FROM STUDENTS
EXCEPT
SELECT NAME, HOBBY, AGE
FROM ASSOCIATES
输出
当我们执行上述查询时,输出结果如下:
+-----------+--------------+-------+
| NAME | HOBBY | AGE |
+-----+----------+---------+-------+
| Karthik | Cricket | 25 |
| Sunny | Football | 26 |
| Surya | Cricket | 19 |
| Vijay | Cricket | 18 |
+-----------+--------------+-------+
使用BETWEEN运算符的EXCEPT
如同我们在初始语法中讨论的一样,我们也可以将EXCEPT运算符与条件运算符一起使用。在SQL中,我们可以使用EXCEPT运算符和BETWEEN运算符来排除落在指定范围内的行。
示例
让我们使用以下查询检索只在第一个表中唯一的记录。此外,我们还检索年龄在20至30之间的记录。
SQL> SELECT NAME, HOBBY, AGE
FROM STUDENTS
WHERE AGE BETWEEN 20 AND 30
EXCEPT
SELECT NAME, HOBBY, AGE
FROM ASSOCIATES
WHERE AGE BETWEEN 20 AND 30
输出
当我们执行程序查询时,输出如下所示−
+----------+----------+-----+
| NAME | HOBBY | AGE |
+----------+----------+-----+
| Karthik | Cricket | 25 |
| Sunny | Football | 26 |
+----------+----------+-----+
除了使用IN运算符外
我们还可以在SQL中使用EXCEPT运算符和IN运算符一起使用,以排除拥有指定值的行。IN运算符用于基于指定值列表过滤结果集。
示例
在这里,我们正在获取表中 仅 独特的记录。此外,我们使用 IN 运算符来检索爱好是“Cricket”的记录。
SQL> SELECT NAME, HOBBY, AGE FROM STUDENTS
WHERE HOBBY IN('Cricket')
EXCEPT
SELECT NAME, HOBBY, AGE FROM ASSOCIATES
WHERE HOBBY IN('Cricket')
输出
当我们执行上述查询时,输出结果如下所示 –
+-----------+--------------+-------+
| NAME | HOBBY | AGE |
+-----+----------+---------+-------+
| Karthik | Cricket | 25 |
| Surya | Cricket | 19 |
| Vijay | Cricket | 18 |
+-----------+--------------+-------+
使用LIKE运算符的EXCEPT
在SQL中,EXCEPT运算符还可以与LIKE运算符一起使用,来排除与指定模式匹配的行。LIKE运算符用于对字符串进行模式匹配。
示例
让我们使用通配符’%’以及LIKE运算符,从第一个SELECT语句的结果集中检索以’v’开头的姓名。
SQL> SELECT NAME, AGE, HOBBY FROM STUDENTS
WHERE NAME LIKE 'v%'
EXCEPT
SELECT NAME, AGE, HOBBY FROM ASSOCIATES
WHERE NAME LIKE 'v%'
输出
以上查询的输出如下所示:
+-----------+-------+----------+
| NAME | AGE | HOBBY |
+-----------+-------+----------+
| Vijay | 18 | Cricket |
+-----------+-------+----------+