一、基本查询练习回顾
1、查询工资高于 500 或岗位为 MANAGER 的雇员,同时还要满足他们的姓名首字母为大写的 J
2、按照部门号升序而雇员的工资降序排序
3、使用年薪进行降序排序
4、显示工资最高的员工的名字和工作岗位
5、显示工资高于平均工资的员工信息
6、显示每个部门的平均工资和最高工资
7、显示平均工资低于2000的部门号和它的平均工资
8、显示每种岗位的雇员总数,平均工资
二、多表查询
实际开发中往往数据来自不同的表,所以需要多表查询。这里我们用一个简单的公司管理系统,有三张表 emp,dept,salgrade 来演示如何进行多表查询。
⚪练习
1、显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自 emp 和 dept 表,因此要联合查询(将数据进行穷举组合 —— 笛卡尔积)
其实我们只要 emp 表中的 deptno=dept 表中的 deptno 字段的记录:
2、显示部门号为 10 的部门名,员工名和工资
3、显示各个员工的姓名,工资,及工资级别
三、自连接
自连接 是指在同一张表连接查询。
⚪练习
1、显示员工 FORD 的上级领导的编号和姓名(mgr 是员工领导的编号 —— empno)
(1)使用的子查询
先找 FORD 的上级领导的编号(emp),再根据领导的编号来找领导的信息(emp)。
(2)使用多表查询(自查询)
- 使用到表的别名
from emp e1, emp e2,给自己的表起别名,因为要先做笛卡尔积,所以别名可以先识别。
四、子查询
子查询是指嵌入在其他 sql 语句中的 select 语句,也叫嵌套查询。
- 目前学习到的子查询都在 where 子句中充当判断条件。
- 任何时刻,查询出来的临时结构,本质在逻辑上也是表结构。
1、单行子查询
返回一行记录的子查询。
- 显示 SMITH 同一部门的员工
2、多行子查询
返回多行记录的子查询。
(1)in 关键字
in 关键字用来判断一个对应的列值是否在某个集合当中,只要在集合当中,说明查找成功。
查询和 10 号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含 10 自己的。
扩展:除了上面的要求以外,还需要显示出对应员工所属岗位的名字。
(2)all 关键字
all 关键字表示与所有的值作比较。
显示工资比部门 30 的所有员工的工资高的员工的姓名、工资和部门号。
另一种写法:
(3)any 关键字
amy 关键字表示与任意的值作比较。
显示工资比部门 30 的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)。
3、多列子查询
- 单行子查询是指子查询只返回单列,单行数据。
- 多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句。
⚪练习
查询和 SMITH 的部门和岗位完全相同的所有雇员,不含 SMITH 本人
4、在 from 子句中使用子查询
子查询语句出现在 from 子句中。
这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。
⚪练习
(1)显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
- 获取各个部门的平均工资,将其看作临时表
扩展:除了上面的要求以外,还需要显示出对应部门的办公地点。
(2)查找每个部门工资最高的人的姓名、工资、部门、最高工资
(3)显示每个部门的信息(部门名,编号,地址)和人员数量
a. 方法 1:使用多表
解决多表问题的本质:(多表的指导思想)
想办法将多表转化为单表,所以在 MySQL 中,所有 select 的问题全都可以转成单表问题。
b. 方法 2:使用子查询(推荐)
- 对 emp 表进行人员统计
- 将上面的表看作临时表
5、合并查询
在实际应用中,为了合并多个 select 的执行结果,可以使用集合操作符 union , union all。
(1)union
该操作符用于取得两个结果集的并集。当使用该操作符时, 会 自动去掉结果集中的重复行。
练习 —— 将工资大于 2500 或职位是 MANAGER 的人找出来
(2)union all
该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。
练习 —— 将工资大于 25000 或职位是 MANAGER 的人找出来
注意:select 如果要使用 union / union all 来拼接两个结果,前提是必须保证两个表的列数是相同的。