SELECT 1 FROM TABLE_NAMEsignifie "Retourne 1 de la table". Il est assez banal en soi, donc normalement il sera utilisé avec WHEREet souvent EXISTS(comme le note @gbn, ce n'est pas nécessairement la meilleure pratique, c'est cependant assez courant pour être noté, même si ce n'est pas vraiment significatif ( cela dit, je vais l'utiliser parce que d'autres l'utilisent et c'est «plus évident» immédiatement. Bien sûr, cela pourrait être un problème de poulet visqueux contre œuf, mais je ne m'attarde généralement pas)).
SELECT*FROM TABLE1 T1 WHEREEXISTS(SELECT1FROM TABLE2 T2 WHERE T1.ID= T2.ID);
Fondamentalement, ce qui précède renverra tout de la table 1 qui a un ID correspondant de la table 2. (Ceci est un exemple artificiel, évidemment, mais je pense qu'il transmet l'idée. Personnellement, je ferais probablement ce qui précède SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);car je le considère comme BEAUCOUP plus explicite pour le lecteur à moins qu'il n'y ait une raison impérieuse de ne pas le faire).
ÉDITER
Il y a en fait un cas que j'ai oublié jusqu'à maintenant. Dans le cas où vous essayez de déterminer l'existence d'une valeur dans la base de données à partir d'une langue extérieure, elle SELECT 1 FROM TABLE_NAMEsera parfois utilisée. Cela n'offre pas un avantage significatif par rapport à la sélection d'une colonne individuelle, mais, en fonction de l'implémentation, cela peut offrir des gains substantiels par rapport à un SELECT *, simplement parce qu'il est souvent le cas que plus la base de données renvoie à une langue, plus les données sont volumineuses. structure, ce qui signifie que plus de temps sera nécessaire.
Et pourquoi "normalement" avec EXISTS? Avez-vous une preuve de pourquoi ?
gbn
6
Et un -1 pour propager le mythe de...EXISTS (SELECT 1...
gbn
2
@Gbn Je ne sais pas pourquoi je l'ai vu là-bas beaucoup plus souvent qu'autre chose. Je viens de le voir beaucoup plus souvent.
cwallenpoole
2
Un poulet visqueux? Je n'aimerais pas manger ça! Peut-être que cela devrait être un «problème vicieux de la poule et des œufs»?
No'am Newman
2
@Ben: IN et EXISTs seront généralement optimisés sur le même plan
gbn
107
select 1 from tablerenverra la constante 1 pour chaque ligne du tableau. C'est utile lorsque vous souhaitez déterminer à moindre coût si record correspond à votre whereclause et / ou join.
Point très important en fait: "pour CHAQUE ligne du tableau". Ainsi, la vérification de la «disponibilité de la table» dans le cadre, par exemple, d'un contrôle de santé d'une table de cent millions de lignes, aboutira à un ensemble de résultats de cent millions «1». (note: pas que cela n'arriverait JAMAIS ... en production;);))
conny
Littéralement, cela devrait être la réponse acceptée ici!
euh - la question était "qu'est-ce que cela signifie?", pas "est cette bonne pratique". Je conviens que cela ne fait aucune différence du point de vue des performances - mais c'est une convention que les développeurs utilisent, probablement parce que 1 est généralement interprété comme "vrai".
Neville Kuyt
20
select 1 from table est utilisé par certaines bases de données comme une requête pour tester une connexion pour voir si elle est active, souvent utilisé lors de la récupération ou du retour d'une connexion vers / depuis un pool de connexions.
Pas vraiment, j'ai essayé de créer une table vide et d'exécuter la requête, le résultat est six 1.
r0ng
9
Bien que ce ne soit pas largement connu, une requête peut avoir une HAVINGclause sans GROUP BYclause.
Dans de telles circonstances, la HAVINGclause est appliquée à l'ensemble entier. De toute évidence, la SELECTclause ne peut faire référence à aucune colonne, sinon vous obtiendrez (corriger) l'erreur "La colonne n'est pas valide dans select car elle n'est pas contenue dans le GROUP BY" etc.
Par conséquent, une valeur littérale doit être utilisée (car SQL n'autorise pas un jeu de résultats avec zéro colonne - pourquoi?!) Et la valeur littérale 1 ( INTEGER) est couramment utilisée: si la HAVINGclause est évaluée, TRUEle jeu de résultats sera une ligne avec un colonne affichant la valeur 1, sinon vous obtenez l'ensemble vide.
Exemple: pour savoir si une colonne a plus d'une valeur distincte:
« De toute évidence, la clause SELECT ne peut pas se référer à une colonne » - Ce ne serait pas plus raisonnable de choisir une expression bool: SELECT MIN(colA) < MAX(colA) FROM tableA?
Paul Spiegel
7
Pour être un peu plus précis, vous utiliseriez ceci pour faire
SELECT1FROM MyUserTable WHERE user_id =33487
au lieu de faire
SELECT*FROM MyUserTable WHERE user_id =33487
parce que vous ne vous souciez pas de regarder les résultats. Demander le numéro 1 est très facile pour la base de données (puisqu'elle n'a pas à faire de recherche).
Selon les commentaires ci-dessus, il semble que Select 1 n'est pas meilleur en termes de performances que select *, n'est-ce pas?
eRaisedToX
5
Si vous ne savez pas qu'il existe des données dans votre table ou non, vous pouvez utiliser la requête suivante:
SELECT cons_value FROM table_name;
À titre d'exemple:
SELECT1FROM employee;
Il renverra une colonne qui contient le nombre total de lignes et toutes les lignes ont la même valeur constante 1 (pour cette fois, il renvoie 1 pour toutes les lignes);
S'il n'y a pas de ligne dans votre tableau, il ne retournera rien.
Nous utilisons donc cette requête SQL pour savoir s'il y a des données dans la table et le nombre de lignes indique combien de lignes existent dans cette table.
Cela signifie que vous voulez une valeur " 1 " en sortie ou la plupart du temps utilisée comme requêtes internes car, pour une raison quelconque, vous souhaitez calculer les requêtes externes en fonction du résultat des requêtes internes .. pas tout le temps que vous utilisez 1 mais vous ont des valeurs spécifiques ...
Cela vous donnera statiquement la sortie comme valeur 1.
Si vous souhaitez simplement vérifier un vrai ou un faux en fonction de la clause WHERE, sélectionnez 1 dans la table où la condition est le moyen le moins cher.
Je vois qu'il est toujours utilisé dans l'injection SQL, comme:
www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;
Ces nombres peuvent être utilisés pour deviner où se trouve la base de données et deviner le nom de colonne de la base de données que vous avez spécifiée, ainsi que les valeurs des tables.
cela signifie simplement que vous récupérez le numéro de la première colonne de la table ,,,, signifie sélectionner Emply_num, Empl_no From Employees; ici, vous utilisez sélectionnez 1 parmi les employés; cela signifie que vous récupérez la colonne Emply_num. Merci
Je me souviens d'une telle syntaxe, mais elle est spécifique à une base de données dont je ne me souviens pas. Postgresql?
diynevala
0
La raison en est une autre, du moins pour MySQL. Ceci est tiré du manuel MySQL
InnoDB calcule les valeurs de cardinalité d'index pour une table la première fois que cette table est accédée après le démarrage, au lieu de stocker ces valeurs dans la table. Cette étape peut prendre beaucoup de temps sur les systèmes qui partitionnent les données en plusieurs tables. Étant donné que cette surcharge s'applique uniquement à l'opération d'ouverture de table initiale, pour «réchauffer» une table pour une utilisation ultérieure, accédez-y immédiatement après le démarrage en émettant une instruction telle que SELECT 1 FROM tbl_name LIMIT 1
Ceci est juste utilisé par commodité avec IF EXISTS (). Sinon, vous pouvez aller avec
select * from [table_name]
Image Dans le cas de 'IF EXISTS', nous avons juste besoin de savoir que toute ligne avec une condition spécifiée existe ou non, peu importe le contenu de la ligne.
select 1 from Users
ci-dessus de code d'exemple, renvoie non. de lignes équivaut à non. d'utilisateurs avec 1 dans une seule colonne
Réponses:
SELECT 1 FROM TABLE_NAME
signifie "Retourne 1 de la table". Il est assez banal en soi, donc normalement il sera utilisé avecWHERE
et souventEXISTS
(comme le note @gbn, ce n'est pas nécessairement la meilleure pratique, c'est cependant assez courant pour être noté, même si ce n'est pas vraiment significatif ( cela dit, je vais l'utiliser parce que d'autres l'utilisent et c'est «plus évident» immédiatement. Bien sûr, cela pourrait être un problème de poulet visqueux contre œuf, mais je ne m'attarde généralement pas)).Fondamentalement, ce qui précède renverra tout de la table 1 qui a un ID correspondant de la table 2. (Ceci est un exemple artificiel, évidemment, mais je pense qu'il transmet l'idée. Personnellement, je ferais probablement ce qui précède
SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);
car je le considère comme BEAUCOUP plus explicite pour le lecteur à moins qu'il n'y ait une raison impérieuse de ne pas le faire).ÉDITER
Il y a en fait un cas que j'ai oublié jusqu'à maintenant. Dans le cas où vous essayez de déterminer l'existence d'une valeur dans la base de données à partir d'une langue extérieure, elle
SELECT 1 FROM TABLE_NAME
sera parfois utilisée. Cela n'offre pas un avantage significatif par rapport à la sélection d'une colonne individuelle, mais, en fonction de l'implémentation, cela peut offrir des gains substantiels par rapport à unSELECT *
, simplement parce qu'il est souvent le cas que plus la base de données renvoie à une langue, plus les données sont volumineuses. structure, ce qui signifie que plus de temps sera nécessaire.la source
...EXISTS (SELECT 1...
select 1 from table
renverra la constante 1 pour chaque ligne du tableau. C'est utile lorsque vous souhaitez déterminer à moindre coût si record correspond à votrewhere
clause et / oujoin
.la source
Si tu veux dire quelque chose comme
alors c'est un mythe que
1
c'est mieux queLe
1
ou*
dans EXISTS est ignoré et vous pouvez l'écrire conformément à la page 191 de la norme ANSI SQL 1992 :la source
exists (select 1/0
fonctionne comme un charmeil fait ce qu'il dit - il retournera toujours l'entier 1. Il est utilisé pour vérifier si un enregistrement correspondant à votre clause where existe.
la source
select 1 from table
est utilisé par certaines bases de données comme une requête pour tester une connexion pour voir si elle est active, souvent utilisé lors de la récupération ou du retour d'une connexion vers / depuis un pool de connexions.la source
Le résultat est
1
pour chaque enregistrement de la table.la source
Bien que ce ne soit pas largement connu, une requête peut avoir une
HAVING
clause sansGROUP BY
clause.Dans de telles circonstances, la
HAVING
clause est appliquée à l'ensemble entier. De toute évidence, laSELECT
clause ne peut faire référence à aucune colonne, sinon vous obtiendrez (corriger) l'erreur "La colonne n'est pas valide dans select car elle n'est pas contenue dans le GROUP BY" etc.Par conséquent, une valeur littérale doit être utilisée (car SQL n'autorise pas un jeu de résultats avec zéro colonne - pourquoi?!) Et la valeur littérale 1 (
INTEGER
) est couramment utilisée: si laHAVING
clause est évaluée,TRUE
le jeu de résultats sera une ligne avec un colonne affichant la valeur 1, sinon vous obtenez l'ensemble vide.Exemple: pour savoir si une colonne a plus d'une valeur distincte:
la source
SELECT MIN(colA) < MAX(colA) FROM tableA
?Pour être un peu plus précis, vous utiliseriez ceci pour faire
au lieu de faire
parce que vous ne vous souciez pas de regarder les résultats. Demander le numéro 1 est très facile pour la base de données (puisqu'elle n'a pas à faire de recherche).
la source
Si vous ne savez pas qu'il existe des données dans votre table ou non, vous pouvez utiliser la requête suivante:
À titre d'exemple:
Nous utilisons donc cette requête SQL pour savoir s'il y a des données dans la table et le nombre de lignes indique combien de lignes existent dans cette table.
la source
Cela signifie que vous voulez une valeur " 1 " en sortie ou la plupart du temps utilisée comme requêtes internes car, pour une raison quelconque, vous souhaitez calculer les requêtes externes en fonction du résultat des requêtes internes .. pas tout le temps que vous utilisez 1 mais vous ont des valeurs spécifiques ...
Cela vous donnera statiquement la sortie comme valeur 1.
la source
Si vous souhaitez simplement vérifier un vrai ou un faux en fonction de la clause WHERE, sélectionnez 1 dans la table où la condition est le moyen le moins cher.
la source
Je vois qu'il est toujours utilisé dans l'injection SQL, comme:
www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;
Ces nombres peuvent être utilisés pour deviner où se trouve la base de données et deviner le nom de colonne de la base de données que vous avez spécifiée, ainsi que les valeurs des tables.
la source
cela signifie simplement que vous récupérez le numéro de la première colonne de la table ,,,, signifie sélectionner Emply_num, Empl_no From Employees; ici, vous utilisez sélectionnez 1 parmi les employés; cela signifie que vous récupérez la colonne Emply_num. Merci
la source
La raison en est une autre, du moins pour MySQL. Ceci est tiré du manuel MySQL
la source
Ceci est juste utilisé par commodité avec IF EXISTS (). Sinon, vous pouvez aller avec
select * from [table_name]
Image Dans le cas de 'IF EXISTS', nous avons juste besoin de savoir que toute ligne avec une condition spécifiée existe ou non, peu importe le contenu de la ligne.
select 1 from Users
ci-dessus de code d'exemple, renvoie non. de lignes équivaut à non. d'utilisateurs avec 1 dans une seule colonne
la source