SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [DISTINCT | DISTINCTROW | ALL]
select_expression,...
[INTO OUTFILE 'Nom_fichier' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY Nom_col,...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | Nom_col | formula} [ASC | DESC] ,...]
[LIMIT [offset,] rows]
[PROCEDURE procedure_name] ]
SELECT
est utilisé pour obtenir des lignes à partir d'une ou plusieurs tables. select_expression
indique les colonnes à lire. SELECT
peut aussi être utilisé pour exécuter des calculs sans rapport avec aucune table. Par exemple :
mysql> SELECT 1 + 1;
-> 2
Toutes les options doivent impérativement être dans l'ordre indiqué ci dessus. Par exemple, une clause HAVING
doit être après GROUP BY
et avant la clause ORDER BY
.
- Une clause
SELECT
peut utiliser des alias, introduit par le mot clé AS
. L'alias est utilisé comme un nom de colonne, et peut être repris dans une clause ORDER BY
ou HAVING
. Par exemple:
mysql> select concat(last_name,', ',first_name) AS full_name
from maTable ORDER BY full_name;
- La clause
FROM table_references
indique les noms des tables qu'il faut interroger. Si il y a plusieurs tables, il vaut mieux utiliser la clause join
. JOIN
.
- Il est possible d'appeler une colonne sous les formes
Nom_col
, Nom_table.Nom_col
or Nom_bdd.Nom_table.Nom_col.
Il n'y a pas besoin de préciser les préfixes Nom_table
ou Nom_bdd.Nom_table
lors d'un SELECT
à moins que les noms soient ambiguës. 7.1.5 Noms de base de données, table, index, column et alias, pour des exemples sur les ambiguïtés qui peuvent apparaître.
- Une référence sur une table peut être aliasée avec
Nom_table [AS] Nom_alias
.
mysql> select t1.name, t2.salary from employee AS t1, info AS t2
where t1.name = t2.name;
mysql> select t1.name, t2.salary from employee t1, info t2
where t1.name = t2.name;
- Les colonnes demandées en sortie peuvent être utilisées dans les clauses
ORDER BY
et GROUP BY
en utilisant leur nom, leurs alias ou leur positions. Les colonnes sont positionnées à partir de 1.
mysql> select college, region, seed from tournament
ORDER BY region, seed;
mysql> select college, region AS r, seed AS s from tournament
ORDER BY r, s;
mysql> select college, region, seed from tournament
ORDER BY 2, 3;
Pour trier dans l'ordre descendant, il faut ajouter le mot clé DESC
après le nom de la colonne, dans la clause ORDER BY
. Par défaut, l'ordre ascendant est utilisé, et peut être explicitement demandé en utilisant le mot clé ASC
- La clause
HAVING
peut faire référence à n'importe quelle colonne ou alias présent dans select_expression
. Cette clause est évaluée en dernier, juste avant que les lignes soient envoyées au client, sans aucune optimisation. Il ne faut pas utiliser HAVING
là WHERE
où est plus efficace. Par exemple, il ne faut pas écrire :
mysql> select Nom_col from Nom_table HAVING Nom_col > 0;
A la place, il vaut mieux écrire :
mysql> select Nom_col from Nom_table WHERE Nom_col > 0;
A partir de MySQL 3.22.5, on peut écrire des requêtes telles que:
mysql> select user,max(salary) from users
group by user HAVING max(salary)>10;
Dans les versions anciennes de MySQL , il était possible d'écrire :
mysql> select user,max(salary) AS sum from users
group by user HAVING sum>10;
- L'option
STRAIGHT_JOIN
force l'optimiseur à regrouper les tables dans l'ordre dans lequel elles sont spécifiées dans la FROM
. Cela permet d'accélérer le traitement d'une requête. EXPLAIN
.
- L'option
SQL_SMALL_RESULT
peut être utilisé avec les clauses GROUP BY
ou DISTINCT
pour indiquer à l'optimiseur que le résultat sera de petite taille. Dans ce cas, MySQL va utiliser des tables temporaires d'accès rapide, pour enregistrer les tables de résultat, plutot que de faire des tries. SQL_SMALL_RESULT
est une extension MySQL de ANSI SQL92.
- L'option
LIMIT
peut être utilisée pour restreindre le nombre de lign retournée SELECT
. LIMIT
a un ou deux arguments numériques.. Le premier indique l'index de la ligne de début, et le deuxième indique le nombre de ligne à retourner. L'indexe de la ligne initiale est 0.
mysql> select * from table LIMIT 5,10; # retourne les lignes 6-15
Si un seul argument est fourni à LIMIT, il indique le nombre de ligne à retourner.
mysql> select * from table LIMIT 5; # retourne les 5 premiere lignes
LIMIT n
et LIMIT 0,n
sont équivalents.
- La forme
SELECT ... INTO OUTFILE 'Nom_fichier'
de la syntaxe de SELECT
écrit les lignes selectionnées dans un fichier. Les fichiers créés sont écrit sur le serveur, et ne doit pas exister au moment de l'écriture (cela évite d'écraser le fichier /etc/passwd, par exemple). Il faut avoir les droits d'écriture. SELECT ... INTO OUTFILE
est le contraire de la commande LOAD DATA INFILE
; qui importe les lignes à partir d'un fichier. L'expression export_options
est constituée des même champs FIELDS
et LINES
que dans la commande LOAD DATA INFILE
. section LOAD DATA
. Dans le fichier texte résultant de la commande SELECT ... INTO OUTFILE
, seuls, les caractères suivants sont précédé du caractère d'échappement, précisé avec ESCAPED BY
:
- Le caractère
ESCAPED BY
- Le premier caractère dans la clause
FIELDS TERMINATED BY
- Le premier caractère dans la clause
LINES TERMINATED BY
De plus, le caractère ASCII 0
est converti en ESCAPED BY
suivi de 0 (ASCII 48
). La raison de l'ajout du caractère d'échappement après les caractères FIELDS TERMINATED BY
, ESCAPED BY
ou LINES TERMINATED BY
,est que cela permet la relecture du fichier. Le caractère ASCII 0
est échappé pour le rendre plus lisible par les éditeurs. Et comme le fichier résultant n'a pas à se conformer à la norme SQL, ce sont les seuls caractères à être échappés.