文章目录
多表查询
1表连接查询
1.1笛卡尔积
笛卡尔积, 两表数据相乘
直接查看可以发现许多错误拼接的数据(脏数据)
select * from emp, dept;
– 乘积筛选后的结果, 两边能匹配上的数据
select * from emp, dept where emp.deptno = dept.deptno;
select * from emp e, dept d where e.deptno = d.deptno;
1.2内连接
1.2.1隐式内连接
隐式内连接:看不到 JOIN 关键字,条件使⽤ WHERE 指定
SELECT 字段名 FROM 左表, 右表 WHERE 条件;
1.2.2显示内连接
显示内连接:使⽤ INNER JOIN … ON 语句,可以省略 INNER
SELECT 字段名 FROM 左表 [INNER] JOIN 右表 ON 条件;
1.3外连接
1.3.1左外连接
左外连接:使⽤ LEFT OUTER JOIN … ON, OUTER 可以省略
SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件
在内连接的基础上,保证左边的表的数据全部展示
1.3.2右外连接
右外连接:使⽤ RIGHT OUTER JOIN … ON, OUTER 可以省略
SELECT 字段名 FROM 左表 RIGHT [OUTER] JOIN 右表 ON 条件
在内连接的基础上,保证右边的表的数据全部展示
子查询
子查询,查询中嵌套查询,使用另一个查询的结果
1.子查询的结果是单行单列的结果,值可以直接比较
-- 查询公司中最高薪资的员工姓名和所在的部门编号、
select max(sal) from emp;
select ename,deptno from emp where sal =5000;
-- 组合
select ename,deptno from emp where sal=(select max(sal) from emp);
2.子查询结果是单列多行的,集合 in\not in>any<all
-- 查询部门 平均薪资高于1800的部门 中所有员工的信息
select deptno from emp group by deptno having avg(sal)>1800;
select * from emp where deptno in
(select deptno from emp group by deptno having avg(sal)>1800);
3.子查询是多行多列的,作为一张临时表来使用
-- 查询薪资大于所在部门平均薪资的所有员工信息
select * from emp;
-- 子查询作为临时表使用
select avg(sal) s_avg,deptno from emp group by deptno;
-- 组合
select * from emp e
join (select avg(sal) s_avg,deptno from emp group by deptno) d
on e.deptno=d.deptno
where e.sal>d.s_avg;
4.子查询用于的语句
⼦查询结果只要是单列,则在 WHERE 后⾯作为条件
⼦查询结果只要是多列,则在 FROM 后⾯作为表进⾏⼆次查询