昨天我的朋友问了我一个关于这个问题的问题:
select * from user where 1=1
我说查询不正确,但他说这是正确的。我不明白这个查询是如何正确的。 where 1 = 1
部分如何运作?
答案 0 :(得分:7)
这在以编程方式构建查询时很常见,因此对于您要添加的每个条件:
AND (SOMECONDITION)
所以1=1
启动WHERE
部分,它始终是真的,并且不会影响性能。
答案 1 :(得分:5)
1=1
通常在where子句的顶部使用。它是正确的语法,与实际查询的输出无关。
当你想逐行注释要调试的where子句时,它特别有用。考虑查询
SELECT Columns
FROM Table
WHERE 1=1
AND Col1 = @Value1
And Col2 IN (@Value2, @Value3)
And Cole Between @Value4 and @Value5
与
SELECT Columns
FROM Table
WHERE Col1 = @Value1
And Col2 IN (@Value2, @Value3)
And Cole Between @Value4 and @Value5
使用第一个查询
注释掉WHERE子句中任何有意义的部分要容易得多WHERE 1=1
-- AND Col1 = @Value1
And Col2 IN (@Value2, @Value3)
And Cole Between @Value4 and @Value5
而在第二个查询中你必须这样做
SELECT Columns
FROM Table
WHERE --Col1 = @Value1
-- And
Col2 IN (@Value2, @Value3)
And Cole Between @Value4 and @Value5
编辑:
专门针对StackOverflow格式化上面的查询,因为它只识别/* COMMENT */
而不识别-- COMMENT
使用第一个查询
注释掉WHERE子句中任何有意义的部分要容易得多WHERE 1=1
/* AND Col1 = @Value1 */
And Col2 IN (@Value2, @Value3)
And Cole Between @Value4 and @Value5
而在第二个查询中你必须这样做
SELECT Columns
FROM Table
WHERE /* Col1 = @Value1 */
/* And */
Col2 IN (@Value2, @Value3)
And Cole Between @Value4 and @Value5
答案 2 :(得分:0)
1 = 1是一个虚拟WHERE子句。它将返回用户表中的每条记录,因为1 = 1显然是真的。
换句话说,WHERE子句应用于users表中的每条记录,并返回WHERE子句为true的所有记录。 1 = 1显然都是真的,因此所有记录都将匹配条件并返回。
答案 3 :(得分:0)
1等于1 所以上面的东西1 = 1是真的,所以sql查询将返回所有的行。
某些SQL DB需要一个where子句,因此您可以放置一个虚拟where子句,该子句对于表中的所有行都是true。
答案 4 :(得分:0)
1 = 1等于true并返回查询中的所有行