Services webmasters
Partenaires
Jeux concours gratuits
 
Référence du langage MySQL
<<<
Syntaxe de SELECT Syntaxe de HANDLER
>>>

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 :

<< Syntaxe de SELECT >>
Référence du langage MySQL Manipulation de données : SELECT , INSERT , UPDATE , DELETE Syntaxe de HANDLER
Services webmasters
Les manuels
 
CoursPHP.com - Reproduction interdite -