mysql中的查询语句的执行顺序

一、sql语句的执行顺序

1.sql语句的执行顺序

(7)select 
(8)distinct 字段名1,字段名2...
(5)[fun 字段名]
(1)from 表名
(2)inner|left|right|full|cross join on 连接条件
(3)where 筛选条件
(4)group by 分组条件
(6)having 分组后的筛选条件
(9)order by 排序条件
(10)limit <起始偏移量,条目数>

2.各个关键字的含义

2.1 from

from后面是表名,可以是从表或主表

2.2 on

on后面跟的是表和表之间的连接条件

2.3 join

  • left 【outer】 join :左外连接,后面跟的是从表
  • right 【outer】join:右外连接,后面跟的是主表
  • full 【outer】join:全外连接,返回的结果是left join + right join
  • 【inner】join 内连接:一般inner省略不写,取两连接表的交集
  • cross join:结果是笛卡尔乘积

2.4 where

where后面跟筛选条件,条件运算符可以为 > < >= <= <>(不等于) between and,多个筛选条件可以用or 或者 and连接。

2.5 group by

group by后面跟分组条件,比如分组之后求出每一个组的最大值(max)、最小值(min)、平均值(avg)、每个组的个数(count)。

2.6 having

having后面跟的也是筛选条件,但是having和where不同点为:having是对分过组之后的虚拟表在进行过滤筛选,而where是在分组之前筛选。

2.7 select

select 后面跟要查询的列。

2.8 distinct

  • distinct 后跟查询字段,必须放在查询字段的开头
  • distinct不会过滤掉null值,返回结果包含null值
  • distinct和聚簇函数使用:SELECT COUNT(distinct 字段名)from 表名,这个查询语句则会过滤掉null项。

2.9 order by

  • order by 后跟排序字段名,一般是数值类的字段名
  • asc 升序排序,desc 降序排序,如果不显示写asc或desc,则默认为升序
  • order by后可以跟多个不同的排序字段,每个字段都可以有自己的排序方式,先按第一个字段排序、当第一个字段比较结果相等时,按第二个字段排序,以此类推

2.10 limit

limit offset,size;

公式:
要显示的页数是page,每一页的条目(item)数是size

select 查询列表
from 表名
limit (page-1)*size,size;

size=10
page      起始索引
1           0
2           10
3           20

#案例1:查询前5条员工的信息
SELECT *
FROM employees
LIMIT 0,5;

#案例2:查询第11条~第25条
SELECT *
FROM employees
LIMIT 10,15;

#案例3:有奖金的员工信息,并且工资较高的前10名显示出来
SELECT *
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary DESC
LIMIT 10;

二、rank() over,dense_rank() over,row_number() over的区别

注意:MySQL8.0才能运行下述三个内置函数!

1.DENSE_RANK() OVER

  • dense_rank() over :当两名同学的成绩相等时,下一位同学并不空出所占的名次

首先创建一个表:Scores:表中有两个字段id(int)、score(double)

SELECT Score, DENSE_RANK() OVER (ORDER BY Score DESC ) AS 'Rank'
FROM Scores;

结果如图1:

在这里插入图片描述
图1:DENSE_RANK() OVER的结果

2.RANK() OVER

  • rank() over:和dense_rank() over不同的是,下一位同学空出所占的名词
SELECT Score, RANK() OVER(ORDER BY Score DESC) AS 'Rank'
FROM Scores;

结果如图2:
在这里插入图片描述

​ 图2:RANK() OVER的结果

3.3.row_number() over

  • 这个函数不需要考虑是否并列,哪怕根据条件查询出来的数值相同也会进行连续排名
SELECT Score, row_number() over(ORDER BY Score DESC) AS 'Rank'
FROM Scores;

结果如图3:

在这里插入图片描述

​ 图3:row_number() over的结果

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

lyqstar...

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值