MYSQL 多表联查详解

目录

一、一个案例引发的多表连接

二、笛卡尔积的错误和与正确的多表查询

2.1、笛卡尔积错误展示

2.2、笛卡尔积解决方法

2.3、练习

三、多表查询分类

3.1、等值连接 vs 非等值连接

3.2、自连接 vs 非自连接

3.3、内连接 vs 外连接

内连接(inner join)

外连接

左外连接(left join)

右外连接(right join)

3.4、七种JOINS查询

左2图

右2图

左下图

右下图

3.5、自然连接(natural join)

3.6、using用法


一、一个案例引发的多表连接

先看这三张表的结构:

员工表的department_id关联部门表的主键department_id,而部门表的location_id关联地区表的主键location_id。

意思就是员工所属部门,而部门所属地区,从而可以查出员工所属地区在哪。

二、笛卡尔积的错误和与正确的多表查询

2.1、笛卡尔积错误展示

案例:查询员工的姓名及其部门名称

SELECT last_name, department_name FROM employees, departments;

结果怎么查出这么多条记录?

我员工表只有107条记录,而部门表更少,只有27条记录,那2889条记录是怎么来的呢?

学过数学的小伙伴们估计已经猜到了答案,是107 * 27 = 2889。是每个员工都与每个部门匹配的一遍,这就是笛卡尔积。

2.2、笛卡尔积解决方法

SQL92中,笛卡尔积也称为交叉连接 ,英文是 CROSS JOIN 。在 SQL99 中也是使用 CROSS JOIN表示交叉连接。它的作用就是可以把任意表进行连接,即使这两张表不相关。

说白了,其实就是没有写连接条件,修改如下:

SELECT last_name, department_name FROM employees, departments where employees.department_id = departments.department_id;

2.3、练习

问题:查出员工所在的部门和地区,要求显示出员工名、部门名、地区名

SELECTlast_name,department_name,city
FROMemployees,departments,locations
WHEREemployees.department_id = departments.department_id
AND departments.location_id = locations.location_id;

从SQL语句看出,需要三张表关联查询,条件先是员工表的department_id关联部门表的department_id,然后部门表的location_id再关联地区表的location_id。

三、多表查询分类

3.1、等值连接 vs 非等值连接

顾名思义,之前我们where条件都是谁等于谁,非等值连接就是不等于谁。

例如:我们先看员工表和工作等级表结构

现在想查出每个员工的薪资等级。

SELECTe.last_name,e.salary,j.grade_level
FROMemployees e,job_grades j
WHEREe.salary >= j.lowest_sal
AND e.salary <= j.highest_sal

这就叫非等值连接。

3.2、自连接 vs 非自连接

先看看员工表的manager_id(管理者ID)。

问题:查询员工id,员工姓名及其管理者的id和姓名

注意:管理者id要和employee_id相等。

SELECTemp.employee_id,emp.last_name,mgr.employee_id,mgr.last_name
FROMemployees emp,employees mgr
WHEREemp.manager_id = mgr.employee_id

顾名思义,自己和自己连接,叫做自连接。

3.3、内连接 vs 外连接

内连接(inner join)

是将两个或多个表中满足指定条件的行连接在一起,形成一个新的结果集的操作。

如:

SELECTe.last_name,dept.department_name
FROMemployees e
INNER JOIN departments dept ON e.department_id = dept.department_id

外连接

左外连接(left join)

左表数据全部查出,右表只返回符合条件的数据。

例如:查询全部的员工和所在部门

员工表共有107条数据,其中有位员工是没有部门的,如果是内连接,最后返回的是106条数据,不包括没有部门的那位员工,但我现在的需求是包含这位员工,这就用到我们的左外连接。

SELECTe.last_name,dept.department_name
FROMemployees e
LEFT JOIN departments dept ON e.department_id = dept.department_id;

右外连接(right join)

右表数据全部查出,左表只返回符合条件的数据。

例如:查询全部的部门和部门下的员工

SELECTe.last_name,dept.department_name
FROMemployees e
RIGHT JOIN departments dept ON e.department_id = dept.department_id;

右表中有的部门下并没有员工,有的部门下有很多员工。

其实可以这样想,因为我是右外连接,我以右表为主,拿每一个部门都去和左表所有记录进行比对,符合条件的就记录下来,不符合的把右表记录下来,其实就相当于Java里的双层for循环。

for (int i = 0, i < dept.size(), i++) {  // 遍历部门表for (int j = 0, i < emp.size(), j++) {  //遍历员工表// 拿部门表的部门id和员工表的部门id比对if (dept.getDepartmentId().equals(emp.getDepartmentId())) {}}
}

3.4、七种JOINS查询

左1:左外连接(left join)

右1:右外连接(right join)

中间:内连接(inner join)

左2图

例:

SELECTe.last_name,dept.department_name
FROMemployees e
LEFT JOIN departments dept ON e.department_id = dept.department_id
WHEREdept.department_id IS NULL;

如图所示,如果sql不加where条件,单纯的左外连接,那查出的是左表全部数据,当然也包括没有部门的那位员工,符合左1图,但现在加了where dept.department_id IS NULL条件,我就把没有部门的那位员工给单独取出来了,注意左2图红色部分是不满足on后面的条件的那部分。

右2图

SELECTe.last_name,dept.department_name
FROMemployees e
RIGHT JOIN departments dept ON e.department_id = dept.department_id
WHEREe.department_id IS NULL;

左下图

属于满外连接,你可以像拼图一样,将左1图和右2图用union拼在一起。

SELECTlast_name,department_name
FROMemployees e
LEFT JOIN departments dept ON e.department_id = dept.department_id
UNION ALL
SELECTlast_name,department_name
FROMemployees e
RIGHT JOIN departments dept ON e.department_id = dept.department_id
WHEREe.department_id IS NULL;

右下图

也可以用拼图的方式,将左2和右2使用union all连接起来。

3.5、自然连接(natural join)

它会帮你自动查询两张连接表中所有相同的字段,然后进行等值连接。

比如我们看员工表和部门表

有两个相同的条件。那么如下是自然连接的写法,等于普通连接的写法。

# 自然连接
SELECTemployee_id,last_name,department_name
FROMemployees e
NATURAL JOIN departments d;# 普通连接
SELECTemployee_id,last_name,department_name
FROMemployees e
JOIN departments d ON e.department_id = d.department_id
AND e.manager_id = d.manager_id;

3.6、using用法

using用来简写on的条件。

如下:

# 内连接 on后写条件
SELECTe.last_name,dept.department_name
FROMemployees e
INNER JOIN departments dept ON e.department_id = dept.department_id;# 内连接 using写条件
SELECTe.last_name,dept.department_name
FROMemployees e
INNER JOIN departments dept using(department_id);

注意:on条件后,只有当左表的字段名和右表字段名一致的时候才能使用using,你像on e.dpetId = d.department_id就不能用using。

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

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

相关文章

第2篇 机器学习基础 —(4)k-means聚类算法

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。聚类算法是一种无监督学习方法&#xff0c;它将数据集中的对象分成若干个组或者簇&#xff0c;使得同一组内的对象相似度较高&#xff0c;不同组之间的对象相似度较低。聚类算法可以用于数据挖掘、图像分割、文本分类等领域…

记录--这个前端Api管理方案会更好?

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 简介 大家好&#xff0c;前端小白一枚&#xff0c;目前接触后台管理系统比较多&#xff0c;经常遇到不同对象的增删改查的接口&#xff0c;如何对Api进行一个有比较好的管理是个问题。在学习偏函数的时…

C#中使用LINQtoSQL管理SQL数据库之添加、修改和删除

目录 一、添加数据 二、修改数据 三、删除数据 四、添加、修改和删除的源码 五、生成效果 1.VS和SSMS原始记录 2.删除ID2和5的记录 3.添加记录ID2、5和8 4.修改ID3和ID4的记录 用LINQtoSQL管理SQL Server数据库时&#xff0c;主要有添加、修改和删除3种操作。 项目中创…

app开发之后需要做什么

在完成app的开发之后&#xff0c;还有一系列的工作需要进行&#xff0c;以确保app的顺利上线和用户的良好体验。下面将从原理和详细介绍两个方面来介绍app开发之后需要做的工作。 一、原理介绍 1. 测试与调试&#xff1a;在app开发完成后&#xff0c;需要进行全面的测试与调试…

[论文笔记]RetroMAE

引言 RetroMAE,中文题目为 通过掩码自编码器预训练面向检索的语言模型。 尽管现在已经在许多重要的自然语言处理任务上进行了预训练,但对于密集检索来说,仍然需要探索有效的预训练策略。 本篇工作,作者提出RetroMAE,一个新的基于掩码自编码器(Masked Auto-Encoder,MAE)…

十种排序算法(1) - 准备测试函数和工具

1.准备工作 我们先写一堆工具&#xff0c;后续要用&#xff0c;不然这些写在代码里可读性巨差 #pragma once #include<stdio.h>//为C语言定义bool类型 typedef int bool; #define false 0 #define true 1//用于交互a和b inline void swap(int* a, int* b) {/*int c *a…

AutoDL 云/本地部署 百川2、GLM2

AutoDL 云上部署 百川2、GLM2 AutoDL 云上部署 百川2、GLM2配置环境体验常见问题huggingface访问不了&#xff0c;使用学术资源加速大文件上传&#xff0c;百度、阿里网盘都可CUDA 空间不足系统盘空间不足省钱绝招软件源 本地部署 百川2、GLM2根据显存大小选模型拉取docker镜像…

MySQL-----事务

事务的概念 事务是一种机制&#xff0c;一个操作序列。包含了一组数据库的操作命令&#xff0c;所有的命令都是一个整体&#xff0c;向系统提交或者撤销的操作&#xff0c;要么都执行&#xff0c;要么都不执行。 是一个不可分割的单位 事务的ACID特点 ACID&#xff0c;是指在可…

【Algorithm】最容易理解的蒙特卡洛树搜索(Monte Carlo Tree Search,MCTS)算法

看了不少解读和笔记&#xff0c;本文把最容易理解的解读做个总结。 1. 蒙特卡洛方法 蒙特卡洛方法(Monte Carlo method)&#xff0c;是一种“统计模拟方法”。20世纪40年代&#xff0c;为建造核武器&#xff0c;冯.诺伊曼 等人发明了该算法。因赌城蒙特卡洛而得名&#xff0c…

R语言用jsonlite库写的一个图片爬虫

以下是一个使用R语言和jsonlite库下载图片的程序。首先&#xff0c;我们需要导入jsonlite库和options()函数&#xff0c;然后将代理服务器的主机名和端口号设置为"duoip"和"8000"。接着&#xff0c;我们将URL设置为"https://yun.baidu.com/"&…

LeetCode 143. 重排链表(双指针、快慢指针)

题目&#xff1a; 链接&#xff1a;LeetCode 143. 重排链表 难度&#xff1a;中等 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln-1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → … 不…

Redis入门指南学习笔记(2):常用数据类型解析

一.前言 本文主要介绍Redis中包含几种主要数据类型&#xff1a;字符串类型、哈希类型、列表类型、集合类型和有序集合类型。 二.字符串类型 字符串类型是Redis中最基本的数据类型&#xff0c;它是其他4种数据类型的基础&#xff0c;其他数据类型与字符串类型的差别从某种角度…

欧科云链研究院:如何降低Web3风险,提升虚拟资产创新的安全合规

在香港Web3.0行业&#xff0c;技术推动了虚拟资产投资市场的快速增长&#xff0c;但另一方面&#xff0c;JPEX诈骗案等行业风险事件也接连发生&#xff0c;为Web3行业发展提供了重要警示。在近期的香港立法会施政报告答问会上&#xff0c;行政长官李家超表示&#xff0c;与诈骗…

自己动手实现一个深度学习算法——三、神经网络的学习

文章目录 1.从数据中学习1&#xff09;数据驱动2&#xff09;训练数据和测试数据 2.损失函数1)均方误差2)交叉熵误差3)mini-batch学习 3.数值微分1&#xff09;概念2&#xff09;数值微分实现 4.梯度1&#xff09;实现2&#xff09;梯度法3&#xff09;梯度法实现4&#xff09;…

从零开始的目标检测和关键点检测(二):训练一个Glue的RTMDet模型

从零开始的目标检测和关键点检测&#xff08;二&#xff09;&#xff1a;训练一个Glue的RTMDet模型 一、config文件解读二、开始训练三、数据集分析四、ncnn部署 从零开始的目标检测和关键点检测&#xff08;一&#xff09;&#xff1a;用labelme标注数据集 从零开始的目标检测…

[H5动画制作系列]坐标转化问题一次搞清,一了百了

前言: 本次演示的坐标包括三个坐标层&#xff1a; 1.舞台上的某位置相对于舞台的全局坐标的坐标(黑色)。 2.舞台上蓝色实例内部某位置相对于该蓝色实例内部局部坐标的坐标(蓝色)。 3.舞台上蓝色实例内部的红色实例内部某位置相对该红色实例内部局部坐标的坐标(红色)。 舞台…

Day18力扣打卡

打卡记录 寻找重复数&#xff08;双指针&#xff09; 链接 Floyd判圈法&#xff0c;先用快慢指针以不同速率进行移动&#xff0c;最终一定会出现相遇点&#xff0c;然后在使一指针从初始开始&#xff0c;两指针再以同步调移动&#xff0c;再次相遇的点一定为循环开始的点位。 …

赋能制造业高质量发展,释放采购数字化新活力——企企通亮相武汉2023国际智能制造创新论坛

摘要 “为应对成本上升、供应端不稳定、供应链上下游协同困难、决策无数据依据等问题&#xff0c;利用数字化手段降本增效、降低潜在风险十分关键。在AI等先进技术发展、供应链协同效应和降本诉求等机遇的驱动下&#xff0c;采购供应链数字化、协同化成为企业激烈竞争的优先选…

链表的介绍

链表的结构和定义 介绍 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 链表&#xff08;linked list&#xff09;是一种经典的线性数据结构&#xff0c;它可以用来存储一组具有顺序性…

执行npm install时老是安装不成功node-sass的原因和解决方案

相信你安装前端项目所需要的依赖包&#xff08;npm install 或 yarn install&#xff09;时&#xff0c;有可能会出现如下报错&#xff1a; D:\code\**project > yarn install ... [4/4] Building fresh packages... [-/6] ⠁ waiting... [-/6] ⠂ waiting... [-/6] ⠂ wai…