对mysql多表查询的理解

来源:互联网 发布:js对象数组重新赋值 编辑:程序博客网 时间:2024/05/18 00:00

   多表查询就是在多个有逻辑联系的表之间进行的查询,逻辑关系主要是指主外键之间的联系, 在主表中的某个字段的值取自另一个表中的一个字段,就是说主表中的一个字段的值包含于另一个表的一个字段的值的集合里 。这样的话,如果要在主表里插入数据,就必须是对应的字段的值在相应的表中存在,才有可能插入成功,如果不存在,则肯定插入不成功(除非此字段可以为空) 。要实现多表之间的查询就要依靠表连接或者是子查询的方式实现:

   表连接:

    普通多表查询:

         select 列1... from 表1,表2...
         where condition
         ...
          在from之后可以有很多表,每个表之间用,隔开,from后面的表会做笛卡尔积
          表与表之间做笛卡尔积,然后就能查询出来了

   内连接:

           select 列
           from 表1 别名 inner join 表2 别名 on 表1.列=表2.列,...
           condition...
           from开始,表1与表2进行笛卡尔积,每匹配一行的数据,就会通过on后条件判断
              是否成立,就将该行匹配的信息存放到临时表,否则不存放

   外连接:

        左外连接:左表中所有的记录都会被放到结果`集中,无论是否在右表是否存在匹配记录

            语法:select 列
                  from 表1 left outer join 表2 on 表1.列=表2.列
                       [left outer join 表3 on...]

        右外连接:不管是否成功匹配连接条件都会返回右表中的所有记录

            语法: select 列
                  from 表1 right outer join 表2 on 表1.列=表2.列
                       [left outer join 表3 on...]

        全外连接:(在mysql中没有全外连接,可以使用union实现

                     即是select...左连接 union select  ... 右连接...
            表1 full outer join 表2 on ...

   自连接:

        一张表与自己进行连接,
          select 列..
           from 表1 别名,表1 别名2
          where...
          ...
        select e1.empno,e1.ename,e1.mgr e2.empno,e2.ename
        from emp e1,emp e2
        where e1.empno = e2.mgr;

         ex:查找每个员工的直接上级领导的姓名:
          select ifnull(e1.ename,'boss') 领导,e2.ename
          from emp e1 right outer join emp e2 on e1.empno=e2.mgr;

   子查询:

       在查询中还可以有查询。外查询叫主查询,内部的叫子查询
        子查询先运行,子查询的结果作为主查询的值使用
      --子查询返回单个值   =
      --子查询返回多行一列  in
      --子查询返回一行多列  (,)in(,)
      --子查询返回多行多列   将条件一个一个拆开,然后将子查询得到的表在进行连接
                            连接之后可按下一步的条件进行查询,以此类推下去即可得到
                            符合条件的结果。在条件拆分的时候就是要月简单越好,并且
                            条件之间有相应的关系,最好是包含的关系,这样查询出来的
                            结果肯定是没有错的,并且在逻辑上也是很通的。也就各种子查询
                            并列或者是一个是另一个的子查询。

   注意:

        笛卡尔积其实就是前后先对应,然后就是后前对应,再是个个匹配,再按照条件去掉一部分,留下需要的形成一张新表。

     

 

0 0
原创粉丝点击