什么是子查询
1.一个select语句中包含另外一个完整的select语句
2.或者说两个以上select,那么就是子查询语句了
子查询出现的位置
1.where后,把select查询出的结果当做另外一个select的条件值
2.from后,把查询出的结果当作一个新表
使用
查询与项羽同一个部门人员工
先查出项羽所在的部门编号
SELECTdeptnoFROMempWHEREename ='项羽';
再根据编号查询同一部门的员工
SELECTenameFROMempWHEREdeptno =20;
把第1条查出来的结果当第2条语句的条件
SELECTename,deptnoFROMemp
WHEREdeptno = (SELECTdeptnoFROMempWHEREename ='项羽')
查询30号以内大于2000的薪水的人(放在from,是把这个语句当成一个表)
SELECTename,salary,deptnoFROMemp
WHEREdeptno =30;
SELECTenameFROM(SELECTename,salary,deptnoFROMempWHEREdeptno=30)ASs
WHEREs.salary >2000;
;
查询工资高于程咬金的员工
SELECTsalaryFROMempWHEREename ='程咬金';
SELECTename,salaryFROMemp
WHEREsalary > (SELECTsalaryFROMempWHEREename ='程咬金')
工资高于30号部门所有人的员工信息
先查出30号部门工资最高的那个人
SELECTMAX(salary)FROMempWHEREdeptno=30;
再到整个表中查询大于30号部门工资最高的那个人
SELECTename,salaryFROMemp
WHEREsalary > (SELECTMAX(salary)FROMempWHEREdeptno=30);
查询工作和工资与妲己已完全相同的员工信息
SELECTjob,salaryFROMempWHEREename='妲己';
SELECT*FROMemp
WHERE(job,salary)in(SELECTjob,salaryFROMempWHEREename='妲己');
SELECT*
FROMemp e,(SELECTjob,salaryFROMempWHEREename='妲己')ASr
WHEREe.job = r.jobANDe.salary = r.salary;
有2个以上直接下属的员工信息
SELECTmgr,GROUP_CONCAT(mgr),COUNT(mgr)FROMemp
GROUPBYmgrHAVINGCOUNT(mgr) >=2;
SELECT*FROMempWHERE
empnoin(SELECTmgr,GROUP_CONCAT(mgr),COUNT(mgr)FROMemp
GROUPBYmgrHAVINGCOUNT(mgr) >=2);
查询员工编号为7788的员工名称、员工工资、部门名称、部门地址
SELECTe.ename,e.salary,d.dname,d.local
FROMemp e,dept d
WHEREe.deptno = d.deptnoANDe.empno =7788;