SQL入门第三篇——连接查询
简介:
什么是连接查询• 从一张表跨越到另一张表进行查询,叫做跨表查询,多张表联合起来查询数据,称为连接查询• 连接查询的分类:SQL92:1992年出现的语法SQL99:1999年出现的语法;我们学习这个• 那么表之间的连接方式又有哪些呢?• 内链接:等值连接,非等值连接,自连接• 外连接:左外连接(左连接)右外连接(右连接)
SQL入门第三篇——连接查询
什么是连接查询
- 从一张表跨越到另一张表进行查询,叫做跨表查询,多张表联合起来查询数据,称为连接查询
- 连接查询的分类:SQL92:1992年出现的语法SQL99:1999年出现的语法;我们学习这个
- 那么表之间的连接方式又有哪些呢?
- 内链接:等值连接,非等值连接,自连接
- 外连接:左外连接(左连接)右外连接(右连接)
内连接之等值连接
- 案例:查询每个员工所以在部门名称,显示员工工名和部门名
SQL92语法:
seleet
e.ename,d.dname
from
emp e,dept d
where
e.deptno =d.deptno;
缺点:结构不清晰,表的连接条件和后期进一步筛选的条件,都放到了where后面
SQL99语法:
select
e.ename,d.dname
from
emp e
inner(inner可以省略) join
dept d
on
e.deptno=d.deptno;
优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后面添加where
内连接之非等值连接
- 案例:找出每个员工的薪资等级,要求显示员工名,薪资,薪资等级
select e.ename,e.sal,s.grade from emp e join salary s on e.sal between s.losal and s.hisal;-- 条件不是一个等量关系为非等值连接
内连接之自连接
- 案例:查询员工的上级领导,要求显示员工名和对应的领导名
select e.name as '员工名',b.ename as ‘领导名’ from emp a join emp b on a.mgr=b.empno;需要将一张表看成是两张表连在一起
外连接(右外连接)
- select e.ename,d.dname from emp e right join dept d on e.deptno = d.deptno;
right代表将join关键字右边的这张表看成是主表,主要是为了将外连接当中,两张表连接,产生了主次关系
- 左外连接与右外连接差不多,交换一下顺序就行,两者可以互换
- 如果三张表,四张表怎么连接
- 语法:
- select
...
from
a
join
b
on
a和b的连接条件
right join
c
on
a和c的连接条件
- 一条SQL中内连接和外连接可以混合
子查询
- 也叫select嵌套查询
- 案例:找出比最低工资高的员工姓名和工资
第一步:先找出最低工资
select min(sal) from emp;
第二部:找出>800的
select ename,sal from emp where sal > 800;
合并:select ename,sal from emp where sal > (select min(sal) from emp);
- from子句中的子查询
- 案例:找出每个岗位的平均工资的薪资等级
- 第一步:找出每个岗位的平均工资
select job,avg(sal) form emp gruop by job;
- 第二步:将以上表看成真实存在的表做成t表
select
t.*,s.grade
from
(select job,avg(sal) as avgsal form emp gruop by job) t
join
salgrade s
on
t.avgsal between s.losal and s.hisal;
- 这里from后面子查询可以看成一张临时表(技巧)
union合并查询结果集
- 案例:查询工作岗位是MANAGER和SALESMAN的员工
- select ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
- select ename,job from emp where job in('MANAGER','SALESMAN');
- select ename,job from emp where job='MANAGER' union select ename,job from emp where job='SALESMAN';
- 实际的情况是union的效率要高一些。对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积,成倍的翻。但是union可以减少匹配的次数。在减少匹配次数的情况下,还可以完成两个结果集的拼接(就像把*变成了+)
limit(起始下标,取多长)
- 是将查询结果集的一部分取出来,通常使用在分页查询当中
- 案例:取出工资排名在[3-5]名的员工
select ename,sal from emp order by sal desc limit 2,3;从下标2也就是第三条开始取,取三条记录
- 公式就是limit (页码-1)*页码长度,页码长度