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.
Chaque select_expr indique une colonne
à lire.
table_references indique la ou les
tables à utiliser.
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.
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 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.
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.
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.
Depuis MySQL 4.1.1, GROUP BY dispose
de l'option WITH ROLLUP.
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.
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.
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. STRAIGHT_JOIN peut
aussi être utilisée dans
la liste table_references.
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().
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).
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.
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).
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.
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.
|