在数据库中当然是可以对001和005使用聚合函数max()进行大小比较的,但是我们必须要留意文本型数值和数字型数值在比较数值大小时,数据库引擎对不同的字段数据类型其比较的结果可能会有所不同!下面举例说明一下:
比如 10和9,按数字比较大小则 10>9,但是如果按文本比较大小则 '10'<'9',因为两个字串比较大小时是从左边第一个字符开始逐个字符进行比较的,一旦分出高低,比较将立即结束不再进行余下比较。'10'开头为1,'9'开头为9首尾字符即可分出大小,这样文本数字'10'就会小于文本数字'9'。我们再来看看001和005,则不论是按数字类型还是按文本类型比较均为前者小于后者,按数字比较的话自然1小于5,若按字串比较,前两位打成平手到第三个字符时就分出了大小。
数据库中字符和字串比较大小的排序规则基本上与我们日常使用的字词典里的排序规则相互吻合,两个字符或字串根据它们在字典中的排序位置我们通常不必依赖电脑运算就可以判断出谁大谁小。
现在我们实测一下使用聚合函数Max()对比文本数据类型字段和数字类型字段的比较结果,以下是SQL实验代码:
drop table if exists t2
-- 创建测试表t2含文本数据型“数字”字段和数字类型字段
create table t2(id int auto_increment primary key,
charNum varchar(10),digitNum int)
-- 插入测试数据
insert into t2(charNum,digitNum) values
('001',1),('005',5),('0010',10)
-- 查看待测数据
select * from t2
-- 直接选出文本“数字”字段中的最大值和数字字段中的最大值
select max(charNum) as maxCharNum,
max(digitNum) as maxDigitNum from t2
-- 将文本“数字”字段转换为数字类型后再选出其最大值,以及直接选出数字字段最大值
select max(convert(charNum,signed)) as maxConvertCharNum,
max(digitNum) as maxDigitNum from t2
测试截图:
待测数据:
直接对文本和数字两种数据类型字段使用Max()函数的返回结果对比:
我们可以看到直接对文本数据类型字段使用Max函数选出的最大值是“005”而非“0010”
下面是将文本数据类型数字转换为数字数据类型后才使用Max函数的对比结果:
我们可以看到对文本类型字段使用Max函数的最大值已经跟数字数据类型字段的最大值一样了,都是10。
总结:
直接对字符型数据类型字段使用聚合函数Max()、Min()所返回的极值将遵循一般字(词)典对字(词)里设定的排序规则,所选出的最大(小)值不一定是数字意义上的极值,如果需要得出严格数字意义上的极值就必须先进行类型转换,否则得出的结果可能会与期望值有出入。
解决 MySQL max的方法 改my.ini算了! 如果你希望通过程序配置 建议将my.ini 中的max_allowed_packet设置为最大, 而你在程序逻辑里控制你程序定义的最大packet只要不超过max_allowed_packet就好了!楼主可以参考下列例句:列出所有年龄最大的学生资料
select * from students
where date_of_birth=
(select max date_of_birth
from students)
或者
select a.* from students a
where not exists (
select 1 from students b
where b.date _of_birth >a.date_of_birth)
第二种写法在有索引可被利用时效率很高,可作为首选,但是无索引可被利用且是大数据表的情况下效率很低,此时应避免使用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)