多表关系
一对多(多对一)->
多对多->
一对一->
概述
概述
多表查询分类
内连接
代码演示-->
-- 内连接演示
-- 1.查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现)
select emp.name, dept.name from emp,dept where emp.dept_id = dept.id;
结果-->
-- 2.查询每一个员工的姓名,及关联的部门的名称(显式内连接实现)
select e.name, d.name from emp e inner join dept d on e.dept_id = d.id;
结果-->
外连接
代码演示-->
-- 外连接演示
-- 1.查询emp表的所有数据,和相应的部门信息(左外连接)
select e.*,d.name from emp e left join dept d on e.dept_id = d.id;
结果-->
-- 2.查询dept表的所有数据,和相应的员工信息(右外连接)
select d.*,e.* from emp e right join dept d on e.dept_id = d.id;
结果-->
自连接
代码演示-->
-- 自连接演示
-- 1.查询员工 及其 所有领导的名字
select e1.*,e2.name from emp e1 join emp e2 where e1.managerid = e2.id;
结果:
-- 2.查询所有员工 emp 及其领导的名字 emp,如果员工没有领导
select e1.name,e2.name from emp e1 left join emp e2 on e1.managerid = e2.id;
结果:
联合查询-union, union all
代码演示->
-- 联合查询
-- 1.将薪资低于7000的员工和年龄大于50的员工全部查询出来
select * from emp where salary < 7000
union all
select * from emp where age > 50;
结果-->如果需要去重,将all删除
子查询
标量子查询
代码演示-->
-- 子查询
-- 标量子查询
-- 1.查询"销售部"的所有员工信息
select * from emp where dept_id = (select id from dept where name = '销售部');
结果:
-- 2.查询杨逍入职之后的员工信息
select * from emp where entrydate > (select entrydate from emp where name = '杨逍');
结果:
列子查询
代码演示-->
-- 列子查询
-- 1.查询"销售部"和"市场部"的所有员工信息
select * from emp where dept_id in (select id from dept where name = '销售部' or name = '市场部');
结果-->
-- 2.查询比财务部所有人工资都高的员工
select * from emp where salary > all (select salary from emp where dept_id = (select id from dept where name = '财务部'));
结果-->
-- 3.查询比财务部其中任意一人工资高的员工
select * from emp where salary > any (select salary from emp where dept_id = (select id from dept where name = '财务部'));
结果-->
行子查询
代码演示-->
-- 行子查询
-- 1.查询与"张无忌"的薪资及其直属领导相同的员工信息
select salary,managerid from emp where name = '张无忌';
select * from emp where (salary,managerid) = (select salary,managerid from emp where name = '张无忌');
结果-->
表子查询
代码演示-->
-- 表子查询
-- 1.查询与"杨苟","金庸"的职位和薪资相同的员工信息
select * from emp where (job,salary) in (select job,salary from emp where name = '杨苟' or name = '金庸');
结果:
-- 2.查询入职日期是"2005-01-01"之后的员工信息,及其部门信息
select e.*,d.* from (select * from emp where entrydate > '2005-01-01') e left join dept d on e.dept_id = d.id;
结果: