Requ PowerPoint PPT Presentation

presentation player overlay
1 / 47
About This Presentation
Transcript and Presenter's Notes

Title: Requ


1
RequĂȘtes SQL par lexemple
Frédéric Gava (MCF) gava_at_univ-paris12.fr LACL,
bùtiment P2 du CMC, bureau 223 Université de
Paris XII Val-de-Marne 61 avenue du Général de
Gaulle 94010 Créteil cedex
2
Généralités
  • Cette prĂ©sentation ne se veut pas exhaustif
  • SQL comprend de nombreux autres choses non
    décrites ici (manque temps ou trop technique)
  • Pour plus de dĂ©tails, je vous conseil les
    références suivantes
  •  SQL pour les nuls 
  • cours sur internet
  • livres
  • SQL comprend
  • Un langage de dĂ©finition des donnĂ©es (LDD)
  • Un langage de manipulation des donnĂ©es (LMD)
  • SQL  Structured Query Language 
  • Il existe une version graphique des requĂȘtes SQL
    sous Microsoft Access. Nétant pas  standard ,
    elle ne sera pas présenté ici. Vous trouverez
    néanmoins un cours par un anonyme sur ma page web

3
Le langage de définition des données
4
Les tables et types
  • Nous souhaitons crĂ©er les tables suivantes
  • Client(NumCl, NomCl, AdresseCl, CodePost, Ville,
    Tél)
  • Article(NumAr, Designation, PrixUnitĂ©, QteStock)
  • Vendeur(NomVd, QualitĂ©, Salaire, Commission)
  • Commande(NumCom, NumCl, NumVd, DateCom)
  • LigneCom(NumCom,NumLg, NumAr, QteCom)
  • Nous utiliserons les types de donnĂ©es suivants
  • CHAR(N) chaĂźne de caractĂšre de longueur maxi N
  • INTEGER entier
  • NUMBER(N) nombre de longueur (en chiffre) maxi
    N
  • FLOAT rĂ©el (0.934 ou 14.3434 etc.)
  • DATE une date (format dĂ©pend du SGBD et du
    pays)
  • NULL valeur nulle

5
Retour sur les clés
  • Une clĂ© primaire est une clĂ© dune table qui est
    composée dune ou plusieurs (dit clé composée)
    attributs (colonnes) de la table et est utilisée
    pour identifier chaque ligne de maniĂšre unique.
    La clé primaire ne doit pas contenir de colonne
    valeur NULL.
  • Une clĂ© unique possĂšde les mĂȘmes propriĂ©tĂ©s
    quune clé primaire à lexception quune colonne
    dĂ©finie comme clĂ© unique peut ĂȘtre NULL. Elle
    contrÎle lunicité de la valeur
  • Une clĂ© Ă©trangĂšre reprĂ©sente une relation entre
    les tables. Elle est composée dune ou plusieurs
    attributs (colonnes) dont les valeurs dépendent
    de clés primaires (ou uniques) dautres tables
  • On parle dintĂ©gritĂ© rĂ©fĂ©rentielle quand on veut
    signifier que les relations représentées par les
    clés sont maintenues. Elle assure la cohérence
    des données.

6
Création de tables
  • CREATE TABLE Client (
  • NumCl INTEGER,
  • NomCl CHAR(20),
  • AdresseCL CHAR(20),
  • CodePost NUMBER(5),
  • Ville CHAR(20),
  • TĂ©l NUMBER(8))
  • CrĂ©ation simple car pas de contraintes
    dintégrités (CI)
  • Nous rappelons quune CI est dĂ©finie pour
    contrÎler la validité des valeurs à insérer
  • Remarque nous Ă©crirons en rouge et majuscule
    les mots clés en SQL. Cela nest pas obligatoire
    et ne sert que pour ces transparents.
  • CREATE TABLE permet donc de crĂ©er un nouvelle
    table en explicitant la liste des attributs de la
    table

7
Les contraintes
  • Les contraintes les plus importantes sont les
    suivantes
  • UNIQUE interdit davoir deux lignes ayant la
    mĂȘme valeur pour cette colonne et les valeurs
    NULL sont autorisées
  • PRIMARY KEY spĂ©cifie que le colonne est
    utilisĂ©e comme clĂ© primaire. Cela a donc le mĂȘme
    effet que UNIQUE mais les valeurs ne peuvent ĂȘtre
    NULL
  • CHECK est un mot associĂ© Ă  une condition qui
    doit ĂȘtre vĂ©rifiĂ©e pour chaque valeur insĂ©rĂ©e
  • REFERENCES dĂ©crit une contraintes
    référentielle (clé étrangÚre) par rapport à une
    clé primaire dune autre table
  • PRIMARY KEY UNIQUE NOT NULL
  • En fait, CONSTRAINT est optionnel. Par contre,
    il permet de donner un nom Ă  chaque contrainte
    qui sera sauvegardé dans le dictionnaire des
    données CONSTRAINT nom NOT NULL
  • Nous pouvons donc dĂ©finir les tables

8
Exemples (1)
  • CREATE TABLE Client (
  • NumCl NUMBER CONSTRAINT PRIMARY KEY,
  • NomCl CHAR(20) CONSTRAINT NOT NULL,
  • CodePost NUMBER(5) CHECK (CodePost BETWEEN 100000
    AND 95999),
  • etc.)
  • BETWEEN permet dexpliciter les bornes de la
    valeur
  • DEFAULT permet de donner une valeur par dĂ©faut
    qui nest pas NULL quand on oublie dajouter une
    valeur pour cette attribut
  • CREATE TABLE Article (
  • NumAr NUMBER PRIMARY KEY,
  • Designation CHAR(40) CONSTRAINT ades NOT NULL,
  • PrixUnitĂ© NUMBER(7),
  • QteStock NUMBER DEFAULT 0)

9
Exemples (2)
  • CREATE TABLE Vendeur (
  • NumVd NUMBER PRIMARY KEY,
  • NomVd, CHAR(20) NOT NULL,
  • QualitĂ© CHAR(2),
  • Salaire NUMBER(8) NOT NULL,
  • Com NUMBER(2) CHECK (Com BETWEEN 0 AND 100))
  • CREATE TABLE Commande (
  • NumCom NUMBER,
  • NumCl NUMBER REFERENCES Client(NumClient),
  • NumVd NUMBER REFERENCES Vendeur(NumVd)
  • DateCom DATE)

10
Exemples (3)
  • On peut aussi ajouter quelle est la clĂ©
    (notamment quand elle est multiple) Ă  la fin de
    la création. Exemple
  • CREATE TABLE LigneComm (
  • NumCom INTEGER,
  • Nligne INTEGER,
  • NumArticle NUMBER CONSTRAINT nlaid REFERENCE
    Article(NumArticle),
  • QteCom NUMBER NOT NULL CHECK (QteComgt0),
  • PRIMARY KEY (NumCom, Nligne))

11
Retour sur les  vues 
  • Une vue est une perception logique sur les
    données dune ou plusieurs tables (ou vues). Elle
    est dĂ©finie Ă  partir dune requĂȘte
    dinterrogation du LDD et hĂ©rite les mĂȘmes
    caractéristique que les objets auquel elle se
    réfÚre (type, contraintes)
  • Les vues sont dĂ©finies pour fournir un niveau de
    sécurité supplémentaire sur les données dune
    table (un avocat ne lit pas les données dun
    procureur)
  • Une vue ne nĂ©cessite aucune allocation mĂ©moire
    pour obtenir les données, contrairement à une
    table. Sa consommation en ressources consiste
    seulement en sa définition dans le dictionnaire
    des données

12
Les vues en SQL
  • CREATE VIEW ClientParis (NumCl, NomCl, TĂ©lCl) AS
    SELECT NumCl, NomCl, TélCl FROM Client WHERE
    ville"Paris"
  • Suppression dune vue DROP VIEW ClientParis
  • COMMIT pour que le SGBD prennent en compte les
    modification physiquement (vues et modifications
    des tables de la suite de ce cours)

13
Le langage de manipulation des données
14
Insertion de valeurs
  • Il faut maintenant insĂ©rer des donnĂ©es dans les
    tables
  • Forme gĂ©nĂ©ral INSERT INTO Table VALUES
    (données)
  • Exemple
  • INSERT INTO Client VALUES (1,"Delacroix", "45,
    rue Royal", 75008, "Paris", 43151678)
  • Autre forme INSERT INTO Client (liste des
    champs) VALUES (valeurs dans lordre des champs
    données)
  • Exemple
  • INSERT INTO Client (NumCl, NomCl, AdresseCl,
    CodePost, Ville, Tél) VALUES (1,"Delacroix", "45,
    rue Royal", 75008, "Paris", 43151678)

15
Manipulation de la BD (1)
  • Effacer une table de la base
  • Forme gĂ©nĂ©ral DROP TABLE nomtable
  • Exemple DROP TABLE Client
  • Modifier une table
  • PremiĂšre forme, ajouter un attribut ALTER
    TABLE Client ADD Remarque CHAR(80)
  • Seconde forme, modifier le type dun attribut
    ALTER TABLE Client MODIFY Ville CHAR(30)
  • Remarques
  • on peut faire plusieurs modifications Ă  la fois.
  • on ne peut modifier une table que pour
    laugmenter !

16
Manipulation de la BD (2)
  • Mettre Ă  jour une table. On utilise la clĂ© pour
    choisir la bonne ligne de la table. Exemple
  • UPDATE Client SET adresse"74 Avenue De Gaulle",
    ville"Grenoble", CodePost"38500", Tél76581011
    WHERE NumCl1
  • UPDATE Article SET PrixPrix0.3
  • Effacer toutes les donnĂ©es dune table. Exemple
  • Suppression physique (plus sur les disques)
  • DELETE FROM Client
  • DELETE FROM Client WHERE ville"Paris" 
  • Suppression logique (permet de garder lespace
    allouĂ© pour le profit de la mĂȘme table)
  • TRUNCATE TABLE Article REUSE STORAGE

17
RequĂȘtes de donnĂ©es
18
Les requĂȘtes SQL
  • Maintenant que nous avons dĂ©finit les tables et
    entrées les données, il est naturel de vouloir
    extraire certaines de ses données
  • Pour cela nous allons voir comment Ă©crire des
    requĂȘtes SQL
  • Cela va nous permettre de
  • lire complĂštement une table
  • lire une partie dune table
  • faire des jointures de diffĂ©rentes tables
  • tables complĂštes
  • ou quavec des sous-parties
  • faire des sous-requĂȘtes pour crĂ©er des tables
    temporaires et en faire des jointures
  • etc.

19
Les requĂȘtes simples
  • Afficher toutes les donnĂ©es de la table Client
  • SELECT FROM Client
  • De Paris SELECT FROM Client WHERE
    Ville"Paris"
  • SELECT "Client Parisiens" FROM Client WHERE
    Ville "Paris"
  • Lister que les noms et adresses des clients
  • SELECT NomCl, AdrCl FROM Client
  • De Paris ou Rouen SELECT NomCl, AdrCl FROM
    Client WHERE (Ville"Paris") OR (Ville"Rouen")
  • Lister tout les articles dont le prix unitaire
    est gt 150 et dont la quantité est lt 100
  • SELECT FROM Article WHERE (Prix gt 150) AND
    (Qtélt100)
  • Lister toutes les commandes enregistrĂ©s aprĂšs le
    2 janvier 1995
  • SELECT FROM Commande WHERE DateEnrgt02-01-1995

20
Quelques prédicats (1)
  • Le prĂ©dicat BETWEEN AND, exemples
  • Lister tout les articles dont les prix sont
    compris entre 150 et 200 euros SELECT FROM
    Article WHERE Prix BETWEEN 150 AND 200
  • Lister tout les consommables non enregistrĂ©s
    entre les dates du 1 janvier 1995 et du 31 mars
    1996 SELECT FROM Consommable WHERE DateCom
    NOT BETWEEN 01-01-1995 AND 31-03-1996
  • Remarque On peut Ă©crire une autre requĂȘte du
    premier problĂšme mais celle-ci sera beaucoup
    moins efficace car elle chargera plusieurs fois
    la table en mémoire (SELECT FROM Article
    WHERE Prixgt150) INTERSECT (SELECT FROM Article
    WHERE Prixlt200)
  • Le prĂ©dicat IN, exemples
  • Lister tout les clients des villes de Paris,
    Rouen, Créteil SELECT FROM Client WHERE Ville
    IN (Paris, Rouen, Créteil)
  • Lister tout les articles dont le prix unitaire
    est 5, 11, 17, 23, 31, 37 SELECT FROM ARTICLE
    WHERE Prix IN (5, 11, 17, 23, 31, 37)

21
Quelques prédicats (2)
  • Le prĂ©dicat LIKE
  • Lister tout les clients dont le nom se termine
    par "nd" SELECT FROM Client WHERE NomCl LIKE
    nd
  • Lister tout les article dont la dĂ©signation est
    de 7 caractĂšres, commence par N et se termine
    par d SELECT FROM Article WHERE Designation
    LIKE N-----d
  • Le prĂ©dicat NULL
  • Lister tout les articles dont la dĂ©signation na
    pas été saisie (est nulle) SELECT FROM
    Article WHERE Designation IS NULL

22
Retour sur la jointure (1)
  • Produit cartĂ©sien
  • concatĂ©nation de toutes les lignes de la
    premiĂšre table avec toutes les lignes de la
    seconde table.
  • Exemple
  • Jointure
  • lien entre 2 tables disposant dau moins une
    colonne commune (sémantiquement). On associe a
    chaque ligne de la premiĂšre table toutes les
    lignes de la seconde table
  • Exemple

Table 1 Table 2 Produit
a x a,x
b y a,y
c b,x
b,y
c,x
c,y
Table 1 Table 2 Jointure
a1,b1 b1,c1 a1,b1,c1
a2,b1 b2,c2 a2,b1,c1
a3,b2 b3,c3 a3,b2,c2
23
Retour sur la jointure (2)
  • Une jointure est un lien entre 2 tables
    disposant dune ou plusieurs colonnes commune
    sémantiquement
  • LopĂ©ration de jointure consistera Ă  crĂ©er une
    table temporaire composé des lignes satisfaisant
    la condition de jointure
  • Par exemple, pour connaĂźtre les clients qui ont
    passé au moins une commande, on est amené à
    utiliser le lien entre les tables Client et
    Commandes puis den extraire seulement les lignes
    satisfaisant la condition suivante
  • Client.NumCl Commande.NumCl

24
Exemples jointure
  • Equi-jointure
  • Lister tout les clients Parisien qui ont passĂ©
    une commande entre les dates du premier janvier
    1993 et aujourdhui
  • SELECT Client.NumCl, NomCl, AdrCl, Commande.Date
    FROM Client, Commande WHERE Client.NumClCommande.
    NumCl AND Client.Ville"Paris" AND Date BETWEEN
    01-01-1993 AND SYSDATE
  • Jointure multiple (equi et theta)
  • Lister tous les articles qui nont pas Ă©tĂ©
    commandé entre le premier janvier 1993 et
    aujourdhui
  • SELECT Article.NumArticle, Designation FROM
    Article, LigneComm, Commande WHERE
    Commande.NumComLigneComm.NumCom AND
    Article.NumArticleltgtLigneComm.NumArticle AND
    Commande.Date BETWEEN 01-01-1993 AND SYSDATE
  • On peut faire plus simple et Ă©viter dĂ©crire
    toujours le nom de la table
  • SELECT A.NumArticle, Designation FROM Article A,
    LigneComm LC, Commande C WHERE C.NumComLC.NumCom
    AND A.NumArticleltgtLC.NumArticle AND C.Date
    BETWEEN 01-01-1993 AND SYSDATE

25
Jointure externe (1)
  • Dans les diffĂ©rents types de jointure prĂ©sentĂ©s
    ci-dessus, toutes les lignes de la premiĂšre table
    qui nont pas de lignes dans la seconde table et
    qui vérifient la condition de jointure, ne font
    pas partie du résultat final.
  • Si on souhaite faire apparaĂźtre cette ligne dans
    le résultat, on utilise la jointure externe
  • Une jointure externe est une jointure qui
    favorise une table par rapport Ă  une autre.
    Aussi, les lignes de la table dominante seront
    affichĂ© mĂȘme si la condition nest pas rĂ©alisĂ©e.
    Une jointure externe est explicité par
    lopérateur () qui est placé dans la clause
    WHERE daprĂšs le nom de la table et celui de la
    colonne subordonné. Comme suit
  • WHERE table1.colonne table2.colonne ()
  • WHERE table1.colonne () table2.colonne

26
Jointure externe (2)
  • Exemple Lister tous les clients parisiens qui
    ont passé ou non une ou plusieurs commande entre
    la période du 1er janvier et aujourdhui
  • SELECT X.NumClient, Nom, PrĂ©nom, adresse,
    DateComm, NumComm FROM Client X, Commande Y WHERE
    X.NumClientY.NumClient () AND Ville"Paris" AND
    Date BETWEEN 01-Jan-93" AND SYS_DATE

27
Condition de sous-requĂȘte (1)
  • SQL permet de comparer une expression ou une
    colonne ou rĂ©sultat dune autre requĂȘte SELECT.
    Cette condition est dite condition de
    sous-requĂȘte  et les 2 requĂȘtes sont dites
     requĂȘte imbriquĂ©s
  • Bien-sur, une sous-requĂȘte peut faire appel Ă 
    une autre sous-requĂȘte etc.
  • Les requĂȘtes imbriquĂ©s dans SQL peuvent ĂȘtre
    utilisés pour comparer une expression ou une
    liste dexpression au résultat dune autre
    requĂȘte SELECT, dĂ©terminer lappartenance dune
    expression ou lexistence dune ligne dans le
    rĂ©sultat dune requĂȘte SELECT etc.

28
Condition sous-requĂȘte (2)
  • Une condition de sous-requĂȘte peut ĂȘtre formulĂ©
    selon lune des possibilité suivante
  • WHERE Exp OpĂ©rateur_de_comparaison ALL ANY
    SOME (RequĂȘte_SELECT)
  • WHERE Exp NOT IN (RequĂȘte_SELECT)
  • WHERE NOT EXISTS (RequĂȘte_SELECT)
  • LĂ©valuation des sous-requĂȘtes peut renvoyer
    plusieurs valeurs qui sont interprété comme suit
  • ALL la condition est vrai, si la comparaison
    est vrai pour chacune des valeurs retournées
    (remarque si lexpression de condition est de
    type numérique et si lopérateur de comparaison
    est gt alors la sous-requĂȘte sera Ă©quivalente Ă 
    lextraction de la valeur maximale car si la
    condition est vrai pour le maximum, elle est
    aussi vrai pour toutes les autres)

29
Condition sous-requĂȘte (3)
  • ANY la condition est vrai si la comparaison
    est vrai pour au moins une des valeurs retournée
    (remarque si . lt alors .. minimal car .
    minimum , elle )
  • SOME ANY
  • IN la condition est vrai si la comparaison est
    vrai pour une des valeurs retournées par la
    sous-requĂȘte
  • EXISTS il est un peu diffĂ©rent des autres
    opérateurs, il renvoie un booléen (vrai ou faux)
    selon le rĂ©sultat de la sous-requĂȘte. Si
    lĂ©valuation de la sous-requĂȘte donne lieu a une
    ou plusieurs ligne, la valeur retourné est vrai.
    Cette valeur sera fausse dans le cas contraire.

30
Exemples de sous-requĂȘtes (1)
  • Lister tous les articles dont la quantitĂ© en
    stock est gt Ă  toutes quantitĂ© commandĂ© du mĂȘme
    article
  • SELECT IdArticle, Designation, QtĂ©Stock from
    Article X WHERE QtéStock gt ALL (SELECT QtéComm
    FROM ligne_commande Y WHERE X.IdArticleY.IdArticl
    e)
  • SELECT IdArticle, Designation, QtĂ©Stock FROM
    Article X WHERE QtéStock gt (SELECT
    MAX(QtéCommandé) FROM ligne_commande Y WHERE
    X.IdArticleY.IdArticle
  • Lister tous les articles dont la quantitĂ© est gt
    a au moins une quantitĂ© commandĂ© au mĂȘme article
  • gt ANY (SELECT QtĂ©CommandĂ© )
  • ou SELECT Min(QtĂ©CommandĂ©)

31
Exemples de sous-requĂȘtes (2)
  • Lister tous les clients parisien qui ont passĂ©
    une commande entre le 1er janvier 93 et
    aujourdhui et dont la quantité commandé est
    égale à la quantité en stock
  • SELECT DISTINCT IdClient FROM Commande WHERE
    IdClient IN (SELECT IdClient FROM Client WHERE
    ville"Paris") AND DateComm BETWEEN "01-Jan-93 
    AND SYSDATE)
  • MĂ©mo technique
  • (lt ou ) 1 seul valeur
  • (IN, ALL, ANY) une liste de valeur
  • EXISTS, un ensemble de valeur

32
RequĂȘtes plus complexes
33
Les fonctions dagrégat (1)
  • Ces fonctions sont appliquĂ©s sur des groupes de
    données Ainsi, on peut déterminer le nombre de
    ligne par table ou par groupe de données,
    calculer la somme ou la moyenne ou déterminer le
    maximum ou le minimum dune colonne etc.
  • Les fonction dagrĂ©gat offert par SQL sont les
    suivantes
  • COUNT() nombre de ligne satisfaisant la
    requĂȘte
  • SELECT COUNT() FROM Clients
  • SELECT COUNT(NumClient) FROM Clients
  • COUNT(DISTINCT Colonne) permet dĂ©viter les
    doublon
  • Calculer le nombre de clients qui ont passĂ© des
    commandes entre le 01-10-1999 et aujourdhui
  • SELECT COUNT(DISTINCT NumClient) FROM Commandes
    WHERE Date BETWEEN 01-10-1999 AND SYS_DATE
  • SUM(DISTINCT Colonne) permet de faire la somme
    des valeurs de la colonne donnée et satisfaisant
    la requĂȘte. Loption DISTINCT somme les valeurs
    uniques

34
Les fonctions dagrégat (2)
  • Suite des fonctions dagrĂ©gat possible
  • AVG(DISTINCT Colonne) permet de calculer la
    moyenne ( AVeraGe  en Anglais) des données
    satisfaisant la requĂȘte.
  • MAX(DISTINCT Colonne) pour le maximal et
    MIN(DISTINCT Colonne) pour le minimal
  • STDDE(DISTINCT Colonne) pour lĂ©cart type et
    VARIANCE(DISTINCT Colonne) pour la variance
  • En prĂ©sence de valeurs NULL dans les donnĂ©es, la
    fonction COUNT prend en compte ces lignes. Les
    autres fonctions ignorent les NULL
  • Important Les fonctions dagrĂ©gat ne peuvent
    en aucun cas ĂȘtre ailleurs que suite au SELECT
    (pas dans la clause WHERE par exemple)

35
Les fonctions dagrégat (3)
  • Exemples
  • Lister le nombre darticles, les prix unitaires,
    maximum, minimum et moyen des différents articles
  • SELECT COUNT() MAX(PrixUnitaire)
    MIN(PrixUnitaire) AVG(PrixUnitaire) FROM Article
  • Calculer le montant total du stock darticle
  • SELECT SUM(PrixUnitaireQteEnStock) FROM Article

36
Groupement de données (1)
  • Avec les fonctions dagrĂ©gats SQL permet de
    grouper des lignes de données ayant des valeurs
    communes ainsi, on peut formuler par exemple,
    une requĂȘte qui liste le nombre de clients par
    ville
  • Cette possibilitĂ© est explicitĂ© par la clause
    GROUP BY
  • Exemple Lister le nombre de lignes par
    commande
  • Imaginons une table "Client", faire un COUNT()
    sur cette table reviendrai Ă  compter le nombre de
    ligne de cette table (le nombre de clients)
  • Par contre, COUNT() sur les groupes de la table
    LigneComm donnerai le nombre de ligne par commande

37
Groupement de données (2)
  • NumClient
  • SELECT NumClient, Count() FROM LigneComm GROUP
    BY NumClient

NumCl
1
2
3
3
4
1
2
5
3
2
4
1
1
2
2
2
3
3
3
4
4
5
38
Groupement de données (3)
  • Autre exemple
  • Lister le montant de chaque commande
  • SELECT NumCom, SUM(PrixUnitQtĂ©CommandĂ©) FROM
    Article Y, LigneComm X WHERE X.NumArticleY.NumArt
    icle GROUP BY NumCom

39
Trier les données
  • Lister tous les clients par ordre de ville et de
    nom de clients
  • SELECT FROM Client ORDER BY Ville, Nom
  • ORDER BY Colonne Position
  • avec PositionASC pour ordre ascendant et DESC
    pour ordre décroissant
  • SELECT FROM Client ORDER BY Ville DESC, Nom
    ASC
  • Lister toutes les commandes par ordre
    décroissant des numéros de commande et de ligne
  • SELECT Num_Comm, Num_Ligne FROM Ligne_Comm ORDER
    BY 1 DESC, 2 DESC
  • Remarque il nest pas trĂšs utile (pas
    optimisé) dutiliser ORDER BY dans une
    sous-requĂȘte vue que lon veut juste y prendre un
    ensemble de données

40
Fusion de requĂȘtes
  • Il est possible d"unifier" des requĂȘtes avec
    des opérations ensemblistes
  • UNION
  • INTERSECT
  • Exemple stupide
  • Donnez la liste des clients vivant soit Ă  Paris
    soit à Créteil
  • (SELECT FROM Client WHERE Client.Ville"Paris")
    UNION (SELECT FROM Client WHERE
    Client.Ville"Créteil")
  • SELECT FROM Client X WHERE X.Ville"Paris" OR
    X.Ville"Créteil"

41
La clause HAVING (1)
  • Supposons que lutilisateur dĂ©sire lister les
    commandes dont le nombre de ligne est gt 5. Il se
    doit donc utiliser la condition COUNT
    (Num_Ligne)gt5 avec un regroupement sur la
    commande Num_Comm. Nous aurions la requĂȘte
    suivante
  • SELECT Num_Comm, COUNT() FROM Ligne_Comm WHERE
    COUNT(Num_Ligne)gt5 GROUP BY Num_Comm
  • Pourtant, cette requĂȘte ne peut donnĂ© le
    résultat escompté car elle contient une erreur de
    syntaxe on rappel que la condition de la clause
    WHERE ne peut en aucun cas inclure des fonctions
    dagrégats
  • La clause HAVING offert par SQL permet une
    restriction sur un groupe de ligne. Elle est liée
    Ă  la clause GROUP BY

42
La clause HAVING (2)
  • HAVING Condition la condition peut ĂȘtre une ou
    plusieurs conditions liées avec les opérations
    logique AND et/ou OR. Une condition sert Ă 
    comparer une fonction dagrégat du groupe à une
    autre fonction dagrégat ou une constante.
  • Exemples
  • RequĂȘte prĂ©cĂ©dente
  • SELECT Num_Com, COUNT() FROM Ligne_Comm GROUP
    BY Num_Comm HAVING COUNT(Num_Ligne)gt5
  • Lister la somme de toutes les commandes dont le
    nombre de ligne est gt 4
  • SELECT NumCom, SUM(PrixUnitĂ©QtĂ©_Comm) FROM
    LigneComm X, Article Y WHERE X.NumArticleY.NumArt
    icle GROUP BY NumComm HAVING COUNT(Num_Ligne)gt4

43
La clause HAVING (3)
  • La clause HAVING est une condition de
    regroupement
  • Exemple
  • SELECT NumCom, SUM(PrixUnitĂ©QtĂ©_Comm) FROM
    LigneComm X, Article Y WHERE X.NumArticleY.NumArt
    icle GROUP BY NumComm HAVING SUM(PrixUnitéQté_Com
    m)gt5
  • Voici donc lordre dĂ©criture dans une requĂȘte
  • SELECT
  • WHERE
  • GROUP
    BY

  • HAVING

44
Exemples examen (1)
  • Nous utiliserons la base de donnĂ©e suivante
  • Magazin(Num_Mag, Adr, Gu)
  • Article(Num_Art, Nom, Poids, Couleur,
    Prix_Achat, Prix_Vente, Num_Fournisseur)
  • Clients(Num_Client, NomCl, PrĂ©nom, Pays, AdrCl)
  • Ventes(Num_Client, Num_Mag, Num_Art, Date,
    Quantité, PrixRéel)
  • DonnĂ©e en SQL les requĂȘtes suivantes

45
Exemples examen (2)
  • Calculer par article, la remise total accordĂ©
    par rapport aux prix de vente catalogué pour une
    semaine.
  • On va construire au fur et Ă  mesure la requĂȘte
    (pas Ă  lexamen)
  • SELECT Nom FROM Ventes, Articles WHERE
    Ventes.Num_ArtArticles.Num_Art AND Date BETWEEN
    01-10-1999 AND SYS_DATE
  • SELECT Nom, SUM(QtĂ©(Prix_Vente-PrixRĂ©el) FROM
    Ventes, Articles WHERE Date BETWEEN 01-10-1999
    AND SYS_DATE AND Ventes.Num_ArtArticles.Num_Art
    GROUP BY Num_Art
  • Rechercher la couleur des articles dont le prix
    de vente moyen des articles de la couleur est gt
    100
  • SELECT Couleur, AVG(Prix_Vente) FROM Articles
    GROUP BY Couleur HAVING AVG(Prix_Vente)gt100

46
Optimisation de requĂȘtes
  • Lorsque lon Ă©crit une requĂȘte, il faut penser
    au conséquences calculatoires (en terme de calcul
    et de ressources mémoires)
  • En effet, chaque sous-requĂȘtes, chaque jointure,
    chaque ORDER BY, chaque GROUP BY, chaque HAVING a
    pour conséquence de créer une table temporaire
    si le nombre de données est trÚs important, cela
    prend nécessairement du temps (le SGBD nest pas
    magique)
  • Il faut donc que vous pensiez au coĂ»t de vos
    requĂȘtes entre 2 requĂȘtes, pour un mĂȘme
    résultats, laquelle des 2 créera le moins de
    tables temporaires
  • Exemple regardons nos prĂ©cĂ©dentes requĂȘtes
  • En cas de doute, demander Ă  un gentil
    informaticien -)

47
À la semaine prochaine !
Write a Comment
User Comments (0)
About PowerShow.com