mysql - 以不同的方式编写 SQL 查询

标签 mysql sql oracle

我编写了一个查询来检查我的表与通用表的完整性。查询如下

SELECT * FROM Universal
WHERE UNIVERSAL.TYPE=MYTYPE
  AND Universal.CLASS=MYCLASS
  AND Universal.ID NOT IN (SELECT Mytable.ID FROM Mytable)

正如您所看到的,我在寻找完整性之前过滤了通用表,两者都在同一查询中。我现在发现,当我删除 NOT IN 部分时,查询运行良好,但是当我包含它时,我没有得到任何结果。这个查询有什么问题吗?我怎样才能以其他形式编写,例如使用联接或其他形式?

最佳答案

SELECT * FROM Universal
WHERE UNIVERSAL.TYPE=MYTYPE
  AND Universal.CLASS=MYCLASS
  AND Universal.ID NOT IN (SELECT Mytable.ID FROM Mytable
                           WHERE Mytable.ID IS NOT NULL)

空且不在...!

SELECT 返回 WHERE 子句为 TRUE 的行,并且不返回 FALSE 行。

此外,也不会返回 UNKNOWN 行(即 NULL 行。)这通常不是问题,但当涉及到 NOT IN 时许多程序员感到惊讶。

假设您有一个汽车表,并且您想要返回列表(或子查询)中未找到的颜色的汽车:

select * from cars where color not in ('red', 'blue')

很容易理解,除了红色和蓝色之外的所有汽车都会返回。

但是如果颜色列表用未知颜色(NULL)扩展,则它将是:

select * from cars where color not in ('red', 'blue', NULL)

现在 WHERE 子句不知道例如是否黄色汽车是否在列表中,它肯定不是红色或蓝色,但我们无法判断它是否不是那种未知的 NULL 颜色...即WHERE 子句变得未知,并且不返回任何行!

在这里,程序员可以通过在子查询中指定IS NOT NULL来避免未知的颜色。 (或者转换为 NOT EXISTS,这是“空安全”。)

关于mysql - 以不同的方式编写 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29147956/

相关文章:

php - 在 PHP 中包含问题

sql - 什么是 Oracle 中的级别伪列,谁能解释一下?

sql - 查找表中总值和不同值之间的差异

oracle - 如何从嵌套表中选择列值

java.sql.SQLException : Parameter index out of range (1 > number of parameters, 即 0)。

mysql - 使用 SystemTap 跟踪 mysqld

mysql - 我有一个来自 MSSQL 的 *.sql 文件,我需要将其导入 MySQL

php - 为什么 SQL 时间戳不是 UTC?

sql - Oracle中的语句触发器?

mysql - 自增列 : differences in SQL syntax between Oracle and MySQL