1.
SELECT * FROM `tablename`
2. SELECT * FROM `tablename` WHERE 1
3. SELECT * FROM `tablename` WHERE 1=1
SELECT * FROM `tablename`
2. SELECT * FROM `tablename` WHERE 1
3. SELECT * FROM `tablename` WHERE 1=1
在MySQL中,2和3在功能上是相同的,1也是相同的。
where 1
不是标准写法,因此,正如其他人指出的那样,在其他方言中不起作用。
人们添加where 1
或 where 1 = 1
,这样可以通过添加/注释一些"and
..."组件来轻松地向查询添加或删除where
条件。
例如:
SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'
WHERE 1=1
,则无需担心您正在尝试添加到字符串中的条件是第一个条件(因此需要在前面添加WHERE
)还是不是。请注意,这样做不会改变原来的意思。 - Vicente Olivert RieraORDER BY 1
语法(而不是列名)。请注意,这不会改变原始意思。 - Mark Stewart正如你所知,它们三个都可以产生相同的结果。(在布尔上下文中,MySQL将整数“1”视为true - 实际上,任何不是“0”的数字都被视为true)。
MySQL优化器明确地记录了在WHERE
子句中删除常量条件:
常量条件删除......:
(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>
而不必担心残留的AND
。
如果您询问性能和结果的差异,那么并没有差异,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
表达式,因此没有过滤器,每条记录都将被选择。
所有的东西都是一样的,但是2和3被用来方便地处理像AND/OR
这样的条件,例如:
SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')
在第1种情况下,MySQL不需要评估任何WHERE条件。
在第2和第3种情况下,where条件是静态的,不基于行的值。它将使用布尔逻辑进行评估,并始终为真。
从功能上讲,没有区别。您应该选择第1种情况以提高代码清晰度。
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"
在MS SQL中,1和3是相同的,但选项2将无法工作,因为在MS SQL中,WHERE用于比较一些值。例如:
... WHERE TRUE
呢?我知道(在大多数 SQL 中,包括 MySQL)TRUE 只是一个代表1
的花哨宏 - 但是,对于读者来说这不是更明显一些吗? - user719662