基础篇04——多表查询

多表关系

一对多

多对多

多对多是通过中间表实现的

-- 创建学生表
create table student
(id   int auto_increment primary key comment 'ID',name varchar(10) comment '姓名',no   varchar(3) comment '学号'
) comment '学生表';insert into student
values (null, '黛绮丝', '001'),(null, '谢逊', '002'),(null, '小明', '003'),(null, '小红', '004');-- 创建课程表
create table course
(id   int auto_increment primary key comment 'ID',name varchar(10) comment '课程名称'
) comment '课程表';insert into course
values (null, '语文'),(null, '数学'),(null, '英语');-- 创建中间表,维护学生表和课程表之间的关系
create table student_course
(id        int auto_increment primary key 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, 3);

一对一 

-- 创建用户表
create table tb_user
(id     int auto_increment primary key comment 'ID',name   varchar(10) comment '姓名',age    tinyint unsigned comment '年龄',gender char(1) comment '性别',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, '小明', 16, '1', '10000000001'),(null, '小花', 13, '2', '10000000002'),(null, '小华', 15, '1', '10000000003'),(null, '小红', 14, '2', '10000000004');insert into tb_user_edu(id, degree, major, primaryschool, middleschool, university, userid)
values (null, '本科', '舞蹈', 'XXX小学', 'XXX中学', 'XXX大学', 1),(null, '大专', '会计', 'YYY小学', 'YYY中学', 'YYY大学', 2),(null, '硕士', '英语', 'AAA小学', 'AAA中学', 'AAA大学', 3),(null, '博士', '临床医学', 'BBB小学', 'BBB中学', 'BBB大学', 4);

多表查询概述

多表查询指的是从多张表中查询数据

用以下例子举例

笛卡尔积

当直接查询两张表时(即执行命令:select * from emp,  dept;),查询的结果就是笛卡尔积,查询结果数为两张表的数据量相乘,我们需要消除无效的笛卡尔积,如下

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

 多表查询分类

内连接

-- 隐式内连接实现:查询每一个员工姓名及其所属部门名称
select emp.name, dept.name
from emp,dept
where dept_id = dept.id;-- 显式内连接实现:查询每一个员工姓名及其所属部门名称
-- 可以给表起别名来简化代码,但是起别名之后不能再用表原来的名称
-- inner关键字可以省略
select e.name, d.name
from emp einner join dept d on e.dept_id = d.id;

外连接

左外连接和右外连接可以相互转换,即左外连接可以用右外连接替代,右外连接也可以用左外连接替代,只需要更改关键字left、right和两个表的位置即可,这里就不展示了。 

-- 查询emp表的所有数据,和对应的部门信息(左外连接)
-- outer 关键字可以省略
-- from 后跟着的表为左表,join后跟着的表为右表
-- 两个表的顺序不一样查询结果也不一样
-- 左外连接表示展示左表的所有数据,以及左表中每一条数据对应的右表数据,如果右表没有数据则显示为空
-- 右外连接则反过来,表示展示右表的所有数据,以及右表中每一条数据对应的左表数据,如果左表没有数据则显示为空
-- 自己运行一下代码就可以明白
select e.*, d.name  -- e.* 表示查询emp表中的所有数据
from emp eleft outer join dept don e.dept_id = d.id;-- 查询所有的部门信息,和对应的emp表数据(右外连接(
select d.*, e.*
from emp eright outer join dept d on d.id = e.dept_id;

自连接

自连接的外连接查询可以是左外也可以是右外。

-- 查询所有员工的名字及其所属领导的名字
-- 显式内连接实现
select e1.name as '员工姓名', e2.name as '领导姓名'
from emp e1join emp e2 on e1.managerid = e2.id;-- 隐式内连接实现
select e1.name '员工姓名', e2.name '领导姓名'
from emp e1,emp e2
where e1.managerid = e2.id;-- 查询所有员工的名字及其所属领导的名字,如果员工没有领导也要查询出来
-- 这里用外连接实现,用的是左外连接
select e1.name '员工姓名', e2.name '领导姓名'
from emp e1left join emp e2 on e1.managerid = e2.id;

联合查询union

-- 将薪资低于5000的员工和年龄大于40的员工全部查询出来
-- 即员工满足两个条件之一就需要被查询出来
-- 有 all 关键字查询结果不去重,没有 all 则会将查询结果去重
-- 只有 select 和 from 之间的字段列表的列数和类型一致时才可以用联合查询
select *
from emp
where salary < 5000
union all
select *
from emp
where age > 40;

子查询

子查询一般都用小括号括起来,可以放在 select、from、where 这几个位置(具体看后面案例)

标量子查询

-- 查询研发部的所有员工信息
select *
from emp
where dept_id = (select id from dept where dept.name = '研发部');

列子查询

-- 查询销售部和市场部的所有员工信息
select *
from emp
where dept_id in (select dept.idfrom deptwhere dept.name in ('销售部', '市场部'));-- 查询比财务部 所有人 工资都高的员工信息
-- 查询财务部的id:select id from dept where dept.name = '财务部'
-- 先查出财务部员工最高的工资
-- select max(salary) from emp where dept_id = (select id from dept where dept.name = '研发部');
-- 实现方式1:
select *
from emp
where salary > (select max(salary)from empwhere dept_id = (select idfrom deptwhere dept.name = '财务部'));-- 实现方式2:(all)
select *
from emp
where salary > all (select salaryfrom empwhere dept_id = (select idfrom deptwhere dept.name = '财务部'));-- 查询比研发部 任意一人 工资高的员工信息(any/some)
select *
from emp
where salary > any (select salaryfrom empwhere dept_id = (select idfrom deptwhere dept.name = '研发部'));

行子查询

-- 查询与“张无忌”薪资及直属领导相同的员工信息
-- 先查出张无忌的薪资和指数领导id
# select salary, managerid from emp where name='张无忌';
# 假设查出结果为(10000, 1)
# (salary, managerid) = ( select ...) => salary=10000 and managerid=1
select *
from emp
where (salary, managerid) = (select salary, managerid from emp where name = '张无忌');

表子查询

-- 查询与 小明,小红 的职位和薪资相同的员工信息
# 1、查询小明,小红 的职位和薪资
select job, salary
from emp
where name in ('小明' '小红');
select *
from emp
where (job, salary) in (select job, salaryfrom empwhere name in ('小明' '小红'));-- 查询入职日期是'2018-01-01'之后的员工信息及其部门信息
# 查询入职日期是'2006-01-01'之后的员工id
select id
from emp
where entrydate > '2006-01-01';# (select * from emp where entrydate > '2006-01-01') 查询结果作为一张临时表
# 给临时表起别名为 e
select e.*, d.name
from (select * from emp where entrydate > '2006-01-01') eleft join dept d on e.dept_id = d.id;

多表查询案例练习

上面的例子涉及之前所说的emp员工表、dept部门表和薪资等级表,薪资等级表的表结构如下:

三张表的结构如下:

-- 例题1(隐式内连接)
select e.name, e.age, e.job, d.name
from emp e,dept d
where e.dept_id = d.id;-- 例题2(显式内连接)
select e.name, e.age, e.job, d.name
from emp einner join dept d on e.dept_id = d.id
where e.age < 30;-- 例题3(结果要去重)
select distinct d.id, d.name
from dept dinner join emp e on d.id = e.dept_id;-- 例题4(左外连接)
select e.*, d.name
from emp eleft outer join dept d on e.dept_id = d.id
where e.age > 40;-- 例题5
# 隐式内连接
select e.name, sg.grade
from salgrade sg,emp e
where e.salary between sg.losal and sg.hisal;# 显式内连接
select e.name, sg.grade
from salgrade sginner join emp e on e.salary between sg.losal and sg.hisal;-- 例题6
select e.*, sg.grade
from emp e,salgrade sg
where e.dept_id = (select id from dept d where d.name = '研发部')and e.salary between sg.losal and sg.hisal;-- 例题7
# 方式一
select avg(e.salary)
from emp e
where e.dept_id = (select d.id from dept d where d.name = '研发部');# 方式二
select avg(e.salary)
from emp e,dept d
where e.dept_id = d.idand d.name = '研发部';-- 例题8
select *
from emp
where salary > (select salary from emp where name = '灭绝');-- 例题9
select *
from emp
where salary > (select avg(salary) from emp);-- 例题10(放在where位置的子查询)
select e1.*
from emp e1
where e1.salary < (select avg(e2.salary)from emp e2where e1.dept_id = e2.dept_id);-- 例题11(放在select位置的子查询)
select d.id,d.name,(select count(e.id)from emp ewhere e.dept_id = d.id) '部门员工数量'
from dept d;-- 例题12
select s.name, s.no, c.name
from student_course sc,student s,course c
where sc.courseid = c.idand sc.studentid = s.id;

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

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

相关文章

SLAM中四元数、流形、李群、李代数是啥?

知识点得逻辑关系如下 引言 非线性问题由于复杂的数学结构&#xff0c;多样的解空间&#xff0c;局部极值等问题求解难度大大增加。所以在求解时需要把非线性问题转化为更容易处理的形式&#xff0c;例如 数值优化方法&#xff1a;数值优化方法包括梯度下降、共轭梯度法、牛顿…

Spring boot实现基于注解的aop面向切面编程

Spring boot实现基于注解的aop面向切面编程 背景 从最开始使用Spring&#xff0c;AOP和IOC的理念就深入我心。正好&#xff0c;我需要写一个基于注解的AOP&#xff0c;被这个注解修饰的参数和属性&#xff0c;就会被拿到参数并校验参数。 一&#xff0c;引入依赖 当前sprin…

寒武纪:“国产平替”道阻且长

英伟达的一季报反映了AI装备竞赛白热化&#xff0c;科技巨头们正疯狂加码投资。 不过&#xff0c;因为众所周知的原因,英伟达最先进的产品卖不到国内&#xff0c;虽然说一定程度上限制了咱们AI的发展&#xff0c;但也给国产AI芯片公司们提供了机会&#xff0c;其中就包括我们今…

K8S==ingress简单搭建和使用

基础环境 D:\DOCKER_REPO\K8S>kubectl version Client Version: v1.29.2 Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3 Server Version: v1.29.2 D:\DOCKER_REPO\K8S>kubectl get nodes NAME STATUS ROLES AGE VERSION docker-…

01_深度学习基础知识

1. 感知机 感知机通常情况下指单层的人工神经网络,其结构与 MP 模型类似(按照生物神经元的结构和工作原理造出来的一个抽象和简化了模型,也称为神经网络的一个处理单元) 假设由一个 n 维的单层感知机,则: x 1 x_1 x1​ 至 x n x_n xn​ 为 n 维输入向量的各个分量w 1 j…

【大学物理】Interference,diffraction,polarization:光学

nature of light definition speed of light reflection dispersion huygenss principle:惠更斯原理

OBD诊断协议

上周领导需要做个OBD相关的功能&#xff0c;我对OBD没有啥概念&#xff0c;于是周末就了解下这到底是个啥东西。了解过后发现很简单&#xff0c;其实就是个UDS协议的简化版&#xff0c;OBD是英文On-Board Diagnostics的缩写&#xff0c;中文翻译为“车载自动诊断系统”&#xf…

链表反转--理解链表指针的基本操作

链表反转--理解链表指针的基本操作 链表反转的方法--主要是理解链表指针链表心得类节点是对象和指针区别&#xff1a; 链表反转的方法–主要是理解链表指针 根据值创建新列表 用一个链表指针代替整个新链表 两个链表的赋值 递归求解反向链表 用一个链表代替前后链表数…

Qt应用程序发布

一、静态编译发布 1.0:以Release模式构建工程 1.1:查看当前构建生成路径,并将所生成的.exe单独拷贝出来 1.2:将可执行文件*.exe拷贝至任一目标文件夹:D:\Temporary\QQIF 2:查看安装Qt时发布工具windeployqt.exe所在的目录 windeployqt.exe在Qt开发套件的bin目录下。Qt的每…

构建高效稳定的短视频直播系统架构

随着短视频直播的迅猛发展&#xff0c;构建一个高效稳定的短视频直播系统架构成为了互联网企业的重要挑战。本文将探讨如何构建高效稳定的短视频直播系统架构&#xff0c;以提供优质的用户体验和满足日益增长的用户需求。 ### 1. 短视频直播系统的背景 短视频直播近年来蓬勃发…

Pycharm 添加内容根

解决问题&#xff1a;包未能被正常引入时

try…except…finally语句

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 完整的异常处理语句应该包含finally代码块&#xff0c;通常情况下&#xff0c;无论程序中有无异常产生&#xff0c;finally代码块中的代码都会被执行…

2024 年该如何利用 MidJourney 创作AI艺术(详细教程)

什么是 Midjourney Midjourney 是根据文本提示创建图像的生成式人工智能的优秀范例。与 Dall-E 和 Stable Diffusion 一样&#xff0c;它已成为最受欢迎的人工智能艺术创作工具之一。与竞争对手不同的是&#xff0c;Midjourney 是自筹资金和封闭源代码的&#xff0c;因此对它的…

【WRF理论第二期】模型目录介绍

WRF理论第二期&#xff1a;模型目录介绍 1 WRF主目录2 WPS主目录3 编译后的可执行文件4 运行目录参考 了解 WRF 模型的目录结构有助于有效地管理和操作模型&#xff0c;从而确保模拟和分析工作的顺利进行。以下分解介绍WRF主目录、WPS主目录等。 Github-wrf-model/WRF 1 WRF…

leetCode-hot100-二分查找专题

二分查找 简介原理分析易错点分析例题33.搜索旋转排序数组34.在排序数组中查找元素的第一个和最后一个位置35.搜索插入位置240.搜索二维矩阵 Ⅱ 简介 二分查找&#xff0c;是指在有序&#xff08;升序/降序&#xff09;数组查找符合条件的元素&#xff0c;或者确定某个区间左右…

找不到steam_api64.dll,无法继续执行的原因及解决方法

电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;在使用电脑的过程中&#xff0c;我们经常会遇到一些常见的问题&#xff0c;其中之一就是找不到某个特定的动态链接库文件&#xff0c;比如steamapi64.dll。这个问题可能会导致某些应用程序无法正常运行&#xff0c;给…

关于博图17安装体验过程—博图17安装失败原因(STEP7 许可证找不到)

目录 一、序言 二、正片 一、序言 该失败原因是在我使用Win11专业版安装博图17时出现的问题&#xff0c;也仅代表我的体验过程&#xff01;以下我将安装过程和解决问题的过程描述一下&#xff0c;希望可以帮助和我一样自己安装博图时能够解决出现的问题。 二、正片 如果阁下…

linux驱动学习(五)之字符设备

需要板子一起学习的可以这里购买&#xff08;含资料&#xff09;&#xff1a;点击跳转 一、 linux设备驱动分类 1、字符设备---char 应用程序与驱动程序在进行数据传输时&#xff0c;数据以"字节"为单位。 特点&#xff1a; [1] 按照顺序进行数据传输 [2] 数据传…

vscode专区

1.展示多行的文件导航标签,而非只有1行 1.1打开设置 1.2搜索该设置"workbench.editor.wrap.tabs",并勾选 1.3效果对比

vue+vscode 快速搭建运行调试环境与发布

1.安装node.js Node.js — Run JavaScript Everywhere 默认不断next 2.更换镜像地址 运行-cmd 执行以下代码安装 npm config set registry https://registry.npmmirror.com 检查node.js和镜像是否是否成功 node -v npm -v npm config get registry 3.安装打包工具 …