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中是一样的,function上1也是一样的。

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

人们添加where 1where 1 = 1以便通过添加/注释掉某些“ and …”组件,可以方便地添加或删除查询条件。

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

如你所知,所有三个产生相同的结果。 (在布尔上下文中,MySQL将整数“1”视为真 – 实际上,任何不是“0”的数都被视为真)。

MySQL优化器明确logging在WHERE子句中去除常量条件:

  • 恒定的条件去除。 。 。:

    (B = 5 AND B = 5)OR(B = 6 AND 5 = 5)OR(B = 7 AND 5 = 6)→B = 5 OR B = 6

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

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

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

通常在构builddynamicWHERE子句时使用第三个。 这使得添加附加条件如AND <condition>很容易,而不用担心AND

如果你问的是性能和结果的差异,那么就不存在任何2和3是一样的,它们的结果与第一个相同。

 1 - SELECT * FROM table_name 

结果来自table_name所有数据(无filter)

 2 - SELECT * FROM table_name WHERE 1 

1将被评估为TRUE ,因此 – 没有filter – 每个logging将被返回。

 3 - SELECT * FROM table_name where 1=1 

与最后一个相同,1 = 1是TRUEexpression式,因此 – 没有filter – 每个logging都将被选中。

全部是相同的,但是2和3用于容易处理AND / OR条件

喜欢

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

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

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

在function上,没有区别。 您应该select1代码清晰。

所有的都是一样的,但是2和3被用来创buildAND / OR条件的dynamic查询

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

我们使用2和3格式来进行dynamic查询,所以我们已经知道“where”关键字被添加了,并且我们不断添加更多的filter。 喜欢

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

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

您不必检查sql查询中的关键字,因为它放置在第一个或初始查询中

 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号的地方声明,否则号码1就足够了。

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

  1. 从“myTable”中select*,其中ID = 3(有效)
  2. 从myTable中select* from myTable其中1 = 1与从myTable中select*相同2 = 2与select* from myTable其中3 = 3您的想法(有效)与Select * from'myTable'相同

1 – SELECT * FROM table_name它会给你所有的表的logging运行任何where语句。

2 – SELECT * FROM table_name WHERE 1这里的条件永远是真的,它主要被黑客用来进入任何系统。 如果你听说sql注入比2&3是被黑客强制build立以获取表的所有logging的场景。

3 – SELECT * FROM table_name where 1 = 1这会给你表的所有logging,但它会比较where语句,然后向前移动,它基本上被添加来添加或删除更多的语句。

结果 – 为所有三个查询指定表中的所有logging,而不是表名

SELECT * FROM tablename WHERE 1 – 检查这个答案

SELECT * FROM tablename WHERE 1=1 – 检查这个答案

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