2009-11-17 108 views
0

昨天我的朋友問我一個問題關於這個查詢:SQL簡單的查詢

select * from user where 1=1 

我說,查詢是不正確的,但他說,這是正確的。我不明白這個查詢是如何正確的。 where 1 = 1部分如何工作?

+0

該查詢等效於:'SELECT * FROM user' – intgr 2009-11-17 10:07:14

回答

7

這是常見的,當查詢被編程的方式構建,因此對於每個條件,您將添加返回的所有行:

AND (SOMECONDITION) 

所以1=1啓動WHERE部分,它總是如此,並且不會損害性能。

0

1 = 1是一個虛擬的WHERE子句。它只會返回用戶表中的每條記錄,因爲1 = 1顯然是真的。

換言之,WHERE子句應用於users表中的每個記錄,並返回WHERE子句爲真的所有記錄。 1 = 1顯然是真的,所以所有的記錄都會匹配條件並被返回。

0

1等於1 所以上面的東西1 = 1是真的,所以sql查詢將返回所有的行。

某些SQL DB需要一個where子句,因此您可以將一個dummy where子句放在表中的所有行中。

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 1=1 
-- AND Col1 = @Value1 
And Col2 IN (@Value2, @Value3) 
And Cole Between @Value4 and @Value5 

註釋掉WHERE子句中的任何有意義的部分,而必須這樣做

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