SQL连表查询

连接查询包括合并、内连接、外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要。

1、Union

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。

当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

注意:使用UNION时,两张表查询的结果有相同数量的列、列类型相似。


预置脚本:

   INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(101,'Tom',20,'BeiJing',10)
   INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(102,'Lucy',18,'ShangHai',11)

   INSERT INTO Teachers(ID,Name) VALUES(101,'Mrs Lee')
   INSERT INTO Teachers(ID,Name) VALUES(102,'Lucy')

1)基本UNION查询,查询学校教师、学生的总的信息表,包括ID和姓名

      SELECT ID,Name FROM Students
      UNION
      // UNION ALL 查询全部
      SELECT ID,Name FROM Teachers

查询结果:

2、INNER JOIN(内连接)

特性:只显示连接表都有的关联数据! 最常用的连接方式,INNER 可以不用写

A表 ————————————————————————B表

    SELECT * FROM A JOIN B ON A.id = B.aid;

结果:

3、外连接

特性:与内连接相比,即使没有匹配行,也会返回一个表的全集
外连接分为三种:左外连接,右外连接,全外连接。对应SQL:LEFT/RIGHT/FULL OUTER JOIN。通常我们省略outer 这个关键字。写成:LEFT/RIGHT/FULL JOIN。
重点:至少有一方保留全集,没有匹配行用NULL代替。

LEFT JOIN 左连接
例: 用内连接的例子

    SELECT * FROM A LEFT JOIN B ON A.id = B.aid; 只显示 3 条数据

结果:


RIGHT JOIN 右连接
例:

    SELECT * FROM A RIGHT JOIN B ON A.id = B.aid; 只显示 3 条数据

结果:


CROSS JOIN 全连接(交叉连接)
交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接也称作笛卡尔积。
简单查询两张表组合,这是求笛卡儿积,效率最低。

笛卡儿积:笛卡尔乘积,也叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有学生爱好的集合,则A与B的笛卡尔积表示所有可能的爱好情况。
例:

image.png

一次查询多表

SELECT name,hobby FROM A,B 结果与交叉连接一样

推荐阅读更多精彩内容