这似乎是如此基本,我因为缺乏一个更好的词而大吃一惊.我有两个表,让我们给他们打电话albums和artists
CREATE TABLE `albums` (
`album_id` bigint(20) NOT NULL AUTO_INCREMENT,
`artist_id` bigint(20) DEFAULT NULL,
`name` varchar(200) NOT NULL,
PRIMARY KEY (`album_id`)
)
CREATE TABLE `artists` (
`artist_id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(250) NOT NULL,
PRIMARY KEY (`artist_id`)
)
Run Code Online (Sandbox Code Playgroud)
每个表中有几十万秒.一些专辑行有一个null artist_id,这是预期的.
但是,当我执行以下查询以查找没有相册的艺术家时:
SELECT * FROM artists WHERE artist_id NOT IN (SELECT artist_id FROM albums)
...查询返回零结果.我知道这不是真的.所以我尝试了这个:
SELECT * FROM artists WHERE artist_id NOT IN (SELECT artist_id FROM albums WHERE artist_id IS NOT NULL)
......我回来了几千行.我的问题是:为什么第一个查询似乎操作任何数字= NULL的想法?或者这是NULL对IN()语句的奇怪影响?我觉得这是我错过的基本内容.我通常不会在我的数据库表中使用NULL.
快速回答 - IN声明是一个捷径=a OR =b OR ....如果在此列表中包含空值,那么我认为这会破坏该语句.你的第二个选择可能是更好的选择.
或者使用连接也可以工作,并且效率更高.
这NOT EXISTS就是语义正确的原因
SELECT * FROM artists ar
WHERE NOT EXISTS
(SELECT * FROM albums al WHERE ar.artist_id = al.artist_id)
Run Code Online (Sandbox Code Playgroud)
逻辑:
NOT IN (x, y, NULL) 实际上是
NOT (x OR y OR NULL) 实际上是
(NOT x) AND (NOT y) AND (NOT NULL)所以NULL使整体无效NOT IN
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |