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
- Si vous avez des problèmes de lenteur malgré le fait que vous avez ajoutés des «INDEX», il est possible qu'il n'utilise pas le bonne «INDEX» pour exécuté votre requête. Dans cette situation, il faudra alors rajouté «USE INDEX (nomdemonindex)» après le nom de votre table dans votre requête SELECT afin qu'il passe bien par le chemin que vous souhaitez. Enfin, pour prendre une décision éclairer, vous devriez utiliser l'instruction «EXPLAIN» et la mettre devant votre requête SQL et vérifier la valeur retourner dans le champ «rows».
- Si vos sites subits de fort trafic, il est fortement recommandé de ne pas spécifier un astérisque «*» mais plutôt le nom de chacun des champs devant nécessaire être retourné par votre requête afin d'éviter d'envoyer des données inutilement. Ainsi, dans une application professionnelle, on ne devrait pas retrouver une syntaxe «SELECT * FROM» mais plutôt «SELECT champ1,champ2,champ3 FROM».
- «LIMIT» et «SQL Server» : Si vous utilisez SQL Server, vous devriez envisager d'utiliser «SELECT TOP» disponible à partir du SQL Server 2008.
- SQL Server et forçage d'index : Si vous utilisez SQL Server, vous devriez plutôt utiliser une requête SQL «SELECT * FROM table WITH(INDEX(nom_index))» plutôt que «USE INDEX» afin de forcer l'utilisation d'un index spécifique.
- «LIMIT» et «Oracle» : Si vous utilisez «Oracle Database SQL», vous devriez envisager d'utiliser ROWNUM dans le WHERE comme ceci «SELECT nom_colonne(s) FROM nom_table WHERE ROWNUM <= nombre;».
- Avant la version 4 de MySQL, les «SELECT imbriqués» sont très mal supporté, voir pas du tout dans certains cas ! Il fallait donc faire supporter se genre de possibilité au niveau du langage de programmation parent (généralement du PHP, Perl, Python,...).
- Un ou plusieurs enregistrements peuvent être retournés avec une simple requête «SELECT», tout dépend de la quantité de données disponibles dans la ou les tables concernées.
- Il est possible de définir plusieurs tables avec le paramètre «FORM», pour se faire, il faudra séparer les noms de tables par des virgules.
- Si vous indiquez un «*» plutôt que les noms spécifiques des champs, vous aurez le résultat de tous les champs.
- L'instruction «SELECT» peut également être exploitée comme moyen d'affichage vers la sortie, pour se faire, il suffit de simplement indiquer «SELECT "message"» ou «SELECT 2+4» afin d'obtenir le résultat comme une requête traditionnelle avec une table.
- ORDER BY: Si vous indiquez une tri basé sur une information, comme une quantité, et qu'il y a donc un potentiel d'avoir 2 quantités pareil, vous devriez envisager de rajouter un tri par clef primaire inversé comme second paramètre de votre «ORDER BY» afin de vous assurer que l'information sort toujours dans le même ordre, car il n'y a aucune garantie que l'information sortira dans le même sur un autre environnement.
- Division par zéro : Si vous effectuez un calcul avec une division par zéro dans un de vos champs, comme par exemple :
SELECT 1/0;
Il retournera la valeur NULL et non pas un message d'erreur s'il n'est pas en mode «strict».
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 :
- 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 :
- 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:
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 :
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 :
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) :
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» :
Cet exemple permet d'indiquer le nombre de courriels identiques dans la table «membres» (ou si vous préférez les doublons de courriel) :
L'exemple suivant permet de retourner la valeur actuelle de l'AUTO_INCREMENT dans la table «matable» de la base de données «nombasededonnees» :
L'exemple suivant permet de forcer la table «article» à utiliser l'index «critere_index» lors d'une recherche avec le champ «critere» :
- 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 :
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