image.png

  1. -- 联合查询 union(单独用可以去重复) union all(将结果合并之后不会去重复)
  2. -- 将薪资低于5000的员工,和年龄大于50岁的员工全部查询出来
  3. select * from emp where salary<5000 -- union用于两张表的结果合并 (这里用or也可以实现,但是效率低) -- orand用于结果判断
  4. union
  5. select * from emp where age>50; -- 使用union 的时候,select查询后的字段一定要一样,否则会报错

————————————-子查询———————————————————-

image.png

1.标量子查询

image.png
image.png
image.png

  1. -- ----------------------------------------标量子查询------------------------------------------------------
  2. -- 1.查询“销售部"的所有员工信息
  3. -- 首先要查询”销售部“部门ID,
  4. select id from dept where name = '销售部';
  5. -- 其次根据部门id,查询员工信息 -- 因为emp表的dept_id绑定了dept表的id
  6. select * from emp where dept_id = (select id from dept where name = '销售部'); -- 子查询要用括号括起来
  7. -- 2.查询在”金庸“入职之后的员工信息
  8. -- 首先先查询”金庸的入职日期“
  9. select entrydate from emp where name = '金庸';
  10. -- 然后再查询入职之后的员工信息 -- 子查询的操作符可以是><=
  11. select * from emp where entrydate>(select entrydate from emp where name = '金庸');

————————————————-列子查询——————————————

image.png

  1. -- 列子查询 (查询的结果是一列多行)
  2. -- 查询”销售部“和”市场部“的所有员工信息
  3. -- 首先查询”销售部“和市场部的员工id
  4. select id from dept where name= '销售部' or name = '市场部';
  5. -- 然后根据查询的id来坐条件查询员工 -- in包含
  6. select * from emp where dept_id in (select id from dept where name= '销售部' or name = '市场部');
  7. -- 查询比财务部所有人工资都高的员工信息
  8. -- 首先先查询财务部的人员的工资
  9. select id from dept where name = '财务部'; -- 先查财务部,然后合并
  10. select salary from emp where dept_id = (select id from dept where name = '财务部'); -- 查询财务部的工资
  11. -- 然后查询比财务部所有人员工资都高的员工信息 -- all 关键字,要满足括号里面所有的条件(一列多行)都要满足
  12. select * from emp where salary>all (select salary from emp where dept_id = (select id from dept where name = '财务部'));
  13. -- 3.查询比研发部其中任意一人工资的员工信息
  14. -- 首先先查询研发部的员工工资信息
  15. select id from dept where name = '研发部';
  16. select salary from emp where dept_id = (select id from dept where name = '研发部');
  17. -- 然后查询比研发部其中任意一人工资的员工信息 -- 关键字any >any表示比括号里面查询到的工资都要高 anysome一样的效果,只要满足括号中的任意一种条件就行
  18. select * from emp where salary> any (select salary from emp where dept_id = (select id from dept where name = '研发部'));

————————————行子查询———————————————————————

image.png

  1. -- 行子查询
  2. -- 1.查询与”金庸33“的薪资及直属领导相同的员工信息
  3. -- 首先查询与”金庸33“的新资和直属领导
  4. select salary,managerid from emp where name = '金庸33';
  5. -- 然后查询与金庸33的薪资及其直属领导相同的员工信息
  6. # select * from emp where salary= 20000 and managerid = 1;
  7. -- salary= 20000 and managerid = 1 可写成 ( salary ,managerid) = (20000,1)
  8. select * from emp where (salary,managerid) = (select salary,managerid from emp where name = '金庸33');

—————————————————表子查询——————————————————-

image.png

  1. -- 表子查询
  2. -- 查询与”金庸33“,“金庸44”的职位和薪资相同的员工信息
  3. -- 首先先查询”金庸33“,“金庸44”的职位和薪资
  4. select job,salary from emp where name= '金庸33' or name = '金庸44';
  5. -- 然后查询与”金庸33“,“金庸44”的职位和薪资相同的员工信息
  6. select * from emp where (salary,job) in (select job,salary from emp where name= '金庸33' or name = '金庸44');
  7. -- 2.查询入职日期是“2006-01-01”之后的员工信息,及其部门信息
  8. -- a.先查询入职日期是“2006-01-01”之后的员工信息
  9. select * from emp where entrydate>'2006-01-01'; -- 表子查询一般接from后面,因为是往生成的新表后面继续查
  10. -- b.查询这部分员工的部门信息 -- 再表子查询后面 添加一个别名,然后用左外连接,显示表1的所有信息
  11. select * from (select * from emp where entrydate>'2006-01-01') e left join dept d on e.dept_id= d.id;