MySQL什么';这两个sql之间的区别是什么?在MAX()中,一个使用null,一个使用字符
数据来源如下:MySQL什么';这两个sql之间的区别是什么?在MAX()中,一个使用null,一个使用字符,mysql,sql,Mysql,Sql,数据来源如下: name course --------------- Marry UNIX Bob Java Bob SQL Cherry SQL John SQL John UNIX Eric SQL 此sql是正确的: SELECT name, max(CASE WHEN course = 'SQL' THEN '○' ELSE null END) AS "SQL", max(CASE WHEN cou
name course
---------------
Marry UNIX
Bob Java
Bob SQL
Cherry SQL
John SQL
John UNIX
Eric SQL
此sql是正确的:
SELECT name,
max(CASE WHEN course = 'SQL' THEN '○' ELSE null END) AS "SQL",
max(CASE WHEN course = 'UNIX' THEN '○' ELSE null END) AS "UNIX",
max(CASE WHEN course = 'Java' THEN '○' ELSE null END) AS "Java"
FROM Courses
GROUP BY name;
但这是错误的:
SELECT name,
max(CASE WHEN course = 'SQL' THEN '○' ELSE 'x' END) AS "SQL",
max(CASE WHEN course = 'UNIX' THEN '○' ELSE 'x' END) AS "UNIX",
max(CASE WHEN course = 'Java' THEN '○' ELSE 'x' END) AS "Java"
FROM Courses
GROUP BY name;
我在MySQL中运行了第二个,结果是错误的
name SQL UNIX JAVA
Bob x x x
Cherry ○ x x
Eric ○ x x
John x x x
Marry x ○ x
那么这两个sql之间有什么问题呢?MAX()忽略空值?MAX()
忽略空值,并选择以其他方式显示的最大值。由于'x'
大于'o'
,如果两个值都存在,则结果为'x'
例如,对于Bob,由于有两条记录具有不同的课程
值,因此至少有一条记录将命中else
子句。这意味着对于所有3个,至少有一个'x'
存在,因此所有3个的结果都是'x'
基本上,第一个版本是:“如果WHEN
子句对任何记录都为true,则结果为'o'
,否则结果为NULL
”
第二个版本是:“如果
WHEN
子句对于任何记录都是false,那么结果是'x'
,因为这是最高值,否则结果是'o'
”,或者说另一种方式:“如果WHEN
子句对于所有记录都是true,那么结果是'o'
,否则结果是'x'
”一切似乎都很好:我在MySQL中运行了第二个,结果是错误的名称SQL UNIX JAVA Bob x Cherry○埃里克○x约翰x x玛丽x○您正在运行哪个版本?非常感谢您,我知道您的意思。但我认为无论“x”是否大于“o”,如果when子句为false,新值将覆盖旧值。但为什么这里的答案是正确的:?@H-x-P,因为○
不是o
(小写字母o),而是a,因此高于x
,这意味着“如果WHEN子句对任何记录为true,则结果为”○'', 否则结果是'x'
“omg,我没有注意到这不是o
^\u^。但我有一个新问题。使用Max(CASE WHEN course='SQL'然后1 ELSE 2 END)
作为示例,如果WHEN子句为true,结果为1,那么为什么最终结果可以为2?列中是否有2,所以Max()选择大的一个?@H-X-P如果有任何条件为false的记录,则CASE
表达式的计算结果为2
,因此MAX()
将看到一个2
并返回该值。--假设一个组中只有一条记录的计算结果为true,这意味着任何具有多条记录的组,如果其中一条记录的计算结果为true,则两个结果都会有记录,因此max()
的结果总是两个值中的较高值。如果false值较高,则意味着对于具有多条记录的任何组,条件检查都没有意义,因为您将获得ELSE
值。