MYSQL 多表联查详解

news2024/11/8 3:51:08

目录

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

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

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。

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

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

相关文章

基于FPGA的图像RGB转CMYK实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、RGB转CMYK的原理 4.2、基于FPGA的实现方法 5.算法完整程序工程 1.算法运行效果图预览 将仿真结果导入到matlab中&#xff0c;得到如下对比结果&#xff1a; 2.算法运行软件版本 matl…

C++虚函数产生的多态

C虚函数产生的多态 1、先看下面代码&#xff0c;参考施雷老师课堂笔记 #include<iostream> #include<vector> #include <algorithm> #include <functional> using namespace std;/* 虚函数&#xff0c;静态绑定和动态绑定覆盖&#xff1a; 基类和派生…

Vue3 实现 clipboard 复制功能

一个很小的交互功能&#xff0c;网上搜了一下有一个 vue3-clipboard 直接支持vue3&#xff0c;到github仓库看了下&#xff0c;原作者已经不维护这个项目了&#xff1a; 推荐使用 vueuse 自带的 useclipboard 功能&#xff0c;由 vue 团队维护&#xff0c;稳定性基本没问题 官…

UDP服务端和客户端通信代码开发流程

一、UDP通信 TCP&#xff1a;传输控制协议&#xff0c;面向连接的&#xff0c;稳定的&#xff0c;可靠的&#xff0c;安全的数据集流传递 稳定和可靠:丢包重传 数据有序:序号和确认序号 流量控制:稳定窗口 UDP&#xff1a;用户数据报协议 面向无连接的,不稳定的,不可靠,不安…

数据链路层协议【MAC帧和ARP协议】

全文目录 以太网帧格式MAC地址MAC地址和IP地址对比理解 MTU定义&#xff1a;细节&#xff1a;为什么它重要&#xff1a; MTU对IP协议的影响MTU对TCP和UDP的影响 ARP协议ARP数据报的格式ARP协议的作用ARP协议的工作流程 以太网帧格式 定义: 以太网是一种数据链路层和物理层标准…

【机器学习】几种常用的机器学习调参方法

在机器学习中&#xff0c;模型的性能往往受到模型的超参数、数据的质量、特征选择等因素影响。其中&#xff0c;模型的超参数调整是模型优化中最重要的环节之一。超参数&#xff08;Hyperparameters&#xff09;在机器学习算法中需要人为设定&#xff0c;它们不能直接从训练数据…

儿童产品和婴儿产品上架亚马逊美国站CPC认证测试标准

婴儿橡皮奶嘴 (ASTM F963, EN 1400, AS 2432) 婴儿奶嘴夹 (EN 12586, BS EN 12586) 婴儿学步车 (ASTM F977, EN 1273, BS EN 1273) 婴儿背带 (ASTM F2236, EN 13209, BS EN 13209) 奶瓶奶嘴 (EN 14350, BS EN 14350) 家用双层床 (ASTM F1427, EN 747, BS EN 747, AS/NZS 4…

uni-app小程序使用vant

步骤一&#xff1a;安装 Vant Weapp # 通过 npm 安装 npm i vant/weapp -S --production# 通过 yarn 安装 yarn add vant/weapp --production# 安装 0.x 版本 npm i vant-weapp -S --production步骤二&#xff1a;在根目录下创建“wxcomponents”文件夹 步骤三&#xff1a;找…

win7中安装node14和vue

下载并安装低版本node 13 到官网去找早期历史版本的 nodejs 13 msi格式即可&#xff0c;并一键安装&#xff0c;我安装在了 D:\Program Files\nodejs 目录下 https://nodejs.org/download/release/v13.14.0/ 下载高版本node 14 下载高版本的node zip包 https://nodejs.org/…

AndroidPicker的使用

项目地址&#xff1a;https://github.com/gzu-liyujiang/AndroidPicker 历史版本:https://github.com/gzu-liyujiang/AndroidPicker/blob/master/ChangeLog.md 依赖配置 // JitPack 远程仓库&#xff1a;https://jitpack.iomaven { url https://jitpack.io } 所有选择器的基…

网络安全(网络安全)小白自学

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全…

利用日期创建文件-多用于数据库的备份

功能&#xff1a;根据日期变化实现文件的创建 1&#xff09;知识点&#xff0c;date命令的用法 --date"n day ago" %Y%m%d #n天前&#xff0c;当天则可以去掉--date参数 2&#xff09;文件名的拼接 ${filename}${date} 3查看结果文件 后期学循环语句可以改一下…

git,ssh,sourcetree代码管理

安装Git并建立与GitHub的ssh连接 1、安装git&#xff0c;设置git的用户信息&#xff08;需要通过用户信息来显示你是谁&#xff09; 2、配置SSH&#xff0c; 因为本地Git仓库和GitHub仓库之间的传输是通过SSH加密传输的&#xff0c;GitHub需要识别是否是你推送&#xff0c;Git…

部署ELK

一、elasticsearch #拉取镜像 docker pull elasticsearch:7.12.1 #创建ELK docker网络 docker network create elk #启动ELK docker run -d --name es --net elk -P -e "discovery.typesingle-node" elasticsearch:7.12.1 #拷贝配置文件 docker cp es:/usr/share/el…

HTML脚本、字符实体、URL

HTML脚本&#xff1a; JavaScript 使 HTML 页面具有更强的动态和交互性。 <script> 标签用于定义客户端脚本&#xff0c;比如 JavaScript。<script> 元素既可包含脚本语句&#xff0c;也可通过 src 属性指向外部脚本文件。 JavaScript 最常用于图片操作、表单验…

网络安全好就业吗?

现目前而言&#xff0c;网络安全工程师仍是比较紧缺的。但网络安全行业前景好并≠网络安全的入学门槛低&#xff0c;也≠网络安全行业适合所有转岗的人。行业紧缺的一直是技术过硬&#xff0c;德才兼备的优秀人才。 一、网络安全适合哪些人&#xff1f; 首先&#xff0c;是对…

K8s Error: ImagePullBackOff 故障排除

Error: ImagePullBackOff 故障排除 1. 起因 起因是要在一组k8s环境下做个Prometheus的测试,当时虚拟机用完直接暂停了. 启动完master和node节点后重启了这些节点. 当检查dashboard时候发现Pod处于ImagePullBackOff状态,使用命令查看详细情况 kubectl describe pods -n kuber…

极简安装win10

0 概述 本文适合那些追求高性能的人。本文的重点不是具体步骤&#xff0c;而是使用高效系统的思路。 0.1 为什么选win10? 虽然目前win11都出来了&#xff0c;但很吃硬件&#xff0c;新机i12,i13的可以装win11。像我们这些买电脑好几年的(i7),还是win10更合适。 0.2 重装效…

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

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

R语言如何写一个爬虫代码模版

R语言爬虫是利用R语言中的网络爬虫包&#xff0c;如XML、RCurl、rvest等&#xff0c;批量自动将网页的内容抓取下来。在进行R语言爬虫之前&#xff0c;需要了解HTML、XML、JSON等网页语言&#xff0c;因为正是通过这些语言我们才能在网页中提取数据。 在爬虫过程中&#xff0c;…