关于MySQL遇到的一个小问题引发的思考?

一、问题的引出

今天早上在看一个关于SQL的面试题目中问到了这样一个问题:

1. 用一条SQL 语句 查询出每门课都大于80 分的学生姓名

原文中博主的表结构是:

name course grade 
张三 语文 81 
张三 数学 75 
李四 语文 76 
李四 数学 90 
王五 语文 81 
王五 数学 100 
王五 英语 90
 

博主给出的SQL是:

select name from table group by name having min(grade) > 80

附上原文地址:https://blog.csdn.net/paul0127/article/details/82529216

于是乎我在我的数据库也创建了表:

关于MySQL遇到的一个小问题引发的思考?_第1张图片
我发送了SQL:

select name from sql01 group by name having MIN(grade) > 80

得到的结果为:

关于MySQL遇到的一个小问题引发的思考?_第2张图片

咦?李四怎么也被查了出来?我把问题反馈给了一个朋友后,他得到的结果是:

关于MySQL遇到的一个小问题引发的思考?_第3张图片

关于MySQL遇到的一个小问题引发的思考?_第4张图片

没有问题,这时候他问我我的数据类型是什么?我突然反应我是用视图化工具建表的,可能grade不是数值类型,一查看果不其然。是varchar类型,最后将数据类型更正过后则结果集正确符合预期。

二、思考

解决问题可能很容易,可是我在想为什么varchar数据集就不对呢?

于是乎我首先想到了ascll编码,在varchar中比大小运用的是ascll编码。

我做了如下实验。

现在数据库的数据为:(注:此时的grade任然为varchar类型)

关于MySQL遇到的一个小问题引发的思考?_第5张图片

于是乎我发送了一条SQL:

select name,min(grade) from sql01 group by name  我想求每组内grade最小值

则有结果为:

关于MySQL遇到的一个小问题引发的思考?_第6张图片

我去?100怎么比90还小了?于是乎我赶紧查了ascll的编码

在ASCLL编码表中数字的编码是从48-57(0-9)

这样一来我就知道为什么100比90小了,它的第一位的ascll编码并没有90的第一位大。

那么所以,这个值与80相比较则当然不符合条件哇!(注:此时不是ascll比较了,是> <这种大小比较 ,就是刚才第一步中的min(grade) > 80,这句,此时我们的min(grade)已经等于100了,自然比80大。符合我们的条件)

三、总结

原来我们的varchar在比较大小的时候是ascll编码,不是我们理解的数值。这是我们要注意的。

学无止境,共同进步吧。不足之处欢迎指正!

你可能感兴趣的:(思考)