-- 联合查询 union(单独用可以去重复) union all(将结果合并之后不会去重复)
-- 将薪资低于5000的员工,和年龄大于50岁的员工全部查询出来
select * from emp where salary<5000 -- union用于两张表的结果合并 (这里用or也可以实现,但是效率低) -- or和and用于结果判断
union
select * from emp where age>50; -- 使用union 的时候,select查询后的字段一定要一样,否则会报错
————————————-子查询———————————————————-
1.标量子查询
-- ----------------------------------------标量子查询------------------------------------------------------
-- 1.查询“销售部"的所有员工信息
-- 首先要查询”销售部“部门ID,
select id from dept where name = '销售部';
-- 其次根据部门id,查询员工信息 -- 因为emp表的dept_id绑定了dept表的id
select * from emp where dept_id = (select id from dept where name = '销售部'); -- 子查询要用括号括起来
-- 2.查询在”金庸“入职之后的员工信息
-- 首先先查询”金庸的入职日期“
select entrydate from emp where name = '金庸';
-- 然后再查询入职之后的员工信息 -- 子查询的操作符可以是><=
select * from emp where entrydate>(select entrydate from emp where name = '金庸');
————————————————-列子查询——————————————
-- 列子查询 (查询的结果是一列多行)
-- 查询”销售部“和”市场部“的所有员工信息
-- 首先查询”销售部“和市场部的员工id
select id from dept where name= '销售部' or name = '市场部';
-- 然后根据查询的id来坐条件查询员工 -- 用in包含
select * from emp where dept_id in (select id from dept where name= '销售部' or name = '市场部');
-- 查询比财务部所有人工资都高的员工信息
-- 首先先查询财务部的人员的工资
select id from dept where name = '财务部'; -- 先查财务部,然后合并
select salary from emp where dept_id = (select id from dept where name = '财务部'); -- 查询财务部的工资
-- 然后查询比财务部所有人员工资都高的员工信息 -- all 关键字,要满足括号里面所有的条件(一列多行)都要满足
select * from emp where salary>all (select salary from emp where dept_id = (select id from dept where name = '财务部'));
-- 3.查询比研发部其中任意一人工资的员工信息
-- 首先先查询研发部的员工工资信息
select id from dept where name = '研发部';
select salary from emp where dept_id = (select id from dept where name = '研发部');
-- 然后查询比研发部其中任意一人工资的员工信息 -- 关键字any >any表示比括号里面查询到的工资都要高 any和some一样的效果,只要满足括号中的任意一种条件就行
select * from emp where salary> any (select salary from emp where dept_id = (select id from dept where name = '研发部'));
————————————行子查询———————————————————————
-- 行子查询
-- 1.查询与”金庸33“的薪资及直属领导相同的员工信息
-- 首先查询与”金庸33“的新资和直属领导
select salary,managerid from emp where name = '金庸33';
-- 然后查询与金庸33的薪资及其直属领导相同的员工信息
# select * from emp where salary= 20000 and managerid = 1;
-- salary= 20000 and managerid = 1 可写成 ( salary ,managerid) = (20000,1)
select * from emp where (salary,managerid) = (select salary,managerid from emp where name = '金庸33');
—————————————————表子查询——————————————————-
-- 表子查询
-- 查询与”金庸33“,“金庸44”的职位和薪资相同的员工信息
-- 首先先查询”金庸33“,“金庸44”的职位和薪资
select job,salary from emp where name= '金庸33' or name = '金庸44';
-- 然后查询与”金庸33“,“金庸44”的职位和薪资相同的员工信息
select * from emp where (salary,job) in (select job,salary from emp where name= '金庸33' or name = '金庸44');
-- 2.查询入职日期是“2006-01-01”之后的员工信息,及其部门信息
-- a.先查询入职日期是“2006-01-01”之后的员工信息
select * from emp where entrydate>'2006-01-01'; -- 表子查询一般接from后面,因为是往生成的新表后面继续查
-- b.查询这部分员工的部门信息 -- 再表子查询后面 添加一个别名,然后用左外连接,显示表1的所有信息
select * from (select * from emp where entrydate>'2006-01-01') e left join dept d on e.dept_id= d.id;