1.表链接查询
1.1内连接
⽤左边表的记录去匹配右边表的记录,如果符合条件的则显示。
1.1.1隐式内连接
隐式内连接:看不到 JOIN 关键字,条件使⽤ WHERE 指定。
1.1.2显示内连接
显示内连接:使⽤ INNER JOIN ... ON 语句,可以省略 INNER。
1.1.3内连接查询步骤
1. 确定查询哪些表 2. 确定表连接的条件 3. 确定查询的条件 4. 确定查询的字段
1.2外连接
1.2.1左外连接
左外连接:使⽤ LEFT OUTER JOIN ... ON,OUTER 可以省略。⽤左边表的记录去匹配右边表的记录,如果符合条件的则显示;否则,显示 NULL。 即:在内连接的基础上保证左表的数据全部显示
1.2.2右外连接
类似左外连接;
2.子查询
⼦查询的概念:
1. ⼀个查询的结果做为另⼀个查询的条件
2. 有查询的嵌套,内部的查询称为⼦查询
3. ⼦查询要使⽤括号。
2.1⼦查询结果的三种情况
2.1.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.1.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);
2.1.3.子查询结果是多行多列的,作为一张临时表使用
-- 查询薪资大于所在部门平均薪资的所有员工信息
select * from emp;
select avg(sal),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;
可以用子查询的字句: from where having select
-- 查询部门平均薪资 大于 公司平均薪资
select avg(sal) from emp;
select AVG(sal),deptno from emp group by deptno
having avg(sal) > (select avg(sal) from emp);
2.2 子查询总结:
⼦查询结果只要是单列,则在 WHERE 后⾯作为条件
⼦查询结果只要是多列,则在 FROM 后⾯作为表进⾏⼆次查询。