赵玉伟的博客

mysql连接语法糖

连接查询算是一种常见的数据库操作, 虽然由于其低下的性能,导致在数据量比较大或是对性能要求较高的场景下,一般不会使用,或者将其转成多阶段查询的业务操作。但是我们还是有必要了解其语法。

mysql中主要支持以下连接查询:

  • 内连接: inner join
  • 外链接: outer join
  • 交叉链接: cross join

内连接

所连接表的交集,如下图中的公共部分:

有两种语法风格, 以下是最初的(ANSI SQL 89)标准制定的语法格式:

1
2
3
select ...
from a, b
where a.x=b.x

以下是(ANSI SQL 92)标准制定的格式, 几种不同的语法风格:

1
2
3
4
select ...
from t1
inner join t2
on t1.x=t2.x and t1.c=t2.c

1
2
3
4
select ...
from t1
join t2
on t1.x=t2.x and t1.c=t2.c
1
2
3
4
select ...
from t1
join t2
on t1.x=t2.x where t1.c=t2.c
1
2
3
4
select ...
from t1
join t2
where t1.x=t2.x and t1.c=t2.c

如果所连接的表明的列名称相同,则可以用以下语法:

1
2
3
4
select ...
from t1
join t2
usering(id) where t1.c=t2.c

两种语法风格的逻辑查询和物理查询流程相同,mysql都支持。

一个demo:

如果不加任何where条件,则是几张表的笛卡尔集:

外连接

外连接分为左连接和右连接:
左连接:左表的记录完全展示,对于所连接右表的数据,如果匹配则填充匹配行,如果不匹配,则填充NULL。
右连接:右表的记录完全展示,对于所连接左表的数据,如果匹配则填充匹配行,如果不匹配,则填充NULL。
一个demo:

通过上图可以看出,第二条查询和第四次查询的结果是相同的, 所以,左右连接可以相互转换。

外连接的注意点:

1、必须有 on 子句,而且on子句的条件不同,所产生的结果也不相同, 因为是基于ON的字段进行连接的。
2、和inner join不同,on 和 where条件不能互换,如果要加where条件,需要先连接成笛卡尔集的表,再在连接成的临时表的基础上做过滤。
3、如果连接的字段名称相同, 也可以用 using 子句简化连接语句。

交叉连接

交叉连接用于返回所连接表的笛卡尔集, 不常用, 比如左表有m行, 右表有n行,则cross join 返回 m * n 条记录,语法为:

1
2
select my_test
cross join my_test2;