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、练习

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

SELECT
	last_name,
	department_name,
	city
FROM
	employees,
	departments,
	locations
WHERE
	employees.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条件都是谁等于谁,非等值连接就是不等于谁。

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

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

SELECT
	e.last_name,
	e.salary,
	j.grade_level
FROM
	employees e,
	job_grades j
WHERE
	e.salary >= j.lowest_sal
AND e.salary <= j.highest_sal

这就叫非等值连接。

3.2、自连接 vs 非自连接

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

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

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

SELECT
	emp.employee_id,
	emp.last_name,
	mgr.employee_id,
	mgr.last_name
FROM
	employees emp,
	employees mgr
WHERE
	emp.manager_id = mgr.employee_id

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

3.3、内连接 vs 外连接

内连接(inner join)

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

如:

SELECT
	e.last_name,
	dept.department_name
FROM
	employees e
INNER JOIN departments dept ON e.department_id = dept.department_id

外连接

左外连接(left join)

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

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

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

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

右外连接(right join)

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

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

SELECT
	e.last_name,
	dept.department_name
FROM
	employees 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图

例:

SELECT
	e.last_name,
	dept.department_name
FROM
	employees e
LEFT JOIN departments dept ON e.department_id = dept.department_id
WHERE
	dept.department_id IS NULL;

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

右2图

SELECT
	e.last_name,
	dept.department_name
FROM
	employees e
RIGHT JOIN departments dept ON e.department_id = dept.department_id
WHERE
	e.department_id IS NULL;

左下图

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

SELECT
	last_name,
	department_name
FROM
	employees e
LEFT JOIN departments dept ON e.department_id = dept.department_id
UNION ALL
SELECT
	last_name,
	department_name
FROM
	employees e
RIGHT JOIN departments dept ON e.department_id = dept.department_id
WHERE
	e.department_id IS NULL;

右下图

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

3.5、自然连接(natural join)

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

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

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

# 自然连接
SELECT
	employee_id,
	last_name,
	department_name
FROM
	employees e
NATURAL JOIN departments d;


# 普通连接
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;

3.6、using用法

using用来简写on的条件。

如下:

# 内连接 on后写条件
SELECT
	e.last_name,
	dept.department_name
FROM
	employees e
INNER JOIN departments dept ON e.department_id = dept.department_id;


# 内连接 using写条件
SELECT
	e.last_name,
	dept.department_name
FROM
	employees e
INNER JOIN departments dept using(department_id);

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jetsonTX2 nx配置yolov5和D435I相机,完整步骤

转载一篇问题解决博客&#xff1a;问题解决 一、烧录系统 使用SDK烧录 二、安装archiconda3 JETSON TX2 NX的架构是aarch64,与win10,linxu不同,所以不能安装Anaconda&#xff0c;这里安装对应的archiconda。 1. 安装 wget https://github.com/Archiconda/build-tools/rel…

第16期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

VMware——VMware17设置WindowServer2012R2环境静态IP及关闭防火墙

目录 一、VMware17设置WindowServer2012R2环境静态IP1.1、工具栏虚拟机的设置步骤1.2、工具栏编辑的设置步骤1.3、静态IP的设置步骤 二、VMware17关闭WindowServer2012R2环境防火墙 一、VMware17设置WindowServer2012R2环境静态IP 1.1、工具栏虚拟机的设置步骤 打开VMware虚拟…

box-shadow

0 参数解释 box-shadow:inset offset-x offset-y blur-radius spread-radius color; **inset&#xff1a;**有inset 则为内阴影&#xff0c;没有insert 则为外阴影&#xff0c;默认为外阴影 **offset-x&#xff1a;**横向阴影的大小。正值阴影在右边&#xff1b;负值阴影在左边…

基于深度学习的目标检测算法 计算机竞赛

文章目录 1 简介2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 1 简介 &#x1f5…

linux查看文件夹使用情况以及查看文件大小

1、ls ls 命令是 Linux 中最常用的文件和目录列表命令之一。它可以显示文件的各种属性&#xff0c;包括文件大小。 ls -l <文件名>上述命令会显示文件的详细信息&#xff0c;其中包括文件的大小。文件大小以字节为单位显示&#xff0c;并且在输出中的第 5 列。4096 表示…

【实战Flask API项目指南】之六 数据库集成 SQLAlchemy

实战Flask API项目指南之 数据库集成 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 在上一篇文章中&#xff0c;我们实现了…

出海营销必看:如何避免邮件被识别为垃圾邮件

对于现在的商业环境来说&#xff0c;邮件通信已经成为企业与客户、合作伙伴以及员工之间沟通和交流的重要方式。然而&#xff0c;尽管企业发送的邮件通常都是正常的、合规的&#xff0c;有时候却会被系统错误地标记为营销邮件。这个情况给企业带来了很多困扰。 如果企业的邮件…

FMC子卡解决方案:FMC214-基于FMC兼容1.8V IO的Full Camera Link 输出子卡

FMC214-基于FMC兼容1.8V IO的Full Camera Link 输出子卡 一、板卡概述   基于FMC兼容1.8V IO的Full Camera Link 输出子卡支持Base、Middle、Full Camera link信号输出&#xff0c;兼容1.8V、2.5V、3.3V IO FPGA信号输出。适配xilinx不同型号开发板和公司内部各FMC载板。北…

Langchain-Chatchat项目:4.1-P-Tuning v2实现过程

常见参数高效微调方法(Parameter-Efficient Fine-Tuning&#xff0c;PEFT)有哪些呢&#xff1f;主要是Prompt系列和LoRA系列。本文主要介绍P-Tuning v2微调方法。如下所示&#xff1a; Prompt系列比如&#xff0c;Prefix Tuning(2021.01-Stanford)、Prompt Tuning(2021.09-Goo…

图片去水印不伤原图快来试试这些方法

也许很多朋友都曾经历过和我相似的困扰。费尽心思找到心仪的图片&#xff0c;却发现下载的图片大多都带有水印。尝试了各种方法想要消除图片上的水印&#xff0c;但效果不尽如人意&#xff0c;反而让画面变得更加凌乱模糊&#xff0c;那么&#xff0c;有什么方法可以图片去水印…

点击跳到详情页

父页面 <template><view class"order-list"><cu-custom bgColor"bg-gradual-blue" :isBack"true"><block slot"content">荒料管理</block></cu-custom><view class"" ><!-- 订…

物流小程序制作教程:从零到有,详细解析

随着互联网的快速发展&#xff0c;物流行业也逐渐实现了数字化转型。为了满足消费者对更加便捷、高效的服务需求&#xff0c;许多物流企业选择制作自己的小程序。本文将通过乔拓云网后台&#xff0c;带你轻松搭建物流小程序&#xff0c;主要分为以下几个部分&#xff1a; 一、进…

Github 自动化部署到GitHub Pages

1.准备工作 新建仓库 新建项目 配置 vite.config.ts base: ./,部署应用包时的基本URL&#xff0c;例&#xff1a;vue-cli 5.x 配置 publicPath 推送到远程仓库 2.配置 GitHub Token 点击 Settings -> Actions -> General 找到 Workflow permissions&#xff0c;选中第…

名称空间,作用域,global和nonlocal

一、名称空间 加载顺序&#xff1a; 1、内置命名空间 2、全局命名空间 3、局部命名空间 取值顺序&#xff1a; 1、局部命名空间 2、全局命名空间 3、内置命名空间 二、作用域 三、global python之闭包https://blog.csdn.net/Python_1981/article/details/133636994 四…

串口通信(8)串口中断“边接收边解析数据“的通信程序

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

JavaScript 基础

文章目录 JavaScript初识JavaScriptJavaScript 的组成第一个程序 语法变量的使用动态类型基本数据类型number 数字类型string 字符串类型转义字符求长度字符串拼接 boolean 布尔类型undefined 未定义数据类型null 空值类型 运算符数组数组的遍历函数 对象使用 字面量 创建对象 …

openGauss学习笔记-112 openGauss 数据库管理-管理用户及权限-行级访问控制

文章目录 openGauss学习笔记-112 openGauss 数据库管理-管理用户及权限-行级访问控制 openGauss学习笔记-112 openGauss 数据库管理-管理用户及权限-行级访问控制 行级访问控制特性将数据库访问控制精确到数据表行级别&#xff0c;使数据库达到行级访问控制的能力。不同用户执…

ZYNQ实验---IQ调制实现SSB PART2

一、前言 本文实验在ZYNQ实验—IQ调制实现SSB PART1的基础上进行优化完善。 下图为IQ调制实现SSB PART1中设想实现设计框图 该图设计存在的几个问题&#xff1a; PC-PS的UDP传输存在丢包中断控制发包实际不适合流数据的传输采用的BRAM模块可以存储的空间较小&#xff0c;PC…

正则表达式续篇

位置锚定&#xff1a; ^:行首锚定&#xff0c;表示以什么为开头 例如&#xff1a; $:行尾锚定&#xff0c;表示以什么为结尾 例如&#xff1a; ^&#xff1a;匹配的是空行 例如&#xff1a; ^root$&#xff1a;匹配整行&#xff0c;而且整行只能有这一个字符串 实验&#x…