MySQL 使用SQL99实现7种JOIN操作

网课指路:MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!_哔哩哔哩_bilibili

预备知识:

·内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
·外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的
行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。
·如果是左外连接,则连接条件中左边的表也称为 主表 ,右边的表称为 从表 。
·如果是右外连接,则连接条件中右边的表也称为 主表 ,左边的表称为 从表 。

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 JOINCROSS 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 操作符返回两个查询的结果集的并集,去除重复记录。

UNION ALL操作符

UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。

 tips:执行UNION ALL语句时所需要的资源比UNION语句少。如果明确知道合并数据后的结果数据 不存在重复数据,或者不需要去除重复的数据,则尽量使用UNION ALL语句,以提高数据查询的效率。

7种SQL JOINS的实现

# 中图:内连接 A B
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e. `department_id` = d. `department_id` ;  
# 左上图:左外连接
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e. `department_id` = d. `department_id` ;
# 右上图:右外连接
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e. `department_id` = d. `department_id` ;
# 左中图: A - A B
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e. `department_id` = d. `department_id`
WHERE d. `department_id` IS NULL

 #右中图:B-AB

SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e. `department_id` = d. `department_id`
WHERE e. `department_id` IS NULL

#左下图:满外连接

# 左中图 + 右上图 A B
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e. `department_id` = d. `department_id`
WHERE d. `department_id` IS NULL
UNION ALL # 没有去重操作,效率高
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e. `department_id` = d. `department_id` ;
# 右下图
# 左中图 + 右中图 A B- A B 或者 (A - A B) ∪ ( B - A B
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e. `department_id` = d. `department_id`
WHERE d. `department_id` IS NULL
UNION ALL
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e. `department_id` = d. `department_id`
WHERE e. `department_id` IS NULL
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值