笛卡尔积, 两表数据相乘
直接查看可以发现许多错误拼接的数据(脏数据)
select * from emp, dept;
– 乘积筛选后的结果, 两边能匹配上的数据
select * from emp, dept where emp.deptno = dept.deptno; select * from emp e, dept d where e.deptno = d.deptno;
隐式内连接:看不到 JOIN 关键字,条件使⽤ WHERE 指定
SELECT 字段名 FROM 左表, 右表 WHERE 条件;
显示内连接:使⽤ INNER JOIN … ON 语句,可以省略 INNER
SELECT 字段名 FROM 左表 [INNER] JOIN 右表 ON 条件;
左外连接:使⽤ LEFT OUTER JOIN … ON, OUTER 可以省略
SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件
在内连接的基础上,保证左边的表的数据全部展示
右外连接:使⽤ RIGHT OUTER JOIN … ON, OUTER 可以省略
SELECT 字段名 FROM 左表 RIGHT [OUTER] JOIN 右表 ON 条件
在内连接的基础上,保证右边的表的数据全部展示
子查询,查询中嵌套查询,使用另一个查询的结果
-- 查询公司中最高薪资的员工姓名和所在的部门编号、 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);
-- 查询部门 平均薪资高于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);
-- 查询薪资大于所在部门平均薪资的所有员工信息 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;
⼦查询结果只要是单列,则在 WHERE 后⾯作为条件 ⼦查询结果只要是多列,则在 FROM 后⾯作为表进⾏⼆次查询