利用子查询进行过滤

简单来说将就是利用一条SELECT语句的返回结果用于另一条WHERE语句的WHERE子句

比方说查询薪水高于150000的员工全名。这里需要查询2张表,先分开写看下

SELECT emp_no,salary FROM salaries WHERE salary > 150000;

输出:

+--------+--------+
| emp_no | salary |
+--------+--------+
|  43624 | 151115 |
|  43624 | 153166 |
|  43624 | 153458 |
|  43624 | 157821 |
|  43624 | 158220 |
|  46439 | 150345 |
|  47978 | 151929 |
|  47978 | 155709 |
|  66793 | 150052 |
|  80823 | 151768 |
|  80823 | 154459 |
| 109334 | 151484 |
| 109334 | 154885 |
| 109334 | 155377 |
| 109334 | 154888 |
| 109334 | 155190 |
| 205000 | 151596 |
| 205000 | 153715 |
| 237542 | 150994 |
| 237542 | 152687 |
| 238117 | 152220 |
| 253939 | 150378 |
| 253939 | 154227 |
| 253939 | 155513 |
| 254466 | 150754 |
| 254466 | 152576 |
| 254466 | 156286 |
| 266526 | 151080 |
| 266526 | 152710 |
| 276633 | 150467 |
| 276633 | 152412 |
| 279776 | 150740 |
| 493158 | 150993 |
| 493158 | 151565 |
| 493158 | 152208 |
| 493158 | 154376 |
+--------+--------+
36 rows in set (0.59 sec)

第二个查询
查询所有员工的姓和名

SELECT first_name, last_name FROM employees;

最后把第一个查询变为子查询来组合两个查询。

SELECT emp_no, first_name, last_name FROM employees WHERE emp_no IN (SELECT emp_no FROM salaries WHERE salary > 150000);

最后输出:

+--------+------------+-----------+
| emp_no | first_name | last_name |
+--------+------------+-----------+
|  43624 | Tokuyasu   | Pesch     |
|  46439 | Ibibia     | Junet     |
|  47978 | Xiahua     | Whitcomb  |
|  66793 | Lansing    | Kambil    |
|  80823 | Willard    | Baca      |
| 109334 | Tsutomu    | Alameldin |
| 205000 | Charmane   | Griswold  |
| 237542 | Weicheng   | Hatcliff  |
| 238117 | Mitsuyuki  | Stanfel   |
| 253939 | Sanjai     | Luders    |
| 254466 | Honesty    | Mukaidono |
| 266526 | Weijing    | Chenoweth |
| 276633 | Shin       | Birdsall  |
| 279776 | Mohammed   | Moehrke   |
| 493158 | Lidong     | Meriste   |
+--------+------------+-----------+
15 rows in set (2.27 sec)

这里的核心点是两个查询之间必须有一个共同点,有一个共同的列。这个列在两组查询中起到了相互连接的作用,在这个例子中emp_no就是共同的列。在子查询查询到薪水高于150000的员工后将emp_no传递给了外部查询的WHERE子句,相当于是外部查询中的WHERE子句变成了IN(43624,46439,47978,66793...)

多重子查询

查询在市场部门的员工姓名

SELECT first_name, last_name FROM employees WHERE emp_no IN(SELECT emp_no FROM dept_emp WHERE dept_no IN(SELECT dept_no FROM departments WHERE dept_name = 'Marketing'));

期间涉及到3张表,需要2次过滤最终得到了市场部门的所有员工姓名。