06 查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序(请注意,一个员工可能有多次涨薪的情况)
解法一 使用group by分组+having min()过滤
select emp_no , salary from salaries
group by emp_no
having min(from_date)
order by emp_no desc;
注:一个员工有多次涨薪,也就是有多个from_date,按员工编号进行分组,然后使用having对分组后的数据进行过滤,找出最小的时间,即最刚入职时的时间。
解法二 使用内连接,入职日期等于发工资的日期(可找到入职时薪水)。
select e.emp_no,s.salary
from employees e inner join salaries s
on e.emp_no=s.emp_no
where e.hire_date = s.from_date
order by e.emp_no desc;
解法三 并列查询
select e.emp_no,s.salary
from employees e,salaries s
where e.emp_no=s.emp_no
and e.hire_date = s.from_date
order by e.emp_no desc;
07 查找薪水变动超过15次的员工号emp_no以及其对应的变动次数t
select emp_no,count() t from salaries
group by emp_no
having t>15;
注:按员工编号分组,然后统计每一个员工的薪水变动次数,并用having进行过滤。
08 找出所有员工当前(to_date=‘9999-01-01’)具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示。
解法一 distinct 去重
select distinct salary
from salaries
where to_date = ‘9999-01-01’
order by salary desc;
解法二 group by 去重
select salary from salaries
where to_date = ‘9999-01-01’
group by salary
order by salary desc;
说明:
对于distinct与group by的使用:
1.当对系统的性能高并且数据量大时使用group by;2.当对系统的性能不高时或者使用数据量少时两者都可;3.尽量使用group by。
distinct 特点:
1、distinct 只能放在查询字段的最前面。
2、distinct 对后面所有的字段均起作用,即 去重是查询的所有字段完全重复的数据,而不是只对 distinct 后面连接的单个字段重复的数据。
3、要查询多个字段,但只针对一个字段去重,使用distinct去重的话是无法实现的。group by可以实现。
group by 特点:
1、一般与聚类函数使用(如count()/sum()等),也可单独使用。
2、group by 也对后面所有的字段均起作用,即 去重是查询的所有字段完全重复的数据,而不是只对 group by后面连接的单个字段重复的数据。
select distinct A,B,C from table1;#distinct只能放在最前面,对3个字段都去重。
select A,B,C from table1
group by B;#可只对中间字段去重。