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有关。如下案例所示。