7.11 SELECT

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 SELECT peut utiliser des alias, introduit par le mot clé AS. L'alias est utilisé comme un nom de colonne, et peut être repris dans une clause ORDER BY ou HAVING. Par exemple:
mysql> select concat(last_name,', ',first_name) AS full_name
    from maTable ORDER BY full_name;
  • La clause FROM table_references indique les noms des tables qu'il faut interroger. Si il y a plusieurs tables, il vaut mieux utiliser la clause join. JOIN.
  • Il est possible d'appeler une colonne sous les formes Nom_col, Nom_table.Nom_col or Nom_bdd.Nom_table.Nom_col. Il n'y a pas besoin de préciser les préfixes Nom_table ou Nom_bdd.Nom_table lors d'un SELECT à 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 BY et GROUP BY en 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 HAVING peut faire référence à n'importe quelle colonne ou alias présent dans select_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 utiliser HAVINGWHERE où 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_JOIN force l'optimiseur à regrouper les tables dans l'ordre dans lequel elles sont spécifiées dans la FROM . Cela permet d'accélérer le traitement d'une requête. EXPLAIN.
  • L'option SQL_SMALL_RESULT peut être utilisé avec les clauses GROUP BY ou DISTINCT pour 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_RESULT est une extension MySQL de ANSI SQL92.
  • L'option LIMIT peut être utilisée pour restreindre le nombre de lign retournée SELECT . LIMIT a 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 de SELECT é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 OUTFILE est le contraire de la commande LOAD DATA INFILE; qui importe les lignes à partir d'un fichier. L'expression export_options est constituée des même champs FIELDS et LINES que dans la commande LOAD DATA INFILE . section LOAD DATA. Dans le fichier texte résultant de la commande SELECT ... INTO OUTFILE , seuls, les caractères suivants sont précédé du caractère d'échappement, précisé avec ESCAPED 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.