一:多表查询
1、什么是多表查询?
在多个表中查询需要的数据
例如:有班级表 和学生表
给你已给班级名称 请查询所有的学员数据
先查班级表 得到一个班级的id 再根据id去学院表查询对应的学员
准备数据: create table emp (id int,name char(10),sex char,dept_id int); insert emp values(1,"大黄","m",1); insert emp values(2,"老王","m",2); insert emp values(3,"老李","w",30); create table dept (id int,name char(10)); insert dept values(1,"市场"); insert dept values(2,"财务"); insert dept values(3,"行政");
2、多表查询的方式
1.笛卡尔积查询
什么是笛卡尔积,用坐标中的一条记录 去链接另一张表的所有记录
就像是把 两张表的数据做了一个乘法
这将导致 产生大量的无用重复数据
我们要的效果是:员工表中的部门id 与 部门表中的id相同 就拼接在一起
用 where 筛选出正确的数据
select *from emp,dept where emp.dept_id = dept.id;
on关键字
作用: 用于多表查询是 进行条件限制
select *from emp,dept on emp.dept_id = dept.id; 这是错误的语法 ,因为 on 它只能用在专门多表查询语句中
2.内连接查询
inner join
select *from emp inner join dept on emp.dept_id = dept.id;# 查询 所有的员工以及他们所属的部门信息
3.左外连接
left join 左边表中的数据完全显示 右边表中的数据匹配上才显示
select *from emp left join dept on emp.dept_id = dept.id; # 查询 所有的部门以及他们所有的员工信息
4 .右外连接
right join 左边表中的数据匹配上才显示 右边表中的数据完全显示
select *from emp right join dept on emp.dept_id = dept.id;# 在一个表中 显示多个表中的所有数据
5. 全外链接
full join mysql不支持 oracle支持
可以通过union 间接实现
union 表示合并查询 意思是把多个查询结果合并在一起显示,
要求是 被合并的表结构必须相同,默认去除重复
合并但是不去除重复 union all
select *from emp right join dept on emp.dept_id = dept.id
union
select *from emp left join dept on emp.dept_id = dept.id;
总结:多表链接 在书写时 按照填空来书写 如果左边要全部显示 用left join
右边全部显示 用right join
全部显示 把左链接的结果和右链接的结果 合并
当然 也可以更多表一起查 但是 没有意义 并且你要尽量避免 太多表 一起查
最多三张 在多对多的时候
select *from emp left join dept left join xxtable on emp.dept_id = dept.id;
二:子查询
什么是子查询:将上一次查询的结果 作为本次查询的原始数据(或是查询条件)
需求 查询出工资最高的人的信息 先查询出 财务部 最高工资是多少 拿着最高工资 去表中看 谁的工资和最高工资匹配
select *from emp where salary = (select max(salary) from emp);