子查询是指一个查询语句嵌套在另一个查询语句内部的查询。它可以嵌套在SELECT、SELECT、INTO 语句、INSERT...INTO 等语句中。在执行查询语句时,首会执行子查询中的语句,然后将返回的结果作为外层查询的过滤条件,在子查询中通可以使用 IN、EXISTS、ANY、ALL 操作符。
使用 IN 关键字进行子查询时,内层查询语句仅返回一个数据列,这个数据列中的将供外层查询语句进行比较操作。
例如,查询存在年龄为 20岁的员工的部门,SQL语句如下:
sql
SELECT * FROM department WHERE did IN(SELECT did FROM employee WHERE age=20);
上述语句执行成功后,结果如下:
sql
mysql> SELECT * FROM department WHERE did IN(SELECT did FROM employee WHERE age=20);
+-----+-----------+
| did | dname |
+-----+-----------+
| 1 | 网络部 |
| 2 | 媒体部 |
+-----+-----------+
2 rows in set (0.04 sec)
从上述结果可以看出,只有网络部和媒体部有年龄为20岁的员工。在查询的过中,首先会执行内层子查询,得到年龄为 20岁的员工的部门id,然后根据部门id与外查询的比较条件,最终得到符合条件的数据。
SELECT 语句中还可以使用 NOT IN 关键字,其作用正好与 IN 相反。
例如,查询不存在年龄为 20岁的员工的部门,SQL语句如下:
sql
SELEcT * FROM department WHERE did NOT IN (SELECT did FROM employee WHERE age=20);
上述语句执行成功后,结果如下:
sql
mysql> SELEcT * FROM department WHERE did NOT IN (SELECT did FROM employee WHERE age=20);
+-----+-----------+
| did | dname |
+-----+-----------+
| 3 | 研发部 |
| 5 | 人事部 |
+-----+-----------+
2 rows in set (0.01 sec)
从上述结果可以看出,只有研发部与人事部不存在年龄为 20岁的员工。明显可以看出,使用 NOT IN 关键字的査询结果与使用 IN 关键字的查询结果正好相反。