J'étais curieux. Quelles sont les différences entre ces requêtes respectives :
-
SELECT * FROM `tablename`
-
SELECT * FROM `tablename` WHERE 1
-
SELECT * FROM `tablename` WHERE 1=1
J'étais curieux. Quelles sont les différences entre ces requêtes respectives :
SELECT * FROM `tablename`
SELECT * FROM `tablename` WHERE 1
SELECT * FROM `tablename` WHERE 1=1
2 et 3 sont les mêmes dans MySQL, fonctionnellement 1 est aussi le même.
where 1
n'est pas standard et, comme d'autres l'ont souligné, ne fonctionnera pas dans d'autres dialectes.
Les gens ajoutent where 1
o where 1 = 1
donc where
peuvent être facilement ajoutées ou supprimées d'une requête en ajoutant/commentant des " and
...".
c'est-à-dire
SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'
De même, lorsque vous construisez par programme une requête dans une chaîne de caractères pour l'exécuter plus tard, si vous ajoutez WHERE 1=1
vous n'aurez pas besoin de faire attention si la condition que vous essayez d'ajouter à la chaîne est la première (elle aura donc besoin d'un WHERE
devant) ou non.
Il peut être utile de souligner que cela est très différent de ORDER BY 1
ce qui est déconseillé et plutôt rare : ici, le numéro est l'index de la colonne à trier.
Comme vous le savez, les trois produisent les mêmes résultats. (Dans un contexte booléen, MySQL traite le nombre entier "1" comme vrai -- en fait, tout nombre qui n'est pas "0" est traité comme vrai).
L'optimiseur MySQL est explicitement documenté pour supprimer les conditions constantes dans le WHERE
clause :
Suppression des conditions constantes . . . :
(B>=5 ET B=5) OU (B=6 ET 5=5) OU (B=7 ET 5=6) -> B=5 OU B=6
Par conséquent, les trois seront compilés dans exactement le même code.
Ils sont tous fonctionnellement équivalents et devraient avoir les mêmes caractéristiques de performance.
Cela dit, le premier et le troisième sont du SQL standard. La seconde provoquera une sorte d'erreur d'expression booléenne dans de nombreuses bases de données. Je vous conseille donc de l'éviter (je ne suis pas sûr que cela fonctionne ou non en mode SQL strict de MySQL).
Le troisième est souvent utilisé lors de la construction de WHERE
clauses. Il est facile d'ajouter des conditions supplémentaires comme AND <condition>
sans s'inquiéter de la persistance AND
s.
Si vous demandez les différences de performances et de résultats, il n'y en a pas, 2 et 3 sont identiques. WHERE TRUE
et le résultat sera le même que celui de la première.
1 - SELECT * FROM table_name
Résultats dans toutes les données de table_name
(sans filtre)
2 - SELECT * FROM table_name WHERE 1
1 sera évalué comme TRUE
Par conséquent, sans filtre, chaque enregistrement sera renvoyé.
3 - SELECT * FROM table_name where 1=1
Comme la dernière, 1=1 est une TRUE
par conséquent, sans filtre, tous les enregistrements seront sélectionnés.
En 1, MySQL n'a pas besoin d'évaluer les conditions WHERE.
En 2 et 3, la condition where est statique et ne repose pas sur les valeurs des lignes. Elle sera évaluée avec une logique booléenne et sera toujours vraie.
Fonctionnellement, il n'y a pas de différence. Vous devriez choisir 1 pour la clarté du code.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
9 votes
Existe-t-il un drapeau "trop étroit" pour les balises ? car cela s'applique à de nombreux dialectes SQL, sinon à tous. Je le vois fréquemment dans MSSQL et Oracle aussi. btw ce sont les apostrophes ? n'est pas le backtick ` utilisé pour citer les noms d'objet mysql ?
3 votes
@dlatikay vous pouvez éditer les tags...
2 votes
Hm. pourquoi pas simplement
... WHERE TRUE
? Je suis conscient que (dans la plupart des langages SQL, y compris MySQL) TRUE est juste une macro fantaisie pour1
- mais quand même, ce n'est pas un peu plus évident pour le lecteur ?2 votes
2 est invalide dans la plupart des dialectes SQL
16 votes
Duplicata possible de Pourquoi utiliserait-on WHERE 1=1 AND <conditions> dans une clause SQL ?
0 votes
J'ai lu que, dans certains systèmes de bases de données, il est impossible d'utiliser un DELETE sans poser une condition explicite, afin de se protéger contre la suppression accidentelle de l'ensemble de la table. Exiger une condition toujours vraie signifierait "Oui, je veux vraiment supprimer la table entière".
0 votes
2 n'est pas valide je pense en plsql, les deux autres devraient produire les mêmes résultats.
0 votes
Pour info, il existe un moyen plus approprié d'y parvenir
SELECT *
en utilisantTABLE 'tablename'
.0 votes
J'avais l'habitude d'utiliser une condition (1=1) comme première condition lors du développement de certaines requêtes complexes, où chaque condition suivante peut commencer par ET, par exemple, ce qui facilite le commentaire ligne par ligne.