MySQL表连接(内连接、交叉连接、外连接、联合查询)

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

上一篇:转:Mac操作技巧 | "键盘侠"必备快捷键


下一篇:MIPS 指令集开源了