Mysql梳理10——使用SQL99实现7中JOIN操作

10  使用SQL99实现7中JOIN操作

10.1  使用SQL99实现7中JOIN操作

本案例的数据库文件分享:

通过百度网盘分享的文件:atguigudb.sql
链接:https://pan.baidu.com/s/1iEAJIl0ne3Y07kHd8diMag?pwd=2233 
提取码:2233 

# 正中图
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 RIGHT 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 LEFT 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
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;
#右下图:满外连接-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;

10.2  语法格式小结

#中间图
#实现A∩B(内连接)
select 字段列表
from A表 inner join从表
on 关联条件#左上图
#实现A
select 字段列表
from A表 left join 从表
on 关联条件
where 从表关联字段 is null and 等其他子句;#左中图 
#实现A - A∩B
select 字段列表
from 主表 left join 从表(B)
on 关联条件
where 从表关联字段 is null ;#右上图
#实现B
select 字段列表
from 主表 right join 从表(B)
on 关联条件
where 从表关联字段 is null and 等其他子句;#右中图
#实现B - A∩B
select 字段列表
from 主表 right join 从表(B)
on 关联条件
where 从表关联字段 is null ;#左下图
#实现查询结果是A∪B
###      用左外的A,union all 右外的B-(A∩B)
select 字段列表
from 主表 left join 从表(B)
on 关联条件
where 等其他子句
union all
select 字段列表
from 主表 right join 从表(B)
on 关联条件
where 等其他子句;#右下图
select 字段列表
from 主表 left join 从表
on 关联条件
where 从表 is null
union all
select 字段列表
from 主表 right join 从表
on 关联条件
where 从表 is null;


10.3  SQL99语法新特性

10.3.1  自然连接

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;

10.3.2  USING连接

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

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

你能看出与自然连接 NATURAL JOIN 不同的是,USING 指定了具体的相同的字段名称,你需要在 USING的括号 () 中填入要指定的同名字段。同时使用 JOIN...USING 可以简化 JOIN ON 的等值连接。

它与下面的 SQL 查询结果是相同的:

SELECT employee_id,last_name,department_name 
FROM employees e ,departments d 
WHERE e.department_id = d.department_id;

10.4  章节小结

表连接的约束条件可以有三种方式:WHERE, ON, 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;#把关联字段写在using()中,只能和JOIN一起使用
#而且两个表中的关联字段必须名称相同,而且只能表示=
#查询员工姓名与基本工资SELECT last_name,job_title
FROM employees INNER JOIN jobs USING(job_id);
#n张表关联,需要n-1个关联条件
#查询员工姓名,基本工资,部门名称SELECT last_name,job_title,department_name FROM employees,departments,jobs
WHERE employees.department_id = departments.department_id
AND employees.job_id = jobs.job_id;SELECT last_name,job_title,department_name
FROM employees INNER JOIN departments INNER JOIN jobs
ON employees.department_id = departments.department_id
AND employees.job_id = jobs.job_id;

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

【强制】超过三个表禁止 join。需要 join 的字段,数据类型保持绝对一致;

多表关联查询时, 保 证被关联的字段需要有索引。

说明:即使双表 join 也要注意表索引、SQL 性能。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/150798.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

线性跟踪微分器TD详细测试(Simulink 算法框图+CODESYS ST+博途SCL完整源代码)

1、ADRC线性跟踪微分器 ADRC线性跟踪微分器(ST+SCL语言)_adrc算法在博途编程中scl语言-CSDN博客文章浏览阅读784次。本文介绍了ADRC线性跟踪微分器的算法和源代码,包括在SMART PLC和H5U平台上的实现。文章提供了ST和SCL语言的详细代码,并讨论了跟踪微分器在自动控制中的作用…

【C++掌中宝】C++ 中的空指针救世主——nullptr

文章目录 1. 什么是 NULL?2. NULL 在 C 和 C 中的区别3. C11 引入 nullptr 的原因4. nullptr 与 NULL 的区别5. nullptr 的应用场景6. 模拟 nullptr 的实现7. 总结结语 1. 什么是 NULL? 在 C 和 C 编程中,NULL 常用于表示空指针,…

《开题报告》基于SpringBoot的社区养老平台的设计与实现+学习文档+答辩讲解视频

开题报告 研究背景 随着社会的快速发展和人口老龄化趋势的加剧,养老服务已经成为一个日益重要的议题。传统的养老模式逐渐暴露出诸多不足,如服务内容单一、服务质量难以保证、管理效率低下等问题,无法满足老年人日益多样化、个性化的需求。…

导出Power bi中的Measure

工作中做交接文档时,有时需要导出Power BI中所有度量值,这时可以下载两个工具。 一 , 下载工具: 1 , DaxStudio: http://daxstudio.org/ 2, Vertipaq Analyzer: https://www.sqlbi.c…

编写程序将华氏温度78度转换为摄氏温度,转换成的摄氏温度要求输出。转换公式为:摄氏度=(5/9)*(华氏度-32)

目录 前言 一、代码部分 二、运行截图 前言 1.本文所讲的是java程序设计语言,其内容是在java语言程序设计实现摄氏温度的转换; 2.Java文件的编写以收入到我的专栏“Java”当中,其中有相关的系列文章; 3.本文的操作步骤具有…

ROG NUC:重塑未来,从“芯”开始

ROG NUC以令人惊叹的紧凑身形、强大配置,从“芯”出发,重塑我们对科技生活的想象,让玩家感受由微缩主机带来的性能风暴。 至强“芯”脏,性能巅峰 ROG NUC至高搭载英特尔酷睿Ultra9处理器,采用先进的制程工艺&#xff…

for循环的应用

正三角 for (int i 0; i < 8; i) { for (int j 0; j < 15; j) { int kong 8 - i - 1; int star 2 * i 1; if (j < kong) { Console.Write(" "); } else if (j < kong star)…

基于Springboot企业员工人事管理系统JAVA|VUE|SSM计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

CodeMeter创新授权解决方案,为半导体自动化行业打造全面保护策略

面临挑战 随着半导体行业的快速发展&#xff0c;KINESYS Software需要为其客户提供更加灵活且适应性强的自动化解决方案。半导体制造过程的复杂性日益增加&#xff0c;晶圆追踪和设备管理需要更高效、精确的解决方案。同时&#xff0c;行业标准的变化以及对安全性和合规性的严格…

C++ 移动迭代器:STL与移动语义的相遇

移动迭代器&#xff1a;STL与移动语义的相遇 一、引言二、C 中移动语义的先决条件2.1、传统的复制机制2.2、移动语义的引入2.3、使用 std::move 进行显式移动 三、移动迭代器3.1、移动迭代器的用途3.2、如何使用移动迭代器3.3、移动迭代器的注意事项 四、避免数据丢失五、范围库…

Gartner最新指南:如何通过开展红队演习提高网络弹性

由于事件和监管要求不断增加&#xff0c;安全和风险管理领导者努力建立网络弹性并有效管理网络威胁。本研究指导这些领导者制定红队计划以支持弹性及其关键组件。 主要发现 根据 2024 年 Gartner 设计和构建现代安全运营调查&#xff0c;73% 的组织认为红队角色对安全运营目标的…

FGL;FGL peptide;EVYVVAENQQGKSKA; Cas:499993-62-3

【FGL peptide 简介】 FGL peptide 是一种多肽&#xff0c;是由15个氨基酸组成的两亲性多肽分子,序列为Glu - Val - Tyr - Val - Val - Ala - Glu - Asn - Gln - Gln - Gly - Lys - Ser - Lys - Ala。FGL peptide 能够由多肽筛选发现。多肽筛选是一种主要通过免疫测定法而集合活…

JAVA开源项目 体育馆管理系统 计算机毕业设计

本文项目编号 T 048 &#xff0c;文末自助获取源码 \color{red}{T048&#xff0c;文末自助获取源码} T048&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

大作业(手把手带你实现):交通标志图像分类系统

在现代交通管理中&#xff0c;交通标志的识别与分类是确保道路安全和流畅的重要环节。随着智能交通系统的发展&#xff0c;利用计算机视觉技术实现交通标志的自动识别成为研究热点。这一系统不仅能帮助司机更快地理解路况&#xff0c;还能为自动驾驶汽车提供关键决策支持。通过…

【QA-MISRA】解决使用命令行扫描项目后看不到报告的问题

1、 文档目标 解决使用命令行扫描项目后看不到报告的问题 2、 问题场景 客户使用命令行扫描项目后看不到报告&#xff0c;原因是客户未设置和勾选报告格式就导出了DAX文件进行命令行直接扫描。 3、软硬件环境 1、软件版本&#xff1a; QA-MISRA23.04 2、机器环境&#xff1…

8080时序

通过RS来区分是命令还是数据 在WR高电平时&#xff0c;将数据放入D[0:15]数据线上 在WR上升沿&#xff0c;读取D[0:15]数据线上的数据 //提前把默认信号设置为对应电平 static inline void LcdSendCmd(uint16_t cmdVal) {LCD_CS_RESET();//cs输出低电平&#xff0c;表示片选…

全球商旅,提升人效,就选用友BIP超级版!

在全球化的商业浪潮中&#xff0c;企业商旅活动愈发频繁&#xff0c;其管理效率与成本控制成为企业提升竞争力的关键。用友BIP超级版商旅费控系统&#xff0c;深度融合数智人力产品&#xff0c;为企业量身打造一体化、智能化的商旅管理解决方案&#xff0c;助力企业在全球商旅中…

Go 综合题面试题

1. Golang 中 make 和 new 的区别&#xff1f; #make 和 new 都用于内存分配1&#xff1a;接收参数个数不一样&#xff1a; new() 只接收一个参数&#xff0c;而 make() 可以接收3个参数2&#xff1a;返回类型不一样&#xff1a; new() 返回一个指针&#xff0c;而 make() 返回…

TDengine 学习与使用经验分享:业务落地实践与架构升级探索

前言 随着物联网、工业互联网等行业的快速发展&#xff0c;时间序列数据的管理和处理需求急剧增加。传统的关系型数据库在处理大规模、高频次的时序数据时性能存在瓶颈&#xff0c;而专门针对时序数据设计的数据库系统则显示出其独特优势。TDengine 是其中的佼佼者&#xff0c;…

C++ :借助栈完成二叉树的非递归遍历

二叉树的传统访问分为&#xff1a;前序、中序、后序、层序。 其中前三者是递归访问&#xff0c;但是递归是有缺陷的&#xff0c;树太深就会栈溢出。 因此本文我们思考如何使用非递归的方法来完成遍历。 1. 前序遍历 要迭代⾮递归实现⼆叉树前序遍历&#xff0c;⾸先还是要借…