SQL中为何时常见到 where 1=1?

你是否曾在 SELECT 查询中看到过 WHERE 1=1 条件。我在许多不同的查询和许多 SQL 引擎中都有看过。这条件显然意味着 WHERE TRUE,所以它只是返回与没有 WHERE 子句时相同的查询结果。此外,由于查询优化器几乎肯定会删除它,因此对查询执行时间没有影响。那么,WHERE 1=1 的作用是什么?这就是我们今天要在这里回答的问题!

WHERE 1=1 会改善查询执行吗?

正如前文中所述,我们预计查询优化器会删除硬编码的 WHERE 1=1 子句,因此我们不应看到查询执行时间减少。为了证实这个假设,让我们在 Navicat 中运行一个有和一个无 WHERE 1=1 子句的 SELECT 查询。

首先,以下是在 Sakila 示例数据库运行的查询,获取从 Lethbridge 商店租借电影的客户:

在信息选项卡的底部可以看到 0.004 秒的运行时间(用红色方框突出显示)。

现在,让我们运行相同的查询,但添加了 WHERE 1=1 子句:

同样,运行时间为 0.004 秒。尽管查询的运行时间可能因许多因素会略有波动,但可以肯定地说 WHERE 1=1 子句对其没有任何影响。

那么,为什么要使用它呢?简单来说,就是...

为方便而设

事实上,WHERE 1=1 子句只是一些开发人员采用的一种惯性做法,以简化静态和动态形式的 SQL 语句的使用。

在静态 SQL 中

向已经具有 WHERE 1=1 的查询添加条件时,此后的所有条件都将包含 AND,因此在注释掉试验查询的条件时更容易。

这类似于另一种在列名之前而不是之后加入逗号的技巧。同样,更容易注释:

在动态 SQL 中

这也是以编程方式构建 SQL 查询时的常见做法。从"WHERE 1=1"开始,然后附加其他条件,例如" and customer.id=:custId",具体取决于是否提供了客户 ID。这允许开发人员在查询中附加以"and ..."开头的下一个条件。这是一个假设的例子:

复制代码
stmt  = "SELECT * "
stmt += "FROM TABLE "
stmt += "WHERE 1=1 "
if user chooses option a then stmt += "and A is not null "
if user chooses option b then stmt += "and B is not null "
if user chooses option b then stmt += "and C is not null "
if user chooses option b then stmt += "

总结

在这篇文章中,我们了解到"WHERE 1=1 的目的是什么?"这个古老问题的答案。它不是一种高级优化技巧,而是一些开发人员所主张的一种风格惯例。

相关推荐
Nturmoils6 小时前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT
数据库
渣波9 小时前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码
javascript·数据库·后端
倔强的石头_1 天前
KingbaseES 新版MySQL 兼容版体验:旧版迁移 + 功能实测
数据库
zzzzzz3102 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
倔强的石头_4 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
云技纵横4 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
冬奇Lab5 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
ClouGence5 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
无响应de神5 天前
三、用户与权限管理
数据库·mysql
麦聪聊数据6 天前
数据服务化时代:企业数据能力输出的核心路径
数据库