1.单表查询练习
这里主要学习MySQL复合查询。
练习:
1. 获取员工表中所有人的年薪,并排序。
年薪=月薪*12+年底奖金。
2.查询平均工资小于2000的部门和这个部门的平均工资
3.显示每种岗位上的雇员总数和平均工资
2.多表查询
两张表的组合形式:
- 从一张表中取出一条记录,和第二张表的所有记录进行组合
- 如果不加过滤条件,得到的结果称为笛卡尔积。
一般来讲,后续的多表查询都应该是笛卡尔积形成的新表的子集,后续只需要添加筛选条件.
1.显示部门号为10的部门地点,员工名,工资
其中部门地点和员工信息不在一张表上。
注意:两张表只有在部门号一致的条件下才有效。
2.查询员工的工资,姓名以及工资级别
工资级别和员工的信息不是一张表。
3.自连接
自连接是指在同一张表上进行查询
一张表也可以和自己笛卡尔积
1.显示员工A(FORD)的上级的编号与姓名
方法一:子查询
方法二:自连接
先找所有领导:
之后找特定名字所对应的领导:
4.子查询
单行子查询: 返回一行记录的子查询
1.显示SMITH同部门的所有员工:
多行子查询(in all any)
多行子查询:返回多行记录的子查询
- in关键字:
1.查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
首先要将10号部门的工作岗位无重复的筛选出来。
查询所有员工只要工作岗位在上图列表中即那满足条件。
-
all关键字:
2.显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
先查询30号部门的所有工资,并去重
-
any关键字:
3.显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
只要有一个符合就行。这就算any的意思。只要比30号部门最低工资高就行。
多列子查询
多列子查询:查询返回多个列数据的子查询语句
1.查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
先将SMITH的部门和岗位挑选出来作为筛选条件
这个条件是多列的,使用()进行比较
form子句中的子查询
子查询出现在form语句中,是将子查询的结果当临时表来使用。
1.显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
首先先挑出每个部门的平均工资表,与员工表进行笛卡尔积,当两张表的DEPTNO相同时才有意义,之后添加条件:员工的工资大于部门平均工资。
注意:在中间子查询需要比较SAL,不要使用format进行格式控制,否则会出错。
子查询可以出现在两个地方:
- where子句中做筛选条件
- from字句中构成笛卡尔积
5.合并查询(union union all)
- union
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
1.将工资大于2500或职位是MANAGER的人找出来
不同列数目的表不能合并。相同列数相同,但是列名不同,查询结果出错无意义。
- union all
该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。