J'ai vu de nombreuses requêtes avec quelque chose comme suit.
Select 1
From table
Que signifie ce 1
, comment sera-t-il exécuté et que retournera-t-il?
Aussi, dans quel type de scénarios, cela peut-il être utilisé?
SELECT 1 FROM TABLE_NAME
signifie "Retour 1 de la table". Il est assez simple en soi, donc normalement, il sera utilisé avec WHERE
et souvent EXISTS
(comme @gbn note, ce n'est pas nécessairement la meilleure pratique, mais il est assez commun pour être noté , même si cela n’a pas vraiment de sens (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 visqueux opposant poulet et œuf, mais en général je ne le fais pas. habiter)).
SELECT * FROM TABLE1 T1 WHERE EXISTS (
SELECT 1 FROM TABLE2 T2 WHERE T1.ID= T2.ID
);
Fondamentalement, ce qui précède renverra tout ce qui est du tableau 1 et qui possède un identifiant correspondant de celui-ci. (Ceci est un exemple artificiel, évidemment, mais je crois que cela traduit l'idée. Personnellement, je ferais probablement ce qui précède comme SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);
car j'estime que FAR est plus explicite pour le lecteur, sauf s'il existe une raison impérieuse de ne pas le faire).
En fait, il y a un cas que j'ai oublié jusqu'à présent. Dans le cas où vous essayez de déterminer l'existence d'une valeur dans la base de données à partir d'une langue externe, il est parfois utilisé SELECT 1 FROM TABLE_NAME
. Cela n'offre pas d'avantage significatif sur la sélection d'une colonne individuelle, mais, en fonction de l'implémentation, il peut s'avérer très bénéfique de réaliser un SELECT *
, tout simplement parce que plus le nombre de colonnes renvoyées par la base de données dans un langage est souvent élevé. plus la structure des données est grande, ce qui signifie qu’il faudra plus de temps.
select 1 from table
renverra la constante 1 pour chaque ligne de la table. C'est utile lorsque vous souhaitez déterminer à moindre coût si l'enregistrement correspond à votre clause where
et/ou join
.
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...)
Le 1
ou *
dans EXISTS est ignoré et vous pouvez l'écrire comme indiqué dans la page de la norme ANSI SQL 1992 :
SELECT * FROM AnotherTable
WHERE EXISTS (SELECT 1/0 FROM table WHERE...)
il fait ce qu'il dit - il retournera toujours le nombre entier 1. Il sert à vérifier si un enregistrement correspondant à votre clause where existe.
select 1 from table
est utilisé par certaines bases de données en tant que requête pour tester une connexion afin de déterminer si elle est active. Elle est souvent utilisée lors de l'extraction ou du renvoi d'une connexion vers/depuis un pool de connexions.
Bien que cela soit peu connu, une requête peut avoir une clause HAVING
sans une clause GROUP BY
.
Dans de telles circonstances, la clause HAVING
est appliquée à l'ensemble. Clairement, la clause SELECT
ne peut faire référence à aucune colonne, sinon vous obtiendrez l'erreur, "La colonne n'est pas valide dans select car elle n'est pas contenue dans GROUP BY" etc.
Par conséquent, une valeur littérale must doit être utilisée (car SQL ne permet pas un ensemble de résultats avec zéro colonne - pourquoi?!) Et la valeur littérale 1 (INTEGER
) est couramment utilisée: si la clause HAVING
évalue TRUE
, la valeur resultset sera une ligne avec une colonne indiquant la valeur 1, sinon vous obtenez l'ensemble vide.
Exemple: rechercher si une colonne a plus d'une valeur distincte:
SELECT 1
FROM tableA
HAVING MIN(colA) < MAX(colA);
Si vous ne savez pas s'il existe ou non des données de votre table, vous pouvez utiliser la requête suivante:
SELECT cons_value FROM table_name;
À titre d'exemple:
SELECT 1 FROM employee;
Nous utilisons donc cette requête SQL pour savoir s’il existe des données dans la table et le nombre de lignes indique le nombre de lignes existantes dans cette table.
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 (car elle n'a pas à faire de recherche).
Cela signifie que vous voulez une valeur " 1 " en sortie ou utilisée la plupart du temps en tant que requêtes internes, car vous souhaitez calculer les requêtes externes en fonction du résultat des requêtes utilisez 1 mais vous avez des valeurs spécifiques ...
Ce sera statiquement vous donne la sortie en tant que valeur 1.
Si vous souhaitez simplement vérifier la valeur true ou false en fonction de la clause WHERE, sélectionnez 1 dans la table où la condition est le moyen le moins coûteux.
Je vois qu'il est toujours utilisé dans l'injection SQL, tel que:
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ù la base de données existe et deviner le nom de colonne de la base de données que vous avez spécifiée. Et les valeurs des tables.
Ceci est juste utilisé pour plus de commodité avec IF EXISTS (). Sinon, vous pouvez aller avec
select * from [table_name]
Image Dans le cas de 'IF EXISTS', il suffit de savoir que toute ligne avec la condition spécifiée existe ou non, peu importe le contenu de la ligne.
select 1 from Users
ci-dessus, exemple de code, renvoie non. de lignes est égal à non. d'utilisateurs avec 1 dans une seule colonne
cela signifie simplement que vous récupérez le numéro de la première colonne de la table , signifieselect Emply_num, Empl_no Des employés; Ici, vous utilisez la sélection 1 des employés; cela signifie que vous récupérez la colonne Emply_num . Merci
La raison en est une autre, du moins pour MySQL. Ceci est extrait du Manuel MySQL
InnoDB calcule les valeurs de cardinalité d'index pour une table lors du premier accès à cette table après le démarrage, au lieu de les stocker 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 en vue d'une utilisation ultérieure, accédez-y immédiatement après le démarrage en émettant une instruction telle que SELECT 1 FROM nom_de_table LIMIT 1