sql——sql中的各种连接

现有两张表

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)

 

后面的语句性能比第一要好点。

猜你喜欢

转载自www.cnblogs.com/znn93/p/8990643.html