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