子查询

###查询工资 高于 JONES 的员工
(1)先查JONES的工资。
select sal from emp where ename = 'JONES';
(2)他的工资作为条件
select * from emp where sal > (第一步得到工资)

(3)合并
select
*
from
emp
where
sal > (select sal from emp where ename = 'JONES');

##查询与SCOTT同一个部门的员工

select
*
from
emp
where
deptno = (select deptno from emp where ename = 'SCOTT');

##工资高于30号部门所有人的员工信息
##(1)查询30部门的所有人的工资
select sal from emp where deptno = 30;
##(2)查询高于30部门所有员工的信息
select
*
from
emp


where
sal > ALL (第一步所有的值)
##(3)合并
select
*
from
emp
where
sal > ALL (select sal from emp where deptno = 30);


=============多行多列============
##查询 工作(job) 和 工资(sal) 与 MARTIN 完全一样的员工信息
#(1)查看MARTIN的 工作和工资
select job,sal from emp where ename = "MARTIN";
+----------+---------+
| job | sal |
+----------+---------+
| SALESMAN | 1250.00 |
+----------+---------+
| SALESMAN | 150.00 |
+----------+---------+

#(2)根据员工信息
select
*
from
emp
where
(job,sal) in (第一步结果)

##(3)合并之后
select
*
from
emp
where
(job,sal) in (select job,sal from emp where ename = "MARTIN") ;


==================多行单列--------
##找出有员工的部门信息
##(1)找出所有 有员工的部门ID
select distinct deptno from emp;
+--------+
| deptno |
+--------+
| 30 |
| 20 |
| 10 |
+--------+

##(2)找部门信息
select * from dept where deptno in (第一步的结果)

##(3)合并
select * from dept where deptno in (select distinct deptno from emp);

##查询有2个以上直接下属的员工信息
##(1)找出各个领导的下属人数

select mgr, count(*) as cnt from emp group by mgr ;

+------+-----+
| mgr | cnt |
+------+-----+
| NULL | 1 |
| 7566 | 2 |
| 7698 | 5 |
| 7782 | 1 |
| 7788 | 1 |
| 7839 | 3 |
+------+-----+

select
t.mgr,t.cnt
from
(
select mgr, count(*) as cnt from emp group by mgr
) t
where
t.cnt > 2;

+------+-----+
| mgr | cnt |
+------+-----+
| 7698 | 5 |
| 7839 | 3 |
+------+-----+

posted @ 2021-04-19 09:02  共你、  阅读(54)  评论(0)    收藏  举报