【MySQL基础篇】多表查询

1、多表关系

概述:项目开发中,在进行数据库表结构操作设计时,会根据业务需求及业务模板之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

一对多(多对一)

多对多

一对一

 · 一对多(多对一)

案例:部门与员工的关系(一个部门对应多个员工,一个员工对应一个部门)

实现:在多的一方建立外键,指向一的一方的主键

· 多对多

案例:学生与课程的关系(一个学生可以选修多门课程,一门课程可以共多个学生选择)

实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

create table student(id int primary key auto_increment 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 primary key auto_increment 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 primary key auto_increment comment '主键ID',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);

·  一对一

案例:用户与用户详情的关系(一对一关系多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率)

实现:在任一方加入外键,关联另一方的主键,并且设置外键为唯一的(UNIQUE)

create table tb_user(id int primary key auto_increment comment '主键ID',name varchar(10) comment '姓名',age int comment '年龄',gender varchar(1) comment '性别',phone char(11) comment '电话'
)comment '用户基本信息表';
create table tb_user_edu(id int primary key auto_increment 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 values(null,'黄渤',45,'1','18903944771'),(null,'冰冰',32,'2','18903955771'),(null,'马云',55,'1','17719224870'),(null,'李彦宏',50,'1','15538655111');
insert into tb_user_edu values(null,'本科','舞蹈','静安区第一小学','静安区第一中学','北京舞蹈学院',1),(null,'硕士','表演','朝阳区第一小学','朝阳区第一中学','北京电影学院',2),(null,'本科','英语','杭州市第一小学','杭州市第一中学','杭州师范大学',3),(null,'本科','应用数学','阳泉区第一小学','阳泉区第一中学','清华大学',4);

2、多表查询概述 

 概述:指从多张表中查询数据

案例:我们用员工与所属部门来作为案例

select * from emp,dept;

 但问题是我们明明只有五条数据却显示了25行信息,这种现象称为笛卡尔积。

笛卡尔积:在数学中两个集合,A集合和B集合的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)

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

 多表查询分类

· 连接查询

        内连接:相当于查询A、B交集部分的数据

        外连接:

                   左外连接:查询左表所有数据,以及两张表交际部分数据

                   右外连接:查询右表所有数据,以及两张表交际部分数据

        自连接:当前表与自身的连接查询,自连接必须使用表别名

· 子查询

3、内连接查询 

内连接查询语法:

隐式内连接:

 SELECT 字段列表 FROM 表1,表2 WHERE 条件 ...;

显示内连接: 

SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件 ...;

内连接查询的是两张表的交集部分 

#内连接演示
#1、查询每一个员工的姓名,及关联部门的名称(隐式内连接实现)
#连接条件:emp.dept_id=dept.id
select emp.name,dept.name from emp,dept where emp.dept_id=dept.id;
#2、查询每一个员工的姓名,及关联部门的名称(显示内连接实现)--关键字:INNER JOIN ... ON ...
select emp.name,dept.name from emp inner join dept on emp.dept_id = dept.id;

4、外连接查询 

外连接查询语法:

左外连接:

SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件 ...;

查询的是左表的所有数据包含两表交集部分的数据 

右外连接: 

SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件 ...;

查询的是右表的所有数据包含两表交集部分的数据 

#左外连接和右外连接
#1、查询emp表的所有数据,和对应部门的信息(左外连接)
select * from emp left outer join dept on emp.dept_id = dept.id;
#2、查询dept表的所有数据,和对应员工信息(右外连接)
select * from dept right outer join emp on dept.id = emp.dept_id;

5、自连接查询

自连接查询语法:

SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ...; 

自连接查询,可以是内连接查询,也可以是外连接查询。 

#自连接
#1、查询员工及其所属领导的名字
select a.name,b.name from emp a,emp b where a.managerid=b.id;
#2、查询所有员工 emp 及其领导的名字 emp,如果员工没有领导也要查询出来
select a.name,b.name from emp a left join emp b on a.managerid=b.id;

6、联合查询 

 联合查询-union,union all

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

SELECT 字段列表 FROM 表A ...

UNION [ALL]

SELECT 字段列表 FROM 表B ...;

#联合查询
#将薪资低于10000的员工,和年龄大于50岁的员工全部查询出来
select * from emp where salary<10000
union all
select * from emp where age>50;
#对查询结果去重
select * from emp where salary<10000
union 
select * from emp where age>50;

 总结:对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致;

union all会将全部的数据直接合并在一起,union会对合并之后的数据去重。

7、子查询

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

SELECT * FROM t1 WHERE column1=(SELECT column1 FROM t2);

子查询外部的语句可以是INSERT/UPDATE/DELETE/SELECT 的任何一个。

根据子查询的结果不同,分为:

标量子查询(子查询结果为单个值)

列子查询(子查询结果为一列)

行子查询(子查询结果为一行)

表子查询(子查询结果为多行多列)

根据子查询位置,分为:WHERE之后、FROM之后、SELECT之后。

标量子查询 

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

常用的操作符:=  <>  >  >=  <  <=

#标量子查询
#1、查询研发部所有员工信息
#第一步:查询研发部部门ID
select id from dept where name='研发部';
#第二步:根据研发部部门ID查询员工信息
select * from emp where dept_id=1;
select * from emp where dept_id=(select id from dept where name='研发部');
#2、查询在”杨逍“入职之后的员工信息
#第一步:查询”杨逍“的入职日期
select entrydate from emp where name='杨逍';
#第二步:查询指定日期之后入职员工的信息
select * from emp where entrydate > '2000-11-03';
select * from emp where entrydate >(select entrydate from emp where name='杨逍');

列子查询 

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

常用操作符:IN、NOT IN、ANY、SOME、ALL

操作符描述
IN在指定的集合范围之内,多选一
NOT IN不在指定的集合范围之内
ANY子查询返回列表中,有任意一个满足即可
SOME与ANY等同,使用SOME的地方都可以使用ANY
ALL子查询返回列表的所有值都必须满足
#列子查询
#1、查询”总经办“和”研发部“所有员工的信息
#第一步:查询总经办和研发部的部门ID
select id from dept where name='总经办'||name='研发部';
#第二步:根据部门ID,查询员工信息
select * from emp where dept_id in (5,1);
select * from emp where dept_id in(select id from dept where name='总经办'||name='研发部');
#2、查询比研发部所有员工工资都高的员工信息
#第一步:查询研发部部门工资
select id from dept where name='研发部';
select salary from emp where dept_id=1;
select salary from emp where dept_id=(select id from dept where name='研发部');
#第二步:比研发部所有员工工资都高的员工信息
select * from emp where salary > all(select salary from emp where dept_id=(select id from dept where name='研发部'));
#3、查询比研发部其中任意一人工资高的员工信息
#第一步:查询研发部所有员工的工资
select salary from emp where dept_id=(select id from dept where name='研发部');
#第二步:比研发部其中任意一人工资高的信息
select * from emp where salary > any(select salary from emp where dept_id=(select id from dept where name='研发部'));

行子查询 

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

常用操作符:= 、<>、IN、NOT IN

#行子查询
#1、查询与”张无忌“的薪资及所属领导相同的员工信息
#第一步:查询张无忌的薪资及直属领导
select salary,emp.managerid from emp where name='张无忌';
#第二步:查询与”张无忌“的薪资及所属领导相同的员工信息
select * from emp where salary=(select salary from emp where name='张无忌')&& emp.managerid=(select managerid from emp where name='张无忌');
#上面这种方法是标量子查询
select * from emp where (salary,managerid)=(select salary,emp.managerid from emp where name='张无忌');

表子查询 

子查询返回的结果是多行多列,这种子查询称为表子查询。

常用操作符:IN

#表子查询
#1、查询与杨逍与韦一笑的职位和薪资相同的员工信息
#第一步:查询与杨逍与韦一笑的职位和薪资
select job,salary from emp where name='杨逍'||name='韦一笑';
#第二步:查询与杨逍与韦一笑的职位和薪资相同的员工信息
select * from emp where (job,salary) in(select job,salary from emp where name='杨逍'||name='韦一笑');
#2、查询入职日期是”2002-01-01“之后的员工信息,及其部门信息
#第一步:入职信息是”2002-01-01“之后的员工信息
select * from emp where entrydate > '2002-01-01';
#第二步:查询这部分员工,对应的部门信息
select e.*,d.* from (select * from emp where entrydate > '2002-01-01') e left join dept d on e.dept_id=d.id;

 多表查询案例

#多表查询案例
#1、查询员工的姓名、年龄、职位、部门信息。(隐式内连接)
select emp.name,emp.age,emp.job,dept.name from emp,dept where emp.dept_id=dept.id;
#2、查询年龄小于30岁的员工姓名、年龄、职位、部门信息(显示内连接)
select emp.name,emp.age,emp.job,dept.name from emp inner join dept on emp.dept_id=dept.id where emp.age<30;
#3、查询拥有员工的部门ID、部门名称
select distinct dept.id,dept.name from emp,dept where emp.dept_id=dept.id;
#4、查询所有年龄大于40岁的员工,及其归属的部门名称;如果员工没有分配部门,也需要展示出来
select emp.*,dept.name from emp left outer join dept on emp.dept_id = dept.id where emp.age>40;
#5、查询所有员工的工资等级
#准备工作
create table salarygrade(grade int,losal int,hisal int
)comment'工资等级表';
insert into salarygrade values(1,0,3000),(2,3001,5000),(3,5001,8000),(4,8001,10000),(5,10001,15000),(6,15001,20000);
select emp.name,salarygrade.grade from emp,salarygrade where emp.salary>=salarygrade.losal and emp.salary<=salarygrade.hisal;
select emp.name,salarygrade.grade from emp,salarygrade where emp.salary between salarygrade.losal and salarygrade.hisal;
#6、查询研发部所有员工信息及工资等级
select e.*,s.grade from emp e,salarygrade s,dept d where e.dept_id=d.id and e.salary between s.losal and s.hisal and d.name='研发部';
#7、查询研发部员工的平均工资
select avg(emp.salary) from emp,dept where emp.dept_id=dept.id and dept.name='研发部';
#8、查询工资比韦一笑高的员工信息
select * from emp where salary>(select salary from emp where name='韦一笑');
#9、查询比平均薪资高的员工信息
select * from emp where salary >(select avg(salary) from emp where id);
#10、查询低于研发部门平均工资的员工信息
select * from emp where salary<(select avg(salary) from emp,dept where dept.name='研发部' and emp.dept_id=dept.id);
#11、查询所有部门信息,并统计部门员工人数
select d.id,d.name,(select count(*) from emp e where e.dept_id=d.id)'人数' from dept d;

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

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

相关文章

从FasterTransformer源码解读开始了解大模型(2.1)代码通读03

从FasterTransformer源码解读开始了解大模型&#xff08;2.2&#xff09;代码解读03-forward函数 写在前面的话 本篇的内容继续解读forward函数&#xff0c;从650行开始进行解读 零、输出Context_embeddings和context_cum_log_probs的参数和逻辑 从653行开始&#xff0c;会…

架构师学习理解和总结

1.架构设计理念 2.架构方法论 2.1需求分析 2.1.1常见需求层次 2.1.2 常见需求结果 2.1.3 需求与架构关系 2.2 领域分析 2.3 关键需求 2.4 概念架构设计 2.5 细化架构设计 2.6 架构设计验证 3.架构设计工具 3.1 DDD领域建模 3.2 41视图分析法 3.3 UML设计工具 4.架构师知…

系统化学习 H264视频编码(01)基础概念

说明&#xff1a;我们参考黄金圈学习法&#xff08;什么是黄金圈法则?->模型 黄金圈法则&#xff0c;本文使用&#xff1a;why-what&#xff09;来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法&#xff0c;理论方面会更多地讲清楚 音视频中概念的…

Swift 中的方法调用机制

Swift 方法调用详解&#xff1a;与 Objective-C 的对比、V-Table 机制、Witness Table 机制 在 iOS 开发中&#xff0c;Swift 和 Objective-C 是两种常用的编程语言。尽管它们都能用于开发应用程序&#xff0c;但在方法调用的底层机制上存在显著差异。本文将详细介绍 Swift 的…

实验2 Aprori关联挖掘算法

目 录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 3.1 connect_string()函数解析... 1 3.2 find_rule()函数解析纠错... 2 3.3 关联规则挖掘... 4 四、心得体会... 7 一、实验目的 &#xff08;1&#xff09;理解Aprori关联挖掘算法的程序编写&#xff1b; &…

PYTHON自学笔记(一)vscode配置

安装python 自行官网下载 安装vscode 自行官网下载 环境变量设置 把python和scripts的文件路径&#xff0c;添加到环境变量的path中&#xff0c;如图&#xff1a; 此项不弄&#xff0c;在命令行模式中系统不会认为你装了python和pip&#xff0c;你的输入相关命令shell不会…

# [0705] Task06 DDPG 算法、PPO 算法、SAC 算法【理论 only】

easy-rl PDF版本 笔记整理 P5、P10 - P12 joyrl 比对 补充 P11 - P13 OpenAI 文档整理 ⭐ https://spinningup.openai.com/en/latest/index.html 最新版PDF下载 地址&#xff1a;https://github.com/datawhalechina/easy-rl/releases 国内地址(推荐国内读者使用)&#xff1a; 链…

[机器学习]-4 Transformer介绍和ChatGPT本质

Transformer Transformer是由Vaswani等人在2017年提出的一种深度学习模型架构&#xff0c;最初用于自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;特别是机器翻译。Transformer通过自注意机制和完全基于注意力的架构&#xff0c;核心思想是通过注意力来捕捉输入序列…

CosyVoice多语言、音色和情感控制模型,one-shot零样本语音克隆模型本地部署(Win/Mac),通义实验室开源

近日&#xff0c;阿里通义实验室开源了CosyVoice语音模型&#xff0c;它支持自然语音生成&#xff0c;支持多语言、音色和情感控制&#xff0c;在多语言语音生成、零样本语音生成、跨语言声音合成和指令执行能力方面表现卓越。 CosyVoice采用了总共超15万小时的数据训练&#…

【2024_CUMCM】时间序列算法ARMA

目录 2023-c-问题二 问题分析 介绍 单位根检验 白噪声检验 自相关和偏自相关图 利用信息准则定阶 构建AMIMA模型 D-W检验 预测 代码 2023-c-问题二 问题分析 ARMA适合多个领域的时间序列分析&#xff0c;不同时间的定价策略属于这类问题。 介绍 ARMA模型&…

C++入门7——string类详解

目录 1.什么是string类&#xff1f; 2.string类对象的常见构造 2.1 string(); 2.2 string (const char* s); 2.3 string (const string& str); 2.4 string (const string& str, size_t pos, size_t len npos); 2.5 string (const char* s, size_t n); 2.7 验证…

【机器学习】基于线性回归的医疗费用预测模型

文章目录 一、线性回归定义和工作原理假设表示 二、导入库和数据集矩阵表示可视化 三、成本函数向量的内积 四、正态方程五、探索性数据分析描述性统计检查缺失值数据分布图相关性热图保险费用分布保险费用与性别和吸烟情况的关系保险费用与子女数量的关系保险费用与地区和性别…

GDP播放器 驱动视频播放器 PHP 系统源码 v4.4.3

最重要的是我们自己开发了源代码&#xff0c;因此无论您在使用此工具时遇到什么问题&#xff0c;我们都会快速解决。这个版本演示 分别支持PHP7.4/8.1/8.2三个版本 演示地址

轻松驾驭开发之旅:Maven配置阿里云CodeUp远程私有仓库全攻略

文章目录 引言一、为什么选择阿里云CodeUp作为远程私有仓库&#xff1f;二、Maven配置阿里云CodeUp远程私有仓库的步骤准备工作配置Maven的settings.xml文件配置项目的pom.xml文件验证配置是否成功 三、使用阿里云CodeUp远程私有仓库的注意事项 引言 在软件开发的世界里&#…

CosyVoice - 阿里最新开源语音克隆、文本转语音项目 支持情感控制及粤语 本地一键整合包下载

近日&#xff0c;阿里通义实验室发布开源语音大模型项目FunAudioLLM&#xff0c;而且一次包含两个模型&#xff1a;SenseVoice和CosyVoice。 CosyVoice专注自然语音生成&#xff0c;支持多语言、音色和情感控制&#xff0c;支持中英日粤韩5种语言的生成&#xff0c;效果显著优于…

分子AI预测赛Task4笔记(结束)

话不多说&#xff0c;直接上官方链接&#xff1a;‌​​​‍&#xfeff;​⁠​‌​‍​​&#xfeff;​‌​⁠‬​&#xfeff;‬​​‌​​​​‬‬​​​​‍⁠‍‌​&#xfeff;⁠Task3&#xff1a;进阶baseline详解 - 飞书云文档 (feishu.cn)Task4&#xff1a;持续尝试&…

C++左值右值

在C中&#xff0c;左值&#xff08;lvalue&#xff09;和右值&#xff08;rvalue&#xff09;是表达式分类的关键概念&#xff0c;它们主要影响表达式的赋值、函数调用以及操作符的使用方式。这些概念在C11及以后的版本中变得更加重要&#xff0c;因为引入了移动语义和右值引用…

妈妈带女儿美在心里

在这个充满温情与惊喜的午后&#xff0c;阳光温柔地洒落在每一个角落&#xff0c;仿佛连空气弥漫着幸福的味道。就在这样一个平凡的时刻&#xff0c;一段关于爱与成长的温馨画面&#xff0c;悄然在网络上绽放&#xff0c;引爆了无数人的心弦——#奚梦瑶2岁女儿身高#&#xff0c…

【Linux进程】命令行参数 环境变量(详解)

目录 前言 1. 命令行参数 什么是命令行参数? 2. 环境变量 常见的环境变量 如何修改环境变量? 获取环境变量 环境变量的组织方式 拓展问题 导入环境变量 3. 本地变量* 总结 前言 在使用Linux指令的时候, 都是指令后边根命令行参数, 每个指令本质都是一个一个的可执行程…

【UE5.1 角色练习】13-枪械射击——拿出与收起武器

目录 效果 步骤 一、安装射击武器 二、拿武器和收武器 效果 步骤 一、安装射击武器 1. 在虚幻商城中将“FPS Weapon Bundle”添加到工程中&#xff0c;由于我们使用的是5.1版本&#xff0c;我们可以先将该资产放入UE4工程中&#xff0c;然后迁移到5.1版本的工程 2. 打开角…