2020年10月11日 晚上,MySQL数据库常见问题:
MySQL易错坑如下:
- 时间的常见表达式
- 窗口函数的执行顺序
- MYSQL的执行顺序
- group by 和partition by的区别
- rank()与dense_rank()与row_number()区别
- order by 与over(oreder by)区别
- count与sum区别
文章目录
#时间的常见表达式
#窗口函数的执行顺序
#MYSQL的执行顺序
#group by 和partition by的区别
#rank()与dense_rank()与row_number()区别
#order by 与over(order by)区别
#count与sum区别
1.时间的常见表达式:
1.CURDATE() 当前时间
SELECT CURTIME() AS 当前时间;
2.CURTIME() 当前日期和时间
SELECT NOW() AS 当前日期和时间;
2.窗口函数的执行顺序:
例如: rank() over(partition by A order by B)
执行顺序如下:
先执行A的分类,再执行B的排序,再进行rank()的排序编号
3.MYSQL的执行顺序:
1.FORM
2.ON
3.JOIN
4.WHERE
5.GROUP BY
6.WITH
7.HAVING
8.SELECT
9.DISTINCT
10.ORDER BY
11.LIMIT
4.group by 和partition by的区别:
group by:
功能:分类;
区别:会缩短数据,会改变显示结果的数据结构(常用语聚合函数);
例子:总共有6个人,但是只有三类人,如果是group by就会只显示三类人的这三行
数据;
partition by:
功能:分类(注意这个分类是指窗口函数分类);
区别:会分类,但是不会缩短数据,不会改变显示结果的数据结构(常用于窗口函数)
例子:总共有6个人,但是只有三类人,如果是 partition by 同样数据也会显示6
个人的数据,但是他会告诉排序的函数 需要对着三个人进行分组排序
5.rank()与dense_rank()与row_number()区别
rank():跳跃式排序-比如分数为99,99,90,89,那么通过这个函数得到的排名为1,
1,3,4;
dense_rank():并列连续性排序-比如分数为99,99,90,89,那么通过这个函数得到
的排名为1,1,2,3;
row_number():连续性排序-比如分数为99,99,90,89,那么通过这个函数得到的排
名为1,2,3,4;
注意事项:在使用上面三个排序函数的时候一定要写order by(看上图红色,为正确书写格式,如果加了partition by 那么就指定排名在分组类 自己进行排名)
例如:rank() over(order by ‘排序字段名’)
dense_rank() over(order by ‘排序字段名’)
row_number() over(order by ‘排序字段名’)
6.order by 与窗口函数(order by)区别
order by:
功能:默认降序排列(desc),升序排列(asc)
区别:会改变数据的排列结构,显示结果能看到数据在排列
窗口函数内(order by):
功能:窗口函数内部显示进行排序
区别:但最终不影响到外部的显示结果数据排列(窗口函数的特殊用法)
7.count与sum区别
1、mysql 数据库中 count() 函数是统计查询结果中的行数,例如我们有下表
user_auth :
使用 count() 函数来查询结果个数,使用如下查询:mysql > select count(*) from user_auth ;
注意的是,count 会忽略掉 NULL 的结果, 所以 count(字段名) 这样使用的
话,如果字段中包含为null的结果,将导致查询结果不准确,我们将表中数据更改如下:
此时查询:mysql > select count(user_id) from user_auth;结果如下:
2、mysql 中 sum() 函数用于计算某一字段中所有行的数值之和( sum 求和时会对 null 进行过滤,不计算),例如如下查询:
mysql > select sum(user_id) from user_auth; 结果如下:
另外也能使用 sum(条件) 进行对符合条件的结果行数进行求和,如下查询:
mysql > select sum(user_id is null),sum(aid = 1) from user_auth; 结果如下:
需要注意的是,如果在没有返回行中使用 sum() 函数,sum 函数的返回值为 null,不是 0,例:
mysql > select sum(user_id) from user_auth where id not in (2,4,6);结果如下:
此时使用JDBC或者一些第三方框架进行映射时就会报错,解决办法是:使用IFNULL(sum(user_id),0) 或者 COALESCE(sum(user_id),0) 进行结果的转换。