SELECT * 从表名 WHERE 1

SELECT * FROM tablename WHERE 1

我一直很好奇。这些查询之间有什么区别:

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

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

2和3在MySQL中是一样的,功能上1也是一样的。

where 1 不是标准的,因此,正如其他人指出的那样,在其他方言中不起作用。

人们添加 where 1where 1 = 1 以便 where 条件可以轻松添加或删除 to/from 通过在查询中添加 in/commenting 一些“and ..." 组件。

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 优化器显式 documented 删除 WHERE 子句中的常量条件:

  • Constant condition removal . . .:

    (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> 而不用担心挥之不去的 ANDs.

都是一样的,但是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" 语句,以便以后更容易添加或删除它。

我觉得第一种和第三种写法比较合适。如果您需要 where 语句,您确实喜欢 3 号,否则 1 号就足够了。

在 MS SQL 中,1 和 3 是相同的,但是,选项 2 将不起作用,选项 2 是无效语句,如在 MS SQL 中,WHERE 用于比较某些值。例如:

  1. Select * 来自 'myTable,其中 ID = 3(有效)
  2. Select * from 'myTable where 1 = 1 is same as Select * from 'myTable where 2= 2 is same as Select * from 'myTable where 3= 3你得到的想法(有效)与 Select * 来自 'myTable'
  3. 相同
  1. SELECT * FROM table_name : 它会给你所有的记录 table 与 运行 任意 where 语句。
  2. SELECT * FROM table_name WHERE 1 : 这个 where 条件总是 是的,它主要被黑客用来进入任何系统。如果你听到 关于 sql 次注射比 2 和 3 是被迫的场景 由黑客构建以获取 table.
  3. 的所有记录
  4. SELECT * FROM table_name where 1=1 :这会给你所有 table 的记录,但它会比较 where 语句和 然后再往前走,基本上就是增加或删除更多 之后的声明。

Result - 为所有三个查询

提供指定的 table 中的所有记录而不是 tablename

SELECT * FROM tablename WHERE 1 - 检查这个 answer

SELECT * FROM tablename WHERE 1=1 - 检查这个 answer

有关 WHERE 子句优化的更多信息,请检查这些:MYSQL, SQLite, SQL