利用子查询进行过滤
简单来说将就是利用一条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次过滤最终得到了市场部门的所有员工姓名。