MySQL--多表查询--概述

多表查询--笛卡尔积

部门表

员工表 

 笛卡尔积展示

 

 消除多余的笛卡尔积

-- 多表查询----笛卡尔积
select *from emp,dept where emp.dept_id=dept.id;

 

 多表查询分类

连接查询--内连接

-- 内链接演示
-- 1、查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现)
-- 表结构 :emp dept
-- 连接条件:emp.dept_id = dept.id

select emp.name,dept.name from emp, dept where emp.dept_id = dept.id;

select e.name,d.name from emp e ,dept d where e.dept_id = d.id;
-- 起别名以后 就不能使用原名了,所以要加强对于执行顺序的记忆
-- 2、查询每一个员工的姓名 ,及关联的部门的名称(显式内连接实现) ---INNER JOIN... ON...
-- inner 可以省略
select e.name,d.name from emp e inner join dept d on e.dept_id = d.id;

select e.name,d.name from emp e join dept d on e.dept_id = d.id;

连接查询--外连接

 

-- 外连接演示
-- 1、查询 emp表的所有数据,和对应的部门信息(左外连接)
-- 表结构:emp,dept
-- 连接条件:emp.dept_id = dept.id;

select e.*,d.name from emp e left outer join dept d on e.dept_id = d.id;
-- outer 可以省略
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 outer join dept d on e.dept_id = d.id;

select d.*,e.* from dept d left outer join emp e on e.dept_id=d.id;
-- 通常会用左表来查询数据,因为左表也能实现右表的功能
左外连接

右外连接

连接查询--自连接

 

-- 自连接
-- 1、查询员工 及其 所属领导的名字
-- 表结构:emp
select a.name,b.name from emp a,emp b where a.managerid=b.id;


-- 2、查询所有员工 emp 及其领导的名字 emp ,如果员工没有领导,也需要查询出来
-- 表结构 emp a, emp b

select  a.name '员工' ,b.name '领导' from emp a left join emp b on a.managerid = b.id;

-- 其中left的目的是为了查询出直属领导为null的员工

联合查询

-- union all,union
-- 1、将薪资低于5000的员工,和年龄大于50岁的员工全部查询出来

select * from emp where salary < 5000
union all
select * from emp where age > 50;

-- 去重操作 去除all
select * from emp where salary < 5000
union
select * from emp where age > 50;

子查询

标量子查询

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

-- 标量子查询
-- 1、查询 “销售部” 的所有员工信息
-- a.查询 “销售部” 部门ID
select id from dept where name = '销售部';

-- b.根据销售部部门ID,查询员工信息
select * from emp where dept_id = 4;

-- 可以合并为标量子查询
select * from emp where dept_id = (select id from dept where name = '销售部');


-- 2、查询在 “方东白” 入职之后的员工信息
-- a. 查询 方东白 的入职日期
select entrtdate from emp where name = '方东白';

-- b.查询指定入职日期之后入职的员工信息
select * from emp where entrtdate > '2009-02-12';

-- 可以合并为标量子查询
select * from emp where entrtdate > (select entrtdate from emp where name = '方东白');
案例1: 
a.

b.

案例2:
a.

b.

列子查询

-- 列子查询
-- 1、查询 “销售部” 和 “市场部”  的所有员工信息
-- a. 查询 “销售部” 和 “市场部” 的部门ID
select id from dept where name = '销售部' or name = '市场部';

-- b. 根据部门ID, 查询员工信息
select * from emp where dept_id in(2,4);

select * from emp where dept_id in(select id from dept where name = '销售部' or name = '市场部');

-- 2、查询比财务部所有人工资都高的员工信息
-- a.查询所有 财务部 人员的工资
select id from dept where name = '财务部';

select salary from emp where dept_id = (select id from dept where name = '财务部');
-- b.比 财务部 所有人工资都高的员工信息

select  * from emp where salary > all (select salary from emp where dept_id = (select id from dept where name = '财务部'));

-- 3、查询比研发部其中任意一人 工资高的员工信息
-- a.查询研发部所有人工资
select id from dept where name = '研发部';

select salary from emp where dept_id = (select id from dept where name = '研发部');
-- b.比研发部其中任意一人工资高的员工信息
select  * from emp where salary > any (select salary from emp where dept_id = (select id from dept where name = '研发部'));


-- all是与最大值相比
-- any或者some是与最小值相比
案例1:
a.

b.

案例2:
a.

b.

案例3:
a.

b.

行子查询

-- 行子查询
-- 1、查询与 “张无忌”的薪资与直属领导相同的员工信息
-- a。查询“张无忌”的薪资以及直属领导
select salary,managerid from emp where name = '张无忌';

-- b.查询与"张无忌"的薪资及直属领导
select * from emp where (salary,managerid) = (select salary,managerid from emp where name = '张无忌');
案例1:
a.

b.

表子查询

-- 表子查询
-- 1、查询与 “鹿杖客”,“宋远桥” 的职位和薪资相同的员工信息
-- a.查询 “鹿杖客” ,“宋远桥” 的职位和薪资
select job,salary from emp where name in('宋远桥','鹿杖客');

-- b.查询与 “鹿杖客”,“宋远桥” 的职位和薪资相同的员工信息
select * from emp where (job,salary) in (select job,salary from emp where name in('宋远桥','鹿杖客'));


-- 2、查询入职日期是“2006-01-01” 之后的员工信息,及其部门信息
-- a.入职日期是“2006-01-01” 之后的员工信息
select * from emp where entrtdate > '2006-01-01';

-- b. 查询这部分员工,对应的部门信息
select e.*,d.* from (select * from emp where entrtdate > '2006-01-01') e left join dept d on e.dept_id = d.id;
案例1:
a.

b.

案例2:
a.

b.

 

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值