SELECT * FROM nomtable WHERE 1

129

J'ai été 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

Stephen Alexander
la source
9
existe-t-il un indicateur «trop étroit» pour les balises? car cela s'applique à de nombreux dialectes SQL, sinon à tous. Je le vois aussi fréquemment dans MSSQL et Oracle. btw quelles sont les apostrophes? le backtick n'est-il pas utilisé pour citer les noms d'objets mysql?
Cee McSharpface
3
@dlatikay vous pouvez modifier les tags ...
Braiam
2
hm. pourquoi pas simplement ... WHERE TRUE? Je suis conscient que (dans la plupart des SQL, y compris MySQL) TRUE est juste une macro sophistiquée pour 1- mais n'est-ce pas encore un peu plus évident pour le lecteur?
2
2 n'est pas valide dans la plupart des dialectes SQL
edc65

Réponses:

177

2 et 3 sont identiques dans MySQL, fonctionnellement 1 est également identique.

where 1 n'est pas standard donc, comme d'autres l'ont souligné, ne fonctionnera pas dans d'autres dialectes.

Les personnes qui ajoutent where 1ou where 1 = 1ainsi des whereconditions peuvent être facilement ajoutées ou supprimées à / d'une requête en ajoutant / commentant certains andcomposants " ...".

c'est à dire

SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'
brent
la source
11
Et aussi lorsque vous construisez par programme une requête dans une chaîne pour l'exécuter plus tard, si vous ajoutez, WHERE 1=1vous n'aurez pas besoin de faire attention si la condition que vous essayez d'ajouter à la chaîne est la première (il faudra donc un WHEREdevant ) ou pas.
Vincent Olivert Riera
45
Je programme depuis 6 ans et je n'ai jamais pensé à le faire - merci!
SimonGates
6
La ORDER BY 1syntaxe @dlatikay est requise (au lieu des noms de colonne) si vous effectuez une union de deux ou plusieurs instructions SELECT.
Mark Stewart
5
@SimonGates Je programme depuis 6 ans et je n'ai jamais pensé à faire autre chose lol
WernerCD
4
@WernerCD Je pense qu'il est beaucoup plus judicieux de construire une liste de clauses de filtre dans une liste quelconque, puis de les joindre par chaîne " AND "comme délimiteur.
Zev Spitz
76

Comme vous le savez, tous les trois produisent les mêmes résultats. (Dans un contexte booléen, MySQL traite l'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 la WHEREclause:

  • Élimination constante de l'état. . .:

    (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 exactement dans le même code.

Ils sont tous fonctionnellement équivalents et doivent 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. Donc, je vous conseillerais d'éviter cela (je ne suis pas sûr si cela fonctionne ou non en mode SQL strict de MySQL).

Le troisième est souvent utilisé lors de la construction de WHEREclauses dynamiques . Cela permet d'ajouter facilement des conditions supplémentaires AND <condition>sans se soucier des ANDs persistantes .

Gordon Linoff
la source
6
C'est une réponse supérieure pour dire tout ce que fait l'autre réponse, mais en soulignant de manière cruciale la différence que # 2 n'est pas conforme à ANSI.
underscore_d
16

Si vous vous interrogez sur les différences de performances et de résultats, il n'y en a pas, 2 et 3 sont identiques WHERE TRUE, et ils donneront le même résultat que le premier.

1 - SELECT * FROM table_name

Résultats dans toutes les données de table_name(pas de filtre)

2 - SELECT * FROM table_name WHERE 1

1 sera évalué comme TRUE, par conséquent - pas de filtre - chaque enregistrement sera renvoyé.

3 - SELECT * FROM table_name where 1=1

Identique au dernier, 1 = 1 est une TRUEexpression, donc - pas de filtre - chaque enregistrement sera sélectionné.

Sagi
la source
14

Tous sont identiques, mais 2 et 3 sont utilisés pour gérer facilement des AND/ORconditions telles que:

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')
Ashraf.Shk786
la source
8

Dans 1, MySQL n'a pas besoin d'évaluer les conditions WHERE.

En 2 et 3, la condition where est statique et non basée sur les valeurs des lignes. Il sera évalué avec une logique booléenne et sera toujours vrai.

Fonctionnellement, il n'y a pas de différence. Vous devez choisir 1 pour la clarté du code.

delx
la source
7

Tous sont identiques mais 2 et 3 sont utilisés pour créer des requêtes dynamiques pour les conditions ET / OU

sqlquery ="  SELECT * FROM `tablename` where 1 =1 "

nous utilisons le format 2 et 3 pour faire des requêtes dynamiques afin que nous sachions déjà «où» le mot-clé est ajouté et nous continuons d'ajouter plus de filtres. Comme

sqlquery  = sqlquery + "and columna =a"
"AND columna =a " then

après quelques lignes si nous avons de nouveaux filtres, nous ajoutons "AND coulmnb = b" et ainsi de suite

Vous n'avez pas à vérifier la requête SQL pour savoir où le mot clé est placé dans la première requête ou la requête initiale

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

Sinon on peut écrire sqlquery = "SELECT * FROM tablename"

puis

s'il n'y a pas de clause 'where' sqlquery alors

sqlquery  = sqlquery + "where columna =a"

autre

sqlquery  = sqlquery + "and columna =a"
Jin Thakur
la source
4 espaces de début indiquent un bloc de code. Veuillez modifier votre réponse pour la formater correctement, et voir l' aide à l' édition pour toute la Bible de formatage de Markdown.
Mathieu Guindon
4

Ils donnent tous la même réponse. Cependant, la façon dont 2 et 3 sont écrits est principalement pour avoir le contrôle de l'instruction "Where" afin qu'il soit plus facile de l'ajouter ou de la supprimer plus tard.

Je pense que la première et la troisième manière sont la bonne manière de l'écrire. Si vous avez besoin d'une instruction where que vous aimez dans le numéro 3, sinon le numéro 1 serait suffisant.

Cédric F.
la source
3

Dans MS SQL 1 et 3 sont identiques, cependant, l'option 2 ne fonctionnera pas, l'option 2 est une instruction invalide comme dans MS SQL, WHERE est utilisé pour comparer certaines valeurs. Par exemple:

  1. Sélectionnez * dans 'myTable où ID = 3 (valide)
  2. Select * from 'myTable where 1 = 1 is same as Select * from' myTable where 2 = 2 is same as Select * from 'myTable where 3 = 3 you get the idea (valid) is same as Select * From' myTable '
Krishneil
la source
2
  1. SELECT * FROM nom_table : il vous donnera tous les enregistrements de la table en exécutant n'importe quelle instruction where.
  2. SELECT * FROM nom_table WHERE 1 : cette condition est toujours vraie, elle est principalement utilisée par les hackers pour entrer dans n'importe quel système. Si vous avez entendu parler des injections SQL, 2 et 3 sont des scénarios qui sont forcés de construire par un pirate informatique pour obtenir tous les enregistrements de la table.
  3. SELECT * FROM nom_table où 1 = 1 : Cela vous donnera tous les enregistrements de la table, mais il comparera l'instruction where puis avancera, il est essentiellement ajouté pour ajouter ou supprimer plus d'instructions après cela.
Ghayyour Ahmed Butt
la source
1

Résultat - Donne tous les enregistrements de la table spécifiée au lieu du nom de la table pour les trois requêtes

SELECT * FROM tablename WHERE 1- Vérifiez cette réponse

SELECT * FROM tablename WHERE 1=1- Vérifiez cette réponse

Pour plus d'informations sur les optimisations de clause WHERE, vérifiez les éléments suivants: MYSQL , SQLite , SQL

Keshan Nageswaran
la source