当前位置: 首页 > article >正文

Mysql之多表查询下篇

Mysql之多表查询下篇

  • 满外连接的实现
    • UNION关键字
      • UNION
      • UNION ALL操作符
  • 7种SQL JOINS的实现
  • 语法格式小结
  • 自然连接
  • USING连接
  • 表连接的约束条件

满外连接的实现

在上篇博客中,我们可以了解到在Mysql中是不支持FULL JOIN来实现
满外连接的,那么我们在Mysql采用什么方式来实现满外连接呢

UNION关键字

我们可以使用UNION关键字,将两个查询的结果合到一起,变成一个查询结果

UNION

UNION 操作符返回两个查询的结果集的并集,去除重复记录。
在这里插入图片描述

UNION ALL操作符

在这里插入图片描述

UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。(这里注意与UNION的区别)

注意执行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-A∩B
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
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

语法格式小结

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

自然连接

SQL99 在 SQL92 的基础上提供了一些特殊语法,比如 NATURAL JOIN 用来表示自然连接。我们可以把
自然连接理解为 SQL92 中的等值连接。它会帮你自动查询两张连接表中 所有相同的字段 ,然后进行 等值
连接

在SQL92语法中

SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`
AND e.`manager_id` = d.`manager_id`;

在SQL99语法中

SELECT employee_id,last_name,department_name
FROM employees e NATURAL JOIN departments d;

USING连接

当我们进行连接的时候,SQL99还支持使用 USING 指定数据表里的 同名字段 进行等值连接。但是只能配
合JOIN一起使用。比如:

SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
USING (department_id);

这里USING(deparment_id) 其实就是等价于 e.deparent_id == d.deparment_id
使用JOIN…USING 可以简化连接方式

表连接的约束条件

WHERE:适用于所有关联的查询
ON:只能和JOIN一起使用,只能写关联条件。虽然关联条件可以并到WHERE中和其他条件一起写,但分开写可读性更好。
USING:只能和JOIN一起使用,而且要求两个关联字段在关联表中的名称一致,而且只能表示关联字段值相等

#关联条件
#把关联条件写在where后面
SELECT last_name,department_name
FROM employees,departments
WHERE employees.department_id = departments.department_id;

#把关联条件写在on后面,只能和JOIN一起使用
SELECT last_name,department_name
FROM employees INNER JOIN departments
ON employees.department_id = departments.department_id;

SELECT last_name,department_name
FROM employees CROSS JOIN departments
ON employees.department_id = departments.department_id;

SELECT last_name,department_name
FROM employees JOIN departments
ON employees.department_id = departments.department_id;

注意:
我们要 控制连接表的数量 。多表连接就相当于嵌套 for 循环一样,非常消耗资源,会让 SQL 查询性能下
降得很严重,因此不要连接不必要的表。在许多 DBMS 中,也都会有最大连接表的限制。


http://www.kler.cn/news/136993.html

相关文章:

  • 鲸鱼优化算法(Whale Optimization Algorithm, WOA)原理与MATLAB例程
  • 【图解版】力扣第146题:LRU缓存
  • 小程序短链接生成教程
  • Llama Tutor:开源 AI 个性化学习平台,根据主题自动制定学习计划
  • Docker 安装Postgres和PostGIS,并制作镜像
  • PCC Net模型实现行人数量统计
  • CSS中2种复合选择器
  • 【Linux网络】从原理到实操,感受PXE无人值守自动化高效批量网络安装系统
  • OpenAI与微软合作,构建 ChatGPT 5 模型;10天准确天气预报
  • 配置中心
  • 如何在Linux以docker-compose方式快速部署运行StackEdit,并实现公网访问
  • 了解JVM的相关概述,发现很多全忘了(文末福利)
  • 【腾讯云云上实验室-向量数据库】TAI时代的数据枢纽-向量数据库 VectorDB
  • mysql8 group by出错:this is incompatible with sql_mode=only_full_group_by
  • CI/CD --git版本控制系统
  • Node.js之Buffer(缓冲器)
  • day29_Servlet
  • 5.什么是Spring的依赖注入(DI)?IOC和DI的区别是什么
  • CentOS 7.9 安装 nginx
  • MIB 6.1810实验Xv6 and Unix utilities(5)find
  • 关于AssetBundle禁用TypeTree之后的一些可序列化的问题
  • vue-quill-editor 使用
  • 无服务器开发实例|微服务向无服务器架构演进的探索
  • 【鸿蒙最新全套教程】<HarmonyOS第一课>1、运行Hello World
  • 【问题解决】Maven密码加密
  • 阿里云配置ssl(Apache)