首页 > 数据库 >SQL 语句中 WHERE 1=1 的作用

SQL 语句中 WHERE 1=1 的作用

时间:2022-12-07 09:46:12浏览次数:63  
标签:语句 SQL chooses stmt 查询 子句 WHERE

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

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

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

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

without 1=1.jpg

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

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

with 1=1.jpg

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

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

为方便而设

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

在静态 SQL 中

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

with _in_static_sql (35K)

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

commas (19K)

在动态 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 += "and D is not null "

总结

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

标签:语句,SQL,chooses,stmt,查询,子句,WHERE
From: https://www.cnblogs.com/lkj371/p/16962173.html

相关文章

  • MySQL的DQL(数据查询语言)
    本篇将会介绍MySQL中的各种查询语句,主要使用的数据表结构如下:它们分别是:部门表(department),包含部门编号(dept_id)和部门名称(dept_name)字段,主键为部门编号。该表共计6......
  • MySql-查看事务与锁
    --1、查看正在进行中的事务SELECT*FROMinformation_schema.INNODB_TRX;--2、查看正在锁的事务SELECT*FROMINFORMATION_SCHEMA.INNODB_LOCKS;--3、查看......
  • What does SQLJC_ERROR_SYNTAX error mean and how to resolve it?
    IBMSupportWhatdoesSQLJC_ERROR_SYNTAXerrormeanandhowtoresolveit?https://www.ibm.com/support/pages/what-does-sq......
  • 解决QT 中Sqlite数据库添加加密功能
    解决QT 中Sqlite数据库添加加密功能是本文要介绍的内容,Sqlite数据库默认没有加密功能,对一些需要对工程文件进行保密的场合产生了不便,本文以QT4.4.3为例,对QT 源代码中......
  • IC64525: SQLCODE -30020 OR DRDA DATA STREAM SYNTAX ERROR REPORTED BY DB2 CONNECT
      Skiptomaincontent    Openacase    KnownIssues IC64525:SQLCODE-30020ORDRDADATASTREAMSYNT......
  • Connection attempt to a database may return SQL0902C error with reason code "200
    Skiptocontent  Support  DownloadsDocumentationForumsCasesMonitoringManagesupportaccount  IBMSupport ......
  • sql语句多表联查
    上图最下面两个图的查询语句select...from表1asaFULLOUTERJOIN表2asbona.列名=b.列名(右)select...from表1asaFULLOUTERJOIN表2asbona.列名=b......
  • MySQL变量
    变量是一个拥有名字的对象,可以用于存储和共享数据。根据变量的创建方式和作用域可以将其分为以下几种类型:系统变量(SystemVariable),由MySQL系统定义和维护的变量。系统......
  • SQLSERVER中RANK OVER(PARTITION BY)的用法
    https://blog.csdn.net/weixin_41896770/article/details/107625845一张学生表【姓名、班级、分数】,查询出每个班级成绩排第一的同学(按照班级的分数排名)其中RANK()OVER(......
  • SQL POWER 函数
    http://www.yiidian.com/sql/power-function-in-sql.html一、SQLPOWER函数语法POWER函数是SQL中的一个数学函数,它返回一个数字的值,它是另一个数字的幂。在幂函数中......