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.

