【自用】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之后的员工信息及其部门信息

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

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

相关推荐
雨落在了我的手上42 分钟前
MySQL数据库基础(12):事务
数据库·mysql
D姐聊门店44 分钟前
门店收银系统断网兜底怎么设计:本地账本、离线续传与日终对账的工程实现
数据库·saas
用户8662978480081 小时前
抓包看 KingbaseES 内部协议?官方给了个现成工具
数据库
wefg11 小时前
【Redis】安装与启动
数据库·redis·缓存
大圣编蚕2 小时前
常见的 Redis 面试题(高频整理)
数据库·redis·缓存
派小心.2 小时前
网站统计采样数据的误差核对
大数据·服务器·前端·数据库·人工智能·小程序·数据分析
龙腾AI白云2 小时前
数字孪生、具身智能、世界模型三者交叉
数据库·人工智能·机器学习·flask·pygame
2301_32241428043 小时前
基于web的校园失物招领管理系统59695-计算机毕设 原创(免费领源码+部署教程+开发环境)
mysql·nginx·php·apache·thinkphp·phpstudy·wampserver
SelectDB技术团队3 小时前
Apache Doris 基于 Lance 的向量检索深度解析
数据库·数据仓库·数据分析·湖仓一体·apache doris·lakehouse·多模湖仓