一级目录
多表查询(连接查询)
内连接查询
内连接查询-只可以查询AB表中都匹配的行
(1)等值连接
select 字段 from A表 inner join B表 on 连接条件a.name=b.name (where)。。。
eg:员工对应的部门
select e.ename,d.dname from emp e inner join dept d on e.deptno = d.deptno;
(2)非等值连接
select 字段 from A表 inner join B表 on 条件
eg:员工的工资等级
select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
(3)自连接
eg:查询员工的名称和员工对应的领导名称 select a.ename empname ,b.ename leadername from emp a join emp b on a.mgr = b.empno;
外连接查询
外连接的查询结果条数 >= 内连接的查询结果条数
外连接–AB两张表,其中一张为主表、另一张为副表,主要查主表,带着查副表,外连接先将主表中的数据全部输出,在匹配副表,当副表中的数据与主表不匹配时 副表自动模拟空值与之匹配。
什么是外连接和内连接有什么区别?
外连接:AB两张表当中一张表是主表,另一张表是副表,主要查询主表中的数据,带着查询副表,当副表中的数据与主表匹配不上的时候,副表自动模拟出null与之匹配
区别:内连接没有主副之分,外连接有主副表之分
select 字段 from A表 left(right) join B表 on 条件。。
left join左边的为主表 right join右边的为主表
三表查询
三表查询
先连接AB表 再连接C表
子查询
子查询in,exists,any(任意一条件),union(连接,去重复),unionAll
什么是子查询?
select 语句当中嵌套select语句,被嵌套的select语句是子查询
子查询可以出现在哪里呢?
(1)where子句中使用子查询
找出高于平均薪资的员工信息
第一步:找出平均薪资
select avg(sal) from emp;
第二步:where过滤
select * from emp where sal>...
合并:select * from emp where sal>(select avg(sal) from emp);
(2)from 后面嵌套子查询
找出每个部门平均薪资的薪水等级
select pid,avg(sal) from emp group by pid;
select ename,distinct job from emp;//错误,ename有13条,job只有4条
注意:distinct只能出现在所有字段的最前面
select distinct pid,job from emp;
distinct在最前面表示后面所有字段联合起来去除重复
统计岗位的数量
select count(distinct job) from emp;
不足:对于多表查询不是很熟练。