7.MySQL复合查询

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 7.MySQL复合查询

复合查询

前面我们讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远不够

基本查询回顾

回顾我们建的表

以及三张表内的数据

 

查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J

按照部门号升序而雇员的工资降序排序

使用年薪进行降序排序

显示工资最高的员工的名字和工作岗位

显示工资高于平均工资的员工信息

显示每个部门的平均工资和最高工资

显示平均工资低于2000的部门号和它的平均工资

显示每种岗位的雇员总数,平均工资

多表查询

实际开发中往往数据来自不同的表,所以需要多表查询。本节我们用一个简单的公司管理系统,有三张表EMP,DEPT,SALGRADE来演示如何进行多表查询,也就是上面我们给出的表。

显示雇员名、雇员工资以及所在部门的名字

(因为上面的数据来自EMP和DEPT表,因此要联合查询)

显示部门号为10的部门名,员工名和工资

显示各个员工的姓名,工资,及工资级别

自连接

自连接是指在同一张表连接查询

显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno)

使用的子查询

使用多表查询(自查询)

子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

单行子查询

返回一行记录的子查询

显示SMITH同一部门的员工

多行子查询

返回多行记录的子查询

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

all关键字;显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

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

 

多列子查询

单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句

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

在from子句中使用子查询

子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。

显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

先找出各个部门的平均工资,将其与emp表做笛卡尔积后,通过工资和部门条件筛选出来。

select ename,emp.deptno,sal,avgsal

from emp,(select deptno,avg(sal) avgsal from emp group by deptno)

where emp.deptno=avg.deptno

and sal>avgsal;

也许你会有疑问,avgsal不是求平均值吗,前面三个数据没有分组,为什么能够做聚合?首先,我们在from那里就已经做出了avgsal的表,而且已经拼接。

查找每个部门工资最高的人的姓名、工资、部门、最高工资

select ename,sal,emp.deptno,m

from emp,(select deptno,max(sal) m from emp group by deptno) max

where emp.deptno=max.deptno

and sal=m;

显示每个部门的信息(部门名,编号,地址)和人员数量

子查询

select dept.dname,emp.deptno,dept.loc,count

from (select deptno, count(*) count from emp group by deptno) emp,dept

where emp.deptno=depto;

多表查询

select dept.dname,dept.deptno,dept.loc,count(*)

from emp,dept

where emp.deptno=dept.deptno

group by dname,loc,dept.deptno;

合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all

union

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行

将工资大于2500或职位是MANAGER的人找出来

union all

该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。

实战OJ

查找所有员工入职时候的薪水情况_牛客题霸_牛客网 (nowcoder.com)

select emp.emp_no,sal.salary from employees emp,salaries sal

where emp.emp_no=sal.emp_no and emp.hire_date=sal.from_date

order by emp.emp_no desc;

获取所有非manager的员工emp_no_牛客题霸_牛客网 (nowcoder.com)

select emp_no from employees

where emp_no not in (select emp_no from dept_manager);

获取所有员工当前的manager_牛客题霸_牛客网 (nowcoder.com)

select emp.emp_no,man.emp_no manager from dept_emp emp,dept_manager man

where emp.dept_no=man.dept_no

and emp.emp_no<>man.emp_no;

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL】11. 复合查询(重点)
【MySQL】11. 复合查询(重点)
30 0
|
2月前
|
关系型数据库 MySQL 索引
【mysql】MySQL 复合索引
【mysql】MySQL 复合索引
42 0
|
9月前
|
关系型数据库 MySQL
【Hello mysql】 mysql的复合查询 (重点)
【Hello mysql】 mysql的复合查询 (重点)
207 0
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL】复合查询
【MySQL】复合查询
|
2月前
|
关系型数据库 MySQL
【MySQL】10. 复合查询(重点)
【MySQL】10. 复合查询(重点)
19 0
|
2月前
|
SQL Oracle 关系型数据库
【mysql】—— 复合查询
【mysql】—— 复合查询
|
7月前
|
关系型数据库 MySQL
【MySQL学习】MySQL表的复合查询2
【MySQL学习】MySQL表的复合查询
126 0
|
7月前
|
SQL Oracle 关系型数据库
【MySQL学习】MySQL表的复合查询1
【MySQL学习】MySQL表的复合查询
112 0
|
12月前
|
关系型数据库 MySQL 索引
MySQL5种索引类型
MySQL5种索引类型
69 0
|
SQL 关系型数据库 MySQL
MySQL复合查询
MySQL复合查询
128 0