web-dev-qa-db-fra.com

SELECT * FROM nom_table Où 1

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

127
Stephen Alexander

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é, cela ne fonctionnera pas dans d'autres dialectes.

Les gens ajoutent where 1 ou where 1 = 1 so where les conditions peuvent être facilement ajoutées ou supprimées d'une requête en ajoutant/commentant certains composants "and ...".

c'est à dire.

SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'
176
brent

Comme vous le savez, les trois résultats sont identiques. (Dans un contexte booléen, MySQL considère que le nombre entier "1" est vrai - en fait, tout nombre autre que "0" est traité comme vrai).

L’optimiseur MySQL est explicitement documenté pour supprimer les conditions constantes dans la clause WHERE:

  • Enlèvement de condition constante. . .:

    (B> = ​​5 ET B = 5) OR (B = 6 ET 5 = 5) OR (B = 7 ET 5 = 6) -> B = 5 OR B = 6

Par conséquent, tous 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. Donc, je vous conseillerais d'éviter cela (je ne suis pas sûr que cela fonctionne ou non dans le mode SQL strict de MySQL).

Le troisième est souvent utilisé lors de la construction de clauses dynamiques WHERE. Il est facile d’ajouter des conditions supplémentaires en tant que AND <condition> _ sans se soucier de rester ANDs.

73
Gordon Linoff

Si vous posez des questions 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 auront 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, donc - pas de filtre - tous les enregistrements seront retournés.

3 - SELECT * FROM table_name where 1=1

Comme le dernier, 1 = 1 est une expression TRUE, donc - pas de filtre - tous les enregistrements seront sélectionnés.

15
sagi

Tous sont les mêmes mais 2 et 3 sont utilisés pour manipuler facilement AND/OR conditions telles que:

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

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

En 2 et 3, la condition where est statique et n'est pas 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.

7
delx

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

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

nous utilisons les formats 2 et 3 pour créer une requête dynamique, nous savons donc déjà que le mot clé "où" est ajouté et que nous continuons d'ajouter de nouveaux filtres. Comme

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

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

Vous n'avez pas à vérifier la requête SQL pour le mot-clé where où il est placé dans la requête initiale ou initiale

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

Sinon, nous pouvons écrire sqlquery = "SELECT * FROM tablename"

ensuite

s'il n'y a pas de clause 'où' dans sqlquery alors

sqlquery  = sqlquery + "where columna =a"

else

sqlquery  = sqlquery + "and columna =a"
6
Jin Thakur

Ils donnent tous la même réponse. Cependant, la façon dont les lettres 2 et 3 sont écrites est principalement pour pouvoir contrôler l'instruction "Where" afin de faciliter son ajout ou sa suppression ultérieurement.

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 déclaration où vous aimez le numéro 3, le numéro 1 suffirait.

3
Cedric F.
  1. SELECT * FROM nom_table: cela vous donnera tous les enregistrements de la table avec l'exécution d'une 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 d’injections SQL, les scénarios 2 et 3 sont forcés par un hacker pour obtenir tous les enregistrements de la table.
  3. SELECT * FROM nom_table où 1 = 1: Ceci vous donnera tous les enregistrements de la table, mais comparera l'instruction where et avancera, il est fondamentalement ajouté pour ajouter ou supprimer plus d'instructions par la suite.
2
Ghayyour Ahmed Butt

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

  1. Sélectionnez * de 'myTable où ID = 3 (valide)
  2. Select * from 'myTable où 1 = 1 est identique à Select * from' myTable où 2 = 2 est identique à Select * from 'myTable où 3 = 3 vous obtenez l'idée (valide) est identique à Select * From "myTable"
2
Krishneil

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

SELECT * FROM tablename WHERE 1 - Cochez cette réponse

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

Pour plus d’informations sur les optimisations de clause WHERE, vérifiez celles-ci: MYSQL , SQLite , SQL

1
Keshan Nageswaran