Skip to content

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é

screen-mysql2.JPG
screen-mysql3.JPG

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;

screen-mysql4.JPG

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');

screen-mysql5.JPG

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.