Mysql专栏:@Mysql
本篇博客简介:介绍mysql的复合查询
mysql的复合查询
- 基本查询回顾
- 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J
- 按照部门号升序而雇员的工资降序排序
- 使用年薪进行降序排序
- 显示工资最高的员工的名字和工作岗位
- 显示工资高于平均工资的员工信息
- 显示平均工资低于2000的部门号和它的平均工资
- 显示每种岗位的雇员总数,平均工资
- 多表查询
- 显示部门号为10的部门名,员工名和工资
- 显示各个员工的姓名,工资,及工资级别
- 自连接
- 子查询
- 单行子查询
- 显示SMITH同一部门的员工
- 多行子查询
- 多列子查询
- 查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
- 在from子句中使用子查询
- 显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
- 查找每个部门工资最高的人的姓名、工资、部门、最高工资
- 合并查询
- union
- 将工资大于2500或职位是MANAGER的人找出来
- union all
- 将工资大于25000或职位是MANAGER的人找出来
- 总结
基本查询回顾
查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J
按照部门号升序而雇员的工资降序排序
使用年薪进行降序排序
显示工资最高的员工的名字和工作岗位
我们这里使用了两个select语句查询 实际上我们也可以将它们分开先使用一个select语句查询到最高工资是多少 再使用一个语句找和最高工资相同的记录
显示工资高于平均工资的员工信息
显示平均工资低于2000的部门号和它的平均工资
显示每种岗位的雇员总数,平均工资
多表查询
在讲解多表查询的具体操作之前 我们首先要明确一个概念
许多张表合并在一起之后会变成什么呢?
答案就是 会变成一张很大的表 本质还是一张表
也就是说 我们的多表查询其实就是在一个比较大的单表里面查询数据罢了
显示部门号为10的部门名,员工名和工资
显示各个员工的姓名,工资,及工资级别
自连接
自连接指的是在同一张表中进行连接查询
我们在某些情况下 需要将一张相同的表进行笛卡尔积
下面是实例
显示员工FORD的上级领导的编号和姓名
思路 我们可以将原本的两张员工表使用笛卡尔积拼接形成一张大的表
之后找到该员工为雇员的记录并且寻找到第一张表中的领导等于第二张表中的雇员的记录
该条记录就记录着ford的上级领导还有编号
子查询
单行子查询
显示SMITH同一部门的员工
多行子查询
关于多列子查询主要有三个关键字需要我们理解下 in all any
下面我们用三个题目去理解这三个关键字
- in关键字;查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
总结下 in关键字表示其中有一个相同就符合筛选条件
- all关键字;显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
总结下 all关键字就是比集合里面的所有数据都要高 我们可以理解为大于最大值
- any关键字;显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门
的员工)
多列子查询
单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句
实际上多列子查询和多行子查询的总体思路几乎没有区别 唯一的区别可能就是语法上 where要加上括号
查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
在from子句中使用子查询
我们在前面介绍过一个概念 由很多张表组成的笛卡尔积 本质上还是一张表
这里还有一个新的概念 我们使用select子句筛选出来的表 本质也是一张表
也就是说之前对于表的各种操作 对筛选出来的表依然适用
显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
查找每个部门工资最高的人的姓名、工资、部门、最高工资
合并查询
union
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
将工资大于2500或职位是MANAGER的人找出来
union all
该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉重复行。