现有两张表
tablea 和 tableb
各种连接
1、笛尔卡积
SELECT * FROM TabA a,TabB b where a.id = b.id /*笛尔卡积乘积*/
返回的结果为两表中所有满足a.id=b.id的记录。b表中id 为1的有两条记录,a表中有一条,返回的结果中可以看出,a表中又自动补齐了一条id为1的记录。
一般的笛尔卡积SELECT * FROM TabA a,TabB 返回的数据为15条。a表中有m条记录,b表中有n条记录,则一般的笛尔卡积返回的数据为m*n条记录。记录之间的组合是随意的。
2、inner join
select * FROM TabA a INNER JOIN TabB b ON a.id=b.id /*inner join*/
inner join的返回结果和笛尔卡积是相同的。
SELECT * FROM TabA a,TabB b where a.id = b.id /*笛尔卡积乘积*/
select * FROM TabA a INNER JOIN TabB b ON a.id=b.id /*inner join*/
区别:执行方式 第一条语句将表a和表b的记录组合起来,然后考察满足条件的,并返回记录。
第二条语句是参照表a中的记录,一条一条到表b中去找符合记录的,符合则连在一起,否则转到a中下一条
inner join 是笛尔卡积的特殊形式。一般情况下,我们选用inner join,内连接的效率要高于笛卡尔积的效率。
3、left join
select * FROM TabA a LEFT JOIN TabB b ON a.id=b.id /*left join*/
返回的为a表中所有的记录,即使在b表中没有匹配到。
4、right join
SELECT * FROM TabA a RIGHT JOIN TabB b ON a.id=b.id /*right join*/
返回的为b表中所有的记录,即使在a表中没有匹配到满足条件的记录。
5、full join
在mysql中,不支持full join操作。我们使用
select * from TabA a left join TabB b on a.id = b.id
union
select *
from TabA a right join TabB b on a.id = b.id /*返回左右表所有的行 相当于full join mysql不支持full join*/
full join:等于left join和right join的并集
6、从两张表中查询出id字段相同,name字段不同的所有记录
SELECT * FROM TabA a WHERE a.id in(SELECT id FROM TabB)
UNION
SELECT * FROM TabB b WHERE b.id in(SELECT id FROM TabA) ORDER BY id /*UNION 去重 UNINSTALL 不去重*/
SELECT * FROM TabA a WHERE EXISTS (SELECT id FROM TabB b WHERE a.id=b.id)
UNION ALL
SELECT * FROM TabB b WHERE EXISTS (SELECT id FROM TabA a WHERE a.id=b.id)
后面的语句性能比第一要好点。