Section courante

A propos

Section administrative du site

SELECT

Sélectionne
MySQL  

Syntaxe

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]]

La syntaxe pour les «jointures» :

nom_de_table [[AS] alias] [USE INDEX (liste_de_clefs)] [IGNORE INDEX (liste_de_clefs)], reference_table
nom_de_table [[AS] alias] [USE INDEX (liste_de_clefs)] [IGNORE INDEX (liste_de_clefs)] [CROSS] JOIN reference_table
nom_de_table [[AS] alias] [USE INDEX (liste_de_clefs)] [IGNORE INDEX (liste_de_clefs)] INNER JOIN reference_table [ON expr_conditionnelle | USING (column_list)]
nom_de_table [[AS] alias] [USE INDEX (liste_de_clefs)] [IGNORE INDEX (liste_de_clefs)] STRAIGHT_JOIN reference_table
nom_de_table [[AS] alias] [USE INDEX (liste_de_clefs)] [IGNORE INDEX (liste_de_clefs)] LEFT [OUTER] JOIN reference_table [ON expr_conditionnelle | USING (column_list)]
nom_de_table [[AS] alias] [USE INDEX (liste_de_clefs)] [IGNORE INDEX (liste_de_clefs)] LEFT [OUTER] JOIN reference_table
nom_de_table [[AS] alias] [USE INDEX (liste_de_clefs)] [IGNORE INDEX (liste_de_clefs)] NATURAL [LEFT [OUTER]] JOIN reference_table
{ OJ nom_de_table [[AS] alias] [USE INDEX (liste_de_clefs)] [IGNORE INDEX (liste_de_clefs)] LEFT OUTER JOIN reference_table ON expr_conditionnelle }
nom_de_table [[AS] alias] [USE INDEX (liste_de_clefs)] [IGNORE INDEX (liste_de_clefs)] RIGHT [OUTER] JOIN reference_table [ON expr_conditionnelle | USING (column_list)]
nom_de_table [[AS] alias] [USE INDEX (liste_de_clefs)] [IGNORE INDEX (liste_de_clefs)] RIGHT [OUTER] JOIN reference_table
nom_de_table [[AS] alias] [USE INDEX (liste_de_clefs)] [IGNORE INDEX (liste_de_clefs)] NATURAL [RIGHT [OUTER]] JOIN reference_table

La syntaxe pour les unions :

SELECT ...
UNION [ALL | DISTINCT]
SELECT ...
[UNION [ALL | DISTINCT]
SELECT ...]

Paramètres

Nom Description
select_expression Ce paramètre permet d'indiquer la liste des expressions, soit généralement les champs de la table.
lignes Ce paramètre permet d'indiquer la nombre de ligne que la liste doit sortie au maximum.
offset Ce paramètre permet d'indiquer la position à partir de la laquelle la liste doit être sortie.
table_references Ce paramètre permet d'indiquer la table ou les tables à sortir de la base de données.
DISTINCT Ce paramètre permet d'indiquer les lignes d'enregistrements lorsqu'elles sont identiques, ne peuvent sortir qu'une seule fois.
ORDER BY {unsigned_integer | nom_de_colonne | formula} Ce paramètre permet d'indiquer l'ordre de tri de la liste des colonnes :
Formule Description
column!=expression Cette formule permet de mettre la colonne correspondant à l'expression spécifié au début.
column=expression Cette formule permet de mettre la colonne correspondant à l'expression spécifié à la fin.
column ASC Cette formule permet d'effectuer un tri dans le sens normal.
column DESC Cette formule permet d'effectuer un tri dans le sens inverse.
LENGTH(column) Cette formule permet d'effectuer un tri de la plus petite chaine de caractères à la plus longue chaine de caractères du champs spécifié.
column LIKE search Cette formule permet d'effectuer un tri par la colonne spécifié en fonction des lettres spécifié dans l'expression search.
... ...
WHERE where_definition Ce paramètre permet d'indiquer les critères de recherche. Ainsi, seul les lignes correspondant à la définition peuvent être affiché.
GROUP BY nomdecolonnes Ce paramètre permet d'indiquer qu'il faut regrouper les données en fonction de la colonne ou des colonnes spécifiés.
UNION Ce paramètre permet de jumelé le résultat de plusieurs «SELECT» en une seule.
... ...
LIMIT [offset,] lignes Ce paramètre permet d'indiquer respectivement la position départ suivi du nombre d'enregistrement retournés. Par défaut la position est de début est 0, et la quantité est tous les enregistrements de la table.

Description

Cette instruction permet de sortie une liste de données à partir d'une ou plusieurs tables.

Remarques

Exemples

Prenons pour base la table «cdmworkgroup» avec le contenu suivant :

Cin WorkGroupId Name_EN Name_FR Description Status CreateDate CreateUserId LastUpdate UpdateUserId
000 0000023901 Coder Développement Groupe de programmeur effectuant de la recherche et développement (R&D). A 2006/03/09 SYSADM 2006/03/09 SYSADM
000 0000023902 Maintenance Maintenance Groupe maintenant les divers services réseaux, implantant les développements, maintenant l'état actuel du matériel et administrant les accès. A 2006/03/09 SYSADM 2006/03/09 SYSADM
000 0000023903 Direction Direction Direction Groupe de travail s'occupant des divers orientations à prendre sur les projets et les produits. I 2006/03/09 SYSADM 2006/03/09 SYSADM
075 0000000068 Test Teste Groupe désigné pour le contrôle de la Qualité A 2006/03/09 STREMBLAY 2006/03/09 STREMBLAY

Si vous voulez retourner tous les champs de cette table vous entrez donc les instructions suivantes :

  1. SELECT * from cdmworkgroup

Si vous voulez retourner tous les champs de cette table contenu dans le CIN égalant «000» vous entrez donc les instructions suivantes :

  1. SELECT * from cdmworkgroup WHERE Cin='000'

Si vous voulez retourner seulement le champs d'identification «ID» représenté par «WorkGroupId» et son nom français dans le champs «Name» de cette table contenu dans le «CIN» égalant «000» et un «Status» actif (A) vous entrez donc les instructions suivantes:

  1. SELECT
  2.   WorkGroupId As ID,
  3.   Name_FR As Name
  4. FROM cdmworkgroup
  5. WHERE Cin='000' AND Status='A'

Et les informations vous seront retourner sous la forme suivante  :

ID Name
0000023901 Développement
0000023902 Maintenance

Pour le problème suivant, sachant que nous avons une table «cdmuser» ressemblant à ceci :

Cin UserId FirstName LastName Password DefLang DefEmail Status NumVisit CreateDate CreateUserId LastUpdate UpdateUserId
000 SYSADM Sylvain Maltais PASSWORD FR support @gladir.com A 615 2006/03/09 SYSADM 2006/03/09 SYSADM
000 STREMBLAY Steve Tremblay PASSWORD FR stremblay @mail.com A 615 2006/03/09 SYSADM 2006/03/09 SYSADM

Si en plus de deux autres champs vous voulez connaitre l'auteur (AuthorName) se trouvant dans la table «cdmuser» voici une des méthodes comment procéder :

  1. SELECT
  2.   cdmworkgroup.WorkGroupId As ID,
  3.   cdmworkgroup.Name_FR As Name,
  4.   CONCAT(cdmuser.FirstName,' ',cdmuser.LastName) As AuthorName
  5. FROM cdmworkgroup
  6. LEFT JOIN cdmuser ON cdmuser.Cin='000' and cdmuser.UserId=cdmworkgroup.CreateUserId
  7. WHERE cdmworkgroup.Cin='000' AND cdmworkgroup.Status='A'

Et les informations vous seront retourner sous la forme suivante :

ID Name AuthorName
0000023901 Développement Sylvain Maltais
0000023902 Maintenance Sylvain Maltais

Il aurait également été possible d'écrire :

  1. SELECT
  2.   cdmworkgroup.WorkGroupId As ID,
  3.   cdmworkgroup.Name_FR As Name,
  4.   CONCAT(cdmuser.FirstName,' ',cdmuser.LastName) As AuthorName
  5. FROM cdmworkgroup,cdmuser
  6. WHERE cdmuser.Cin='000' and cdmuser.UserId=cdmworkgroup.CreateUserId AND cdmworkgroup.Cin='000' AND cdmworkgroup.Status='A'

Mais je déconseille la seconde méthode car il y a une possibilité d'avoir des résultats irrégulier si vous avez de la corruption de données, des contraintes extérieures à rajouter et sans compter qu'elle a une moins bonne lisibilité du problème.

L'exemple suivant permet de sortir le résultat d'un SELECT à partir d'un SELECT (SELECT FROM SELECT) :

  1. SELECT id FROM (SELECT WorkGroupId AS id FROM cdmworkgroup WHERE `Status`='A') AS matable

N.B. : Il ne faut pas oublier d'indiquer un alias à la table (dans ce cas si «matable») car sinon vous aurez un message d'erreur «Error Code: 1248» ou «Every derived table must have its own alias».

L'exemple suivant permet d'afficher la taille de chacune des tables en Mo pour la base de données «mabasededonnees» :

  1. SELECT table_name AS "Table", 
  2. ROUND(((data_length + index_length) / 1024 / 1024), 2) "Taille en Mo" 
  3. FROM information_schema.TABLES 
  4. WHERE table_schema = "mabasededonnees";

Cet exemple permet d'indiquer le nombre de courriels identiques dans la table «membres» (ou si vous préférez les doublons de courriel) :

  1. SELECT COUNT(1) AS Compte,courriel FROM membres GROUP BY courriel HAVING Compte > 1

L'exemple suivant permet de retourner la valeur actuelle de l'AUTO_INCREMENT dans la table «matable» de la base de données «nombasededonnees» :

  1. SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = "nombasededonnees" AND TABLE_NAME = "matable" 

L'exemple suivant permet de forcer la table «article» à utiliser l'index «critere_index» lors d'une recherche avec le champ «critere» :

  1. SELECT `id` FROM `article` USE INDEX(`critere_index`) WHERE critere = 1

L'exemple suivant permet de retourner le pourcentage d'utilisateur n'ayant pas de mot de passe dans la table «utilisateur», sachant qu'il existe un champ «passwd» contenant le mot de passe :

  1. SELECT (SELECT COUNT(passwd) FROM utilisateur WHERE passwd='')/(SELECT COUNT(passwd) FROM utilisateur)

Voir également

Article - Les géants de l'informatique - Oracle

Références

MySQL - Référence, Edition Micro Application, Nicolas Rivereau, Antoine Pichot, 2002, ISBN: 2-7429-2560-0, page 909.
MySQL: The definitive guide to using, programming, and administering MySQL 4 databases - Second Edition, Paul Dubois, 2003, ISBN: 0-7357-1212-3, page 885

Dernière mise à jour : Samedi, le 3 octobre 2015