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.rhkb.cn/news/435897.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日OJ题_牛客_添加逗号_模拟_C++_Java

目录 牛客_添加逗号_模拟 题目解析 C代码1 C代码2 Java代码 牛客_添加逗号_模拟 添加逗号_牛客题霸_牛客网 题目解析 读取输入:读取一行字符串。分割字符串:使用空格将字符串分割成单词数组。拼接字符串:将单词数组中的每个单词用逗号…

Oracle控制文件全部丢失如何使用RMAN智能恢复?

1.手动删除所有控制文件模拟故障产生 2.此时启动数据库发现控制文件丢失 3.登录rman 4.列出故障 list failure; 5.让RMAN列举恢复建议 advise failure; 6.使用RMAN智能修复 repair failure;

Java常用三类定时器快速入手指南

文章目录 Java常用三类定时器快速入手指南一、序言二,Timer相关1、概念2、Timer类3、TimerTask类4、ScheduleExecutorService接口 三,Scheduled相关1、配置1.1 SpringMVC配置1.2 SpringBoot配置(1)单线程(2&#xff09…

cpp,git,unity学习

c#中的? 1. 空值类型(Nullable Types) ? 可以用于值类型(例如 int、bool 等),使它们可以接受 null。通常,值类型不能为 null,但是通过 ? 可以表示它们是可空的。 int? number null; // …

桥接(桥梁)模式

简介 桥接模式(Bridge Pattern)又叫作桥梁模式、接口(Interface)模式或柄体(Handle and Body)模式,指将抽象部分与具体实现部分分离,使它们都可以独立地变化,属于结构型…

【AAOS】CarService -- Android汽车服务

概述 Android Automative OS理解为Android OS + Android Automative Service,而CarService就是提供汽车相关功能的最主要模块。 CarService与Android OS的关系:CarService运行于独立的进程中,其作为原有Android服务的补充,在汽车设备上运行。CarService在整体车载通信中起…

JAVA线程基础二——锁的概述之乐观锁与悲观锁

乐观锁与悲观锁 乐观锁和悲观锁是在数据库中引入的名词,但是在并发包锁里面也引入了类似的思想,所以这里还是有必要讲解下。 悲观锁指对数据被外界修改持保守态度,认为数据很容易就会被其他线程修改,所以在数据被处理前先对数据进行加锁&…

python 如何引用变量

在字符串中引入变量有三种方法: 1、 连字符 name zhangsan print(my name is name) 结果为 my name is zhangsan 2、% 字符 name zhangsan age 25 price 4500.225 print(my name is %s%(name)) print(i am %d%(age) years old) print(my price is %f%(pric…

项目管理专业资质认证ICB 3中关于项目经理素质的标准

项目管理专业资质认证ICB 3中关于项目经理素质的标准,的确很全面,下面摘录之:

15年408计算机网络

第一题: 解析: 接收方使用POP3向邮件服务器读取邮件,使用的TCP连接,TCP向上层提供的是面向连接的,可靠的数据传输服务。 第二题: 解析:物理层-不归零编码和曼彻斯特编码 编码1:电平在…

LabVIEW项目编码器选择

在LabVIEW项目中,选择增量式(Incremental Encoder)和绝对式(Absolute Encoder)编码器取决于项目的具体需求。增量式编码器和绝对式编码器在工作原理、应用场景、精度和成本等方面存在显著差异。以下从多方面详细阐述两…

又一年国庆至,“打工人”在欢呼,OTA们在雀跃

国庆“黄金周”倒计时最后一天,旅游出行即将迎来新一轮高峰。 安信国际指出,国庆期间,出游人次的增长确定性高于人均消费的增长。预计国内旅游收入7,000-7,500亿元,较2019年同期增8%-15%;预计国内旅游人次8.5-9.0亿人…

今日指数项目A股大盘数据采集

1、A股大盘数据采集 1.1 A股大盘数据采集准备 1.1.1 配置ID生成器bean A股大盘数据采集入库时,主键ID保证唯一,所以在stock_job工程配置ID生成器: Configuration public class CommonConfig {/*** 配置基于雪花算法生成全局唯一id* 参与…

springboot+大数据+基于协同过滤算法的校园食堂订餐系统【内含源码+文档+部署教程】

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

Git常用方法——详解

一、下载安装git git官网: Git - Downloads (git-scm.com) 下载安装Git(超详细超简单)_git下载-CSDN博客 二、克隆下载至本地 1、复制HTTPS链接 在gitee或者gitLab或者gitHub上复制HTTPS链接 2、打开Open Git Bash here 在本地想要新建文…

闯关训练一:Linux基础

闯关任务:完成SSH连接与端口映射并运行hello_world.py 1.创建开发机 2.SSH连接 3. VS-Code 连接 选择 Linux 平台 ,输入密码 ,选择进入文件夹 4.端口映射 按照下文安装Docs pip install gradio 运行server.py import gradio as grdef …

工业制造场景中的设备管理深度解析

在工业制造的广阔领域中,设备管理涵盖多个关键方面,对企业的高效生产和稳定运营起着举足轻重的作用。 一、设备运行管理 1.设备状态监测 实时监控设备的运行状态是确保生产顺利进行的重要环节。通过传感器和数据采集系统等先进技术,获取设备…

新书速览|Stable Diffusion-ComfyUI AI绘画工作流解析

《Stable Diffusion-ComfyUI AI绘画工作流解析》 本书内容 《Stable Diffusion-ComfyUI AI绘画工作流解析》从零开始,详尽系统地讲解从本地部署ComfyUI、下载安装自定义节点,到搭建各种工作流程的全过程。同时,辅以3D形象转绘、艺术二维码和证…

思科dhcp的配置

以路由器为例 让pc3 自动获取ip地址并获取的网段为172.16.4.100-172.16.4.200 配置如下: R1(config)#interface GigabitEthernet0/2 R1(config)#ip address 172.16.4.254 255.255.255.0 R1(config)# no shutdown R1(config)#ip dhcp pool 4_pool //创建dhcp地址池…

【原创】java+swing+mysql企业招聘管理系统设计与实现

个人主页:程序员杨工 个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验 博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片,希望和大家…