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条件结合

相关推荐
kirs_ur2 小时前
ECC & LDPC — SSD 的数据卫士
服务器·数据库·性能优化
是三一seven3 小时前
Sql注入基础
数据库·安全·网络安全
Sirens.3 小时前
MySQL表设计进阶-约束范式连接索引与事务
android·数据库·mysql
字节跳动开源4 小时前
火山引擎开源 Agent 驱动的搜索自迭代技术
数据库·开源·agent
zh_xuan6 小时前
安卓上 mmap读取并修改文件内容
android·mmap
二流小码农6 小时前
鸿蒙开发:实现文本渐变效果
android·ios·harmonyos
Oo大司命oO7 小时前
藏在正则表达式里的陷阱
数据库·mysql·正则表达式
_oP_i8 小时前
mysql统计数据库使用存储大小
数据库
会编程的土豆8 小时前
MySQL 入门:库、表、行、主键是什么
linux·数据库·网络协议·http
jjjava2.08 小时前
系统日志:从入门到精通的完整指南
网络·数据库