MySQL:全部选择,除了当一列包含一个特定值而另一列包含另一特定值时

时间:2018-10-16 22:18:47

标签: mysql select

因此,我正在尝试从此表中执行一条select语句:

+--------+-------+--------+
| LETTER | COLOR | NUMBER |
+--------+-------+--------+
| A      | red   | 1      |
| B      | red   | 2      |
| A      | black | 3      |
| C      | red   | 4      |
| B      | black | 5      |
| D      | red   | 6      |
| E      | red   | 7      |
| C      | black | 8      |
| C      | black | 9      |
| C      | red   | 10     |
+--------+-------+--------+ 

基本上,我想执行“ SELECT *”,但是跳过字母为C 且颜色为“黑色”的行。

换句话说,SELECT的结果将是整个表,除了那两个倒数第二行。

我将如何构造该语句?

2 个答案:

答案 0 :(得分:2)

最直接的方法是使用 NOT 运算符来消除条件:

SELECT t.*
  FROM this_table t 
 WHERE NOT ( t.letter = 'C' AND t.color = 'black' )
       ^^^

请注意,我们将条件括在括号中,以便将NOT应用于整个条件的结果。

但这并不能说明lettercolor列中可能的NULL值。

为了更精确地匹配规范(没有关于是否允许使用NULL值的信息),我们可以使用MySQL NULL安全比较<=>(太空飞船)运算符代替相等性=运算符。

SELECT t.*
  FROM this_table t 
 WHERE NOT ( t.letter <=> 'C' AND t.color <=> 'black' )
       ^^^

在括号内对AND运算符的求反将是OR,因此我们也可以这样写:

SELECT t.*
  FROM this_table t 
 WHERE NOT ( t.letter <=> 'C' )
    OR NOT ( t.color  <=> 'black' )
       ^^^ 

如果我们要使用不等式比较运算符(<>),则无需使用NOT运算符就可以获得等效的结果...

SELECT t.*
  FROM this_table t 
 WHERE ( t.letter <> 'C'     OR t.letter IS NULL )
    OR ( t.color  <> 'black' OR t.color  IS NULL )

答案 1 :(得分:0)

从TableName中选择* 没有字母=“ C”且没有颜色=“黑色”