目录
6.1多表查询
(1)联合查询
联合查询是多表查询的一种方式,在保证多个SELECT语句的查询字段数相同的情况下,合并多个查询的结果。
SELECT …
UNION [ALL | DISTINCT] SELECT …
[UNION [ALL | DISTINCT] SELECT …];
SELECT查询的字段个数必须相同,且联合查询的结果中只保留第一个SELECT语句对应的字段名称,即使UNION后SELECT查询的字段与第一个SELECT查询的字段表达含义或数据类型不同,MySQL也仅会根据查询字段出现的顺序,对结果进行合并。
除此之外,若要对联合查询的记录进行排序等操作,需要使用圆括号“()”包裹每一个SELECT语句,在SELECT语句内或在联合查询的最后添加ORDER BY语句。并且若要排序生效,必须在ORDER BY后添加LIMIT限定联合查询排序的数量,通常推荐使用大于表记录数的任意值。
(2)连续查询
1.交叉连接
交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积。
SELECT 查询字段 FROM 表1 CROSS JOIN 表2;
2.内连接
内连接是一种常见的连接查询,它根据匹配条件返回第1个表与第2个表所有匹配成功的记录。
SELECT 查询字段 FROM 表1[INNER] JOIN 表2 ON 匹配条件;
关键字ON与WHERE的异同点
相同点:都用于完成条件的限定。不同点:于 WHERE 是限定已全部查询出来的记录,那么在数据量很大的情况下,此操作会浪费很多性能,所以此处推荐使用 ON 实现内连接的条件匹配。
自连接查询是内连接中的一种特殊查询。
它是指相互连接的表在物理上为同一个表,但逻辑上分为两个表。
在标准的SQL中,交叉连接(CROSS JOIN)与内连接
(INNER JOIN)表示的含义不同,前者一般只连接表的笛卡尔积,而后者则是获取符合ON筛选条件的连接数据。
但是在MySQL中,CROSS JOIN与INNER JOIN(或JOIN)语法的功能相同,都可以使用ON设置连接的筛选条件,可以互换使用,但是此处不推荐将交叉连接与内连接混用。
3.左外连接
左外连接是外连接查询中的一种,也可以将其称为左连接。
它用于返回连接关键字(LEFT JOIN)左表中所有的记录,以及右表中符合连接条件的记录。
当左表的某行记录在右表中没有匹配的记录时,右表中相关的记录将设为空值(NULL)。
SELECT 查询字段 FROM 表1 LEFT [OUTER] JOIN 表2 ON 匹配条件;
OUTER在查询时可以省略。
4.右外连接
右外连接也是外连接查询中的一种,可以将其称为右连接。
它用于返回连接关键字(RIGHT JOIN)右表(主表)中所有的记录,以及左表(从表)中符合连接条件的记录。
当右表的某行记录在左表中没有匹配的记录时,左表中相关的记录将设为空值(NULL)