昨天我的朋友问了我一个关于这个查询的问题:
select * from user where 1=1
我说查询不正确,但他说是正确的。我不明白这个查询如何正确。该部分如何where 1 = 1
工作?
这在以编程方式构建查询时很常见,因此对于您将添加的每个条件:
AND (SOMECONDITION)
所以1=1
开始WHERE
部分,它总是正确的,并且不会影响性能。
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
1=1 是一个虚拟的 WHERE 子句。它只会返回用户表中的每条记录,因为 1=1 显然是正确的。
换句话说,WHERE 子句应用于 users 表中的每条记录,并返回 WHERE 子句为 true 的所有记录。1=1 显然一直为真,所以所有记录都会匹配条件并被返回。
1 等于 1 所以上面的事情 1 = 1 是真的,所以 sql 查询将返回所有的行。
某些 SQL DB 需要 where 子句,因此您可以放置一个虚拟 where 子句,该子句对于表中的所有行都是正确的。
1=1 等于 true 并返回查询中的所有行