一、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的结果