目录
一、题目描述
二、思路
一、题目描述
有一个员工employees表简况如下:
请你查找employees里最晚入职员工的所有信息,以上例子输出如下:
二、思路
目前的任务是查找最晚入职的员工的信息,最简单的思路,是找入职时间最晚的信息。
思路1:倒序
最简单的思路是,直接把数据按入职的时间倒序排列,返回第一条信息。
这个要求并不高,主要利用order by
和limit
参数
select
*
from
employees
order by
hire_date DESC #按hire_date降序排列
limit
0,1 #从第0个元素开始,取1个————取第1个的意思
知识点——order by
- 默认是升序(ASC)
- 如果是降序,需要在列名后面加上
DESC
- 如果按多个元素依次排序,则为
select
*
from
employees
order by
hire_date DESC,
emp_no ASC
- 上方表示的内容指,按照hire_date降序排列,再按emp_no升序排列
知识点——limit
- 前提:sql的第一条数据为第0行!
- limit 1: 从第1条开始,取1条数据,等同于
limit 0,1
- limit 2,3:从第3条开始,取3条数据
- limit 1,3 等价于 limit 3 offset 1
不足
这个思路虽然简单直接,但无法应对这样的情况——最大值不唯一
例如,当有两个人的入职时间都是最晚的同一天时,上方代码只能返回第一条数据,而无法察觉到第二条等值的数据
因此,我们推出思路2,通过max定位到最大值,用值来匹配!
思路2:找到最大值
鉴于思路1的不足,我们发现——不能依靠位次来定位最大值,而应该通过值
最好要能直接找到最大值是谁,接着只要匹配等于这个最大值的行就行
基于上方的推断,我们只需要写两层匹配算法,利用max()
找到最大的hire_date
select
*
from
employees
where
hire_date = (select max(hire_date) from employees)
知识点——常用聚合函数
- 最大最小值——max()/min()
- 除了数值型,也可以比较字符串和时间数据
- 字符串:从A~Z,越来越大;依次比较
- 时间数据:越晚越大
select
max(A) # min()
from
employees
where
xxxxxx
- 求和——sum()
- 只适用于数值型,可以计算的数字
select
sum(A)
from
employees
- 计数——count()
count(*)
统计表的行总数,即使行中有空,也会计算进去算作一行!count(a)
统计该列的行数,如果有空,则不会计算为行数!
select
count(A)
count(*)
from
employees
- count可以统计多列的行数,中间用逗号隔开
select
count(a) as a_name,
count(b) as b_name
from
employees
- 均值——avg()
- 总值/非空行数
select
avg(a) as a_avg
from
employees
聚合函数的重复值处理!!!
select count(distinct a), # 统计去重后的a列行数 avg(all b), # 统计b列全部数值的均值;默认为all sum(all c) from employees