【澳门金沙vip】Mysql查询最近一条记录的sql语句(优化篇)

下策——查询出结果后将时刻排序后取第一条

有关mysql查询近来一条记下

近年项目中遇见须要查询记录当前时间以来的一条记下的标题,带头以为无从入手,后来日渐开采了二种减轻方案。

1 . group by 和 having字句:

select * from a where create_time="2017-03-29 19:30:36" order by create_time desclimit 1

下策——查询出结果后将时间排序后取第一条

select * from a 
where time<="2017-03-29 19:30:36" 
order by time desc
limit 1

诸有此类做固然能够收取当前岁月以来的一条记下,可是二回查询要求将表遍历壹次,对于百万之上数据查询将相比为难;limit是先抽出全体结出,然后取第一条,也就是查询中占领了不供给的日子和空间;辛亏似果急需批量抽出近些日子一条记下,例如说:“三个订单表,有顾客,订单时间,金额,要求二回性查询全数用户的近年的一条订单记录”,那么每一个顾客一次询问将在做一遍整表的遍历,数据大的情况下,时间将会以指数方式抓实,不能够投入其实运用。

group by是依靠列值对数据开展分组,
having子句用于对分组的多寡进行过滤. [ having 针没有错靶子是分好的组]

eg:

    employee表:

uuid

emp_name

emp_id

dept_id

    dept表:

uuid

dept_name

dept_id

    查询最少含有五个雇员的单位名称:

select d.dept_name, d.dept.id, count(e.emp_id) emp_sum    --这里统计可以使用*号,但是建议使用具体的列,速度上会快一点
from employee e left join dept d
on e.dept_id = d.dept_id
group by d.name
having count(e.emp_id) >= 2;   --统计每组的人数,即部门人数

如此那般做即使能够抽出当前时光以来的一条记下,可是一回询问须求将表遍历叁次,对于百万以上数量查询将相比较费力;limit是先抽出全部结实,然后取第一条,也正是查询中降志辱身了不须要的年月和空间;还宛倘使急需批量抽取近期一条记下,举个例子说:“八个订单表,有顾客,订单时间,金额,须要三回性查询全部客户的近年的一条订单记录”,那么各类客户一次询问就要做二遍整表的遍历,数据大的情景下,时间将会以指数格局提高,无法投入其实运用。

中策——查询排序后group by

select * from (
    select * from a
    where time<="2017-03-29 19:30:36" 
    order by time desc
)   group by user_id

后来察觉使用group by 能够依靠group by
的参数列分组,但重临的结果唯有一条,留神察看发掘group
by是将分组后的第一条记下重返。时间在查询后默许是顺序排列,由此需求先将时刻倒序排列,方可抽出间隔当前多年来一条。

那样查询实际上依然进行了五遍询问,即使日子上相比较第四个情势有了质的敏捷,但是还能特别优化。

2 . Order by 子句

中策——查询排序后group by

上策——将max(卡塔尔 方法和group by结合使用

select *,max(time) from a
where time<="2017-03-29 19:30:36" 
group by user_id

那句能够知晓为将结果集依照user_id分组,每组取time最大学一年级条记下。那样就很好的落到实处了批量询问目前记下,况兼只是须要遍历三回表,就算在数据量庞大的状态下也得以在相当的短的小时得悉结果。

order by
子句用于对结果集中的原始列数据可能依照列数据总结的表明式的结果开展排序
.

私下认可是升序, 加上 desc 关键字正是降序了.

多规格排序只需把标准用逗号分割就可以.

eg:

   account表:

uuid

name

account

id

询问全数顾客,结果按 account 降序:

select * 
from account
order by account desc;

基于表达式排序:

假如 account 表中 id 列为那样的数据 111-111-111, 和银行卡编号相像.

筛选须要依据 id 后肆位展开排序:

select * 
from account
order by right(id, 3) desc;

听闻内建函数 right(State of Qatar 提取 id 字段的最终八个字符,
并依据该值对结果集实行排序.

select * from ( select * from a where create_time="2017-03-29 19:30:36" order by create_time desc) group by user_id

3 . 集合函数

后来察觉使用group by 能够依照group by
的参数列分组,但回来的结果唯有一条,细心考察发掘group
by是将分组后的第一条记下重临。时间在询问后默许是顺序排列,由此供给先将时间倒序排列,方可抽取间隔当前以来一条。

涉嫌聚焦函数, 必需提到分组, 分组就联想到了 group by 语句. [ 使用
group by 是展现分组 ]

汇合函数是对有些分组的具备行开展一定的操作.

正如聚集函数:

  • Max(State of Qatar : 重回会集中最大值
  • Min(State of Qatar : 再次回到集结中最小值
  • Avg(State of Qatar : 重返群集中的平均值
  • Count(卡塔尔(قطر‎ : 再次来到集结中值的个数

在地方提到了显示分组, 那么势必就还应该有隐式分组, 也正是不选择 group by
语句, 比方上边包车型客车 sql:

eg:

    员工表 employee

uuid

name

emp_id

emp_age

emp_location

查询 emp_location 是瓦伦西亚市的职员和工人的十分的小年龄, 最大年龄, 平均年龄 :

select min(emp_age) min_age, 
max(emp_age) max_age,
avg(emp_age) avg_age
from employee
where emp_location = "杭州";

      上边未有动用分组语句, 可是却得以选拔聚集函数, 那是因为 where
相当于了八个隐式分组, 结果聚集唯有二个组, 那正是emp_location=”杭州”
这一组.

这么查询实际上还是进行了五次查询,即使日子上相比第八个点子有了质的神速,不过仍为能够进一层优化。

4 . distinct 关键字

上策——将max(State of Qatar 方法和group by结合使用

用来除去会集中列中的重复值, 留下不另行的值, 用于总计 .

eg:

询问选课表中总结有多少学子选了课 :

     选课表 SC :

uuid

c_id

s_id

select count(distinct s_id) 
from SC;

注意 :

         固然 distinct 关键字后有多个列, distinct
关键字的效用并非保险离他后日的那一列保险不重复,
而是保证全部列的咬合保险不另行 .

 

select *,max(create_time) from awhere create_time="2017-03-29 19:30:36" group by user_id

5 . as 关键字的选拔

那句能够通晓为将结果集遵照user_id分组,每组取time最大学一年级条记下。这样就很好的贯彻了批量询问近期记录,而且独自需求遍历二次表,纵然在数据量庞大的境况下也得以在超级短的小时获悉结果。

as 关键字用于取外号, 能够给表取外号, 也足以给列取别名, 可以被轻便 .
可是有少数, 别称尽量选拔双引号包裹, 尽管别称中含有特殊字符就能出错 .

扩展:

给列取别称有二种艺术 : [ 推荐应用个中的 ]

前段时间有一张资金财产配备表:base_assets_turn

select name as "姓名", age "年龄", sex 性别  --这里使用了三种取别名的方式, 推荐使用第二种
from users