201 votes

Que signifie "select 1 from table" ?

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

Select 1  
From table

Qu'est-ce que cela 1 c'est-à-dire, comment sera-t-il exécuté et, qu'est-ce qu'il rapportera ?

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

0 votes

Montrez-nous la requête complète s'il vous plaît

174voto

Sahil Muthoo Points 6193

select 1 from table retournera la constante 1 pour chaque ligne du tableau. C'est utile lorsque vous voulez déterminer de façon peu coûteuse si un enregistrement correspond à votre where et/ou join .

5 votes

Cette réponse est la plus logique pour moi

4 votes

Point très important en fait : "pour CHAQUE rangée dans le tableau". Ainsi, la vérification de la "disponibilité de la table" dans le cadre, par exemple, d'un bilan de santé d'une table comportant des centaines de millions de lignes, aboutira à un ensemble de résultats de cent millions de "1". (note : non pas que cela se produise JAMAIS... en production ;);) )

3 votes

Littéralement, cela devrait être la réponse acceptée ici !

141voto

cwallenpoole Points 34940

SELECT 1 FROM TABLE_NAME signifie "Retourner 1 de la table". Il est assez banal en soi, donc normalement, il sera utilisé avec WHERE et souvent EXISTS (comme le note @gbn, ce n'est pas nécessairement une bonne pratique, c'est cependant suffisamment courant pour être noté, même si ce n'est pas vraiment significatif (ceci dit, je vais l'utiliser parce que d'autres l'utilisent et que c'est "plus évident" immédiatement. Bien sûr, cela pourrait être une question visqueuse de poule et d'œuf, mais je ne m'y attarde généralement pas)).

 SELECT * FROM TABLE1 T1 WHERE EXISTS (
     SELECT 1 FROM TABLE2 T2 WHERE T1.ID= T2.ID
 );

En gros, la méthode ci-dessus renverra tout ce qui se trouve dans la table 1 et qui a un identifiant correspondant dans la table 2. (Il s'agit évidemment d'un exemple artificiel, mais je pense qu'il transmet l'idée. Personnellement, je ferais probablement ce qui précède comme suit SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2); car je considère cela comme FAR plus explicite pour le lecteur, à moins qu'il n'y ait une raison circonstancielle impérieuse de ne pas le faire).

EDITAR

Il y a en fait un cas que j'avais 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, parfois SELECT 1 FROM TABLE_NAME sera utilisé. Cette méthode n'offre pas d'avantage significatif par rapport à la sélection d'une colonne individuelle, mais, selon la mise en œuvre, elle peut offrir des gains substantiels par rapport à la sélection d'une colonne individuelle. SELECT * En effet, il arrive souvent que plus le nombre de colonnes que la BD renvoie à un langage est élevé, plus la structure de données est grande, ce qui signifie qu'il faut plus de temps.

0 votes

Et pourquoi "normalement" avec EXISTS ? Avez-vous des preuves de por qué ?

6 votes

Et un -1 pour propager le mythe de ...EXISTS (SELECT 1...

2 votes

@Gbn Aucune idée de la raison pour laquelle je l'ai vu là bien plus souvent qu'autre chose. C'est juste que je l'y ai vu beaucoup plus souvent.

49voto

gbn Points 197263

Si vous voulez dire quelque chose comme

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

alors c'est un mythe que le 1 est meilleur que

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

El 1 o * dans l'EXISTS est ignorée et vous pouvez l'écrire comme suit Page 191 de la norme ANSI SQL 1992 :

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

1 votes

Je viens de vérifier que postgres respecte cela, exists (select 1/0 fonctionne comme un charme

28voto

Neville K Points 13666

Il fait ce qu'il dit - il renvoie toujours le nombre entier 1. Elle est utilisée pour vérifier si un enregistrement correspondant à votre clause where existe.

24 votes

Uhm - la question était "qu'est-ce que cela signifie", pas "est-ce une bonne pratique". Je suis d'accord que cela ne fait pas de différence du point de vue des performances - mais c'est une convention que les développeurs utilisent, probablement parce que 1 est communément interprété comme "vrai".

24voto

Tom Points 13036

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 vivante, souvent utilisé lors de la récupération ou du retour d'une connexion vers / depuis un pool de connexion.

2 votes

C'était mon cas, c'est assez courant parmi les applications JBOSS et TOMCAT.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X