0

昨天我的朋友问了我一个关于这个查询的问题:

select * from user where 1=1 

我说查询不正确,但他说是正确的。我不明白这个查询如何正确。该部分如何where 1 = 1工作?

4

5 回答 5

7

这在以编程方式构建查询时很常见,因此对于您将添加的每个条件:

 AND (SOMECONDITION)

所以1=1开始WHERE部分,它总是正确的,并且不会影响性能。

于 2009-11-17T10:07:31.770 回答
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
于 2009-11-17T10:10:37.497 回答
0

1=1 是一个虚拟的 WHERE 子句。它只会返回用户表中的每条记录,因为 1=1 显然是正确的。

换句话说,WHERE 子句应用于 users 表中的每条记录,并返回 WHERE 子句为 true 的所有记录。1=1 显然一直为真,所以所有记录都会匹配条件并被返回。

于 2009-11-17T10:06:38.383 回答
0

1 等于 1 所以上面的事情 1 = 1 是真的,所以 sql 查询将返回所有的行。

某些 SQL DB 需要 where 子句,因此您可以放置​​一个虚拟 where 子句,该子句对于表中的所有行都是正确的。

于 2009-11-17T10:06:48.633 回答
0

1=1 等于 true 并返回查询中的所有行

于 2009-11-17T10:07:07.223 回答