1、理解联结的概率(主要还是用于代替子查询)

    表为v9_admin_role和表v9_admin为两个单独的表,其中如下所示,红色部分表示表v9_admin_role的内容,绿色部分表示v9_admin的内容。如果执行了如下的sql语句以后,那么两个表的内容就会合并,行车独立的一行(既row)。


mysql> select * from v9_admin_role,v9_admin \G;

*************************** 1. row ***************************

       roleid: 1

     rolename: 超级管理员

  description: 超级管理员

    listorder: 0

     disabled: 0

       userid: 1

     username: phpcms

     password: 599ad78482cd3480ccc6361b55c1fe43

       roleid: 1

      encrypt: JM5Gsb

  lastloginip:

lastlogintime: 0

        email: phpcms@163.com

     realname:

         card:

         lang:

*************************** 2. row ***************************

       roleid: 2

     rolename: 站点管理员

  description: 站点管理员

    listorder: 0

     disabled: 0

       userid: 1

     username: phpcms

     password: 599ad78482cd3480ccc6361b55c1fe43

       roleid: 1

      encrypt: JM5Gsb

  lastloginip:

lastlogintime: 0

        email: phpcms@163.com

     realname:

         card:

         lang:


联结自后的where查询,相对于查询联结后的新表,eg:select * from v9_admin,v9_admin_role where v9.admin.roleid=v9_admin_role.roleid。其中v9.admin.roleid=v9_admin_role.roleid比较的内容,为上图所示的1.row,2.row中roleid的值(就相当于查询一个表的内容)。


如上所示,roleid在比较时,为什么要加表名,其原因在于,在联结后的一行(row)中,出现了两个相同的roleid,所以加表明是为了区分。如果不相同,那么和普通的where查询一直,如

select * from v9_admin,v9_admin_role where v9.admin.roleid=v9_admin_role.roleid and encrypt='JM5Gsb'  #因为encrypt在唯一的一列。


1、内部联结(如上的案例就是内部联结的一种)

mysql> select * from v9_admin inner join v9_admin_role;#另外的表示方式,效率更高

mysql>

select * from v9_admin inner join v9_admin_role on v9.admin.roleid=v9_admin_role.roleid

注意:条件查询时候用on代替where


2、自联结(as别名的使用)

出现的背景(同一张表查询的联结问题),如下所示就会出错

mysql> select * from v9_admin ,v9_admin ;

ERROR 1066 (42000): Not unique table/alias: 'v9_admin'


解决方法

mysql> select * from v9_admin as p1,v9_admin as p2 \G;

*************************** 1. row ***************************

       userid: 1

     username: phpcms

     password: 599ad78482cd3480ccc6361b55c1fe43

       roleid: 1

      encrypt: JM5Gsb

  lastloginip:

lastlogintime: 0

        email: phpcms@163.com

     realname:

         card:

         lang:

       userid: 1

     username: phpcms

     password: 599ad78482cd3480ccc6361b55c1fe43

       roleid: 1

      encrypt: JM5Gsb

  lastloginip:

lastlogintime: 0

        email: phpcms@163.com

     realname:

         card:

         lang:

1 row in set (0.00 sec)


3、外联(outer join)

概念:在执行条件查询的时候,对于不匹配的部分,用NULL进行填充,至于填充什么位置和left outer join、right outer join以及full outer join有关。如下案例所示。