2009-11-17 6 views
0

Hier, mon ami m'a posé une question au sujet de cette requête:simple requête SQL

select * from user where 1=1 

je dit que la requête est incorrecte, mais il a dit qu'il est correct. Je ne comprends pas comment cette requête peut être correcte. Comment fonctionne la pièce where 1 = 1?

+0

La requête est équivalente à: 'SELECT * FROM user' – intgr

Répondre

7

Cette situation est commune lorsqu'une requête est en cours de construction par programmation, vous ajouterez pour chaque condition:

AND (SOMECONDITION) 

de sorte que le 1=1 commence la section WHERE, c'est toujours vrai, et cela ne nuit pas à la performance.

0

1 = 1 est une clause WHERE factice. Il retournera juste chaque enregistrement de la table d'utilisateur car 1 = 1 est évidemment vrai. En d'autres termes, la clause WHERE est appliquée à chaque enregistrement dans la table users et renvoie tous les enregistrements où la clause WHERE est vraie. 1 = 1 est évidemment vrai tout le temps, ainsi tous les enregistrements correspondront à la condition et seront retournés.

0

1 est égal à 1 donc la chose ci-dessus 1 = 1 est vrai, et donc la requête sql retournera toutes les lignes.

Certaines bases de données SQL requièrent une clause where, vous pouvez donc placer une clause where fictive qui sera vraie pour toutes les lignes des tables.

0

1 = 1 équivaut à true et renvoie toutes les lignes dans la requête

5

1=1 est généralement utilisé en haut de la clause where pour des raisons de formatage et pour faciliter le débogage. C'est la syntaxe correcte et n'a aucune incidence sur la sortie de la requête réelle.

Ceci est particulièrement utile lorsque vous voulez commenter ligne par ligne de la clause where à déboguer. Considérons la requête

SELECT Columns 
FROM Table 
WHERE 1=1 
AND Col1 = @Value1 
And Col2 IN (@Value2, @Value3) 
And Cole Between @Value4 and @Value5 

contre

SELECT Columns 
FROM Table 
WHERE Col1 = @Value1 
And Col2 IN (@Value2, @Value3) 
And Cole Between @Value4 and @Value5 

Il est beaucoup plus facile de commenter une partie significative de la clause WHERE avec la première requête

WHERE 1=1 
-- AND Col1 = @Value1 
And Col2 IN (@Value2, @Value3) 
And Cole Between @Value4 and @Value5 

alors que dans la deuxième requête vous le feriez avoir à faire

SELECT Columns 
FROM Table 
WHERE --Col1 = @Value1 
-- And 
Col2 IN (@Value2, @Value3) 
And Cole Between @Value4 and @Value5 

EDIT:

formatter les requêtes de ci-dessus spécialement pour StackOverflow parce qu'elle ne reconnaît que le /* COMMENT */ et non la -- COMMENT

Il est beaucoup plus facile de commenter une partie significative de la clause WHERE avec la première requête

WHERE 1=1 
/* AND Col1 = @Value1 */ 
And Col2 IN (@Value2, @Value3) 
And Cole Between @Value4 and @Value5 

alors que dans la deuxième requête que vous auriez à faire

SELECT Columns 
FROM Table 
WHERE /* Col1 = @Value1 */ 
/* And */ 
Col2 IN (@Value2, @Value3) 
And Cole Between @Value4 and @Value5