或叫逗号连接
, 在多个表的笛卡尔积中选取满足条件的行的连接, 如select * from A,B where A.a > A.b
特殊的条件连接, 当条件为某字段=某字段
时, 即为等值连接。如select * from A,B where A.a=B.b
对两张表中字段名和数据类型都相同
的字段进行等值连接, 再将表中重复的字段去掉, 即为自然连接
。
NATURAL JOIN
列名相同
且类型相同
on/using
示例:
-- A中有a,b,c字段, B中有c,d字段
select * from A natural join B;
-- 结果等同于下面
select A.a, A.b, A.c, B.d from A,B where A.c = B.c;
使用比较运算符(<>=
)根据每个表共有的列值匹配两个表中的行
(INNER) JOIN
on/using
示例:
-- 等值
select * from A join B on A.c = B.c;
-- 非等值
select * from A join B on A.a > B.d;
-- 带条件
select * from A join B on A.c = B.c where A.a > B.d;
-- using
select * from A join B using (c);
using
与 on
using
与on
都可以达到等值连接的效果, 但二者直接也有差别
on
可以设置条件, 而using
不可设置条件,只能指明使用哪些字段进行等值连接on
不会去掉重复列, 而using
会去掉重列(去重效果与自然连接的效果一样)自然连接
只能是同名属性的等值连接, 而内连接
可以使用on
子句来指定连接条件自然连接
的结果会去掉重复列, 而内连接
使用on
子句进行等值连接时, 重复列不会被去掉内连接
使用using
子句时, 若指定所有同名同类型属性, 则与自然连接
的结果一样外连接包括左连接、右连接、全连接
on/using
子句提供相应的连接条件左表的所有行, 右表的匹配行。如果左表的某行在右表中没有匹配行, 则在结果集中右表的所有列均为空值
LEFT [OUTER] JOIN
示例:
-- on
select * from A left join B on A.a = B.b;
-- using
select * from A left outer join B using (a, b);
右表的所有行, 左表的匹配行。如果右表的某行在左表中没有匹配行, 则在结果集中左表的所有列均为空值
RIGHT [OUTER] JOIN
左表和右表中的所有行, 当某行在另一个表中没有匹配行时, 显示为空值
FULL [OUTER] JOIN
MySQL
不支持全连接, 可以采用左外 + union + 右外
达到等效目的-- 使用 左外 + union + 右外 达到 full join 的效果
(select * from A left outer join B on A.id=B.id) union (select * from A right outer join B on A.id=B.id);
union
与union all
UNION
操作符用于合并两个或多个SELECT
语句的结果集UNION
内部的SELECT
语句必须拥有相同数量的列, 列也必须拥有相似的数据类型UNION
会去掉重复的值, UNION ALL
会保留重复的值交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积
CROSS JOIN
on/using
, 不写是时等同于笛卡尔积示例:
-- 笛卡尔积
select * from A cross join B;
-- on
select * from A cross join B on A.a = B.b;