0

我有一个没有记录的 MySQL 表。

-- all of these return false
SELECT IF(MAX(id), 'true', 'false') FROM `vcr_grades`
SELECT IF(MAX(id) = NULL, 'true', 'false') FROM `vcr_grades`
SELECT IF(!MAX(id), 'true', 'false') FROM `vcr_grades`

-- returns NULL
SELECT MAX(id) FROM `vcr_grades`

AUTO_INCREMENT设置为另一个值,而不是1。主键是id.

我错过了什么??

4

4 回答 4

3

你显然有零行。

当您使用 MAX() 或 COUNT() 之类的聚合函数时,查询将返回至少一行,即使表有零行也是如此。

MAX(id)如果它扫描的行集中没有非 NULL id 值,则返回 NULL。如果您有零行,这将返回 NULL。

NULL = NULL不返回 true,它返回 NULL。

mysql> select null=null;
+-----------+
| null=null |
+-----------+
|      NULL |
+-----------+

IF(NULL, 'true', 'false')返回“假”。

您可能想了解null 安全的相等运算符

mysql> select null <=> null;
+---------------+
| null <=> null |
+---------------+
|             1 |
+---------------+
于 2020-01-14T17:11:05.827 回答
1

我发现的一些误解:

  • NULL与其他任何事物既不相等也不不同……包括它自己:

    mysql> SELECT 1 = 1, 1 <> 1, 1 = NULL, 1 <> NULL, NULL = NULL, NULL <> NULL;
    +-------+--------+----------+-----------+-------------+--------------+
    | 1 = 1 | 1 <> 1 | 1 = NULL | 1 <> NULL | NULL = NULL | NULL <> NULL |
    +-------+--------+----------+-----------+-------------+--------------+
    |     1 |      0 |     NULL |      NULL |        NULL |         NULL |
    +-------+--------+----------+-----------+-------------+--------------+
    1 row in set (0.00 sec)
    

    这就是我们有IS运算符的原因,如下所示:

    mysql> SELECT 1 IS NULL, 1 IS NOT NULL, NULL IS NULL, NULL IS NOT NULL;
    +-----------+---------------+--------------+------------------+
    | 1 IS NULL | 1 IS NOT NULL | NULL IS NULL | NULL IS NOT NULL |
    +-----------+---------------+--------------+------------------+
    |         0 |             1 |            1 |                0 |
    +-----------+---------------+--------------+------------------+
    1 row in set (0.00 sec)
    
  • AUTO_INCREMENT功能只不过是一个全局计数器,您可以使用它来生成唯一的不可重用的表范围整数。它通常用于填充主键这一事实并不能使其成为主键的同义词。

  • MAX(id)完全按照名称所暗示的那样做,仅此而已:获取 column 中的最大值id。如果表是空的,它不会去从表定义中获取当前的 AUTO_INCREMENT 值,它只会NULL 按记录返回:

    如果没有匹配的行,则MAX()返回NULL

  • IF()在这里并没有真正发挥任何作用,但是:

    如果expr1TRUE(expr1 <> 0expr1 <> NULL),则IF()返回expr2。否则,它返回expr3.

    (这种描述实际上具有误导性,因为expr1 <> NULL实际上意味着简单的英语所暗示的内容。)

于 2020-01-14T17:30:18.010 回答
1

在所有这些情况下MAX(id)返回NULL,又!MAX(id)!NULL哪个又是NULL
一个布尔表达式在前 3 个查询中并非如此,结果是NULL函数 一部分。TRUEFALSEIF()

于 2020-01-14T17:13:09.857 回答
1

你的桌子似乎是空的:

  • MAX(id)返回NULLid是表的主键所以不能是NULL,所以这个结果表明表中根本没有记录
  • IF(MAX(id), 'true', 'false')产生假因为NULL在逻辑上是假的
  • IF(MAX(id) = NULL, 'true', 'false')是假的,因为NULL不等于NULL(要检查NULLness,你需要IS NULL
  • IF(!MAX(id), 'true', 'false')是假的,因为! NULL在逻辑上是假的

您可以尝试使用以下表达式,这应该会产生'true'

IF(MAX(id) IS NULL, 'true', 'false')
于 2020-01-14T17:13:18.300 回答