网课指路:MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!_哔哩哔哩_bilibili
预备知识:
·内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
·外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的
行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。
·如果是左外连接,则连接条件中左边的表也称为 主表 ,右边的表称为 从表 。
·如果是右外连接,则连接条件中右边的表也称为 主表 ,左边的表称为 从表 。
SQL99语法实现多表查询
SQL99语法实现多表查询
基本语法
使用JOIN...ON
子句创建连接的语法结构:
SELECT table1.column, table2.column,table3.column
FROM table1 JOIN table2 ON table1 和 table2 的连接条件
JOIN table3 ON table2 和 table3 的连接条件
它的嵌套逻辑类似我们使用的 FOR 循环:
for t1 in table1:
for t2 in table2:
if condition1:
for t3 in table3:
if condition2:
output t1 + t2 + t3
SQL99 采用的这种嵌套结构非常清爽、层次性更强、可读性更强 即使再多的表进行连接也都清晰 语法说明:
可以使用 ON 子句指定额外的连接条件。
这个连接条件是与其它条件分开的。
ON 子句使语句具有更高的易读性。
关键字 JOIN、INNER JOIN、CROSS JOIN 的含义是一样的,都表示内连接
内连接(INNER JOIN)的实现
语法:
语法:
SELECT 字段列表
FROM A表 INNER JOIN B表
ON 关联条件
WHERE 等其他子句;
外连接(OUTER JOIN)的实现
左外连接(LEFT OUTER JOIN)
#实现查询结果是A
SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件
WHERE 等其他子句;
右外连接(RIGHT OUTER JOIN)
#实现查询结果是B
SELECT 字段列表
FROM A表 RIGHT JOIN B表
ON 关联条件
WHERE 等其他子句;
满外连接
(FULL OUTER JOIN)
满外连接的结果 =
左右表匹配的数据
+
左表没有匹配到的数据
+
右表没有匹配到的数据。
SQL99
是支持满外连接的。使用
FULL JOIN
或
FULL OUTER JOIN
来实现。需要注意的是,MySQL
不支持
FULL JOIN
,但是可以用
LEFT JOIN
UNION
RIGHT join代替。
UNION操作符
UNION操作符
![](https://img-blog.csdnimg.cn/abc163330b51478b8f48a0cf742a5165.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oiQ5Li65Y-m5LiA5Liq5byg5b-X5piO,size_10,color_FFFFFF,t_70,g_se,x_16)
UNION 操作符返回两个查询的结果集的并集,去除重复记录。
UNION ALL操作符
UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。
tips:执行UNION ALL语句时所需要的资源比UNION语句少。如果明确知道合并数据后的结果数据 不存在重复数据,或者不需要去除重复的数据,则尽量使用UNION ALL语句,以提高数据查询的效率。
7种SQL JOINS的实现
# 中图:内连接 A ∩ BSELECT employee_id,last_name,department_nameFROM employees e JOIN departments dON e. `department_id` = d. `department_id` ;
# 左上图:左外连接SELECT employee_id,last_name,department_nameFROM employees e LEFT JOIN departments dON e. `department_id` = d. `department_id` ;
# 右上图:右外连接SELECT employee_id,last_name,department_nameFROM employees e RIGHT JOIN departments dON e. `department_id` = d. `department_id` ;
# 左中图: A - A ∩ BSELECT employee_id,last_name,department_nameFROM employees e LEFT JOIN departments dON e. `department_id` = d. `department_id`WHERE d. `department_id` IS NULL
#右中图:B-A∩B
SELECT employee_id,last_name,department_nameFROM employees e RIGHT JOIN departments dON e. `department_id` = d. `department_id`WHERE e. `department_id` IS NULL
#左下图:满外连接
# 左中图 + 右上图 A ∪ BSELECT employee_id,last_name,department_nameFROM employees e LEFT JOIN departments dON e. `department_id` = d. `department_id`WHERE d. `department_id` IS NULLUNION ALL # 没有去重操作,效率高SELECT employee_id,last_name,department_nameFROM employees e RIGHT JOIN departments dON e. `department_id` = d. `department_id` ;
# 右下图# 左中图 + 右中图 A ∪ B- A ∩ B 或者 (A - A ∩ B) ∪ ( B - A ∩ B )SELECT employee_id,last_name,department_nameFROM employees e LEFT JOIN departments dON e. `department_id` = d. `department_id`WHERE d. `department_id` IS NULLUNION ALLSELECT employee_id,last_name,department_nameFROM employees e RIGHT JOIN departments dON e. `department_id` = d. `department_id`WHERE e. `department_id` IS NULL