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
值。