sqlserver——查询(四)——连接查询

目录

一.连接查询

分类:

 内连接:

        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;

  • 40
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值