SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [DISTINCT | DISTINCTROW | ALL]
    select_expression,...
    [INTO OUTFILE 'Nom_fichier' export_options]
    [FROM table_references
        [WHERE where_definition]
        [GROUP BY Nom_col,...]
        [HAVING where_definition]
        [ORDER BY {unsigned_integer | Nom_col | formula} [ASC | DESC] ,...]
        [LIMIT [offset,] rows]
        [PROCEDURE procedure_name] ]
SELECT est utilisé pour obtenir des lignes à partir d'une ou plusieurs tables. select_expression indique les colonnes à lire. SELECT peut aussi être utilisé pour exécuter des calculs sans rapport avec aucune table. Par exemple :
mysql> SELECT 1 + 1;
         -> 2
Toutes les options doivent impérativement être dans l'ordre indiqué ci dessus. Par exemple, une clause HAVING doit être après GROUP BY et avant la clause ORDER BY .
- Une clause SELECTpeut utiliser des alias, introduit par le mot clé AS. L'alias est utilisé comme un nom de colonne, et peut être repris dans une clauseORDER BYouHAVING. Par exemple:
mysql> select concat(last_name,', ',first_name) AS full_name
    from maTable ORDER BY full_name;
- La clause FROM table_referencesindique les noms des tables qu'il faut interroger. Si il y a plusieurs tables, il vaut mieux utiliser la clausejoin.JOIN.
- Il est possible d'appeler une colonne sous les formes Nom_col,Nom_table.Nom_colorNom_bdd.Nom_table.Nom_col. Il n'y a pas besoin de préciser les préfixesNom_tableouNom_bdd.Nom_tablelors d'unSELECTà moins que les noms soient ambiguës.   7.1.5  Noms de base de données, table, index, column et alias, pour des exemples sur les ambiguïtés qui peuvent apparaître.
- Une référence sur une table peut être aliasée avec Nom_table [AS] Nom_alias.
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;
- Les colonnes demandées en sortie peuvent être utilisées dans les clauses ORDER BYetGROUP BYen utilisant leur nom, leurs alias ou leur positions. Les colonnes sont positionnées à partir de 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 descendant, il faut ajouter le mot clé DESC après le nom de la colonne, dans la clause ORDER BY . Par défaut, l'ordre ascendant est utilisé, et peut être explicitement demandé en utilisant le mot clé ASC
- La clause HAVINGpeut faire référence à n'importe quelle colonne ou alias présent dansselect_expression. Cette clause est évaluée en dernier, juste avant que les lignes soient envoyées au client, sans aucune optimisation. Il ne faut pas utiliserHAVINGlàWHEREoù est plus efficace. Par exemple, il ne faut pas écrire :
mysql> select Nom_col from Nom_table HAVING Nom_col > 0;
A la place, il vaut mieux écrire :
mysql> select Nom_col from Nom_table WHERE Nom_col > 0;
A partir de MySQL 3.22.5, on peut écrire des requêtes telles que:
mysql> select user,max(salary) from users
           group by user HAVING max(salary)>10;
Dans les versions anciennes de MySQL , il était possible d'écrire :
mysql> select user,max(salary) AS sum from users
           group by user HAVING sum>10;
- L'option STRAIGHT_JOINforce l'optimiseur à regrouper les tables dans l'ordre dans lequel elles sont spécifiées dans laFROM. Cela permet d'accélérer le traitement d'une requête.EXPLAIN.
- L'option SQL_SMALL_RESULTpeut être utilisé avec les clausesGROUP BYouDISTINCTpour indiquer à l'optimiseur que le résultat sera de petite taille. Dans ce cas, MySQL va utiliser des tables temporaires d'accès rapide, pour enregistrer les tables de résultat, plutot que de faire des tries.SQL_SMALL_RESULTest une extension MySQL de ANSI SQL92.
- L'option LIMITpeut être utilisée pour restreindre le nombre de lign retournéeSELECT.LIMITa un ou deux arguments numériques.. Le premier indique l'index de la ligne de début, et le deuxième indique le nombre de ligne à retourner. L'indexe de la ligne initiale est 0.
mysql> select * from table LIMIT 5,10;  # retourne les lignes 6-15
Si un seul argument est fourni à LIMIT, il indique le nombre de ligne à retourner.
mysql> select * from table LIMIT 5;     # retourne les 5 premiere lignes
LIMIT n et LIMIT 0,n sont équivalents.
- La forme SELECT ... INTO OUTFILE 'Nom_fichier'de la syntaxe deSELECTécrit les lignes selectionnées dans un fichier. Les fichiers créés sont écrit sur le serveur, et ne doit pas exister au moment de l'écriture (cela évite d'écraser le fichier /etc/passwd, par exemple). Il faut avoir les droits d'écriture.SELECT ... INTO OUTFILEest le contraire de la commandeLOAD DATA INFILE; qui importe les lignes à partir d'un fichier. L'expression export_optionsest constituée des même champsFIELDSetLINESque dans la commandeLOAD DATA INFILE. sectionLOAD DATA. Dans le fichier texte résultant de la commandeSELECT ... INTO OUTFILE, seuls, les caractères suivants sont précédé du caractère d'échappement, précisé avecESCAPED BY:
- Le caractère ESCAPED BY
- Le premier caractère dans la clause FIELDS TERMINATED BY
- Le premier caractère dans la clause LINES TERMINATED BY
 
De plus, le caractère ASCII 0 est converti en ESCAPED BY suivi de 0 (ASCII 48). La raison de l'ajout du caractère d'échappement après les caractères FIELDS TERMINATED BY, ESCAPED BY ou LINES TERMINATED BY ,est que cela permet la relecture du fichier. Le caractère ASCII 0 est échappé pour le rendre plus lisible par les éditeurs. Et comme le fichier résultant n'a pas à se conformer à la norme SQL, ce sont les seuls caractères à être échappés.