【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.架构师知…

【PYG】pytorch中size和shape有什么不同

一般使用tensor.shape打印维度信息&#xff0c;因为简单直接 在 PyTorch 中&#xff0c;size 和 shape 都用于获取张量的维度信息&#xff0c;但它们之间有细微的区别。下面是它们的定义和用法&#xff1a; size&#xff1a; size 是一个方法&#xff08;size()&#xff09;和…

系统化学习 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 的…

Calicoctl工具学习 —— 筑梦之路

官方文档&#xff1a; Calico Documentation | Calico Documentation 插件方式安装 calicoctl 工具 curl -o kubectl-calico -O -L "https://github.com/projectcalico/calicoctl/releases/download/v3.20.0/calicoctl"cp kubectl-calico /usr/bin/kubectl-calic…

05:C语言函数

C语言函数 1、函数的三要素1.1、函数定义1.2、函数声明1.3、函数调用 函数是C语言代码的基本组成部分&#xff0c;它是一个小的模块&#xff0c;整个程序由很多个功能独立的模块&#xff08;函数&#xff09;组成。这就是程序设计的基本分化方法。 之前接触过的函数&#xff1a…

实验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;核心思想是通过注意力来捕捉输入序列…

实现Windows经典游戏——扫雷

扫雷游戏以前是windows的内置小游戏&#xff0c;相信不少人都玩过这么一款游戏。 1.扫雷游戏规则 以9*9的简单模式为例&#xff0c;游戏开始时系统会生成10颗雷随机分布在这9*9的格子当中。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yv29OzCb…

中英双语介绍意大利(Italy):有哪些著名景点、出名品牌?

中文版 意大利概述 意大利&#xff0c;位于欧洲南部&#xff0c;是一个以其悠久的历史、丰富的文化遗产和美丽的自然风光而闻名的国家。意大利不仅是文艺复兴的发源地&#xff0c;还拥有众多世界著名的城市、景点和品牌。 著名城市 罗马&#xff08;Rome&#xff09;&#x…

DataWhale AI夏令营 对话分角色要素提取挑战赛 学习笔记

大模型技术概览 大模型技术是指利用庞大的数据集训练出的深度学习模型&#xff0c;这些模型在处理复杂自然语言处理&#xff08;NLP&#xff09;任务方面表现出色&#xff0c;例如文本分类、情感分析、机器翻译等。在对话系统中&#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 验证…

vue2项目迁移vue3与gogocode的使用

#背景 公司有个项目使用vue2jswebpack框架开发的&#xff0c;由于该项目内部需要安扫&#xff0c;导致很多框架出现了漏洞需要升级&#xff0c;其中主要需要从vue2升vue3,但是重新搭框架推翻重做成本太高&#xff0c;于是找到了gogocode。 #升级步骤踩坑 1. 安装 gogocode插…

牛客链表题:BM2 链表内指定区间反转

描述 将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转&#xff0c;要求时间复杂度 &#x1d442;(&#x1d45b;)O(n)&#xff0c;空间复杂度 &#x1d442;(1)O(1)。 例如&#xff1a; 给出的链表为 1→2→3→4→5→&#x1d441;&#x1d448;&#x1d43f;&#x…

分表分库是一种数据库架构的优化策略,用于处理大规模数据和高并发请求,提高数据库的性能和可扩展性。

分表分库是一种数据库架构的优化策略&#xff0c;用于处理大规模数据和高并发请求&#xff0c;提高数据库的性能和可扩展性。以下是一些常见的分表分库技术方案&#xff1a; 1. **水平分表&#xff08;Horizontal Sharding&#xff09;**&#xff1a; - 将单表数据根据某个…