2009-11-17 3 views
0

Вчера мой друг задал мне вопрос по этому запросу:SQL простого запроса

select * from user where 1=1 

Я сказал, что запрос является неправильным, но он сказал, что это правильно. Я не понимаю, как этот запрос может быть правильным. Как работает where 1 = 1?

+0

Запрос эквивалентен: 'SELECT * FROM user' – intgr

ответ

7

Это является общим, когда запрос строится программно, так и для каждого условия вы будете добавлять:

AND (SOMECONDITION) 

так 1=1 начинается раздел WHERE, это всегда так, и это не повредит производительности.

0

1 = 1 - это фиктивное предложение WHERE. Он просто вернет каждую запись из таблицы пользователя, так как 1 = 1, очевидно, верно.

Другими словами, предложение WHERE применяется к каждой записи в таблице пользователей и возвращает все записи, где предложение WHERE истинно. 1 = 1, очевидно, истинно все время, поэтому все записи будут соответствовать условию и будут возвращены.

0

1 равно 1 , так что вышеуказанная вещь 1 = 1 истинна, поэтому запрос sql вернет все строки.

Некоторым SQL DB требуется предложение where, поэтому вы можете поместить предложение dummy where, которое будет истинно для всех строк в таблицах.

0

1 = 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 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 

EDIT:

отформатированных запросы сверху специально для StackOverflow, потому что она признает только /* COMMENT */, а не -- COMMENT

Это намного проще, закомментировать содержательную часть ИНЕКЕ с первым запросом

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 
Смежные вопросы