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
);