【自用】MySQL-多表查询

多表关系

一对多(多对一)

多对多

创建中间表示例:

一对一

与多对一、一对多不同的就是,将外键设置为unique,常用于单表的拆分

概述

在进行多表查询时要删除笛卡尔积,需要使其条件为外键==主键

正常使用select * from emp, dept; 会导致出现以下情况,然后实际一个人仅对应一个部门

因此,需要让emp员工表中的外键dept_id等于dept部门表中的主键dept.id即可

使用select * from emp, dept ++where emp.dept_id= dept.id++; 这样就消除了无效的记录,即消除了笛卡尔积

分类

连接查询

内连接查询

查询交集部分,也就是图中绿色的共有部分

隐式内连接,即前面概述中采用的方法

显示内连接仅是写法不同,inner可省略

外连接查询

查询完整的表本身,包含交集部分

outer可以省略

左外连接

右外连接

其中还是左外连接用的多,因为对于左外连接,只要将顺序调换即可具体如下

自连接查询

一定要起别名

自己连接自己,可以是内查询也可以是外查询,以下图表为例

两个案例:

联合查询

就是将两个查询合起来,对于关键字all,有all就是直接合并两个结果,省略all就是合并后去重

注意,查询的字段以及列数必须一致,否则会报错

子查询(嵌套查询)

标量子查询

案例1:

要查询销售部的所有员工信息,需要先知道销售部门id,再根据id去查员工信息,步骤如下

其实直接能合成同一行,即采用子查询,如下图,同时因为括号中的内容只会返回一个信息(销售部门id),所以称为标量子查询

案例2,查询在方东白之后入职的员工信息:

列子查询

案例1,查询 销售部 和 市场部 的所有员工信息:

案例2,查询比 财务部 所有人工资都高的员工信息:

案例3,查询比 研发部 任意一人 工资高的员工信息,any也可以换成some,返回的列中只要有1个或多个满足条件就可以

行子查询

案例,查询与张无忌薪资与直属领导相同的员工信息(工资一样、领导一样)

常规方法,先通过下面一行查询出张无忌的薪资与领导id

再通过下面一行查询

换一种写法,要求与括号中的内容一一对应

转换成行子查询的方式,因为括号中的内容返回的就是salary与managerid的信息

表子查询

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

先查询鹿杖客、宋远桥的职位和薪资

但是由于这不是一个单行数据,不能和行子查询一样使用=,而是使用in,表示只要满足其中一行即可

、

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

先查询该日期之后的员工信息

查询这部分员工对应的部门信息,

相关推荐
Decay__9 小时前
18_MySQL 智能巡检方案 —— 巡检项清单 / 一键巡检脚本 / 健康评分
运维·数据库·sql·mysql·架构
java_logo9 小时前
Docker 部署 Liquibase:轻松搭建数据库变更管理
数据库·docker·容器·数据库管理·liquibase·轩辕镜像·数据库变更
凤凰院凶涛QAQ11 小时前
《MySQL内核拆解:从SQL到InnoDB》(四) : 联合查询 & 视图
数据库·sql·mysql
码农小河6611 小时前
基于SSM+JSP的高校专业信息管理系统【附源码+数据库】
java·开发语言·数据库
张小姐的猫11 小时前
【MySQL】访问 & 数据流动原理
android·数据库·mysql·adb·1024程序员节
这个DBA有点耶15 小时前
信创场景下数据同步软件怎么选?对比开源CDC与原生闭环工具的结构性差异
数据库·mysql·架构
多客:duokelijie16 小时前
代练订单系统选型思路:跨品类游戏接入、订单分层管理、自动结算逻辑拆解!
数据库·mysql·微信小程序·前端框架·uni-app·php·持续部署
PingCAP16 小时前
平凯星辰上榜!2026 年胡润全球独角兽企业
数据库
PingCAP16 小时前
轨道交通 AFC 系统升级,平凯 Loop 把跨部门协同变成可追溯闭环
数据库