一、外连接
1.定义
外连接返回某张表(主表)的所有行,并带回另一张表(连接表)的条件相符的行,如无相符的行,则返回NULL;
2.和内连接的不同之处
① 使用内连接时,虽然会对比来自两张表的行,但是表的顺序并无影响;
② 外连接对比两张表里的行,如无相符的行,则返回NULL(VBA返回空),换句话点说外连接一定会提供数据行,无论此行是否能在另一个表中找出相匹配的;
③ 外连接的一起以左、右有关,确定用LEFT OUTER JOIN和RIGHT OUTER JOIN 确定主表。
3.左外连接(和右外连接)
SELECT tb1.girl, tb2.toy FROM table_name1 tb1
LEFT OUTER JOIN table_name2 tb2
ON tb1.toy_id = tb2.toy_id;
LFET OUTER JOIN 左边的表是主表 右边的是连接表
同理
RIGHT OUTER JOIN 右边的表是主表 左边的是连接表
二、自连接
1.自引用外键
同一张表中,若有一非主键列引用了主键的值,那么此列也是外键列,这样被称为自引用外键。
2.自连接示例
SELECT tb1.name,tb2.name AS leader FROM
table_name1 tb1 INNER JOIN table_name1 tb2
ON tb1.leaderID=tb2.id
自连接能把单一表当成两张具有完全相同的信息的表来进行查询。
改成子查询模式
SELECT tb1.name,
(SELECT name FROM table_name1 WHERE tb1.leaderID=id) AS leader
FROM table_name1 tb1
三、表的联合
1. UNION和UNION ALL把查询的结果联合起来
SELECT title FORM job_current
UNION
SELECT title FORM job_desired
UNION
SELECT title FORM job_listings
ORDER BY title;
① SELECT语句里列的数量必须一致;
② SELECT语句里包含的表达式和统计函数也必须相同;
③ SQL会清除结果中的重复值;
④ 若需查看重复值,可使用UNION ALL;
⑤ 列的数据类型必须相同或可以互相转换;
⑥ SELECT语句的顺序不重要,不会改变结果;
⑦ UNION只能接受一个ORDER BY 且必须位于语句末端。
注:UNION ALL 和 UNION的使用方法一致,不同点在于前者可以取重复值,后者会清除重复值。
2.创建联合表,CREATE TABLE AS
CREATE TABLE table_name AS
SELECT title FORM job_current UNION
SELECT title FORM job_desired UNION
SELECT title FORM job_listings
ORDER BY title;
3.INTERSECT(交集)和EXCEPT(差集)
① INTERSECT,交集
SELECT title FORM job_current
INTERSECT
SELECT title FORM job_desired;
INTERSECT只会返回同时出现在第一个和第二个查询中的列。
② EXCEPT,差集
SELECT title FORM job_current
EXCEPT
SELECT title FORM job_desired;
EXCEPT返回只出现在第一个查询中,而不在第二个查询中的列。
四、子查询和连接的优劣
1.子查询写法
SELECT tb1.column_name1,tb1.column_name2,tb2.column_name3 FROM
table_name1 AS tb1 NATURAL JOIN table_name2 AS tb2
WHERE
tb2.column_name3 IN(SELECT column_name3 FROM table_name3)
2.连接写法
SELECT tb1.column_name1,tb1.column_name2,tb2.column_name3 FROM
table_name1 AS tb1 NATURAL JOIN table_name2 AS tb2
INNER JOIN table_name3 tb3 on tb2.column_name3=tb3.column_name3
3.优劣
① 子查询可以使用统计函数,连接不行;
② 子函数可以与UPDATE、INSERT和DELETE一起使用,连接不行;
③ 连接的运算速度快于子查询。