SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] [HIGH_PRIORITY] [DISTINCT | DISTINCTROW | ALL] select_expression,... [INTO {OUTFILE | DUMPFILE} 'nom_fichier' export_options] [FROM table_references [WHERE where_definition] [GROUP BY {unsigned_integer | nom_de_colonne | formula} [ASC | DESC], ... [HAVING where_definition] [ORDER BY {unsigned_integer | nom_de_colonne | formula} [ASC | DESC] ,...] [LIMIT [offset,] lignes] [PROCEDURE procedure_name(argument_list)] [FOR UPDATE | LOCK IN SHARE MODE]]
SELECT
est utilisé pour obtenir des
enregistrements venant d'une ou plusieurs tables. Le support des
commandes UNION
et des sous-requêtes est
disponibles depuis MySQL 4.0 et 4.1, respectivement. Voir
Section 13.1.7.2, « Syntaxe de UNION
» et Section 13.1.8, « Sous-sélections (SubSELECT
) ».
Chaque select_expr
indique une colonne à
lire.
table_references
indique la ou les tables
à utiliser. La syntaxe est décrite dans
Section 13.1.7.1, « Syntaxe de JOIN
».
where_definition
indique les conditions
que les lignes sélectionnées doivent satisfaire.
SELECT
peut aussi être utilisée pour lire
des lignes calculées, sans référence à une table.
Par exemple :
mysql> SELECT 1 + 1;
-> 2
Tous les mots-clés utilisés doivent être donnés exactement
dans le même ordre que ci-dessus. Par exemple, une clause
HAVING
doit être placée après toute clause
GROUP BY
et avant toute clause ORDER
BY
.
Une expression SELECT
peut recevoir un
alias en utilisant AS
. L'alias est
utilisé de la même fa¸on que le nom du champ et peut
être employé avec des clauses ORDER BY
ou HAVING
. Par exemple :
mysql> SELECT CONCAT(last_name,', ',first_name) AS full_name
FROM mytable ORDER BY full_name;
Le mot clé AS
est optionnel lors de la
création d'un alias pour une expression
SELECT
. L'exemple précédent aurait pu
être écrit comme ceci :
mysql> SELECT CONCAT(last_name,', ',first_name) full_name
FROM mytable ORDER BY full_name;
Comme AS
est optionnel, un problème
subtil peut survenir si vous oubliez une virgule entre deux
expressions de SELECT
: MySQL va
interpréter la seconde comme un alias de la première. Par
exemple, dans la commande suivante,
columnb
est traité comme un nom
d'alias :
mysql> SELECT columna columnb FROM mytable;
Il n'est pas possible d'utiliser un alias de champ dans une
clause WHERE
, car la valeur du champ peut
ne pas être définie lorsque la clause
WHERE
est exécutée. See
Section A.5.4, « Problèmes avec les alias
».
La clause FROM table_references
indique
les tables à partir desquelles nous allons obtenir les
enregistrements. Si vous indiquez le nom de plusieurs
tables, vous faites une jointure. Pour davantage
d'informations sur la syntaxe des jointures, consultez
Section 13.1.7.1, « Syntaxe de JOIN
». Pour chaque table spécifiée, vous
pouvez éventuellement indiquer un alias.
tbl_name [[AS] alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)] | [FORCE INDEX (key_list)]]
L'utilisation de USE INDEX
,
IGNORE INDEX
, FORCE
INDEX
pour donner des conseils d'optimisation à
l'optimiseur d'index. Section 13.1.7.1, « Syntaxe de JOIN
».
En MySQL 4.0.14, vous pouvez utiliser SET
MAX_SEEKS_FOR_KEY=value
comme une alternative pour
forcer MySQL à choisir un scan d'index, plutôt qu'un scan
de table.
Vous pouvez faire référence à une table avec
nom_de_table
(au sein de la base de
données courante), ou avec
dbname.nom_de_table
pour expliciter le
nom de la base de données. Vous pouvez vous référer à un
champ avec nom_de_colonne
,
nom_de_table.nom_de_colonne
, ou
db_name.nom_de_table.nom_de_colonne
. Vous
n'êtes pas obligés d'indiquer de préfixe
nom_de_table
ou
db_name.nom_de_table
pour une référence
à un champ dans un SELECT
, à moins que
la référence ne soit ambigue. Consultez
Section 9.2, « Noms de bases, tables, index, colonnes et alias », pour des exemples
d'ambiguîtés qui nécessitent des formes plus explicites
de référence à des champs.
Depuis la version 4.1.0, vous êtes autorisés à spécifier
DUAL
comme nom de table, dans les
situations ou aucune table n'est référencé. C'est une
fonctionnalité pure de compatibilité, car certains autres
serveurs requièrent cette syntaxe.
mysql> SELECT 1 + 1 FROM DUAL;
-> 2
Une référence à une table peut être aliasée en
utilisant nom_de_table [AS] alias_name
:
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;
Dans la clause WHERE
, vous pouvez
utiliser toutes les fonctions que MySQL supporte, hormis les
fonctions d'agrégation. See Chapitre 12, Fonctions à utiliser dans les clauses SELECT
et
WHERE
.
Les colonnes sélectionnées dans le résultat peuvent être
nommées dans les clauses ORDER BY
et
GROUP BY
en utilisant leur nom de
colonne, les alias ou leur position de colonne. Les
positions commencent à 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 inverse, ajoutez le mot-clé
DESC
(descendant) au nom du champ dans la
clause ORDER BY
qui vous permet de trier.
Par défaut, l'ordre ascendant est utilisé; ceci peut être
indiqué de fa¸on explicite en utilisant le mot-clé
ASC
.
L'utilisation des positions de colonnes est obsolète, car la syntaxe a été supprimée du SQL standard.
Si vous utilisez GROUP BY
, les lignes
sont triées en fonction des colonnes GROUP
BY
comme si on avait ajouté la clause
ORDER BY
pour ces colonnes. MySQL a
amélioré la clause GROUP BY
depuis la
version 3.23.34 pour que vous puissiez aussi spécifier
ASC
et DESC
après le
nom de la colonne :
SELECT a, COUNT(b) FROM test_table GROUP BY a DESC
MySQL améliore l'utilisation de GROUP BY
en vous autorisant à l'utiliser avec des champs qui ne sont
pas mentionnés dans la clause GROUP BY
.
Si vous n'obtenez pas les résultats que vous attendiez,
lisez la description de GROUP BY
. See
Section 12.9, « Fonctions et options à utiliser dans les clauses GROUP
BY
».
Depuis MySQL 4.1.1, GROUP BY
dispose de
l'option WITH ROLLUP
. See
Section 12.9.2, « Options de GROUP BY
».
La clause HAVING
peut faire référence
à n'importe quel champs ou alias défini dans
select_expr
. C'est évalué en dernier
lieu, juste avant que les éléments ne soient envoyés au
client, sans aucune optimisation.
N'utilisez pas HAVING
pour des éléments
qui devraient être dans la clause WHERE
.
Par exemple, n'écrivez pas ceci :
mysql> SELECT nom_de_colonne FROM nom_de_table HAVING nom_de_colonne > 0;
Ecrivez plutôt cela :
mysql> SELECT nom_de_colonne FROM nom_de_table WHERE nom_de_colonne > 0;
Dans les versions 3.22.5 et supérieures de MySQL, vous pouvez aussi écrire des requêtes ainsi :
mysql>SELECT user,MAX(salary) FROM users
->GROUP BY user HAVING MAX(salary)>10;
Dans des versions plus anciennes de MySQL, vous pouvez écrire à la place :
mysql>SELECT user,MAX(salary) AS sum FROM users
->group by user HAVING sum>10;
La clause HAVING
peut utiliser des
fonctions d'agrégation, alors que la clause
WHERE
ne le peut pas :
mysql>SELECT user, MAX(salary) FROM users
->GROUP BY user HAVING MAX(salary)>10;
Cependant, cela ne fonctionne pas dans les anciennes
versions du serveur MySQL, : avant la version 3.22.5. Au
lieu de cela, ajoutez un alias de colonne dans la liste de
colonnes, et faites référence à cet alias dans la colonne
HAVING
:
mysql>SELECT user, MAX(salary) AS max_salary FROM users
->GROUP BY user HAVING max_salary>10;
La clause LIMIT
peut être utilisée pour
limiter le nombre d'enregistrements retournés par la
commande SELECT
. LIMIT
accepte un ou deux arguments numériques. Ces arguments
doivent être des entiers constants.
Avec un argument, la valeur spécifie le nombre de lignes à retourner depuis le début du jeu de résultat. Si deux arguments sont donnés, le premier indique le décalage du premier enregistrement à retourner, le second donne le nombre maximum d'enregistrement à retourner. Le décalage du premier enregistrement est 0 (pas 1) :
Pour être compatible avec PostgreSQL, MySQL supporte aussi
la syntaxe : LIMIT row_count OFFSET
offset
.
mysql> SELECT * FROM table LIMIT 5,10; # Retourne les enregistrements 6 à 15
Pour obtenir tous les enregistrement d'un certain décalage jusqu'à la fin du résultat, vous pouvez utiliser de grands entier en tant que second paramètre :
mysql> SELECT * FROM table LIMIT 95,18446744073709551615; # Retourne les enregistrements de 96 jusqu'au dernier.
Si un seul argument est donné, il indique le nombre maximum d'enregistrements à retourner :
mysql> SELECT * FROM table LIMIT 5; # Retourne les 5 premiers enregistrements
Autrement dit, LIMIT n
est équivalent à
LIMIT 0,n
.
La forme SELECT ... INTO OUTFILE
'nom_fichier'
de SELECT
écrit
les lignes sélectionnées dans un fichier. Le fichier est
crée sur le serveur et ne peut y être déjà présent
(cela permet entre autre d'éviter la destruction des tables
et de fichiers tel que /etc/passwd
).
Vous devez avoir le droit FILE
sur le
serveur pour utiliser cette forme de
SELECT
.
SELECT ... INTO OUTFILE
à pour but
principal de vous permettre de réaliser des dumps rapides
des tables sur la machine serveur. Si vous voulez créer le
fichier sur une autre machine, vous ne pouvez utiliser
SELECT ... INTO OUTFILE
. Dans ce cas là,
vous pouvez utiliser à la place un programme client comme
mysqldump --tab
ou mysql -e
"SELECT ..." > fichier
pour générer le
fichier.
SELECT ... INTO OUTFILE
est le
complément de LOAD DATA INFILE
; La
syntaxe pour la partie export_options
de
la requête se compose des mêmes clauses
FIELDS
et LINES
que
celles utilisées avec la commande LOAD DATA
INFILE
. See Section 13.1.5, « Syntaxe de LOAD DATA INFILE
».
Dans le fichier résultant, seul les caractères suivants
sont protégés par le caractère ESCAPED
BY
:
Le caractère ESCAPED BY
Les premier caractère de FIELDS TERMINATED
BY
Les premier caractère de LINES TERMINATED
BY
ASCII 0
est convertit en
ESCAPED BY
suivi de 0 (ASCII
48
).
Si le caractère FIELDS ESCAPED BY
est
vide, aucun caractère n'est protégé, et
NULL
vaut NULL
, et non
\N
. Il est probable que ce ne soit pas
une bonne idée de spécifier un caractère de protection
vide, en particulier sir les valeurs de vos champs peuvent
être n'importe quoi.
La raison de ce qui précède est que vous devez
impérativement protéger chaque
caractère FIELDS TERMINATED BY
,
ESCAPED BY
, ou LINES TERMINATED
BY
pour assurer une relecture fiable du fichier.
Le caractère ASCII 0
est échappé pour
assurer la lisibilité sur certains clients.
Comme le fichier résultant ne se doit pas d'être syntaxiquement conforme à SQL, vous n'avez besoin d'échapper rien d'autre.
Voila un exemple de relecture de fichier au format utilisé par plusieurs anciens programmes.
SELECT a,b,a+b INTO OUTFILE '/tmp/result.text' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM test_table;
Si vous utilisez INTO DUMPFILE
au lieu de
INTO OUTFILE
, MySQL n'écrira qu'une
seule ligne dans le fichier, sans aucun caractère de fin de
ligne ou de colonne, ni d'échappement. Cela est utile
lorsque vous voulez enregistrer un BLOB
dans un fichier.
Note : notez que les
fichiers crées par INTO OUTFILE
et
INTO DUMPFILE
sera lisible par tout les
utilisateurs ! La raison est que le serveur MySQL ne peut
créer de fichier appartenant à autre que l'utilisateur qui
l'a mis en route. (vous devez éviter d'exécuter
mysqld
en tant que root), le fichier doit
se composer de mot lisible pour que les données puissent
être récupérées.
Une clause PROCEDURE
indique une
procédure qui doit traiter les lignes du jeu de résultat.
Pour un exemple, voyez Section 27.3.1, « La procédure Analyse ».
Si vous utilisez la clause FOR UPDATE
avec un gestionnaire de tables qui gère les verrous de
lignes ou de pages, les lignes seront verrouillées.
Après le mot SELECT
, vous pouvez ajouter
certaines options qui affectent le comportement de la commande.
Les options DISTINCT
,
DISTINCTROW
et ALL
indiquent quels enregistrements avec doublons doivent être
retournés. Par défaut, c'est (ALL
),
retournant ainsi tous les enregistrements.
DISTINCT
et DISTINCTROW
sont synonymes et indique que les doublons doivent être
éliminés du résultat.
HIGH_PRIORITY
,
STRAIGHT_JOIN
, et les options commen¸ants
par SQL_
sont des extensions MySQL au
standard SQL.
HIGH_PRIORITY
donne à une commande
SELECT
une plus grande priorité qu'une
commande qui modifie une table. Vous devez l'utiliser
seulement pour les requêtes qui sont très rapides et qui
doivent être effectuées en premier lieu. Une requête
SELECT HIGH_PRIORITY
s'exécutera sur une
table verrouillée en lecture même si une commande de mise
à jour attend que la table soit libérée.
HIGH_PRIORITY
ne peut être utilisée
avec les commandes SELECT
qui font partie
d'une UNION
.
STRAIGHT_JOIN
force l'optimiseur à
joindre les tables dans l'ordre dans lequel elles sont
listées dans la clause FROM
. Vous pouvez
utiliser cela pour accélérer la requête, si les tables
sont réordonnées sub-optimalement par l'optimiseur. See
Section 7.2.1, « Syntaxe de EXPLAIN
(Obtenir des informations sur les
SELECT
) ». STRAIGHT_JOIN
peut aussi être utilisée dans la liste
table_references
. See
Section 13.1.7.1, « Syntaxe de JOIN
».
SQL_BIG_RESULT
peut être utilisé avec
GROUP BY
ou DISTINCT
pour indiquer à l'optimiseur que le résultat comportera
beaucoup d'enregistrements. Dans ce cas, MySQL utilisera si
besoin directement les bases temporaires stockées sur le
disque. MySQL préférera, dans ce cas, trier que d'obtenir
une table temporaire avec une clé sur les éléments du
GROUP BY
.
SQL_BUFFER_RESULT
forcera le résultat à
être stocké dans une table temporaire. Ceci va aider MySQL
à libérer plus tôt les verrous des tables et aidera aussi
dans les cas ou l'envoi du résultat au client prend un
temps assez conséquent.
SQL_SMALL_RESULT
, une option spécifique
à MySQL, peut être utilisée avec GROUP
BY
ou DISTINCT
pour indiquer à
l'optimiseur que le résultat sera petit. Dans ce cas, MySQL
utilise des tables temporaires rapides pour stocker la table
résultante plutôt que d'utiliser le tri. Dans MySQL 3.23,
ceci n'est normalement pas nécessaire.
SQL_CALC_FOUND_ROWS
(version 4.0.0 et
supérieure) indique à MySQL de calculer combien
d'enregistrements seront dans le jeu de résultats,
indépendamment de n'importe quelle clause
LIMIT
. Le nombre d'enregistrements peut
alors être obtenu avec SELECT
FOUND_ROWS()
. See
Section 12.8.4, « Fonctions diverses ».
Avant MySQL 4.1.0, cette option ne fonctionne pas avec
LIMIT 0
, qui est optimisée pour se
terminer instantanément (le résultat ne contiendra pas de
lignes). See Section 7.2.12, « Comment MySQL optimise LIMIT
».
SQL_CACHE
demande à MySQL de ne pas
stocker le résultat de la requête si vous utilisez
query_cache_type
avec la valeur
2
ou DEMAND
. Pour une
requête qui utilise UNION
ou une
sous-requête, cette option prend effet si elle est
utilisée dans n'importe quelle partie de la requête
SELECT
. See
Section 5.11, « Cache de requêtes MySQL ».
SQL_CACHE
indique à MySQL de stocker le
résultat de la requête dans le cache de requêtes si vous
utilisez QUERY_CACHE_TYPE=2
(DEMAND
). See
Section 5.11, « Cache de requêtes MySQL ». Pour les requêtes qui
utilisent UNION
ou les sous-requêtes,
cette option aura un effet sur toutes les parties de la
requête SELECT
.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.