Que signifie sélectionner 1 dans le tableau?

146

J'ai vu de nombreuses requêtes avec quelque chose comme suit.

Select 1  
From table

Qu'est-ce 1que cela signifie, comment sera-t-il exécuté et que rapportera-t-il?

De plus, dans quel type de scénarios, cela peut-il être utilisé?

Développeur Microsoft
la source
Montrez-nous la requête complète s'il vous plaît
gbn

Réponses:

107

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 WHERE EXISTS (
     SELECT 1 FROM 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.

cwallenpoole
la source
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.

Sahil Muthoo
la source
1
Cette réponse a eu le plus de sens pour moi
Joseph Astrahan
2
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!
Fahad Javed le
41

Si tu veux dire quelque chose comme

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1 FROM table WHERE...) 

alors c'est un mythe que 1c'est mieux que

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT * FROM table WHERE...) 

Le 1ou *dans EXISTS est ignoré et vous pouvez l'écrire conformément à la page 191 de la norme ANSI SQL 1992 :

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1/0 FROM table WHERE...) 
gbn
la source
1
vient de vérifier que postgres respecte cela, exists (select 1/0fonctionne comme un charme
alex
22

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

Neville Kuyt
la source
22
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.

À M
la source
2
C'était mon cas, c'est assez courant parmi les applications JBOSS et TOMCAT.
Valter Silva
13

Le résultat est 1pour chaque enregistrement de la table. __

TiyebM
la source
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:

SELECT 1
  FROM tableA
HAVING MIN(colA) < MAX(colA);
un jour quand
la source
« 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

SELECT 1 FROM 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).

Robert Martin
la source
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:

SELECT 1 FROM employee;
  1. 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);
  2. 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.

mahbub_siddique
la source
3

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.

DShah
la source
3

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
2

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.

EmilyAvon
la source
0

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

zeeshan rajput
la source
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

Ramona Morea
la source
0

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

arvind singh
la source