|
Services webmasters |
|
|
|
|
|
Partenaires |
|
|
|
6.4 Manipulation de données : SELECT , INSERT , UPDATE , DELETE
6 Référence du langage MySQL
Manuel de Référence MySQL 4.1 : Version Française
->Syntaxe de SELECT . Syntaxe de HANDLER . Syntaxe de INSERT . Syntaxe de INSERT DELAYED . Syntaxe de UPDATE . Syntaxe de DELETE . Syntaxe de TRUNCATE . Syntaxe de REPLACE . Syntaxe de LOAD DATA INFILE . Syntaxe de DO
|
6.4.1 Syntaxe de SELECT
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.
select_expression
indique les champs que vous voulez obtenir.
SELECT
peut aussi être utilisé pour obtenir des enregistrements
calculés sans aucune 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 être aliasée 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;
|
-
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.
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 Syntaxe de
JOIN
.
Pour chaque table spécifiée, vous pouvez éventuellement indiquer un alias.
table_name [[AS] alias] [USE INDEX (key_list)] [IGNORE INDEX (key_list)]
|
Depuis la version 3.23.12 de MySQL, vous pouvez donner des indications sur les index
que MySQL doit utiliser lors de l'obtention des enregistrements venant d'une table.
C'est pratique lorsque
EXPLAIN
montre que MySQL utilise
le mauvais index parmi la liste des index possibles. En indiquant
USE INDEX (key_list)
, vous pouvez dire à MySQL d'utiliser un seul des
index possibles pour trouver des enregistrements dans la table. L'autre syntaxe
IGNORE INDEX (key_list)
peut être utilisée pour dire à MySQL
de ne pas utiliser un index en particulier.
USE/IGNORE KEY
sont des synonymes de
USE/IGNORE INDEX
.
-
Vous pouvez vous référer à 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 ambigüe. Consultez Noms de base de données, tables, index, colonnes et alias ,
pour des exemples d'ambigüités qui nécessitent des formes plus explicites de
référence à des champs.
-
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;
|
-
Vous pouvez faire référence aux champs sélectionnés en sortie dans
des clauses
ORDER BY
et
GROUP BY
en utilisant les noms des champs, les alias des champs ou bien
les positions des champs. Les positions des champs 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
.
-
Vous pouvez, dans une clause
WHERE
, utiliser n'importe laquelle des fonctions que MySQL supporte. Fonctions .
-
La clause
HAVING
peut faire référence à n'importe quel champs ou alias
défini dans
select_expression
. 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;
|
-
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.
-
Toutes les options commençant par
SQL_
,
STRAIGHT_JOIN
, et
HIGH_PRIORITY
sont des extensions MySQL de ANSI 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.
-
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()
.
Fonctions diverses .Veuillez noter que dans les versions antérieures à 4.1.0, ceci ne fonctionne pas avec
LIMIT 0
, qui est optimisé pour retourner le résultat instantanément (retournant
bien entendu un nombre d'enregistrements égal à 0). Comment MySQL optimise
LIMIT
.
-
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
).
Cache de requêtes MySQL .
-
SQL_NO_CACHE
indique à MySQL de ne pas permettre au résultat de la requête d'être stocké
dans le cache de requêtes. Cache de requêtes MySQL .
-
Si vous utilisez
GROUP BY
, les enregistrements en sortie seront triés en accord avec le
GROUP BY
comme si vous aviez eu un
ORDER BY
sur tous les champs du
GROUP BY
. MySQL a étendu
GROUP BY
de façon à ce que vous puissiez
spécifier
ASC
et
DESC
lors du
GROUP BY
:
SELECT a,COUNT(b) FROM test_table GROUP BY a DESC
|
-
MySQL a étendu l'utilisation de
GROUP BY
pour permettre de sélectionner des champs
qui ne sont pas mentionnés dans la clause
GROUP BY
.
Si vous n'obtenez pas les résultats que vous attendez de votre requête, veuillez consulter la description de
GROUP BY
.
Fonctions à utiliser dans les définitions
GROUP BY
.
-
STRAIGHT_JOIN
force l'optimiseur à joindre les tables dans l'ordre où elles sont listées
dans la clause
FROM
. Vous pouvez utiliser cela pour accélérer une requête
si l'optimiseur joint les tables dans un ordre qui n'est pas optimal.
Syntaxe de
EXPLAIN
(Obtenir des informations
SELECT
) .
-
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.
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écallage du premier enregistrement est 0 (pas 1):
mysql> SELECT * FROM table LIMIT 5,10; # Retourne les enregistrements 6 à 15
|
Pour obtenir tous les enregistrement d'un certain décallage jusqu'à la fin du résultat,
vous pouvez utiliser -1 en tant que second paramètre:
mysql> SELECT * FROM table LIMIT 95,-1; # 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
.
Syntaxe des
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
De plus,
ASCII 0
est convertit en
ESCAPED BY
suivi de 0
(
ASCII 48
).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.
-
Notez que chaque fichier crée 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 mit 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.
-
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.
Sommaire :
|
|
|
|
Services webmasters |
|
|
|
|
|