两个表连接:相等连接,外连接,自连接
表dep: 表member:
1. 相等连接
通过两个表具有相同意义的列,可以建立相等连接条件。使用相等连接进行两个表的查询时,只有连接列上在两个表中都出现且值相等的行才会出现在查询结果中;下面两条语句的执行结果是一样的。
SELECT * FROM dep a,member b WHERE a.dep_id = b.dep_id; (SELECT * FROM dep a INNER JOIN member b ON a.dep_id = b.dep_id;)
2. 外连接
在相等连接中有一个问题:如果某个member的dep还没有填写,即保留为空,那么该member在查询中就不会出现; 为了解决这个问题可以用外连接,即除了显示满足相等连接条件的记录外,还显示那些不满足连接条件的行,不满足连接条件的行将显示在最后。注意图形红色的差异部分。
SELECT * FROM dep a LEFT JOIN member b ON a.dep_id = b.dep_id; (left join 是以from 后面的表为准,它的表中的数据会全部显示,包括不匹配的内容 )
SELECT * FROM dep a RIGHT JOIN member b ON a.dep_id = b.dep_id; (right join 是以join 后面的表为准,它的表中的数据会全部显示,包括不匹配的内容)
3. 自连接(一般用在树形权限结构中)
自连接就是一个表,同本身进行连接。对于自连接可以想像存在两个相同的表(表和表的副本),可以通过不同的别名区别两个相同的表。
SELECT CONCAT(a.member_name,' 的上级是:',b.member_name) FROM member a, member b WHERE a.member_sjid = b.member_id;
笛卡尔积:笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。
在操作多表联合查询时,若出现以下情况,将形成笛卡尔积
– 联接条件被省略
– 联接条件无效
– 第一个表中的所有行被联接到第二个表中的所有行上
注:主要内容来自于 http://www.cnblogs.com/linjiqin/archive/2011/04/13/2014497.html 请参考。