SELECT pour des requêtes d extraction sur une table Syntaxe générale : Entre [ ] : des valeurs optionnelles Entre { } : une liste de valeur obligatoires possibles De part et d autre de : une valeur parmi celles proposées SELECT [ DISTINCT ALL ] { * liste_de_colonnes } FROM nom_de_table [ WHERE critères_de_selection ] [ GROUP BY liste_de_colonnes_de_regroupement ] [ HAVING critères_de_selection_après_groupement ] [ ORDER BY liste_de_colonnes_de_tri ] ; Clause SELECT, choisir les colonnes à afficher Ex. : Afficher toutes les colonnes de la table membre SELECT * Ex. : Afficher [ne pas supprimer les doublons, valeur par défaut] les colonnes nom et prenom de la table membre SELECT [ALL] nom, prenom FROM t_membre ; Ex. : Afficher les valeurs différentes des colonnes (supprimer les doublons) qui suivent (ici paysorigine)de la table membre SELECT DISTINCT paysorigine FROM t_membre ; Ex. : Afficher les datenais de la table membre et renommer cette colonne en Date_Naissance SELECT datenais AS Date_Naissance Ex. : Afficher les colonnes nom et prenom de la table membre, avec, comme 3eme colonne, une valeur constante chaîne de caractères un_membre SELECT nom, prenom, un_membre FROM t_membre ; Ex. : Afficher les différentes valeurs de largeur*hauteur, renommé surface, à partir de peinture SELECT DISTINCT ( largeur * hauteur ) AS surface FROM t_peinture ; Ex. : Afficher dans une colonne nommée nomprenom, la concaténation 1 de nom, un espace et prenom, à partir de membre SELECT nom prenom AS nomprenom FROM t_membre ; Ex. : Afficher dans une colonne nommée nommaj, les différentes valeurs de nom et les afficher en majuscule, à partir de membre SELECT DISTINCT UPPER(nom) AS nommaj 1 La concaténation utilise parfois le symbole + (SQL Server, par exemple) PATDEZ-2006- SELECT pour des requêtes d extraction sur une table Page 1/8
Ex. : Afficher les différentes valeurs de largeur*hauteur arrondi à 1 décimale, renommé surfarr, à partir de peinture. SELECT DISTINCT ROUND(largeur * hauteur, 1) AS surfarr Ex. : Afficher les colonnes nom, prenom et extraire l année de la date de naissance et la renommer anneenaissance, à partir de peinture SELECT nom, prenom, EXTRACT (YEAR FROM datenais) AS anneenaissance Ex. : Afficher les colonnes id_activ, intitule_activ et selon le cas, afficher une affaire si tarif1_activ < 15 ou prix moyen si tarif1_activ < 15 sinon cher renommer cette colonne indicetarif, à partir de activite.. SELECT id_activ, intitule_activ, CASE WHEN tarif1_activ < 15 then une affaire WHEN tarif1_activ < 30 prix moyen ELSE cher END AS indicetarif FROM t_activite; Remarque importantes sur les fonctions appliquées sur des valeurs de colonnes Ces fonctions sont peu standardisées ; on va souvent les retrouver dans différents SGBDR nommées différemment. Fonctions bit_length, char_length, initcap, lower, upper, position, strpos, substring, substr, chaînes lpad, rpad, trim, rtrim, ltrim, replace, repeat, convert, cast, coalesce, sound,etc. Fonctions Abs, ceil, floor, log, mod, pi, power, degrees, radians, random, round, trunc, numériques sign, sqrt, etc. Fonctions dates To_char, to_date, to_number, age, current_date, now, date_part, extract Les colonnes affichées peuvent également provenir d une sous requête. SELECT numartiste, titre, prix, (SELECT AVG(prix) FROM t_oeuvre B WHERE A.numoeuvre = B.numoeuvre) AS moyenne FROM t_œuvre A; Clause FROM, choisir la table d origine des colonnes utilisées Ex. : Afficher toutes les colonnes de la table membre SELECT * Ex. : Afficher toutes les colonnes de la table membre SELECT membre.* Ex. : Afficher [tous] les noms et prénoms de la table M, surnom de la table membre SELECT M.nom, M.prenom FROM t_membre M ; Si l origine des colonnes nécessite l accès à plusieurs tables, ==> jointures PATDEZ-2006- SELECT pour des requêtes d extraction sur une table Page 2/8
Clause WHERE, choisir les lignes à extraire Opérateurs de comparaison : =, <>, <, <=, >, >= Ex. : Afficher toutes les colonnes de la table membre : choisir les lignes pour lesquelles la valeur de la colonne id_memb est inférieure à 10 SELECT * FROM t_membre WHERE id_memb < 10; Ex. : Afficher toutes les colonnes de la table membre : choisir les lignes pour lesquelles la valeur de la colonne datenais est supérieure ou égal au 1 er janvier 1985 SELECT * FROM t_membre WHERE datenais >= 01/01/1985 ; Ex. : Afficher les colonnes nom et prenom de la table artiste : choisir les lignes pour lesquelles la valeur de la colonne paysorigine_artiste est égale à Italie SELECT nom, prenom FROM t_artiste WHERE lower(paysorigine) = Italie ;2 Ex. : Afficher toutes les colonnes de la table membre : choisir les lignes pour lesquelles la valeur de la colonne datenais est supérieure au 1 er janvier 1980 SELECT * FROM t_membre WHERE datenais > 01/01/1980 ; Concordance avec des modèles : LIKE, % et _, SIMILAR, [ ], [ ^ ], etc. paysorigine_artiste COMMENCE PAR es, avec n importe quoi derrière WHERE lower(paysorigine) LIKE 'es%'; paysorigine_artiste contient un. WHERE lower(paysorigine) LIKE '%un%'; paysorigine_artiste se termine par E, avec n importe quoi devant. WHERE lower(paysorigine) LIKE '_e%'; paysorigine_artiste commence par un lettre comprise entre F et M, avec n importe quoi derrière. WHERE lower(paysorigine) SIMILAR '[f-m]%'; paysorigine_artiste ne commence pas par un lettre comprise entre F et M, avec n importe quoi derrière. WHERE lower(paysorigine) SIMILAR '[^f-m]%'; 2 Dans la comparaison avec des chaînes de caractères, on utilisera des fonctions de conversion en majuscule (UPPER) ou minuscule (LOWER) afin d être sûr de la comparaison effectuée. Les SGBDR sont en général paramétrés pour, lors des comparaison, ignorer les différences majuscules/minuscules PATDEZ-2006- SELECT pour des requêtes d extraction sur une table Page 3/8
Utilisation des listes de valeurs : IN, NOT IN Ex. : Afficher toutes les colonnes de la table oeuvre : choisir les lignes pour lesquelles la colonne paysorigine_artiste est l une des valeurs France ou Italie. WHERE lower(paysorigine) IN ( france, italie ); Ex. : Afficher toutes les colonnes de la table oeuvre : choisir les lignes pour lesquelles la colonne paysorigine_artiste N EST PAS l une des valeurs France ou Italie. WHERE lower(paysorigine) NOT IN ( france, italie ); Intervalles : BETWEEN... AND, NOT BETWEEN AND Afficher toutes les colonnes de la table oeuvre : choisir les lignes pour lesquelles la colonne annee_oeuvre est comprise entre 1800 et 1900 WHERE annee BETWEEN 1800 AND 1900; Les connecteurs logiques pour combiner des critères : AND, OR Ex. : Afficher toutes les colonnes de la table oeuvre : choisir les lignes pour lesquelles la colonne annee_oeuvre est supérieure ou égal à 1800 ET inférieure ou égal à 1900 (= comprise entre 1800 et 1900, les bornes sont comprises) WHERE annee >= 1800 AND annee <= 1900; Ex. : Afficher toutes les colonnes de la table oeuvre : choisir les lignes pour lesquelles la valeur de la colonne annee_oeuvre est inférieure à 1800 OU supérieure à 1900 WHERE annee < 1800 OR annee > 1900; Opérateur de négation d une condition : NOT Ex. : Afficher toutes les colonnes de la table oeuvre : choisir les lignes pour lesquelles la condition annee_oeuvre comprise entre 1800 et 1900 N EST PAS VRAIE. WHERE NOT (annee >= 1800 AND annee <= 1800); Ex. : Afficher toutes les colonnes de la table artiste : choisir les lignes pour lesquelles la condition (paysorigine = Italie ) N EST PAS VRAIE, WHERE NOT (lower(paysorigine) = italie ); PATDEZ-2006- SELECT pour des requêtes d extraction sur une table Page 4/8
Valeurs non renseignées : IS NULL, IS NOT NULL Ex. : Afficher toutes les colonnes de la table oeuvre : choisir les lignes pour lesquelles la valeur de la colonne annee_oeuvre est renseignée (= n est pas nulle) WHERE annee IS NOT NULL; Ex. : Afficher toutes les colonnes de la table oeuvre : choisir les lignes pour lesquelles la valeur de la colonne annee_oeuvre N EST PAS renseignée (= est nulle) WHERE annee IS NULL; Clause GROUP BY, colonnes et fonctions d agrégation Dès que GROUPER PAR ==> GROUP BY + colonnes de regroupement Compter en totalité, compter par : COUNT, DISTINCT Ex. : Afficher le nombre de lignes de la table membre après avoir choisi les lignes pour lesquelles la valeur de la colonne id_memb est inférieure à 50 SELECT COUNT(*) FROM t_membre WHERE id_memb < 50; Ex. : Afficher le nombre de lignes de la table oeuvre pour lesquelles la valeur de la colonne annee_œuvre N EST PAS NULLE SELECT COUNT(annee) FROM t_oeuvre; Ex. : Afficher le nombre de lignes de la table artiste pour lesquelles la valeur de la colonne paysorigine_artiste EST DIFFERENTE (=nombre de valeurs différentes de paysorigine_artiste) SELECT COUNT(DISTINCT paysorigine) FROM t_artiste; Ex. : Afficher le nombre de lignes de la table artiste PAR valeur de paysorigine SELECT paysorigine, COUNT(*) FROM t_artiste GROUP BY paysorigine; Calculer la somme en totalité, la somme par : SUM, DISTINCT Ex. : Afficher la somme des valeurs numériques de la colonne largeur_peinture à partir de la table oeuvre SELECT SUM(largeur) as LargeurTotale Ex. : Afficher la somme des valeurs numériques de la colonne largeur_peinture à partir de la table œuvre par valeur différente de hauteur_peinture SELECT hauteur, SUM(largeur) as LargeurTotale FROM t_peinture GROUP BY hauteur; PATDEZ-2006- SELECT pour des requêtes d extraction sur une table Page 5/8
Calculer la moyenne en totalité, la moyenne par : AVG, DISTINCT Ex. : Afficher la moyenne des valeurs numériques de la colonne calculée à partir de la table peinture SELECT AVG(largeur_peinture * hauteur_peinture) as surfmoyenne Ex. : Afficher la moyenne des valeurs DIFFERENTES de la colonne calculée à partir de la table oeuvre SELECT AVG(DISTINCT(largeur_peinture * hauteur_peinture)) as surfmoyenne2 Ex. : Afficher la somme des valeurs de la colonne largeur_peinture à partir de la table œuvre par valeur différente de hauteur_peinture SELECT hauteur, SUM(largeur) as LargeurTotale FROM t_peinture GROUP BY hauteur; Recherche du minimum en totalité, le minimum par : MIN Ex. : Afficher la valeur la plus petite de la colonne largeur_peinture à partir de la table peinture SELECT MIN(largeur) Ex. : Afficher la valeur la plus petite de la colonne largeur_peinture à partir de la table œuvre par valeur différente de hauteur_peinture SELECT hauteur, MIN(largeur) FROM t_peinture GROUP BY hauteur; Recherche du maximum en totalité, le maximum par : MAX Ex. : Afficher la valeur la plus grande de la colonne calculée à partir de la table peinture SELECT MAX(largeur * hauteur) Ex. : Afficher la valeur la plus grande de la colonne largeur_peinture à partir de la table œuvre par valeur différente de hauteur_peinture SELECT hauteur, MAX(largeur) FROM t_peinture GROUP BY hauteur; PATDEZ-2006- SELECT pour des requêtes d extraction sur une table Page 6/8
Clause HAVING, choisir les lignes après l agrégation Utilisation des opérateurs de comparaison sur les valeurs agrégées Ex. : Afficher le nombre de lignes de la table artiste par valeur de paysorigine_artiste, en ne prenant que les valeurs de paysorigine_artiste pour lesquelles le nombre d artistes est supérieur à 2. SELECT paysorigine, COUNT(*) FROM t_artiste GROUP BY paysorigine HAVING COUNT(*) > 2; Clause ORDER BY, classement final du résultat Classement croissant : ASC, pour ASCending (valeur par défaut) Classement décroissant : DESC, pour DESCending Ex. : Afficher la liste des membres classés par ordre alpha du nom, puis du prénom SELECT nom, prenom FROM t_artiste ORDER BY nom, prenom ; Ex. : Afficher le nombre de lignes de la table artiste par valeur de paysorigine_artiste, en ne prenant que les valeurs de paysorigine_artiste pour lesquelles le nombre d artistes est supérieur à 2. SELECT paysorigine, COUNT(*) AS nbartistes FROM t_artiste GROUP BY paysorigine HAVING COUNT(*) > 2 ORDER BY nbartistes DESC; PATDEZ-2006- SELECT pour des requêtes d extraction sur une table Page 7/8
Complément Plusieurs requêtes SQL peuvent ensuite être assemblées : Requête1 UNION [ALL] requête2 UNION [ALL] requête3... [ORDER BY...]; Met bout à bout les résultats des différentes requêtes et supprime les doublons (DISTINCT implicite) à moins que ALL soit spécifié ; Requête1 INTERSECT [ALL] requête2; Renvoie les lignes communes aux 2 requêtes et supprime les doublons (DISTINCT implicite) à moins que ALL soit spécifié ; Requête1 EXCEPT [ALL] requête2; Renvoie les lignes de requete1 qui ne sont pas dans requete2 et supprime les doublons (DISTINCT implicite) à moins que ALL soit spécifié ; Ces opérations nécessitent que les requêtes soient UNION-COMPATIBLE, c'est-à-dire qu elles renvoient le même nombre de colonnes et que les colonnes soient d un type de données compatible. Evaluation de la performance des requêtes Les SGBD mettent à disposition des développeurs un ordre permettant d évaluer la performance d une requête. L utilisation de ce type d outil permet l optimisation de requêtes complexes afin de réduire la taille des résultats intermédiaires. Par exempple, pour PostgreSQL : EXPLAIN requête_sql ; Cependant les performances dépendent de nombreux autres critères (placement des fichiers de bases de données et journaux sur les disques, exploitation en milieu transactionnel, accès concurrents, etc.). PATDEZ-2006- SELECT pour des requêtes d extraction sur une table Page 8/8