首页 > 解决方案 > 选择数据“不存在”并选择为空或“为空”的列 - MySQL

问题描述

这是我目前的查询:

select * from outerb where not exists(
Select * from wms
where wms.barcode = outerb.barcode);

此查询返回我需要的值。

到目前为止,一切都很好...

接下来,我需要选择一个pcode没有写入任何值的特定列(在本例中)。这是我尝试过并且对我来说绝对没问题的方法:

select * from outerb where not exists(
Select * from wms
where wms.barcode = outerb.barcode) 
and pcode = "" or pcode is null;

但是,当我向查询中添加另一列时,它会为我返回空列,pcode但对于新列,它会返回空值和填充值。我对此感到困惑。这是我尝试过的:

select * from outerb where not exists(
Select * from wms
where wms.barcode = outerb.barcode) 
and pcode = "" or pcode is null
and
brand = "" or brand is null;

Pcode工作得很好,但brand没有..有什么问题?

但是,如果我将两者颠倒过来,那么brand在查询中排在第一位,排在pcode第二位,pcode这一次会显示有值和brand没有值。

两列都是 Varchar 类型

标签: mysqlmysql-workbench

解决方案


放几个括号

select * 
from outerb 
where 
  not exists(
   select * 
   from wms
   where 
     wms.barcode = outerb.barcode
  ) 
  and (pcode = '' or pcode is null)
  and (brand = '' or brand is null);

每当您混合 AND 和 OR 时,请使用括号让 DB 和在您之后维护它的人都清楚,哪一组事实是一起的。没有它们,MySQL 将首先评估任何 AND,然后评估任何 OR。这意味着当你说:

a AND b OR c AND d OR e

MySQL会做,而不是你想要的:

(a AND b) OR (c AND d) OR e --MySQL does
a AND (b OR c) AND (d OR e) --you wanted

非常不同的一组事实,这两个

看看Mysql 或/和优先级?了解更多信息

Tim 的脚注和使用 MySQL 时的一般建议 - MySQL 可能有点像 Visual Basic 6 - 在其默认设置中,它允许您的编码比大多数其他数据库更加草率。诸如不必在使用聚合的查询上提供显式 GROUP BY 之类的事情;它只会为你发明一个分组。当 SQL 标准是单引号时,它还允许对字符串使用双引号。SQL 标准使用双引号来引用列名等,所以SELECT a as "my column name with spaces"- MySQL 也允许字符串被双引号,这不是规范。那么为什么要坚持规范呢?它使您的数据库技能更易于移植 - 如果您学习标准 sql,它在比 MySQL 特定 sql 更多的地方工作,这意味着您可以在工作面试中更有信心地说您的数据库交叉技能很好,因为您使用了一个范围通过将您的学习重点放在 sql 标准上来学习数据库,而不是说“我只使用过 MySQL,但我确信我可以学习......”。当然,您总是会遇到供应商特定的东西,因为标准无法像实现那样满足消费者的需求。边注; 我相信 Postgres 是严格遵守 SQL 规范的更好的数据库之一,因此是一个很好的学习数据库


推荐阅读