下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。
- INNER JOIN:内连接,又叫等值连接,只返回两个表中连接字段相等的行。
- LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行,右边为空字段补null
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行,左边为空字段补null
- FULL JOIN:外连接,返回两个表中的行:left join + right join。
- CROSS JOIN : 结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。
FULL OUTER JOIN 用法:
得到的结果数 inner join <= min(left join, right join) full join >= max(left join, right join) 当 inner join < min(left join, right join) 时, full join > max(left join, right join)
首先,连接的结果可以在逻辑上看作是由SELECT语句指定的列组成的新表。
左连接与右连接的左右指的是以两张表中的哪一张为基准,它们都是外连接。
外连接就好像是为非基准表添加了一行全为空值的万能行,用来与基准表中找不到匹配的行进行匹配。假设两个没有空值的表进行左连接,左表是基准表,左表的所有行都出现在结果中,右表则可能因为无法与基准表匹配而出现是空值的字段。
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
- on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
- where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
举例说明: A表(a1,b1,c1) B表(a2,b2)
结果:
结果:
从多个表中返回满足 JOIN 条件的所有行。
结果:
合并两个或多个SQL语句的结果集(重复或不重复)
请注意,UNIOn 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
SQL union用法:
默认地,UNIOn 操作符选取不同的值。如果允许重复的值,请使用 UNIOn ALL。
SQL union all用法:
UNIOn 结果集中的列名总是等于 UNIOn 中第一个 SELECT 语句中的列名。
使用UNIOn命令时需要注意,只能在最后使用一个ORDER BY命令,是将两个查询结果合在一起之后,再进行排序!绝对不能写两个ORDER BY命令。
另外,在使用ORDER BY排序时,注意两个结果的别名保持一致,使用别名排序很方便。当然也可以使用列数。
ORDER BY 除了可以对指定的字段进行排序,还可以使用函数进行排序:
ORDER BY 只能当前 SQL 查询结果进行排序,如要对 union all 出来的结果进行排序,需要先做集合。
可以模拟优化器执行SQL查询语句,从而指导MySQL是如何处理你的SQL语句的。可用来分析查询语句或表结构的性能瓶颈。可以查看:
- 表的读取顺序
- 数据读取操作的操作类型
- 哪些索引可以使用
- 哪些索引被实际使用
- 表之间的引用
- 每张表有多少行被优化器查询