连接查询包括合并、内连接、外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要。
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 可以不用写
例:
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的笛卡尔积表示所有可能的爱好情况。
例:
一次查询多表
SELECT name,hobby FROM A,B 结果与交叉连接一样