J'ai été 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 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'
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 AND
s.
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.
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')
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.
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"
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.
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:
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