130 votes

SELECT * FROM tablename WHERE 1

J'étais curieux. Quelles sont les différences entre ces requêtes respectives :

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

  3. SELECT * FROM `tablename` WHERE 1=1

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 pour 1 - mais quand même, ce n'est pas un peu plus évident pour le lecteur ?

178voto

brent Points 1318

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'

11 votes

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.

45 votes

Je programme depuis 6 ans et je n'ai jamais pensé à faire cela - merci !

2 votes

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.

76voto

Gordon Linoff Points 213350

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.

6 votes

C'est une réponse supérieure parce qu'elle dit tout ce que l'autre réponse dit, mais en soulignant de manière cruciale la différence que la réponse n° 2 n'est pas conforme à la norme ANSI.

16voto

sagi Points 32665

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.

14voto

Tous sont identiques mais 2 et 3 sont utilisés pour manipuler facilement AND/OR conditions comme :

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

8voto

delx Points 354

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.com

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.

Powered by:

X