MySQL的DQL中含NULL

2024 年 4 月 18 日 星期四(已编辑)
/
17
这篇文章上次修改于 2024 年 5 月 20 日 星期一,可能部分内容已经不适用,如有疑问可询问作者。

MySQL的DQL中含NULL

IN / NOT IN中含NULL

当左侧操作数为 NULL,返回 NULL
SELECT NULL IN (1, 2), NULL IN (1, 2, NULL);
+----------------+----------------------+
| NULL IN (1, 2) | NULL IN (1, 2, NULL) |
+----------------+----------------------+
|           NULL |                 NULL |
+----------------+----------------------+
当右侧值列表含有 NULL,如果包括左侧的非 NULL 值,返回 1,否则返回 NULL
SELECT 1 IN (1, NULL), 2 IN (1, NULL);
+----------------+----------------+
| 1 IN (1, NULL) | 2 IN (1, NULL) |
+----------------+----------------+
|              1 |           NULL |
+----------------+----------------+
因为第一个确定有,但当表内有NULL时,虽然没找到但是结果也是不确定对NULL的比较操作会返回UNKNOWN


当左侧操作数为 NULL,返回 NULL
SELECT NULL NOT IN (1, 2), NULL NOT IN (1, 2, NULL);
+--------------------+--------------------------+
| NULL NOT IN (1, 2) | NULL NOT IN (1, 2, NULL) |
+--------------------+--------------------------+
|               NULL |                     NULL |
+--------------------+--------------------------+
当右侧值列表含有 NULL,如果包含左侧的非 NULL 值,返回 0,否则返回 NULL
SELECT 1 NOT IN (1, NULL), 2 NOT IN (1, NULL);
+--------------------+--------------------+
| 1 NOT IN (1, NULL) | 2 NOT IN (1, NULL) |
+--------------------+--------------------+
|                  0 |               NULL |
+--------------------+--------------------+
第一个确定not in 为false,同样第二个不确定表内是否真没有

BETWEEN中含NULL

如果 expression, min, max 至少有一个 NULL 时, BETWEEN 运算符的返回 NULL。

SELECT
    NULL BETWEEN 1 AND 3,
    1 BETWEEN NULL AND 3,
    1 BETWEEN 1 AND NULL;

+----------------------+----------------------+----------------------+
| NULL BETWEEN 1 AND 3 | 1 BETWEEN NULL AND 3 | 1 BETWEEN 1 AND NULL |
+----------------------+----------------------+----------------------+
|                 NULL |                 NULL |                 NULL |
+----------------------+----------------------+----------------------+

LIKE中含NULL

LIKE运算符的两个操作数中任意一个为 NULL 时,返回 NULL

SELECT NULL LIKE 'a%', 'a' LIKE NULL;
+----------------+---------------+
| NULL LIKE 'a%' | 'a' LIKE NULL |
+----------------+---------------+
|           NULL |          NULL |
+----------------+---------------+

ORDER BY 和 NULL

在 MySQL 中的升序排序中, NULL 值出现在非 NULL 值之前。

当我们使用 ORDER BY 子句降序 DESC 排序时, NULL 值排在非 NULL 值的后面。

DISTINCT 与 NULL

DISTINCT 遇到 NULL 值时,只保留一个 NULL 值。因为 DISTINCT 认为所有的 NULL 值都是相同的,这与字段的类型无关

EXISTS

在本文中,我们讨论在 MySQL 中的 EXISTS 操作符,以及使用 EXISTS 操作符的时机。以下是 EXISTS 操作符的要点:

  • EXISTS 操作符用来判断一个子查询是否返回数据行。如果一个子查询返回了至少一个数据行,则 EXISTS 的计算结果为 TRUE,否则计算结果为 FALSE
  • EXISTS 运算的结果只与子查询是否返回数据行有关,子查询中的列的数量或者名称不影响运算结果。
  • 大多数情况下,使用 EXISTS 的语句的性能比对应的使用 IN 的语句要好。
SELECT *
FROM language
WHERE EXISTS(
    SELECT *
    FROM film
    WHERE film.language_id = language.language_id
);
等价
SELECT *
FROM language
WHERE EXISTS(
    SELECT 1
    FROM film
    WHERE film.language_id = language.language_id
);

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...