MySQL 常见问题总结之一

2020年10月11日 晚上,MySQL数据库常见问题:
MySQL易错坑如下:

  1. 时间的常见表达式
  2. 窗口函数的执行顺序
  3. MYSQL的执行顺序
  4. group by 和partition by的区别
  5. rank()与dense_rank()与row_number()区别
  6. order by 与over(oreder by)区别
  7. 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) 进行结果的转换。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值