Select (SQL)
SELECTâ
est une commande SQL qui permet d'extraire des données des tables d'une base de données relationnelle.
Une commande SELECTâ
peut obtenir zĂ©ro ou plusieurs tuples provenant de tables et de vues. En raison de la nature dĂ©clarative du langage SQL, une commande SELECTâ
dĂ©crit un jeu de rĂ©sultats voulus, et non la maniĂšre de les obtenir. La base de donnĂ©es transforme donc la requĂȘte en un plan dâexĂ©cution de requĂȘte, qui peut varier dans le temps, en fonction de la version du serveur, ou du serveur utilisĂ©.
Forme basique
La commande SELECTâ
a, classiquement, la syntaxe suivante :
SELECT expr [, expr ...]
FROM tables
WHERE conditions
GROUP BY expr
HAVING conditions
ORDER BY expr
LIMIT
Chaque implémentation de base de données relationnelle ajoute des fonctionnalités et variations spécifiques, cette syntaxe est donc particuliÚrement incomplÚte. Il est nécessaire de se référer à la documentation de l'implémentation utilisée afin d'obtenir une syntaxe détaillée.
Exemples de requĂȘte utilisant la table my_tableâ
contenant :
col1 | col2 | col3 |
---|---|---|
foo | bar | 42 |
foo | baz | 84 |
RequĂȘte | RĂ©sultat | Explication | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
SELECT * FROM my_table
|
|
Le joker '*' reprĂ©sente toutes les colonnes. La requĂȘte n'ayant pas de condition, toutes les lignes sont rĂ©cupĂ©rĂ©es. | |||||||||
SELECT col2 FROM my_table
|
|
Tous les tuples de la colonne col2â sont rĂ©cupĂ©rĂ©s. | |||||||||
SELECT col1, col2 FROM my_table WHERE col3 > 50
|
|
Cette requĂȘte utilise une condition, WHERE col3 > 50â , seul le tuple (foo, baz, 84) est donc rĂ©cupĂ©rĂ©s. Aussi, elle ne sĂ©lectionne que col1 et col2, ainsi col3 n'est pas affichĂ© dans le rĂ©sultat. | |||||||||
SELECT SUM(col3) * 3 FROM my_table
|
|
Il est possible d'appliquer des opérations et des fonctions sur les colonnes sélectionnées. |
SELECT
La premiĂšre partie de la syntaxe d'une requĂȘte SELECTâ
permet de dĂ©finir quelles colonnes doivent ĂȘtre extraites des tables, et Ă©ventuellement comment les valeurs de ces colonnes doivent ĂȘtre agrĂ©gĂ©es. Il est possible d'appliquer des opĂ©rateurs mathĂ©matiques Ă cette sĂ©lection, ou encore des fonctions proposĂ©es par le moteur de base de donnĂ©es tel que, par exemple, SUM, ou AVG. Enfin, lors d'un select, il est possible d'utiliser le joker '*' permettant de sĂ©lectionner toutes les colonnes d'une table. Lors d'une requĂȘte effectuĂ©e sur plusieurs table, il est possible de prĂ©ciser sur quelles tables le joker s'applique, en prĂ©fixant le joker d'un nom de la table, par exemple : SELECT T1.*, T2.fooâ
.
RequĂȘte | RĂ©sultat | Explication | ||||||
---|---|---|---|---|---|---|---|---|
SELECT 1
|
|
Cette requĂȘte n'utilise aucune table, mais directement une valeur, le rĂ©sultat est donc composĂ© d'un tableau d'une seule colonne nommĂ©e '1' : c'est la premiĂšre ligne, et ayant une seule valeur, 1 : la seconde ligne. | ||||||
SELECT 1 AS "Colonne1"
|
|
Cette fois la colonne a reçu un alias, "Colonne1", le tableau de résultat est donc plus explicite. | ||||||
SELECT 1 * 2, 3 + 4, CONCAT("Hello ", "World")
|
|
Il est possible d'appliquer des opĂ©rations et des fonctions lors d'une requĂȘte SELECTâ . |
FROM
Le mot-clĂ© FROMâ
permet de dĂ©finir quelles tables, vues, ou sous requĂȘtes serviront de sources de donnĂ©es. C'est aussi dans la clause FROMâ
qu'il est possible de définir des jointures entre tables.
Exemples :
SELECT * FROM table1, table2
Cette requĂȘte renvoie toutes les combinaisons possibles des tuples des tables table1 et table2, c'est-Ă -dire que si table1 contient 1000 tuples et que table2 en contient 2000, le rĂ©sultat sera de 2 000 000 tuples. Il est donc plus commun de joindre les tables grĂące au mot-clĂ© JOIN, permettant d'appliquer des conditions Ă la jointure entre les deux tables.
SELECT table1.a, table2.b FROM table1 JOIN table2 ON table1.a = table2.a
Avec cette requĂȘte, seuls les tuples respectant la condition table1.a = table2.a seront sĂ©lectionnĂ©s.
WHERE
Le mot-clĂ© WHEREâ
permet de dĂ©finir les conditions de sĂ©lection des tuples. DiffĂ©rentes conditions peuvent ĂȘtre exprimĂ©es, et une Ă©quation peut ainsi ĂȘtre crĂ©Ă©e en reliant les diffĂ©rentes conditions par les mots clefs AND ou OR. Des parenthĂšses sont utilisables afin de dĂ©terminer l'ordre d'application des diffĂ©rentes conditions.
Exemple :
SELECT field1 FROM table1 WHERE table1.field2 > 42 AND table1.field3 = "Gonzo"
GROUP BY
Le mot-clĂ© GROUP BYâ
permet de dĂ©finir, via des noms de colonnes ou des expressions, comment les rĂ©sultats doivent ĂȘtre groupĂ©s. La prĂ©sence d'un GROUP BY dans une requĂȘte implique gĂ©nĂ©ralement la prĂ©sence de fonctions dâagrĂ©gation, tel que SUM(expr)â
, AGV(expr)â
ou COUNT(expr)â
dans le SELECTâ
.
Exemple en utilisant la table my_table contenant :
col1 | col2 | col3 |
---|---|---|
foo | bar | 1 |
foo | baz | 2 |
bar | bar | 4 |
bar | baz | 8 |
RequĂȘte | RĂ©sultat | Explication | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
SELECT col2, COUNT(1), AVG(col3) FROM my_table GROUP BY col2
|
|
Ici deux groupes ont été créés, le groupe pour la valeur bar et le groupe pour la valeur baz. | |||||||||
SELECT COUNT(1), AVG(col3) FROM my_table GROUP BY col3 < 3;
|
|
Ici une expression a Ă©tĂ© utilisĂ©e pour grouper les tuples, deux groupes sont donc crĂ©Ă©s, l'un pour le cas oĂč l'expression est vraie, l'autre pour le cas oĂč l'expression est fausse. |
HAVING
Le mot-clĂ© HAVINGâ
permet de dĂ©finir des conditions sur les rĂ©sultats, agrĂ©gĂ©s, d'un GROUP BYâ
. Il se diffĂ©rencie donc du WHEREâ
par le fait que le WHEREâ
est utilisĂ© Ă la sĂ©lection des tuples avant le GROUP BYâ
et que le HAVINGâ
est utilisĂ© pour la sĂ©lection des tuples aprĂšs agrĂ©gation par le GROUP BYâ
.
Exemple en utilisant la table my_table contenant :
col1 | col2 | col3 |
---|---|---|
foo | bar | 1 |
foo | baz | 2 |
bar | bar | 4 |
bar | baz | 8 |
bar | foo | 16 |
RequĂȘte | RĂ©sultat | Explication | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
SELECT col2, COUNT(1), AVG(col3) FROM my_table GROUP BY col2 HAVING COUNT(1) > 1
|
|
Ici trois groupes ont Ă©tĂ© crĂ©Ă©s, le groupe pour la valeur barâ et le groupe pour la valeur bazâ , et le groupe pour la valeur fooâ , mais le HAVINGâ n'a sĂ©lectionnĂ© que les deux premiers, car le groupe fooâ ne contient qu'un seul tuple. | |||||||||
SELECT col2, COUNT(1) AS count, SUM(col3) AS sum FROM my_table GROUP BY col2 HAVING sum = 10
|
|
Ici aussi trois groupes ont été créés, mais un seul a été conservé par la clause HAVING. |
ORDER BY
Le mot-clĂ© ORDER BYâ
permet de trier les rĂ©sultats. Le tri est par dĂ©faut croissant, mais peut ĂȘtre dĂ©croissant en utilisant le mot-clĂ© DESC. Il est possible de tirer sur plusieurs champs, en cas d'Ă©galitĂ© sur le premier champ, le second est utilisĂ© et ainsi de suite.
Exemple :
SELECT * FROM my_table ORDER BY field1 ASC, field2 DESC;
Limiter le nombre de résultats
La maniĂšre de limiter le nombre de rĂ©sultats d'une requĂȘte est dĂ©pendante du moteur utilisĂ©, cependant la norme SQL:2008 dĂ©finit la syntaxe suivante :
SELECT * FROM table1 FETCH FIRST 10 ROWS ONLY