mysql:全选,除非一列包含一个特定值,而另一列包含另一个特定值

kjthegm6  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(476)

所以我试着从这个表中做一个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,颜色是“black”的行。
换句话说,select的结果将是除倒数第二行以外的整个表。
我该如何构造这个语句?

af7jpaap

af7jpaap1#

最直接的方法是使用 NOT 操作员:

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

请注意,我们将条件括在parens中,这样就不适用于整个条件的结果。
但这并不能解释列中可能存在的空值 letter 或者 color .
为了更精确地匹配规范(我们没有关于是否允许空值的信息),我们可以使用mysql空安全比较 <=> (宇宙飞船)代替等式的运算符 = 比较运算符。

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

ogsagwnx2#

选择*from tablename where not letter='c'and not color='black'

相关问题