mysql - 选择数据“不存在”并选择为空或“为空”的列 - 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 类型
解决方案
放几个括号
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 规范的更好的数据库之一,因此是一个很好的学习数据库
推荐阅读
- typescript - 在 Jest 中,如何模拟具有依赖项的 TypeScript 类?
- javascript - 如何获取所有元素的数据,而不仅仅是第一个元素
- cassandra - Cassandra 基于轻量级事务的序列生成器一致性失败?
- python - How to add data to nested serializers?
- algorithm - 谷歌 Foobar 游戏
- webpack - 获取 @babel/present-env 的默认实现以与 IE11 一起使用
- android - 具有 StaggeredGridLayoutManager 的 Recyclerview 元素正在反向加载
- php - 执行输入数据时显示的 PHP 代码
- apache-kafka - 文件更改时如何更新 Kafka 文件源连接器?
- azure - 自定义 Azure IR 的问题