目录
一.连接查询
分类:
内连接:
1. select ... from A,B ;
2. select ..from A,B where ..;
3.select ...,... from A join B on...
4. where 与 join...on 的区别
5. where位置的先后
导语:连接查询用于多表查询,是数据库查询操作的核心,在实际中一定会使用到的,难度比较大;
一.连接查询
将两个表或多个表连接起来,检索出满足条件的数据;
分类:
内连接 外连接 完全连接 交叉连接 自连接 联合
内连接:
1. select ... from A,B ;
结果:产生一个临时表(笛卡尔积),临时表的行数=表A行数*表B行数;列数=表A列数+表B列数;
2. select ..from A,B where ..;
结果:对产生的笛卡尔积使用where进行过滤;
明白了上面两个语句,我们就可以理解下面的语句了;
3.select ...,... from A join B on...
select emp.ename as "员工姓名" , dept.dname as "部门名称" --查询表的某一列使用 【表.字段名】
from emp
join dept --join是连接的意思,后面所跟连接的表
on 1=1 ; --on 后面是连接的条件;
不使用 join ...on,使用 where 也可以
select *
from emp , dept
where emp.deptno=dept.deptno
order by emp.deptno;
4. where 与 join...on 的区别
select ...,...from A ,B where ...... 这是sql 92标准;
select ...,... from A join B on ...... 这是sql99标准;
两者得到的结果是相同的,但是更推荐大家使用sql99标准。
下面我们通过连接三张表来体会一下sql99与sql92标准的区别;
我们先连接三张表,主要思路是先连接两张表,再使用生成的临时表去连接第三张表;
select *
from emp
join dept
on 1 = 1
join salgrade
on 3 > 2 ;
我们再好好地设置条件,对这三张表进行过滤;
--sql99标准
select *
from emp
join dept
on emp.deptno = dept.deptno
join salgrade
on emp.sal >= salgrade.losal and emp.sal <= salgrade.hisal
where emp.sal > 2000 ;
这里需要强调的是 emp.sal >= salgrade.losal and emp.sal <= salgrade.hisal ,虽然前面我们说是前面两个表形成的临时表与第三张表连接,但是在使用的时候我们不会给临时表取名字,使用其名字进行操作,例如temporary.sal >= salgrade.losal and temporary.sal <= salgrade.hisal ( temporary 为临时表名 ),我们仍旧使用原先的表名进行操作。因为在实际操作中,可能会连接上百张表,如果每次连接都给临时表取名字的话,恐怕连名字都记不住,更别谈操作了;
我们再使用 sql92 的标准进行操作 :
--sql92标准
select *
from emp , dept,salgrade
where emp.deptno = dept.deptno and (emp.sa l>= salgrade.losal and emp.sal <= salgrade.hisal) and emp.sal > 2000 ;
显而易见,sql99标准更加容易理解,sql 92把条件都堆放在 where 后面,而且条件的顺序可以调整,显得逻辑不太清晰;
5. where位置的先后
我们会过头来再看一下这个语句;
如果我们将 where 过滤的 emp.sal > 2000,放在前面如何?他不是先连接再过滤的吗?咱们把他放前面相当于先过滤再连接,反而减少了工作量,提高了查询效率,这样行不行呢?
--sql99标准
select *
from emp
join dept
on emp.deptno = dept.deptno
join salgrade
on emp.sal >= salgrade.losal and emp.sal <= salgrade.hisal
where emp.sal > 2000 ;
答案是不行的!至于为什么就需要大家充分发挥自己的聪明才智了,总之,我们记住就可以了。
select *
from emp
join dept
where emp.sal>2000
on emp.deptno=dept.deptno
join salgrade
on emp.sal>=salgrade.losal and emp.sal<=salgrade.hisal;