MySQL连表查询

156 阅读3分钟

在项目中进行数据查询时,通常需要用到连表查询,大多数情况下,用 JOIN或者LEFT JOIN 就可以满足需求。为了全面了解MySQL提供的其他连表查询方式,于是通过MySQL手册、StackOverflow,结合自身的理解,总结如下,欢迎纠错、补充。

MySQL连表查询的大致语法可以总结为:连表对象 + 连表操作符 + 连表对象 + [连表条件]

1、连表对象(Join Object)

  1. db中的表 或者 表的别称(AS) 或者表的部分切片

  2. 子查询,比如:(SELECT * FROM t1)

  3. 连表结果,比如 (SELECT * FROM t1 JOIN t2)

2、连表操作符 (Join Operation)

2.1、 [keywords] JOIN

2.1.1、keywords: INNER | CROSS

此时连表条件是可选的,在无连表条件的情况下,结果等于连表对象的笛卡尔积。当存在连表条件时,返回连表对象的交集,如下:

**
**

默认的JOIN方式是INNER。MySQL 中 JOIN, CROSS JOIN, and INNER JOIN 语义上一致,可相互替换,但是在标准SQL中是有区别的,标准SQL中,INNER JOIN 需要和ON语句配合使用

2.1.2、keywords: {LEFT | RIGHT} [OUTER]

此时连表条件不能缺少,否则会报SQL syntax error。

OUTER 关键字是可选的(可忽略),为了兼容SQL ANSI-92,LEFT JOIN 完全等同于 LEFT OUTER JOIN。二者区别如下:

2.2、NATURAL [keywords] JOIN

keywords: INNER | {LEFT | RIGHT} [OUTER]。此时没有显式的连表条件,默认根据连表对象具有相同列名的字段进行值匹配。

比如: t1(a, b), t2(a, c),

t1         t2

----    ----

1 x      2 z

2 y      3 w

两个表拥有共同的列 a , 则 SELECT * FROM t1 NATURAL JOIN t2 等同于 SELECT * FROM t1 JOIN t2 USING(a).关于USING的用法在连表条件中说明。查询结果会忽略重复的相同列名的数据,例如 SELECT * FROM t1 NATURAL JOIN t2;结果如下

+------+------+------+

| a | b | c |

+------+------+------+

| 1 | x | NULL |

| 2 | y | z |

+------+------+------+

查询结果的显示顺序是:

1.显示共同列 并且值为: a = COALESCE(t1.a, t2.a)

COALESCE(x, y) = (CASE WHEN x IS NOT NULL THEN x ELSE y END)

2.显示第一个表中出现的唯一列,按照在表1中出现的顺序排列

3.显示第二个表中出现的唯一列,按照在表2中出现的顺序排列

通常如果连表对象有多个共同列需要匹配时,可以用NATURAL进行查询

2.3、STRIGHT_JOIN

没有其他关键字,和JOIN(INNER JOIN)用法一直,唯一区别是左表总是优先于右表进行读取,可以用在一些很少的优化场景,比如明确知道左表作为驱动表有利于提高查询效率时。

3、连表条件 (Join Specification)

3.1、ON search_condition

语义上等同于WHERE,却别在于ON的作用维度是表级别,WHERE通常用于筛选数据行,常见的用法是:SELECT * FROM t1 JOIN t2 ON t1.a=t2.a

3.2、USING(join_column_list)

USING 方法中的列名必须是在连表对象中共同出现。和ON的显示结果在于,不会重复显示相同列,显示顺序和结果同NATURAL 关键字一致

4、总结

  1. JOIN 默认等同于 INNER JOIN

  2. LEFT JOIN 等同于 LEFT OUTER JOIN,RIGHT同理

  3. NATURAL 用于连接具有列名的表查询

  4. ON 和USING的查询结果的包含的列不同,ON更常用