MySQL数据库的子查询
1. 子查询
- 定义:子查询即一个查询语句嵌到另一个查询语句的子句中;可以出现在另一个查询的列中,where子句中,from子句中等。
例如:通过子查询实现一个自身连接的功能,显示员工与领导的关系
自身连接:
mysql> select A.ename 员工 , B.ename 领导 from EMP A, EMP B where A.mgr = B.empno;
子查询:
mysql> select ename 员工 ,(select ename from EMP where empno = e.mgr) 领导 from EMP e;
两者都能得到如下结果:
+--------+--------+
| 员工 | 领导 |
+--------+--------+
| xxxx | CLARK |
| SMITH | FORD |
| ALLEN | BLAKE |
| WARD | BLAKE |
| JONES | KING |
| MARTIN | BLAKE |
| BLAKE | KING |
| CLARK | KING |
| SCOTT | JONES |
| TURNER | BLAKE |
| ADAMS | SCOTT |
| JAMES | BLAKE |
| FORD | JONES |
| MILLER | CLARK |
+--------+--------+
例如:查找出工资大于SMITH的员工
1. 先查找出SMITH的工资
select sal from EMP where ename = 'SMITH';
2. 在查找出所有工资
select * from EMP where sal;
3. 将sal和SMITH的工资作比较
select * from EMP where sal > (select sal from EMP where ename = 'SMITH');
2. any/all
- 小于any,小于子查询中的某个值。等价于
例如:查询工资小于销售员某个员工的信息
mysql> select * from EMP where sal < any (select sal from EMP where job = 'SALESMAN');
例如:查询工资大于所有销售员的信息
mysql> select * from EMP where sal > all(select sal from EMP where job = 'SALESMAN');
3. exists
- exists 存在性条件判断
- 若内层查询非空,则外层的where子句返回真值,否则返回假。not exists相反。
例如:列出与Scott从事相同工作的所有员工
mysql> select * from EMP e where exists (select * from EMP where ename = 'SCOTT' and e.job = job);
//当exists后的语句(内层查询)非空,则外层where子句返回查询结果。