MySQL 【多表查询】

news2025/1/7 6:34:03

一 . 概述

多表关系 一对多(多对一) , 多对多 ,一对一
1) 一对一
案例: 用户 与 用户详情的关系
关系: 一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另 一张表中,以提升操作效率
实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)
create table tb_user(
			id int auto_increment primary key comment '主键ID',
			name varchar(10) comment '姓名',
			age int comment '年龄',
			gender char(1) comment '1: 男 , 2: 女',
			phone char(11) comment '手机号'
) comment '用户基本信息表';

create table tb_user_edu(
			id int auto_increment primary key comment '主键ID',
			degree varchar(20) comment '学历',
			major varchar(50) comment '专业',
			primaryschool varchar(50) comment '小学',
			middleschool varchar(50) comment '中学',
			university varchar(50) comment '大学',
			userid int unique comment '用户ID',
			constraint fk_userid foreign key (userid) references tb_user(id)
) comment '用户教育信息表';

insert into tb_user(id, name, age, gender, phone) values
		(null,'黄渤',45,'1','18800001111'),
		(null,'冰冰',35,'2','18800002222'),
		(null,'码云',55,'1','18800008888'),
		(null,'李彦宏',50,'1','18800009999');
		
insert into tb_user_edu(id, degree, major, primaryschool, middleschool,
university, userid) values
(null,'本科','舞蹈','静安区第一小学','静安区第一中学','北京舞蹈学院',1),
(null,'硕士','表演','朝阳区第一小学','朝阳区第一中学','北京电影学院',2),
(null,'本科','英语','杭州市第一小学','杭州市第一中学','杭州师范大学',3),
(null,'本科','应用数学','阳泉第一小学','阳泉区第一中学','清华大学',4);
2)一对多 (多对一)
案例: 部门 与 员工的关系
关系: 一个部门对应多个员工,一个员工对应一个部门
实现: 在多的一方建立外键,指向一的一方的主键

 

3 )多对多
案例: 学生 与 课程的关系
关系: 一个学生可以选修多门课程,一门课程也可以供多个学生选择
实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
通过中间表维护学生和课程的关系

create table student(
				id int auto_increment primary key comment '主键ID',
				name varchar(10) comment '姓名',
				no varchar(10) comment '学号'
) comment '学生表';

insert into student values
 (null, '黛绮丝', '2000100101'),(null, '谢逊','2000100102'),
 (null, '殷天正', '2000100103'),(null, '韦一笑', '2000100104');
 
 create table course(
			id int auto_increment primary key comment '主键ID',
			name varchar(10) comment '课程名称'
) comment '课程表';

insert into course values 
(null, 'Java'), (null, 'PHP'), (null , 'MySQL') ,(null, 'Hadoop');


create table student_course(
		id int auto_increment comment '主键' primary key,
		studentid int not null comment '学生ID',
		courseid int not null comment '课程ID',
		constraint fk_courseid foreign key (courseid) references course (id),
		constraint fk_studentid foreign key (studentid) references student (id)
)comment '学生课程中间表';

insert into student_course values (null,1,1),(null,1,2),
(null,1,3),(null,2,2),(null,2,3),(null,3,4);

 

在接下来的学习中,我们同样要先准备两张表(员工表和部门信息表):
create table dept(
		id int auto_increment comment 'ID' primary key,
		name varchar(50) not null comment '部门名称'
)comment '部门表';
INSERT INTO dept (id, name) VALUES (1, '研发部'), (2, '市场部'),(3, '财务部'), (4,
'销售部'), (5, '总经办'), (6, '人事部');

-- 创建emp表,并插入数据
create table emp(
		id int auto_increment comment 'ID' primary key,
		name varchar(50) not null comment '姓名',
		age int comment '年龄',
		job varchar(20) comment '职位',
		salary int comment '薪资',
		entrydate date comment '入职时间',
		managerid int comment '直属领导ID',
		dept_id int comment '部门ID'
)comment '员工表';

-- 添加外键
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) 
references dept(id);

INSERT INTO emp (id, name, age, job,salary, entrydate, managerid, dept_id)
VALUES
(1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),
(2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1),
(3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),
(4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1),
(5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1),
(6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12', 2,1),
(7, '灭绝', 60, '财务总监',8500, '2002-09-12', 1,3),
(8, '周芷若', 19, '会计',48000, '2006-06-02', 7,3),
(9, '丁敏君', 23, '出纳',5250, '2009-05-13', 7,3),
(10, '赵敏', 20, '市场部总监',12500, '2004-10-12', 1,2),
(11, '鹿杖客', 56, '职员',3750, '2006-10-03', 10,2),
(12, '鹤笔翁', 19, '职员',3750, '2007-05-09', 10,2),
(13, '方东白', 19, '职员',5500, '2009-02-12', 10,2),
(14, '张三丰', 88, '销售总监',14000, '2004-10-12', 1,4),
(15, '俞莲舟', 38, '销售',4600, '2004-10-12', 14,4),
(16, '宋远桥', 40, '销售',4600, '2004-10-12', 14,4),
(17, '陈友谅', 42, null,2000, '2011-10-12', 1,null);

在单表查询中,查询emp表的所有数据 --> select * from emp;

同样我们可以思考,多表能否写成 ? ---> select * from emp,dept;

此时,我们看到查询结果中包含了大量的结果集,总共102条记录,而这其实就是员工表emp所有的记录 (17) 与 部门表dept所有记录(6) 的所有组合情况,这种现象称之为笛卡尔积。接下来,就来简单 介绍下笛卡尔积。
笛卡尔积: 笛卡尔乘积是指在数学中,两个集合A集合 和 B集合的所有组合情况。

而在多表查询中,我们是需要消除无效的笛卡尔积的,只保留   两张表关联部分  的数据 

 SQL语句中,如何来去除无效的笛卡尔积呢?

------------>       我们可以给多表查询加上连接查询的条件即可。

二  . 分类

连接查询
1.内连接:相当于查询AB交集部分数据
2.外连接:
        1)左外连接:查询左表所有数据,以及两张表交集部分数据
        2)右外连接:查询右表所有数据,以及两张表交集部分数据
3.自连接:当前表与自身的连接查询,自连接必须使用表别名

 

三. 内连接

内连接查询的是两张表交集部分的数据。(也就是绿色部分的数据)

 内连接的语法分为两种: 隐式内连接、显式内连接

1) 隐式内连接
SELECT 字段列表 FROM 1 , 2 WHERE 条件 ... ;
2)显式内连接
SELECT 字段列表 FROM 1 [ INNER ] JOIN 2 ON 连接条件 ... ;

1.查询每一个员工的姓名 , 及关联的部门的名称 (隐式内连接实现) 

-- 隐式内连接
-- 表结构:emp,dept
-- 连接条件:emp.dept_id = dept.id

select emp.name,dept.name from emp,dept where emp.dept_id = dept.id;

 在多表查询中,我们经常会采用别名,为了简化SQL的编写,但是得注意,一旦给表取了别名,此时不能再使用emp 和 dept 来限定字段

2.查询每一个员工的姓名 , 及关联的部门的名称 (显式内连接实现)

-- 显示内连接
select e.name,d.name from emp e inner join dept d on e.dept_id = d.id;

 

四 . 外连接

外连接分为两种,分别是:左外连接 和 右外连接
1)左外连接
SELECT 字段列表 FROM 1 LEFT [ OUTER ] JOIN 2 ON 条件 ... ;
左外连接相当于查询表 1( 左表 ) 的所有数据,当然也包含表 1 和表 2 交集部分的数据。
2) 右外连接
SELECT 字段列表 FROM 1 RIGHT [ OUTER ] JOIN 2 ON 条件 ... ;
右外连接相当于查询表 2( 右表 ) 的所有数据,当然也包含表 1 和表 2 交集部分的数据。

 

1.查询emp表的所有数据, 和对应的部门信息

-- 查询emp表的所有数据, 和对应的部门信息
-- 表结构: emp, dept
-- 连接条件: emp.dept_id = dept.id
select e.*,d.name from emp e left join dept d on e.dept_id = d.id;

2.查询dept表的所有数据, 和对应的员工信息(右外连接)

-- 查询dept表的所有数据, 和对应的员工信息(右外连接)
-- 表结构: emp, dept
-- 连接条件: emp.dept_id = dept.id

select e.*,d.* from emp e right join dept d on e.dept_id = d.id;

注意事项:
左外连接和右外连接是可以相互替换的,只需要调整在连接查询时SQL中,表结构的先后顺
序就可以了。 而我们在日常开发使用时,更偏向于左外连接。

五 . 自连接

自连接查询,顾名思义,就是自己连接自己,也就是把一张表连接查询多次
语法:
SELECT 字段列表 FROM A 别名 A JOIN A 别名 B ON 条件 ... ;
而对于自连接查询,可以是内连接查询,也可以是外连接查询。

1.查询员工 及其 所属领导的名字

select a.name,b.name from emp a join emp b on a.managerid = b.id;

 

2. 查询所有员工 emp 及其领导的名字 emp , 如果员工没有领导, 也需要查询出来

select a.name,b.name from emp a left join emp b on a.managerid = b.id;

注意事项:
在自连接查询中, 必须要为表起别名 ,要不然我们不清楚所指定的条件、返回的字段,到底
是哪一张表的字段

六 . 联合查询

对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集 。

        SELECT 字段列表 FROM A ...
        UNION [ ALL ]
        SELECT 字段列表 FROM B ....;
1)对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
2)union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重。

 1.将薪资低于 5000 的员工 , 和 年龄大于 50 岁的员工全部查询出来


select * from emp where salary < 5000
union all
select * from emp where age > 50;

union all查询出来的结果,仅仅进行简单的合并,并未去重  --> union 去重

 

七 . 子连接

1. 概念 : SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询

SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );
子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个。

2.分类 :  

根据子查询返回的结果:

根据子查询位置,分为:
A. WHERE之后
B. FROM之后
C. SELECT之后

 7.1 标量子查询

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。
常用的操作符:=   <>   >     >=       <       <=

1.查询 "销售部" 的所有员工信息

2. 查询在 "方东白" 入职之后的员工信息

 

7.2 列子查询

 子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。

常用的操作符:IN NOT IN ANY SOME ALL
操作符
描述
IN
在指定的集合范围之内,多选一
NOT IN
不在指定的集合范围之内
ANY
子查询返回列表中,有任意一个满足即可
SOME
ANY 等同,使用 SOME 的地方都可以使用 ANY
ALL
子查询返回列表的所有值都必须满足

1.查询 "销售部" 和 "市场部" 的所有员工信息

 

 

2.查询比 财务部 所有人工资都高的员工信息

这里可以把最高的工资修改,来进行多次验证: 

 

3.查询比研发部其中任意一人工资高的员工信息

 

7.3 行子查询

子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。
常用的操作符:= <> IN NOT IN

1.. 查询与 "张无忌" 的薪资及直属领导相同的员工信息 ; 

 

7.4 表子查询 

子查询返回的结果是多行多列,这种子查询称为表子查询。
常用的操作符:IN

1.查询与 "鹿杖客" , "宋远桥" 的职位和薪资相同的员工信息

 

2. 查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门信息

 

八 . 练习

相关表的准备 :
主要涉及到三张表:emp 员工表、 dept 部门表、 salgrade 薪资等级表
create table salgrade(
		grade int,
		losal int,
		hisal int
) comment '薪资等级表';

insert into salgrade values (1,0,3000);
insert into salgrade values (2,3001,5000);
insert into salgrade values (3,5001,8000);
insert into salgrade values (4,8001,10000);
insert into salgrade values (5,10001,15000);
insert into salgrade values (6,15001,20000);
insert into salgrade values (7,20001,25000);
insert into salgrade values (8,25001,30000);

1.查询员工的姓名、年龄、职位、部门信息 (隐式内连接)

2.查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显式内连接)

3.查询拥有员工的部门ID、部门名称

4.查询所有年龄大于40岁的员工, 及其归属的部门名称; 如果员工没有分配部门, 也需要展示出

来(外连接)
-- 表结构:emp,dept
-- 连接条件: emp.dept_id = dept.id
select e.*,d.name from emp e left join dept d on e.dept_id = d.id where age > 40; 

5.查询所有员工的工资等级

-- 表结构:emp salgrade
-- 连接关系:emp.salary >= salgrade.losal and emp.salary <= salgrade.hisal
select e.*,s.grade from emp e , salgrade s where e.salary>=s.losal and e.salary<= s.hisal;

6.查询 "研发部" 所有员工的信息及 工资等级

-- 表: emp , salgrade , dept
-- 连接条件 : emp.salary between salgrade.losal and salgrade.hisal ,emp.dept_id = dept.id
-- 查询条件 : dept.name = '研发部'
select e.*,s.grade from emp e ,dept d,salgrade s where e.dept_id = d.id 
and 
(e.salary between s.losal and s.hisal) 
and d.name = '研发部';

7.查询 "研发部" 员工的平均工资

-- 表结构:emp,dept
-- 连接条件: emp.dept_id = dept.id
select avg(e.salary) from emp e ,dept d where e.dept_id = d.id and d.name = '研发部';

8.查询工资比 "灭绝" 高的员工信息。

9.查询比平均薪资高的员工信息

10.查询低于本部门平均工资的员工信息

11.查询所有的部门信息, 并统计部门的员工人数

12.查询所有学生的选课情况, 展示出学生名称, 学号, 课程名称

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

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

相关文章

【大模型】ChatGPT 数据分析与处理使用详解

目录 一、前言 二、AI 大模型数据分析介绍 2.1 什么是AI数据分析 2.2 AI数据分析与传统数据分析对比 2.2.1 差异分析 2.2.2 优劣势对比 2.3 AI大模型工具数据分析应用场景 三、AI大模型工具数据分析操作实践 3.1 ChatGPT 常用数据分析技巧操作演示 3.1.1 快速生成数据…

【面试系列】深入浅出 Spring Boot

熟悉SpringBoot&#xff0c;对常用注解、自动装配原理、Jar启动流程、自定义Starter有一定的理解&#xff1b; 面试题 Spring Boot 的核心注解是哪个&#xff1f;它主要由哪几个注解组成的&#xff1f;Spring Boot的自动配置原理是什么&#xff1f;你如何理解 Spring Boot 配置…

【Java项目】基于SpringBoot的【新生宿舍管理系统】

【Java项目】基于SpringBoot的【新生宿舍管理系统】 技术简介&#xff1a;本系统使用采用B/S架构、Spring Boot框架、MYSQL数据库进行开发设计。 系统简介&#xff1a;管理员登录进入新生宿舍管理系统可以查看首页、个人中心、公告信息管理、院系管理、班级管理、学生管理、宿舍…

【AI学习】Transformer深入学习(二):从MHA、MQA、GQA到MLA

前面文章&#xff1a; 《Transformer深入学习&#xff08;一&#xff09;&#xff1a;Sinusoidal位置编码的精妙》 一、MHA、MQA、GQA 为了降低KV cache&#xff0c;MQA、GQA作为MHA的变体&#xff0c;很容易理解。 多头注意力&#xff08;MHA&#xff09;&#xff1a; 多头注…

IP5385应用于移动电源快充方案的30W到100W大功率电源管理芯片

英集芯IP5385一款专为智能手机&#xff0c;平板&#xff0c;移动电源&#xff0c;手持电动工具等便携式电子设备提供快充解决方案的30W到100W大功率电源管理SOC芯片。集成了快充协议芯片、MCU、同步升降压控制器等多种功能于一个封装内部&#xff0c;有效减小了整体方案的尺寸。…

信息科技伦理与道德1:研究方法

1 问题描述 1.1 讨论&#xff1f; 请挑一项信息技术&#xff0c;谈一谈为什么认为他是道德的/不道德的&#xff0c;或者根据使用场景才能判断是否道德。判断的依据是什么&#xff08;自身的道德准则&#xff09;&#xff1f;为什么你觉得你的道德准则是合理的&#xff0c;其他…

.Net加密与Java互通

.Net加密与Java互通 文章目录 .Net加密与Java互通前言RSA生成私钥和公钥.net加密出数据传给Java端采用java方给出的公钥进行加密采用java方给出的私钥进行解密 .net 解密来自Java端的数据 AES带有向量的AES加密带有向量的AES解密无向量AES加密无向量AES解密 SM2(国密)SM2加密Sm…

西安电子科技大学初/复试笔试、面试、机试成绩占比

西安电子科技大学初/复试笔试、面试、机试成绩占比 01通信工程学院 02电子工程学院 03计算机科学与技术学院 04机电工程学院 06经济与管理学院 07数学与统计学院 08人文学院 09外国语学院 12生命科学与技术学院 13空间科学与技术学院 14先进材料与纳米科技学院 15网络与信息安…

服务器信息整理

文章目录 引言I BIOS时间Windows查看BIOS版本安装日期linux查看BIOS时间II 操作系统安装日期LinuxIII MAC 地址IV 设备序列号Linux 查看主板信息引言 信息内容:重点信息:用途、操作系统安装日期、设备序列化、IP、MAC地址、BIOS时间、系统 Linux查看工具:ifconfig、宝塔运维…

关于PINN进一步的探讨

pinn 是有监督、无监督、半监督&#xff1f; PINN&#xff08;Physics-Informed Neural Networks&#xff0c;物理信息神经网络&#xff09;通常被归类为一种有监督学习的方法。在PINN中&#xff0c;神经网络的训练过程不仅依赖于数据点&#xff08;例如实验观测数据&#xff0…

Linux-Ubuntu之I2C通信

Linux-Ubuntu之I2C通信 一&#xff0c;I2C通信原理1.写时序2.读时序 二&#xff0c;代码实现三&#xff0c;显示 一&#xff0c;I2C通信原理 使用I2C接口驱动AP3216C传感器&#xff0c;该传感器能实现两个效果&#xff0c;一个是感应光强&#xff0c;另一个是探测物体与传感器…

Trimble天宝X9三维扫描仪为建筑外墙检测提供了全新的解决方案【沪敖3D】

随着城市化进程的快速推进&#xff0c;城市高层建筑不断增多&#xff0c;对建筑质量的要求也在不断提高。建筑外墙检测&#xff0c;如平整度和垂直度检测&#xff0c;是衡量建筑质量的重要指标之一。传统人工检测方法不仅操作繁琐、效率低下&#xff0c;还难以全面反映墙体的真…

主机A与主机B建立TCP连接的三次握手过程

&#xff08; 1 &#xff09;主机 A 的 TCP 向主机 B 发出连接请求 SYN 报文段&#xff08;第一次握手&#xff09;。&#xff08; 1 分&#xff09; &#xff08; 2 &#xff09;一旦包含 SYN 报文段的 IP 数据报到达主机 B &#xff0c; SYN 报文段被从数据报…

【GUI-pyqt5】QObject类

1. QObject模块详解 1.1 描述 所有Qt对象的父类 1.2 功能和作用 1.2.1 对象名称和属性 1.2.1.1 API API功能备注 setObjectName("唯一名称") 给一个Qt对象设置一个名称 一般这个名称是唯一的&#xff0c;当做对象ID来使用 objectName() 获取一个对象名称 - set…

C++Primer 变量

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

VScode怎么重启

原文链接&#xff1a;【vscode】vscode重新启动 键盘按下 Ctrl Shift p 打开命令行&#xff0c;如下图&#xff1a; 输入Reload Window&#xff0c;如下图&#xff1a;

(leetcode算法题)382. 链表随机节点

如果给你一个 智能记录 k行内容的小笔记本&#xff0c;从一本你也不知道有多少行的 C Primer 中进行摘抄&#xff0c;你应该怎么做才能让抄写的时候能让书中的每一行都等概率的出现在小笔记本中&#xff1f; 答&#xff1a;准备好一个公平的轮盘和一个巨大的摇奖机&#xff0c…

MIPI_DPU 综合(DPU+MIPI+Demosaic+VDMA 通路)

目录 1. 简介 2. 创建 Platform 2.1 Block Design 2.1.1 DPU PFM Lite 2.1.2 DPU prj 2.1.3 DPU MIPI Platform 2.2 pin 约束 2.2.1 GPIO 约束 2.2.2 IIC 约束 2.1.3 DPHY 约束 3. 报错总结 3.1 AXI_M 必须顺序引用 3.2 DPU 地址分配错误 4. Design Example 4.…

亚信安全2025年第1期《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件51起&#xff0c;本周勒索事件数量降至近一年来最低&#xff0c;需注意防范。从整体上看Ransomhub依旧是影响最严重的勒索家族&#xff1b;本周Acrusmedia和Safepay也是两个活动频繁的恶意家族&#xff0c;需要注意防范。本周&#…

麒麟服务器安装kafka--亲测

我这安装的是单机版本的&#xff1a; 下载地址&#xff1a;Index of /kafka/3.9.0 我下载的是&#xff1a;https://dlcdn.apache.org/zookeeper/zookeeper-3.9.3/apache-zookeeper-3.9.3-bin.tar.gz https://dlcdn.apache.org/kafka/3.9.0/kafka_2.12-3.9.0.tgz 一、下载并上…