MySQL——复合查询

基本查询回顾

下面的复合查询我们要用到基本查询用到的表:
员工表: emp
部门表: dept
薪资等级表:salagrade
https://blog.csdn.net/2601_95175861/article/details/161271536?spm=1001.2014.3001.5501 在文章的最后面有创建语句,可以自行复制,然后跟着我走

多表查询

要求:显示部门号为10的部门名,员工名和工资
首先进行多表查询时,我们就需要把两张表连起来一起看
select * from emp,dept; 说明在查询表的时候可以多个表连起来一起查

就是一张表中拿第一条数据,与第二张表所有数据中每个数据连在一起,类似于穷举,这里是叫做笛卡尔积,这里也可以给表查询的表取别名

自己可以试试看看是不是emp中每条数据都对应连接dept中所有数据
然而穷举的数据对应有些是没有意义的,我们要的是员工表的每个数据的部门号对应部门表的部门号,一般来说,公司不会搞唯一键,只会有个主键,部门号就相当于唯一键约束,所以部门号能确定员工在哪个部门,所以我们可以用部门号相等的数据来对笛卡尔积的数据进行筛选
要求:显示部门号为10的部门名,员工名和工资
所以这个可以这样写 select ename, sal,dname from EMP, DEPT where EMP.deptno=DEPT.deptno and
DEPT.deptno = 10;

注意: 如果一个字段名不是你要查询的多表表中的唯一字段就要指名查哪个表的,比如虽然说这里的deptno两个表指名意义相同,但也可以指名显示哪个表的deptno SQL语句为: 表名.deptno 这样写就是指名拿哪个表的数据,虽然说在屏幕上显示的是两个表连起来了,但是查询的字段并不是在一张表而是各自表中指明,所以查询时需要写清楚

自连接

意思为一张表也能连接自己来做笛卡尔积,但是需要把其中一张表弄个别名或两张表都弄别名才行
显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno)

思路为:自己与自己做笛卡尔积后,筛选的条件为员工表FORD的mgr的数据与连接的员工表的empno也就是员工号相同就是找到了FORD的领导

主要的难点就是笛卡尔积穷举出来的数据你自己要通过where 条件去筛选

子查询

显示SMITH同一部门的员工

意思是select 语句中能嵌套select语句


执行的顺序会是先执行where 条件的select语句也就是子查询,这个语句是查询smith在哪个部门,并且注意: 你提供的列数与子查询显示的列数需要相匹配,比如如果这里改一下写成 deptno=(select deptno,ename from emp where ename='smith'),就会报错,因为你这只提供一列做相等运算符,而等号右边有两个值: deptno和ename

多行子查询

in关键字

查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己

首先10号部门的岗位有这些


in语句就是,里面的数据组成一个集合,比如这里是十号部门的job中每个数据组成一个集合,where 条件中的 job只要存在在这个集合当中就成立,条件中的job属于被包含关系,它只要属于这个集合的数据就是成立的

all关键字

显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

all关键字就是, where 条件中 该字段比这个集合当中所有人的工资都高就成立,这里的子查询的sal就是30号部门所有人的工资。

any关键字

显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门
的员工)

这里就是wehre 语句中 只要工资比30号部门的工资集合中任意一个人的工资高就条件成立

多列子查询

查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人

子查询中显示了两列,所以接受也要是两列,这就是多列子查询
总结: 这里的多表连接中,所有的查询后显示出来的数据也能看作表,也能与其他表做笛卡尔积,但一定要给它取个别名,多列子查询和多行子查询也就是把一个select语句作为另一个select的where条件而已,自己先可以把一个个select查询的结果先自己显示出来,根据情况再进行于where条件结合

相关推荐
我命由我123456 小时前
Dart - 数字类型、布尔类型、列表类型
android·开发语言·flutter·ios·uni-app·android jetpack·移动端
万岳科技系统开发6 小时前
外卖系统小程序开发方案解析:直播、团购与外卖功能如何融合
数据库·小程序·架构
Kapaseker6 小时前
Kotlin 准备引入 [1,2,3] 创建集合
android·kotlin
yh弓长6 小时前
Redis的string类及基础指令
数据库·redis·缓存
MY_TEUCK6 小时前
MCP 安装与使用:在 Claude Code 中用自然语言操作 MySQL
数据库·mysql·ai·ai编程
say_fall6 小时前
操作系统与进程核心全解:从冯诺依曼到fork系统调用
android·linux·运维·服务器·学习·ubuntu
诸神黄昏EX6 小时前
Android 性能优化 【总篇:深入浅出】
android
蜡台6 小时前
从mysql的data目录中恢复数据库
数据库·mysql·adb
andafaAPS6 小时前
安达发|橡胶行业自动排产软件:“人脑排产“到“AI智控“的破局之路
运维·数据库·人工智能·安达发aps·自动排产软件·计划排产软件·自动排单软件