两个表:
name表
id name
1 ru
2 ruge
3 ruye
4 rushen
score表
id score
1 120
2 130
4 150
5 110
1.内联
(1)不做限制
SELECT * FROM NAME AS NAME INNER JOIN score AS s ;
结果:
id name id score
------ ------ ------ --------
1 ru 1 120
2 ruge 1 120
3 ruye 1 120
4 rushen 1 120
1 ru 2 130
2 ruge 2 130
3 ruye 2 130
4 rushen 2 130
1 ru 4 150
2 ruge 4 150
3 ruye 4 150
4 rushen 4 150
1 ru 5 110
2 ruge 5 110
3 ruye 5 110
4 rushen 5 110
(2)id相等时
SELECT * FROM NAME AS n INNER JOIN score AS s ON n.`id`=s.`id`;
结果:
id name id score
1 ru 1 120
2 ruge 2 130
4 ruye 4 150
2、左外连接(left join 或者left outer join)
SELECT * FROM NAME AS n LEFT JOIN score AS s ON n.`id`=s.`id`;
结果:
id name id score
------ ------ ------ --------
1 ru 1 120
2 ruge 2 130
4 rushen 4 150
3 ruye (NULL) (NULL)
3、右外连接(right join或者right outer join)
SELECT * FROM NAME AS n RIGHT JOIN score AS s ON n.`id`=s.`id`;
结果:
id name id score
1 ru 1 120
2 ruge 2 130
4 ruye 4 150
\N \N 5 110
注:外联必须有查询条件
二、3表关联查询
没有限制条件时:
SELECT * FROM `stuname` nm INNER JOIN `stuaddress` address INNER JOIN `stuscore` score;
id name id address id score 1 ru 1 hebei 1 120 1 ru 2 beijing 1 120 2 ruge 1 hebei 1 120 2 ruge 2 beijing 1 120 3 ruye 1 hebei 1 120 3 ruye 2 beijing 1 120 4 rushen 1 hebei 1 120 4 rushen 2 beijing 1 120 1 ru 1 hebei 2 130 1 ru 2 beijing 2 130 2 ruge 1 hebei 2 130 2 ruge 2 beijing 2 130 3 ruye 1 hebei 2 130 3 ruye 2 beijing 2 130 4 rushen 1 hebei 2 130 4 rushen 2 beijing 2 130 1 ru 1 hebei 4 150 1 ru 2 beijing 4 150 2 ruge 1 hebei 4 150 2 ruge 2 beijing 4 150 3 ruye 1 hebei 4 150 3 ruye 2 beijing 4 150 4 rushen 1 hebei 4 150 4 rushen 2 beijing 4 150 1 ru 1 hebei 5 160 1 ru 2 beijing 5 160 2 ruge 1 hebei 5 160 2 ruge 2 beijing 5 160 3 ruye 1 hebei 5 160 3 ruye 2 beijing 5 160 4 rushen 1 hebei 5 160 4 rushen 2 beijing 5 160
有限制条件时:
SELECT * FROM `stuname` nm INNER JOIN `stuaddress` address ON nm.`id`=address.`id` INNER JOIN `stuscore` score ON nm.`id`=score.`id`;
id name id address id score
1 ru 1 hebei 1 120
2 ruge 2 beijing 2 130
三,另一个实例
SELECT permission_id,permission_name,permission_url,parent_id FROM tbpermissions WHERE permission_id>999999 AND permission_id<10000000 AND permission_id IN(
SELECT permission_id FROM tbrole_permissions WHERE role_id=(
SELECT role_id FROM tbuserinfo WHERE user_id='0'));
等价于下面的sql:
SELECT tm.* FROM tbpermissions tm INNER JOIN
(SELECT tpm.permission_id FROM tbrole_permissions tpm INNER JOIN tbuserinfo tu ON tpm.`role_id`=tu.`role_id` AND tu.`user_id`='0') tp
ON tm.permission_id>999999 AND tm.permission_id<10000000 AND tm.permission_id IN(tp.`permission_id`);