我很好奇。这些相应查询之间有什么区别:
SELECT * FROM `tablename`
SELECT * FROM `tablename` WHERE 1
SELECT * FROM `tablename` WHERE 1=1
答案 0 :(得分:175)
where 1
不是标准的,正如其他人所指出的那样,它不适用于其他方言。
人们添加where 1
或where 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用于比较某些值。例如:
答案 8 :(得分:2)
答案 9 :(得分:1)