Récupération de données
Definition : Extraire des informations d’une ou plusieurs tables, sous certaines conditions avec un ordre donné.
SELECT [DISCTINCT] expression [FROM] table [WHERE condition GROUP BY expression HAVING condition ORDER BY expression LIMIT m,n];
Afin d’extraire des données, la syntaxe minimum devient :
SELECT expression FROM table;
SELECT
SELECT est l’instruction qui permet de retourner un jeu de resultat. Le SELECT est suivi d’une expression.
L’expression
Dans l’expression, on peut avoir des chaines de caracteres, des entiers, des flottants, des temporels, une expression mathématique, ou encore une fonction.
Toutes ses données devront être spéparées par des virgules
SET @@SQL_MODE='';
SELECT 14,3.2,"Bonjour",CONCAT('H',' ','X');
On peut renommer une expression grace au mot clé AS. A partir de la, l’expression dispose d’un alias. MySQL accepte aussi la possibilité d’ommetre le mot clé AS
SELECT expression AS monAlias; // ou SELECT expression monAlias;
Pour une meilleur visibilité, on privilegiera la premiere methode.
Lorsqu’il sagira d’extraire des données en provenance d’une table, l’expression sera composée de nom de colonnes séparées par des virgules. Ces colonnes peuvent avoir aussi des alias. On peut mélanger colonne et autres expression.
DISTINCT
Permet de supprimer les doublons dans un jeu de resultats.
FROM
Le FROM permet de spécifier la ou les tables d’où l’on recupera les informations. Il est donc impossible de mettre une expression apres le FROM. Les tables ont elles aussi la possibilité d’avoir des alias
FROM table1 AS t1 //ou FROM table1 t1
Syntaxe complete de récupération de données simple
SELECT [{table|alias}.]col1 [ , [{table|alias}.]col2...]
FROM table [ [AS] alias ][,table2...];
Il est possible de récuperer l’ensemble des colonnes d’une table avec *
On privilegiera la syntaxe où on spécifie le nom des colonnes.
WHERE
Le WHERE permet de filtrer les enregistrements pour selectionner ceux qui entrerons dans la constitution du jeu de resultat.
A la suite du WHERE, on place une expression booleene qui est donc une condition. Et si cette expression vaux true, la ligne sera utilisée pour la constitution du jeu de resultat
MySQL, lors d’un SELECT avec un WHERE récupere ligne par ligne et vérifie a chaque fois si cette ligne rend l’expression booleen à true.
Condition
Les opérateurs
Opérateurs logiques :
| Opérateur | Description |
| <> (SQL) != (MySQL) |
Vérifie l’inégalité |
| = | Vérifie l’égalité |
| > | Superiorité |
| < | Infériorité |
| >= | Supérieur ou égal |
| <= | Inférieur ou égal |
Autres :
| Opérateur | Description |
| LIKE | Permet de verifier la conformité d’une chaine de caractere en utilisant : % : 0 ou n caracteres _ : 1 caractere Le LIKE peut etre utilisé directement dans le SELECT sans clause FROM |
| NOT LIKE | Negation de LIKE |
| IN | Permet de vérifier l’appartenance à un ensemble (item IN (‘val1′,’val2′,’val3′)) |
| NOT IN | Negation de IN |
| BETWEEN | Permet de déterminer si une valeur est comprise entre deux valeurs ( item BETWEEN x AND y ) |
| NOT BETWEEN | Negation de BETWEEN |
| IS NULL | Permet de vérifier si une valeur est NULL |
| IS NOT NULL | Negation de NULL |
Dans l’expression, chaque condition est séparée par un opérateur logique
Regrouper les conditions
Pour regrouper les conditions, on utilisera les opérateurs logiques tels que AND et OR
| AND | 0 | 1 |
| 0 | 0 | 1 |
| 1 | 0 | 1 |
| OR | 0 | 1 |
| 0 | 0 | 1 |
| 1 | 1 | 1 |
Chaque condition devra etre encadrée par des parentheses afin de facilité la lisibilité mais aussi avoir une expression correcte
NOTE
Peut-on utiliser tous les opérateurs dans un SELECT sans clause FROM?
Oui.
Que fait « SELECT 1 AND (5=7 OR 8<>7) »?
1.
GROUP BY
GROUP BY permet de réaliser des opérations d’aggrégations : c’est le regrouppement de lignes dans un certain ensemble en fonction de divers criteres pour produire des informations resumées..
Fonctions d’aggregations
| Fonction | Description | Syntaxe |
| COUNT | Permet de compter le nombre d’enregistrements | COUNT(col1) COUNT(*) COUNT(DISTINCT {col|*}) |
| MAX | Permet d’obtenir la valeur maximale d’une colonne | MAX(col) |
| MIN | Permet d’obtenir la valeur minimale d’une colonne | MIN(col) |
| SUM | Permet d’obtenir la somme des valeurs d’une colonne | SUM(col) |
| AVG | Permet d’obtenir la moyenne des valeurs d’une colonne | AVG(col) |
| GROUP_CONCAT | Permet de regroupper des colonnes | GROUP_CONCAT(expression) |
ATTENTION : Lorsqu’on utilisera un GROUP BY, on pourra mettre dans le SELECT les fonctions d’aggrégation.
ATTENTION : Les fonctions d’aggrégation ne tiennent pas compte des valeurs NULL sauf le COUNT.
Spécificité du GROUP BY chez MySQL :
- Un GROUP BY se comporte de la meme maniere qu’un ORDER BY. Il est possible d’ajouter apres le nom de colonne les mots clés ASC (par defaut) et DESC
- Il est possible d’ajouter la clause WITH ROLLUP qui permet d’obtenir un résumé de résumé
GROUP_CONCAT
GROUP_CONCAT(colonne ORDER BY colonne SEPARATOR ‘separateur’);
Permet de concatener les valeurs d’un champ utilisé par un GROUP BY
SELECT Classe, GROUP_CONCAT(Eleve ORDER BY Classe SEPARATOR '_') FROM test GROUP BY Classe;
HAVING
La clause HAVING ne s’utilise qu’avec la clause GROUP BY
HAVING permet de filtrer les groupes à utiliser pour le jeu de resultat : si HAVING retourne TRUE, le groupe sera utilisé.
WHERE vs HAVING : Le Where est traité avec le GROUP BY a contrario du HAVING qui est réalisé apres le GROUP BY. Le WHERE est plus interressant niveau performances
A savoir, pour une performance ultime, il faut mieu supprimer le maximum de lignes le plus rapidement possible : privilegier le WHERE au HAVING
SELECT Classe, Count(*) AS nb_eleve FROM test GROUP BY Classe Having nb_eleve>2;
ATTENTION NE MARCHE PAS :
mysql> SELECT Classe, COUNT(Eleve) AS nb_eleve FROM test WHERE nb_eleve>2 GROUP
BY Classe ;
ORDER BY
ORDER BY permet de trier le jeu de resultat avant son expédition au client. Deux tris sont possibles : ASC (Croissant, par défaut) et DESC.
Aucune importance de tri lorsque la COLLATION se trouve en CI (case insensitive) par contre si on utilise CS, on aura pas forcément le meme tri.
CREATE TABLE test (
Col1_cs varchar(4) COLLATE latin7_general_cs,
Col2_ci varchar(4) COLLATE latin7_general_ci,
Col3_autre varchar(4) COLLATE gbk_bin
);
INSERT INTO test(Col1_cs,Col2_ci,Col3_autre) VALUES ('AaBb','AaBb','AaBb'),('aAbB','aAbB','aAbB'),('ABC','ABC','ABC'),('abc','abc','abc');
LIMIT
LIMIT permet de limiter le nombre d’enregistrements pris en compte par MySQL. Il existe deux syntaxe à la clause LIMIT :
LIMIT n // LIMIT m,n
Dans la syntaxe ci-dessus, m et n sont des entiers, n représentant le nombre d’enregistrements et m, le décalage du jeu de résultat ou encore le nombre de lignes à ignorer.
Il est possible d’utiliser la clause LIMIT dans le SELECT et dans ce cas, il est possible d’utiliser les deux syntaxes.
Il est possible d’utiliser la clause LIMIT dans le UPDATE/DELETE et dans ce cas, il n’est possible d’utiliser que LIMIT n.
//Les 5 enregistrements qui suivent le 3eme enregistrement LIMIT 3,5 //Les 5 premiers enregistrements LIMIT 0,5 //Les 5 enregistrements qui suivent le 10eme enregistrement LIMIT 10,5
ATTENTION : A ne pas utiliser pour les resultats volumineux car le jeu de resultat est créee par MySQL puis la clause limit est faite.

Commentaires récents