选择 * FROM tablename WHERE 1

我一直很好奇,这些查询之间的区别是什么:

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

  3. SELECT * FROM `tablename` WHERE 1=1

25362 次浏览

2和3在 MySQL 中是相同的,功能1也是相同的。

where 1是不标准的,因此,正如其他人所指出的,不会在其他方言工作。

人们添加 where 1where 1 = 1,这样通过添加/注释掉一些“ and...”组件,就可以很容易地在查询中添加或删除 where条件。

也就是说。

SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'

如果你问的是性能和结果的差异,没有任何差异,2和3是相同的 WHERE TRUE,他们将导致相同的第一个。

1 - SELECT * FROM table_name

table_name生成所有数据(没有过滤器)

2 - SELECT * FROM table_name WHERE 1

1将被评估为 TRUE,因此-没有过滤器-每个记录将被返回。

3 - SELECT * FROM table_name where 1=1

与上一个相同,1 = 1是一个 TRUE表达式,因此-无过滤器-每条记录都将被选中。

在1中,MySQL 不需要计算任何 WHERE 条件。

在2和3中,where 条件是静态的,而不是基于行的值。它将使用布尔逻辑进行计算,并且始终为真。

在功能上没有区别。为了代码清晰度,您应该选择1。

正如你们所知,这三种方法产生的结果是一样的。(在布尔上下文中,MySQL 将整数“1”视为真值——事实上,任何非“0”的数字都被视为真值)。

MySQL 优化器显式地使用 记录在案来删除 WHERE子句中的常量条件:

  • 持续状态移除..:

    (B > = 5 AND B = 5) OR (B = 6 AND 5 = 5) OR (B = 7 AND 5 = 6) - > B = 5 OR B = 6

因此,这三个代码将被编译成完全相同的代码。

它们在功能上都是等价的,应该具有相同的性能特征。

也就是说,第一个和第三个是标准 SQL。第二种方法会在许多数据库中导致某种布尔表达式错误。因此,我建议您避免这种情况(我不确定它在 MySQL 的严格 SQL 模式下是否有效)。

在构造动态 WHERE子句时,通常使用第三种方法。它可以很容易地添加额外的条件,如 AND <condition>,而不用担心延迟 AND

所有这些都是相同的,但是2和3用于轻松处理 AND/OR条件 例如:

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

它们都是一样的,但是2和3用于为 AND/OR 条件创建动态查询

sqlquery ="  SELECT * FROM `tablename` where 1 =1 "

我们使用2和3格式进行动态查询,所以我们已经知道添加了“ where”关键字,并且我们继续添加更多的过滤器。 喜欢

sqlquery  = sqlquery + "and columna =a"
"AND columna =a " then

如果我们有新的过滤器,在几行之后我们添加“ AND coulmnb = b”等等

您不必检查 sql 查询是否将 where 关键字作为其放置在第一个或初始查询中

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

否则我们可以写 sqlquery = "SELECT * FROM tablename"

那么

如果在 sqlquery中没有“ where”子句,那么

sqlquery  = sqlquery + "where columna =a"

别的

sqlquery  = sqlquery + "and columna =a"

它们都输出相同的答案。然而,编写2和3的方式主要是为了控制“ Where”语句,以便以后更容易添加或删除它。

我认为第一种和第三种方式是正确的写法。如果你需要在数字3中使用 where 语句,否则数字1就足够了。

在 MS SQL 1和3是相同的,但是,选项2将不工作,选项2是一个无效的语句,因为在 MS SQL,WHERE 是用来比较一些值。例如:

  1. 从‘ myTable 中选择 * ,其中 ID = 3(有效)
  2. 从“ myTable”中选择 * ,其中1 = 1与 Select * 相同,从“ myTable”中选择 * ,其中2 = 2与 Select * 相同,从“ myTable”中选择 * ,其中3 = 3您得到的想法(有效)与 Select * 从“ myTable”中选择 * 相同
  1. SELECT * FROM table _ name : 它将提供 运行任意 where 语句的表。
  2. SELECT * FROM table _ name WHERE 1 : 这里的条件始终是 的确,它主要被黑客用来进入任何系统。如果你听说 关于 sql 注射比2 & 3的情况下,被迫 由黑客构建以获取表的所有记录。
  3. SELECT * FROM table _ name where 1 = 1 : 这将为您提供所有 但是它将比较 where 语句和 然后向前移动,它基本上是添加或删除更多 之后的陈述。

Result -为所有三个查询提供指定的表中的所有记录,而不是表名

检查这个 回答

检查这个 回答

有关 WHERE 子句优化的更多信息,请检查以下内容: MYSQLSQLiteSQL