SELECT * FROM tablename WHERE 1
我一直很好奇。 有什么区别:
-
SELECT * FROM `tablename`
-
SELECT * FROM `tablename` WHERE 1
-
SELECT * FROM `tablename` WHERE 1=1
2和3在MySQL中是一样的,function上1也是一样的。
如其他人所指出的那样, where 1
不是标准的,在其他方言中不起作用。
人们添加where 1
或where 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是TRUE
expression式,因此 – 没有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用于比较一些值。 例如:
- 从“myTable”中select*,其中ID = 3(有效)
- 从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