sql中cross join,sql各种join用法详解
SQL中的连接可以分为内部连接、外部连接和交叉连接。
1.交叉连接
如果没有WHERE子句,则返回连接的两个表的笛卡尔积,返回的行数等于两个表的行数的乘积;
例如,下面的A、B和C具有相同的执行结果,但是效率不同:
答:从表1交叉连接表2中选择*
b:从表1、表2中选择*
c:从表1 a的内部连接表2 b中选择*
a:从表1 a、表2 b中选择a.*、b.*,其中a.id=b.id
b:select * from table 1a cross join table 2b where a . id=b . id(注意:cross join只能用在where,不能用在on)。
c:从a.id=b.id上的表1 a内部连接表2 b中选择*
一般不建议使用方法A和方法B,因为如果有WHERE子句,会将两行乘以表中行数的数据表进行示教,然后根据WHERE条件进行选择。
所以如果两个需要通信的表太大,会非常非常慢,不建议使用。
2.内部连接
同时满足条件的两个表的组合。
如果你只使用
SELECT * FROM表1内部联接表2
如果不指定连接条件,内连接会有和笛卡尔积的交叉连接一样的结果,但和笛卡尔积不同的是,如果没有笛卡尔积那么复杂,内连接的效率要比笛卡尔积的交叉连接高。
但是,通常使用内部联接需要指定联接条件。
* * * * * * * * * * * *关于等联接和自然连接
Equijoin (=符号应用于联接条件,不会删除重复的列)
自然联接(重复的列将被删除)
所有数据库连接操作都是自然连接,因为不允许重复的行(元组)。
例如:
SELECT * FROM table1作为内部连接table2 AS b on a.column=b.column
3.外部连接
指定条件的内部联接,并且只返回满足联接条件的条目。
外部连接是不同的。返回的结果不仅包括满足连接条件的行,还包括左表(对于左外连接)、右表(对于右连接)或两侧连接(对于全外连接)中的所有数据行。
1)左外连接左[外]连接
显示符合条件的数据行,同时显示左侧数据表中不符合条件的数据行。右边没有对应的条目显示为空。
例如
从表1中选择*作为a.column=b.column的左[外]联接
2)右连接右[外]连接
显示符合条件的数据行,同时显示右侧数据表中不符合条件的数据行。左边没有相应的条目显示为空。
例如
从表1中选择*作为a.column=b.column上的右[外]联接
3)完全[外部]连接
显示合格的数据行,同时显示左侧和右侧不合格的数据行。对应的左右两边显示NULL,即显示左连接、右连接和内连接的并集。