MySQL表连接(内连接、交叉连接、外连接、联合查询)
一、内连接(INNER JOIN)
SELECT * FROM 表1 INNER JOIN 表2 ON 条件
SELECT * FROM 表1 INNER JOIN 表2 WHERE 条件
典型的联接运算,使用像 = 或 <> 之类的比较运算符)。包括相等联接和自然联接。内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。
说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集部分
不写条件会造成查询笛卡尔乘积
三表连接
SELECT S.studentName AS 姓名,SU.subjectName AS 课程,R.studentResult AS 成绩
FROM student AS S
INNER JOIN `result` AS R ON (S.`studentNo` = R.`studentNo`)
INNER JOIN `subject` AS SU ON (SU.subjectNo=R.subjectNo);
二、交叉连接(CROSS JOIN)
1、 隐式交叉连接(没有CROSS JOIN)
SELECT * FROM 表1,表2
结果为笛卡尔乘积
2、显式交叉连接
SELECT * FROM 表1 CROSS JOIN 表2
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。
如果写条件ON / WHERE 结果和内连接一样
三、外连接(LEFT JOIN、RIGHT JOIN、FULL JOIN)
1、SELECT * FROM 表1 LEFT JOIN 表2 ON 条件
左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
2、SELECT * FROM 表1 RIGHT JOIN 表2 ON 条件
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
3、SELECT * FROM 表1 FULL JOIN 表2 ON 条件
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。
三者的共同点是都返回符合连接条件和查询条件(即:内连接)的数据行。不同点如下:
左外连接还返回左表中不符合连接条件单符合查询条件的数据行。
右外连接还返回右表中不符合连接条件单符合查询条件的数据行。
全外连接还返回左表中不符合连接条件单符合查询条件的数据行,并且还返回右表中不符合连接条件单符合查询条件的数据行。全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外=左外 UNION 右外”。
说明:左表就是在“(LEFT JOIN)”关键字左边的表。右表当然就是右边的了。
四、联合查询
联合连接(UNION JOIN):这是一种很少见的连接方式。Oracle、MySQL均不支持,其作用是:找出全外连接和内连接之间差异的所有行。这在数据分析中排错中比较常用。也可以利用数据库的集合操作来实现此功能。
MySQL里有联合查询(UNION)、主要用作去重。
select 语句1
union 【all | distinct】
select 语句2;
此联合查询语句,默认会“自动消除重复行”,即默认是distinct 如果想要将所有数据都显示(允许重复行),就使用all
注意:
1,两个select语句的查询结果的“字段数”必须一致;
2,通常,也应该让两个查询语句的字段类型具有一致性;
3,也可以联合更多的查询结果;
4,应该将这个联合查询的结果理解为最终也是一个“表格数据”,且默认使用第一个select语句中的字段名
5,默认情况下,order by子句和limit子句只能对整个联合之后的结果进行排序和数量限定:select... union select... order by XXX limit m,n;
6,最后,来一个“应用”,实现“全外连接”:
select * f rom 表1 left join 表2 on 条件
union
select * f rom 表1 right join 表2 on 条件
原文地址https://blog.csdn.net/qq_42351920/article/details/81410925