SELECT * FROM tablename WHERE 1

时间:2016-08-07 11:49:12

标签: sql select-query

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

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

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

10 个答案:

答案 0 :(得分:175)

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

where 1不是标准的,正如其他人所指出的那样,它不适用于其他方言。

人们添加where 1where 1 = 1,因此可以通过添加/注释掉一些“where来轻松地向/从查询中添加或删除and条件“组件。

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

答案 1 :(得分:72)

如您所知,三者都产生相同的结果。 (在布尔上下文中,MySQL将整数“1”视为真 - 事实上,任何不为“0”的数字都被视为真。)

MySQL优化器明确地documented删除WHERE子句中的常量条件:

  
      
  • 不断删除条件。 。 :

         

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

  •   

因此,所有三个都将编译成完全相同的代码。

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

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

通常在构造动态WHERE子句时使用第三个。这样可以轻松添加其他条件AND <condition>,而无需担心AND的延迟。

答案 2 :(得分:15)

如果你问的是性能和结果的差异,那么就没有,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表达式,因此 - 没有过滤器 - 将选择每个记录。

答案 3 :(得分:12)

所有都相同,但2和3用于轻松处理AND/OR条件 像:

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

答案 4 :(得分:7)

在1中,MySQL不需要评估任何WHERE条件。

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

从功能上讲,没有区别。您应该选择1以获得代码清晰度。

答案 5 :(得分:6)

所有都相同,但2和3用于为AND / OR条件创建动态查询

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

我们使用2和3格式进行动态查询,因此我们已经知道&#34;其中&#34;关键字已添加,我们会不断添加更多过滤条件 喜欢

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

如果我们有新的过滤器几行,我们添加&#34; AND coulmnb = b&#34;等等

您不必检查sql查询where关键字在第一个或初始查询中的位置

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

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

然后

如果没有&#39;其中&#39; sqlquery中的子句

sqlquery  = sqlquery + "where columna =a"

否则

sqlquery  = sqlquery + "and columna =a"

答案 6 :(得分:3)

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

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

答案 7 :(得分:2)

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

  1. 从&#39; myTable中选择*,其中ID = 3(有效)
  2. 从myTable中选择*,其中1 = 1与Select * from&#39; myTable相同,其中2 = 2与Select * from&#39; myTable相同,其中3 = 3您明白了(有效)与Select * From&#39; myTable&#39;
  3. 相同

答案 8 :(得分:2)

  1. SELECT * FROM table_name :它会为您提供所有记录 运行任何where语句的表。
  2. SELECT * FROM table_name WHERE 1 :此条件始终为 是的,它主要被黑客用于进入任何系统。如果你听到了 关于sql注射比2&amp; 3是被迫的场景 由黑客构建以获取表的所有记录。
  3. SELECT * FROM table_name其中1 = 1 :这将为您提供全部 表的记录,但它将比较where语句和 然后继续前进,基本上添加了添加或删除更多 之后的陈述。

答案 9 :(得分:1)

结果 - 为所有三个查询提供指定表中的所有记录而不是tablename

SELECT * FROM tablename WHERE 1 - 请检查此answer

SELECT * FROM tablename WHERE 1=1 - 请检查此answer

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