目录

一、题目描述

二、思路


一、题目描述

有一个员工employees表简况如下:

android sql 倒序查询 sql倒序查询第一条_字符串

请你查找employees里最晚入职员工的所有信息,以上例子输出如下:

android sql 倒序查询 sql倒序查询第一条_android sql 倒序查询_02

二、思路

目前的任务是查找最晚入职的员工的信息,最简单的思路,是找入职时间最晚的信息。

思路1:倒序

最简单的思路是,直接把数据按入职的时间倒序排列,返回第一条信息。

这个要求并不高,主要利用order bylimit参数

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)

知识点——常用聚合函数

  1. 最大最小值——max()/min()
  • 除了数值型,也可以比较字符串和时间数据
  • 字符串:从A~Z,越来越大;依次比较
  • 时间数据:越晚越大
select 
    max(A)  # min()
from
    employees
where
    xxxxxx
  1. 求和——sum()
  • 只适用于数值型,可以计算的数字
select
    sum(A)
from
    employees
  1. 计数——count()
  • count(*) 统计表的行总数,即使行中有空,也会计算进去算作一行!
  • count(a)统计该列的行数,如果有空,则不会计算为行数!
select
    count(A)
    count(*)
from    
    employees
  • count可以统计多列的行数,中间用逗号隔开
select
    count(a) as a_name,
    count(b) as b_name
from
    employees
  1. 均值——avg()
  • 总值/非空行数
select
    avg(a) as a_avg
from
    employees

聚合函数的重复值处理!!!

select count(distinct a),  # 统计去重后的a列行数 avg(all b), # 统计b列全部数值的均值;默认为all sum(all c) from employees