qu’est-ce qu’un sgbd où utilise-t-on des sgbd · et puis on écrit les programmes c ou java...
TRANSCRIPT
1
Introduction aux bases de données
Olivier [email protected]
2
Plan
• Motivations• Algèbre relationnelle• SQL• Mises à jour, vues, contraintes
3
Qu’est-ce qu’un SGBD
• Système de Gestion de Base de Données = SGBD (SGBD Relationnel = SGBD-R)
• C’est un programme qui rend plus simple la manipulation de grandes quantités de données
• Il vous permet de ne pas penser aux détails, mais de vous concentrer sur les objectifs de votre application
4
Où utilise-t-on des SGBD ?
• Backend pour les applications de gestion traditionnelles– étudiants à l’Université– applications bancaires– réservations (SNCF, avion,…)– …
• Backend pour les sites Web (Amazon,…)• Backend pour les services Web
5
Une application classique
• On veut construire un système qui permet de gérer les informations concernant:– les étudiants– les cours– les professeurs
• Qui suit tel cours, qui enseigne quoi ?
6
Gestion des données
• La gestion des données est plus que la gestion d’une base de données
• Imaginons: – disponibilité complète des données– n’importe où, n’importe quand– <votre application favorite>
• Les techniques abordées dans ce cours sont les principes pour gérer des données, peu importe où et quand
7
Peut-on faire la même chose sans SGBD ?
Sans problème ! On commence par stocker les données dans les fichiers:
Et puis on écrit les programmes C ou Java qui implantent les fonctionnalités voulues
Etudiant.txt Cours.txt Professeurs.txt
8
Sans un SGBD…
• Ajouter “Pierre Martin” dans “CoursSGBD1”
• Écrire un programme quiLit “étudiants.txt” Lit “cours.txt”Cherche et màj “Pierre Martin”Cherche et màj “CoursSGBD1”Écrit “étudiants.txt”Écrit “cours.txt”
9
Problèmes sans un SGBD…
• Crash système:– quel est le problème ?
• Beaucoup de données (disons 50 GB)– quel est le problème ?
• Accès simultanés par plusieurs utilisateurs– besoin de verrous: au niveau OS, mais
maintenant au niveau données, pas très drôle à manipuler et implanter…
Lit “étudiants.txt” Lit “cours.txt”Cherche et màj “Pierre Martin”Cherche et màj “CoursSGBD1”Écrit “étudiants.txt”Écrit “cours.txt” Crash !
10
Un SGBD
• Système 2/3
Fichiers de données
Serveur Applications
11
Fonctionnalités d’un SGBD
Le programmeur voit SQL, à deux niveaux:• Data Definition Language - DDL• Data Manipulation Language - DML
– c’est le langage de requêteDerrière, il y a:• l’optimisation des requêtes• le moteur de traitement des requêtes• la gestion du stockage• la gestion des transactions (concurrence,
récupérations)
Fonctions o!ertes par un SGBD
• Définition des données• Manipulation des données• Intégrité des données• Gestion des accès concurrents• Sécurité de fonctionnement• Confidentialité
12
13
Comment le programmeur voit-il le SGBD ?
• Il utilise le DDL pour créer des tables:
• Il utilise ensuite le DML pour peupler ou interroger les tables:
CREATE TABLE Etudiant ( Nom CHAR(30) NSS CHAR(9) PRIMARY KEY NOT NULL, Diplôme CHAR(20)) . . .
INSERT INTO Etudiant VALUES(“Charles”, “123456789”, “LicencePro”)…
14
Comment le programmeur voit-il le SGBD ? (2)
• Tables
• Implanté également avec des fichiers, mais avec de nombreuses fonctionnalités
– independance des données et des traitements = séparer la vue logique de l’implantation physique
NSS Nom Diplôme123456789 Martin LPro123456879 Durand DUT 2… … …
NSS CID123456789 CS123123456879 CS456… …
CID Nom SemestreCS123 SGBD S1CS456 Java S3
Etudiant
Suit
Cours
15
Construire une application avec un SGBD
• Modélisation– quelles sont les entités qui font partie de
l’application, et quels sont leurs liens• Conception et implantation
– l’ensemble des tables, des attributs– création des tables dans le SGBD– remplissage de la base (insertion des n-uplets)
• Développement de l’application qui va utiliser la base– plus facile puisque la gestion des données est prise en
charge par le SGBD16
Transactions
• “Pierre Martin” suit “CoursSGBD1”
Si le système plante, la transaction est soit validée, soit annulée
BEGIN TRANSACTION; INSERT INTO Suit SELECT Etudiant.NSS, Cours.CID FROM Etudiant, Cours WHERE Etudiant.nom = “Pierre Martin” and Cours.nom = “CoursSGBD1”-- autres instructions…IF tout-est-OK THEN COMMIT;ELSE ROLLBACK
17
Transactions (2)
• Une transaction = séquence d’instructions qui réussissent toutes, ou échouent toutes
• Propriétés ACID:– Atomicité: tous les e!ets, ou aucun d’eux– Cohérence: la transaction fait passer d’un état
cohérent à un état cohérent– Isolation: les e!ets d’une transaction sont
invisibles aux autres tant qu’elle n’est pas validée
– Durabilité: lorsqu’une transaction est validée, ses e!ets persistent
18
Reqûetes
• Trouver tous les cours que Pierre suit ?
• Que se passe-t-il au niveau du SGBD ?– le moteur de traitement des requêtes cherche
à répondre de manière optimale à la requête
SELECT C.nom FROM Etudiant E, Suit S, Cours CWHERE E. nom =“Pierre” andE.nss = S. nss and S.cid = C.cid
19
Requêtes, derrière la scèneRequête SQL déclarative
Le moteur d’optimisation choisit le meilleur plan d’exécution
Plan d’exécution impératif
SELECT C.nom FROM Etudiant E, Suit S, Cours CWHERE E. nom =“Pierre” andE.nss = S. nss and S.cid = C.cid
!nom
!cid=cid
!nss=nss
"nom="Pierre"
Etudiant Suit Cours
20
SGBD
• Les commerciaux: – Oracle – IBM (avec DB2)– Microsoft (SQL Server)– Sybase
• Les open source (Unix) :– PostgreSQL– Mysql
21
Tendances actuelles
• SGBD Objet-relationnel• SGBD en mémoire• XML XML XML !
– SGBD relationnel avec support de XML– Middleware entre XML SGBD relationnel– SGBD XML natifs
• Intégration de données• P2P, flux
22
Étudier les SGBD
• Plusieurs aspects: – Conception de bases de données– Programmation: requêtes, mises à jour– Implantation– Administration
• L’étude d’un SGBD recoupe plusieurs disciplines: OS, langages, IA, Logique, théorie,…
23
Plan
• Motivations• Algèbre relationnelle• SQL• Mises à jour, vues, contraintes
Le modèle relationnel
• Une base de données est représentée par un ensemble de relations (ou tables)
• Exemple– relation Personne: un ensemble de personnes– relation Diplôme: un ensemble de diplômes– relation Possède: l’association qui lie les
personnes et les diplômes
24
25
Le modèle relationnel
ProduitPNom Prix Catégorie FabricantGizmo 19.99 Gadgets GizmoWorksPowergizmo 29.99 Gadgets GizmoWorksIxus40 149.99 Photography CanonMultiTouch 203.99 Household Hitachi
Nom tableNom attributs
N-uplets
Concepts de base
• Domaine: ensemble de valeurs caractérisé par un nom– défini en extension: liste de valeurs (couleur =
{rouge, vert, bleu})– défini en intention: propriétés respectées par
toutes les valeurs (marque: caractère(20))• Relation: sous-ensemble du produit
cartésien d’une liste de domaines • Attribut: colonne de la relation
caractérisée par un nom 26
27
Algèbre relationnelle (Codd)
• Formalisme pour créer de nouvelles relations à partir de relations existantes
• Où en a-t-on besoin ?
Langagedéclaratif de
requêtesAlgèbre Implantation
SQL,Calcul relationnel
Algèbre relationnelle
28
Algèbre relationnelle (2)
• Cinq opérateurs: – Union: ∪ – Di!érence: - – Sélection: " – Projection: # – Produit cartésien: $
• Opérateurs dérivés: – Intersection, complément– Jointure– Renommage: %
29
Union et Di!érence
• R1 ∪ R2• Exemple:
– EmployésActifs ∪ EmployésEnRetraite
• R1 – R2• Exemple:
– TousLesEmployés – EmployésEnRetraite
30
Et l’intersection ?
• C’est un opérateur dérivé• R1 ∩ R2 = R1 – (R1 – R2)• On peut également l’exprimer avec une
jointure• Exemple
– TousLesEmployés ∩ EmployésEnRetraite
31
Sélection
• Renvoie tous les n-uplets qui satisfont une condition
• Notation: "c(R)• Exemples
– "Salaire > 2000 (Employés) – "nom = “Durand” (Employés)
• La condition c peut contenir =, <, &, >, ', <>
32
Exemple de sélectionEmployéEmployéNSS Nom DivisionID Salaire999999999 John 1 30 000777777777 Tony 1 32 000888888888 Alice 2 45 000
sSalaire > 40000(Employé)sSalaire > 40000(Employé)NSS Nom DivisionID Salaire888888888 Alice 2 45 000
Trouver tous les employés ayant un salaire > à 40000(
33
Projection
• Élimine des colonnes, puis les doublons• Notation: #A1,...,An (R)• Exemple: projection du numéro de sécu et
des noms:– #NSS, Nom (Employé)– Schéma obtenu: Réponse(NSS, Nom)
34
Exemple de projection
!NSS, Nom (Employé)!NSS, Nom (Employé)NSS Nom999999999 John777777777 Tony888888888 Alice
EmployéEmployéNSS Nom DivisionID Salaire999999999 John 1 30 000777777777 Tony 1 32 000888888888 Alice 2 45 000
35
Produit cartésien
• Chaque n-uplet de R1 avec chaque n-uplet de R2
• Notation: R1 $ R2• Exemple:
– Employé $ ÀCharge– Très rare en pratique, utilisé en fait dans les
jointures
36
ExempleEmployéNom NSSJohn 999999999Tony 777777777
ÀChargeNSSEmployé ACNom999999999 Emily777777777 Joe
Employé x ÀChargeEmployé x ÀChargeNom NSS NSSEmployé ACNomJohn 999999999 999999999 EmilyJohn 999999999 777777777 JoeTony 777777777 999999999 EmilyTony 777777777 777777777 Joe
37
Renommage
• Modifie le schéma, pas les instances• Notation: %B1,...,Bn (R)• Exemple:
– %NomFamille, NumSécSoc (Employé)– Schéma obtenu:
Réponse(NomFamille, NumSécSoc)
38
Jointure
• Notation: R1! R2• Signification: R1! R2 = #A("C(R1 $ R2))• Où:
– la sélection "C vérifie l’égalité entre les attributs en commun
– la projection élimine les attributs qui apparaissent en double
39
Jointure (2)
• R = S =
• R ! S=
A BX YX ZY ZZ V
B CZ UV WZ V
A B CX Z UX Z VY Z UY Z VZ V W
40
Jointure (3)
EmployéNom NSSJohn 999999999Tony 777777777
ÀChargeNSSEmployé ACNom999999999 Emily777777777 Joe
Employé ! ÀChargeEmployé ! ÀChargeNom NSS ACNomJohn 999999999 EmilyTony 777777777 Joe
41
Jointure (4)
• Étant donnés les schémas R(A, B, C, D) et S(A, C, E), quel est le schéma de R ! S ?
• Étant donnés R(A, B, C) et S(D, E), quel est le schéma de R ! S ?
• Étant donnés R(A, B) et S(A, B), quel est le schéma de R ! S ?
42
Equi Jointure
• C’est une jointure pour laquelle la condition de jointure est une égalité
• R1 !A=B R2 = "A=B (R1 $ R2)• Exemple:
– Employé ! NSS=NSS ÀCharge– C’est la jointure la plus utilisée en pratique
43
Expressions complexes en algèbre relationnelle
!nom
!nss-acheteur=nss
!pid=pid
"nom="fred"
PersonneAchatPersonne
!nss-vendeur=nss
!nss !pid
"nom="gizmo"
Produit
44
Opérations sur les multi-ensembles
• Multi-ensemble= un ensemble où chaque élément peut apparaître plusieurs fois
• Opérations sur les multi-ensembles:– {a,b,b,c}∪{a,b,b,b,e,f,f }={a,a,b,b,b,b,b,c,e,f,f }– {a,b,b,b,c,c} – {b,c,c,c,d} = {a,b,b}– "C(R): préserve le nombre d’occurrences– #A(R): pas d’élimination des doublons– Produit cartésien, jointure: pas d’élimination
des doublons• Important ! Les moteurs relationnels
fonctionnent avec des multi-ensembles !
45
Limitations de l’algèbre relationnelle
• Pas de fermeture transitive
• Requête: « trouver tous les parents directs ou indirects de Fred »– ne peut pas être exprimé en algèbre
relationnelle ! – on doit écrire un programme
Nom 1 Nom 2 LienFred Mary FrèreMary Joe CousinMary Bill ÉpouseNancy Lou Soeur
46
Plan
• Motivations• Algèbre relationnelle• SQL• Mises à jour, vues, contraintes
47
Introduction à SQL
• Langage pour interroger et manipuler les données d’une base de données
• Acronyme de Structured Query Language• Plusieurs standards:
– ANSI SQL, SQL92 (SQL2), SQL99 (SQL3)– les vendeurs supportent des sous-ensembles
de ces spécifications• Dans ce cours, on se base sur ce qui
commun à tous
48
SQL
• Data Definition Language (DDL) – Créer/modifier/supprimer des tables et leurs
attributs• Data Manipulation Language (DML)
– Interroger une ou plusieurs tables– Insérer/supprimer/modifer des n-uplets dans
les tables• XX/SQL
– Langage permettant de regrouper des instructions SQL
49
Données en SQL
• Types atomiques, types de données• Tables construites à partir des types
atomiques
• Contrairement à XML, structures plates, pas d’imbrications !
50
Types de données en SQL
• Caractères: – CHAR(20) -- longueur fixe – VARCHAR(40) -- longueur variable
• Nombres: – BIGINT, INT, SMALLINT, TINYINT– REAL, FLOAT -- précision di!érente – MONEY
• Temps/date: – DATE – DATETIME -- SQL Server
• Autres… simples à comprendre
51
Les tables
• Un n-uplet = un enregistrement• Restriction: tous les attributs sont de type
atomique• Une table = un ensemble de n-uplets
– Comme une liste…– ...non ordonnée: pas de premier(), pas de
suivant(), pas de dernier()
52
Les tables (2)
• Le schema d’une table est composé de son nom et de ses attributs: Produit(PNom, Prix, Catégorie, Fabricant)
• Une clé est un attribut pour lequel les valeurs sont uniques (généralement, on souligne la clé) Produit(PNom, Prix, Catégorie, Fabricant)
53
Requête SQL
• Forme simple
SELECT attributs FROM relations (éventuellement plusieurs) WHERE conditions (sélections)
54
Requête SQL simple
Produit PNom Prix Catégorie FabricantGizmo 19.99 Gadgets GizmoWorksPowergizmo 29.99 Gadgets GizmoWorksIxus40 149.99 Photography CanonMultiTouch 203.99 Household Hitachi
SELECT * FROM Produit WHERE Catégorie=“Gadgets”
PNom Prix Catégorie FabricantGizmo 19.99 Gadgets GizmoWorksPowergizmo 29.99 Gadgets GizmoWorks
“Sélection”
55
Requête SQL simple (2)
Produit PNom Prix Catégorie FabricantGizmo 19.99 Gadgets GizmoWorksPowergizmo 29.99 Gadgets GizmoWorksIxus40 149.99 Photography CanonMultiTouch 203.99 Household Hitachi
SELECT PNom, Prix, FabriquantFROM Produit WHERE Prix > 100
PNom Prix FabriquantIxus40 149.99 CanonMultiTouch 203.99 Hitachi
“sélection” et“projection”
56
Notation pour les requêtes
SELECT PNom, Prix, FabriquantFROM Produit WHERE Prix > 100
Produit(PNom, Prix, Catégorie, Fabriquant)
Réponse(PNom, Prix, Fabriquant)
Schéma initial
Schéma résultat
57
Sélections
Que peut-on mettre dans la clause WHERE: • x = y, x < y, x <= y, …
– pour les nombres, classique– pour les CHAR et VARCHAR: ordre
lexicographique• conversion implicite entre CHAR et VARCHAR
– pour les dates, normal• Possibilité de faire de la recherche de
motifs sur les chaînes…58
L’opérateur LIKE
• s LIKE p: recherche de motif sur les chaînes
• p peut contenir deux symboles spéciaux:– % = n’importe quelle séquence de caractères– _ = n’importe quel caractère
Produit(PNom, Prix, Catégorie, Fabriquant) Trouver les produits dont le nom contient ‘gizmo’:
SELECT * FROM ProduitWHERE PNom LIKE ‘%gizmo%’
59
Élimination des doublons
Comparée à:
SELECT DISTINCT Catégorie FROM Produit
SELECT Catégorie FROM Produit
CatégorieGadgets
PhotographyHousehold
CatégorieGadgetsGadgets
PhotographyHousehold
60
Ordonner le résultat
• L’ordre est croissant par défaut, sauf si mention contraire avec DESC
• Les égalités sont éventuellement triées grâce au deuxième (ou plus) critère dans la liste du ORDER BY
SELECT pnom, prix, fabriquant FROM ProduitWHERE catégorie=‘gizmo’ AND prix > 50 ORDER BY prix, pnom
61
Ordonner le résultat (2)
SELECT Catégorie FROM Produit ORDER BY pnom
PNom Prix Catégorie FabriquantGizmo 19.99 Gadgets GizmoWorksPowergizmo 29.99 Gadgets GizmoWorksIxus40 149.99 Photography CanonMultiTouch 203.99 Household Hitachi
?
62
Ordonner le résultat (3)
Comparée à:
SELECT DISTINCT Catégorie FROM Produit ORDER BY catégorie
CatégorieGadgets
HouseholdPhotography
SELECT DISTINCT Catégorie FROM Produit ORDER BY pnom
?
63
Jointures en SQL
• Relier deux (au moins) tables:PNom Prix Catégorie FabriquantGizmo 19.99 Gadgets GizmoWorksPowergizmo 29.99 Gadgets GizmoWorksIxus40 149.99 Photography CanonMultiTouch 203.99 Household Hitachi
CNom PrixAction PaysGizmoWorks 25 USACanon 65 JapanHitachi 15 Japan
Produit
CompagnieQuelle est lelien entre cesdeux tables ?
64
Jointures en SQL (2)
Produit(Pnom, prix, catégorie, fabriquant)Compagnie(Cnom, prixAction, pays)
Trouver tous les produits à moins de 200( fabriqués au Japon, et a)cher leurs noms et prix
SELECT pnom, prix FROM Produit, CompagnieWHERE fabriquant=cnom AND pays=‘Japon’ AND prix <= 200
Lienentre Produit et
Compagnie
65
Jointures en SQL (3)
PNom Prix Catégorie FabriquantGizmo 19.99 Gadgets GizmoWorksPowergizmo 29.99 Gadgets GizmoWorksIxus40 149.99 Photography CanonMultiTouch 203.99 Household Hitachi
CNom PrixAction PaysGizmoWorks 25 USA
Canon 65 JapanHitachi 15 Japan
SELECT pnom, prix FROM Produit, CompagnieWHERE fabriquant=cnom AND pays=‘Japon’ AND prix <= 200
Pnom PrixIxus40 149.99
66
Jointures en SQL (4)
Produit(Pnom, prix, catégorie, fabriquant)Compagnie(Cnom, prixAction, pays)
Trouver tous les pays qui fabrique un produit de la catégorie ‘Gadgets’
SELECT pays FROM Produit, CompagnieWHERE fabriquant=cnom AND catégorie=‘Gadgets’
67
Jointures en SQL (5)
Produit(pnom, prix, catégorie, fabriquant) Achat(acheteur, vendeur, magasin, produit) Personne(nompersonne, téléphone, ville)
Trouver le nom des personnes vivant à Seattle et qui ont acheté un produit de la catégorie ‘Gadgets’, et le nom du magasin dans lequel ils ont acheté
SELECT DISTINCT nompersonne, magasin FROM Personne, Achat, Produit WHERE nompersonne=acheteur AND produit = pnom AND ville=‘Seattle’ AND catégorie=‘Gadgets’
68
Quand deux tables sont-elles liées ?
• Vous supposez qu’elles le sont, je vous le dis,…
• En fait, les clés étrangères permettent aux concepteurs de vous indiquer le lien entre les tables– une clé étrangère spécifie qu’un attribut fait
référence à une clé d’une autre tableex: Produit.fabriquant est une clé étrangère de Compagnie
– elle donne une information sur le lien– elle assure la cohérence
69
Ambiguïté des attributs
• Deux relations peuvent avoir le même attribut:Personne(pnom, adresse, travaillePour) Compagnie(cnom, adresse)
SELECT DISTINCT pnom, adresse FROM Personne, CompagnieWHERE travaillePour = cnom
Quelleadresse ?
SELECT DISTINCT Personne.pnom, Compagnie.adresse FROM Personne, CompagnieWHERE Personne.travaillePour = Compagnie.cnom
70
Variables
Produit(pnom, prix, catégorie, fabriquant) Achat(acheteur, vendeur, magasin, produit) Personne(nompersonne, téléphone, ville)
Trouver tous les magasins qui vendent au moins un produit que le magasin ‘BestBuy’ vend aussi
SELECT DISTINCT x.magasin FROM Achat AS x, Achat AS yWHERE x.produit = y.produit AND y.magasin = ‘BestBuy’
71
Comment fonctionne une requête SQL ?
SELECT a1, a2,…,akFROM R1 as x1, R2 as x2, …, Rn as xnWHERE conditions
• Boucles imbriquéesRéponse = {} for x1 in R1 do for x2 in R2 do ..... for xn in Rn do if Conditions then Réponse = Réponse ∪ {(a1,...,ak)} return Réponse
72
Union, intersection, di!érence
• Pareil pour INTERSECT et EXCEPT• On doit avoir les mêmes noms d’attributs
(sinon: renommage)
(SELECT nom FROM Personne WHERE Ville=‘Seattle’) UNION (SELECT nom FROM Personne, AchatWHERE acheteur=nom AND magasin=‘*e Bon’)
73
Conserver les doublons
(SELECT nom FROM Personne WHERE Ville=‘Seattle’) UNION ALL (SELECT nom FROM Personne, Achat WHERE acheteur= nom AND magasin=‘*e Bon’)
74
Sous-requêtes
• Cas d’une sous-reqûete qui retourne une seule valeur:
• C’est le cas ici !• Si ce n’est pas le cas, c’est une erreur
d’exécution
SELECT Achat.produitFROM AchatWHERE acheteur = ( SELECT nom FROM Personne WHERE nss = ‘123456789’)
75
Sous-requêtes (2)
• On peut faire la même chose sans sous-requête:
• C’est équivalent à la requête précédente lorsque nss est une clé et ‘123456789’ exsite dans la base; sinon, le résultat est di!érent
SELECT Achat.produitFROM Achat, PersonneWHERE acheteur = nom AND nss = ‘123456789’
76
Sous-requêtes retournant des relations
• Trouver les compagnies qui fabriquent des produits achetés par Joe Blow
• Ici, la sous-requête retourne un ensemble de valeurs: pas d’erreur grâce à IN
SELECT Compagnie.cnom FROM Compagnie, Produit WHERE Compagnie.cnom = Produit.fabriquant AND Produit.pnom IN ( SELECT Achat.produit FROM Achat WHERE Achat.acheteur = ‘Joe Blow’);
77
Sous-requêtes retournant des relations (2)
• Équivalent à
• Vraiment équivalent ?
SELECT Compagnie.cnom FROM Compagnie, Produit, Achat WHERE Compagnie.cnom =Produit.fabriquant AND Produit.pnom = Achat.produit AND Achat.acheteur = ‘Joe Blow’);
78
Suppression des doublons
SELECT Compagnie.cnom FROM Compagnie, Produit, Achat WHERE Compagnie.cnom= Produit. fabriquant AND Produit.pnom = Achat.produit AND Achat.acheteur = ‘Joe Blow’);
SELECT DISTINCT Compagnie.cnom FROM Compagnie, Produit, Achat WHERE Compagnie.cnom= Produit.fabriquant AND Produit.pnom = Achat.produit AND Achat.acheteur = ‘Joe Blow’);
Copies multiples
Une seule copie
79
Suppression des doublons (2)
SELECT DISTINCT Compagnie.cnom FROM Compagnie, Produit, Achat WHERE Compagnie.cnom= Produit.fabriquant AND Produit.pnom = Achat.produit AND Achat.acheteur = ‘Joe Blow’);
SELECT Compagnie.cnom FROM Compagnie, Produit WHERE Compagnie.cnom = Produit.fabriquant AND Produit.pnom IN ( SELECT Achat.produit FROM Achat WHERE Achat.acheteur = ‘Joe Blow’);
Maintenant, il ya équivalence !
80
Sous-requêtes retournant des relations (3)
• On peut utiliser également:– s > ALL R– s > ANY R– EXISTS R
Produit(Pnom, prix, catégorie, fabriquant)Trouver les produits qui sont plus chers que tous
les produits fabriqués par “GizmoWorks”SELECT pnom FROM Produit WHERE prix > ALL ( SELECT prix FROM Produit WHERE fabriquant = ‘GizmoWorks’)
81
Conditions sur les n-uplets
SELECT DISTINCT Compagnie.cnom FROM Compagnie, Produit WHERE Compagnie.cnom = Produit.fabriquant AND (Produit.pnom,prix) IN ( SELECT Achat.produit, Achat.prix) FROM Achat WHERE Achat.acheteur = ‘Joe Blow’);
82
Requêtes corrélées
Film (titre, année, metteurEnScène, durée) Trouver les films dont le titre apparaît plus d’une
fois
Noter– portée des variables– cela peut s’exprimer avec un seul SFW
SELECT DISTINCT titre FROM Film AS x WHERE année <> ANY ( SELECT année FROM Film WHERE titre = x.titre);
corrélation
83
Requêtes corrélées complexesProduit (pnom, prix, catégorie, fabriquant, année)Trouver les produits (et leur fabriquant) qui sont plus chers
que tous les produits fabriqués par le même fabricant avant 1972
Puissant, mais di)cile à optimiser !
SELECT DISTINCT pnom, fabriquant FROM Produit AS x WHERE prix > ALL ( SELECT prix FROM Produit AS y WHERE x.fabriquant = y.fabriquant AND y.année < 1972);
Synthèse requêtes corrélées
• Opérateurs– EXISTS R: vrai ssi R n'est pas vide– s IN R: vrai ssi s est égal à un des tuples de R – s > ALL R: vrai ssi s est plus grand que toute
valeur de la relation unaire R – s > ANY R: vrai ssi s est plus grand qu'au
moins une des valeurs de la relation unaire R • Comparateurs <, <>,<=,>= avec ALL et
ANY84
Synthèse requêtes corrélées (2)
• Les opérateurs EXISTS, IN, ALL et ANY peuvent être niés: – NOT EXISTS R: vrai ssi R est vide– NOT s > ANY R: vrai ssi s est la valeur
minimale de R – s NOT IN R: vrai ssi s n'est égal à aucun des
tuples de R
85 86
Agrégation
• SQL supporte plusieurs opérations d’agrégation:SUM, MIN, MAX, AVG, COUNT
SELECT AVG(prix)FROM ProduitWHERE fabriquant = “Toyota”
87
Agrégation: count
• À l’exception de COUNT, toutes les opérations d’agrégation portent sur un seul attribut
• COUNT s’applique sur les doublons, sauf indication contraire
SELECT COUNT(catégorie)FROM ProduitWHERE année > 1995
SELECT COUNT(*)FROM ProduitWHERE année > 1995
SELECT COUNT(DISTINCT catégorie)FROM ProduitWHERE année > 1995
88
Agrégation simple
Achat (produit, date, prix, quantité) • Exemple 1: calculer le total des ventes
pour la base entièreSELECT Sum(prix * quantité) FROM Achat
• Exemple 1’: calculer le total des ventes pour les briochesSELECT Sum(prix * quantité) FROM Achat WHERE produit = ‘brioche’
89
Agrégation simple (2)
AchatProduit Date Prix QuantitéBrioche 21/10 0.85 15Banane 22/10 0.52 7Banane 19/10 0.52 17Brioche 20/10 0.85 20
90
Regroupement et agrégation
• Souvent, on veut agréger les résultats sur une partie seulement de la relation
Achat(produit, date, prix, quantité) • Exemple 2: calculer le total des ventes par
produit après le 1/10
• Qu’est-ce que cela signifie…
SELECT produit, Sum(prix*quantité) AS TotalFROM AchatWHERE date > “1/10”GROUPBY produit
91
Regroupement et agrégation (2)
1. Exécute les clauses FROM et WHERE,2. Regroupe les n-uplets obtenus en
fonction du GROUP+BY 3. Sélectionne un n-uplets pour chaque
groupe (et applique la fonction d’agrégation)
Le SELECT peut avoir (1) des attributs groupés ou (2) des agrégats
92
Regroupement et agrégation (3)
• Exécution des clauses FROM-WHERE (date > “1/10”) puis regroupement (GROUP BY) par produit: Produit Date Prix QuantitéBanane 19/10 0.52 17Banane 22/10 0.52 7Brioche 20/10 0.85 20Brioche 21/10 0.85 15
93
Regroupement et agrégation (4)
• Puis, agrégation
Produit TotalBanane 12.48Brioche 29.75
SELECT produit, Sum(prix*quantité) AS TotalFROM Achat WHERE date > “1/10” GROUPBY produit
94
GROUP BY vs sous-requêtes
SELECT produit, Sum(prix*quantité) AS TotalFROM Achat WHERE date > “1/10” GROUPBY produit
SELECT DISTINCT x.produit, ( SELECT Sum(y.prix*y.quantité) FROM Achat y WHERE x.produit = y.produit AND y.date > “1/10”) AS TotalFROM Achat x WHERE x.date > “1/10”
95
Un autre exemple
Pour chaque produit, quel est le total des ventes la quantité maximale vendue ?
Produit Total MaxBanane 12.48 17Brioche 29.75 20
SELECT produit, Sum(prix*quantité) AS Total, Max(quantité) AS MaxFROM Achat GROUPBY produit
96
La clause HAVING
• Même requête, sauf que l’on considère seuelement les produits qui ont été achetés 100 fois au moins
• Une clause Having contient des conditions sur les agrégats
SELECT produit, Sum(prix*quantité) AS TotalFROM Achat WHERE date > “1/10”GROUPBY produit HAVING Sum(quantité) > 100
97
Forme générale pour le regroupement et l’agrégation
• SELECT SFROM R1,…,RnWHERE C1GROUP BY a1,…,akHAVING C2
• S peut contenir les attributs a1,...,ak et/ou n’importe quel agrégat
• C1 est n’importe quelle condition portant sur les attributs dans R1,...,Rn
• C2 est n’importe quelle condition portant sur les agrégats
98
Forme générale pour le regroupement et l’agrégation (2)
• SELECT SFROM R1,…,RnWHERE C1GROUP BY a1,…,akHAVING C2
• Étapes pour l’évaluation:– exécute la partie FROM-WHERE, et renvoie une
table avec tous les attributs dans R1,...,Rn
– regroupe suivant les attributs a1,...,ak
– calcule les agrégats de C2 et conserve uniquemenet ceux qui satisfont C2
– calcule les agrégats de S et renvoie le résultat
99
Agrégation vs SQL simple
• Si on suppose– Auteur(login, nom) – Document(url, titre) – Écrit(login, url) – Mentionne(url, mot)
• Trouver tous les auteurs qui ont écrit au moins 10 documents
100
Agrégation vs SQL simple (2)
• Avec des requêtes imbriquéesSELECT DISTINCT Auteur.nom FROM AuteurWHERE count( SELECT Ecrit.url FROM Ecrit WHERE Auteur.login=Ecrit.login) > 10
SQL par unnovice
101
Agrégation vs SQL simple (3)
• Avec GROUP BY
• Pas besoin de DISTINCT, automatique avec le GROUP BY
SELECT Auteur.nom FROM Auteur, Ecrit WHERE Auteur.login= Ecrit.login GROUP BY Auteur.nom HAVING count(Ecrit.url) > 10
102
Agrégation vs SQL simple (4)
• Trouver tous les auteurs qui ont un vocabulaire de plus de 10000 mots
SELECT Auteur.nomFROM Auteur, Ecrit, MentionneWHERE Auteur.login= Ecrit.login AND Ecrit.url=Mentionne.urlGROUP BY Auteur. nomHAVING count(distinct Mentionne.mot) > 10000
103
Plan
• Motivations• Algèbre relationnelle• SQL• Mises à jour, vues, contraintes
Modifier la base
Trois types de modifications• insertions• suppressions• mises à jour
104
Insertion
• Forme générale
• Exemple: insérer un nouvel achat dans la base
– attribut manquant ! null– on peut ne pas mettre les noms des attributs
si on les donne dans l’ordre105
INSERT INTO R(A1,…,An) VALUES (v1,…,vn)
INSERT INTO Achat(acheteur, vendeur, produit, magasin)VALUES (‘Joe’, ‘Fred’, ‘wakeup-clock-espresso-machine’, ‘*e Sharper Image’)
Insertion (2)
La requête remplace le mot-clé VALUES
Ici, on a inséré plusieurs n-uplets dans Produit
106
INSERT INTO Produit(pnom) SELECT DISTINCT Achat.produit FROM Achat WHERE Achat.date > “26/10/05”
Insertion (3)
pnom est une clé étrangère de Produit.nom• Supposons que la base soit corrompue et
que l’on doive réparer:
• Objectif: insérer dans Produit tous les pnom de Achat 107
PRODUIT (nom, prix, catégorie)ACHAT (pnom, acheteur, prix)
nom prix catégoriegizmo 100 gadgets
pnom acheteur prixcaméra John 200gizmo Smith 80caméra Smith 225
Insertion (4)
•
108
INSERT INTO Produit(nom)SELECT DISTINCT pnomFROM AchatWHERE pnom NOT IN (SELECT nom FROM Produit)
nom prix catégoriegizmo 100 gadgetscamera - -
Insertion (5)
109
INSERT INTO Produit(nom, prix)SELECT DISTINCT pnom, prixFROM AchatWHERE pnom NOT IN (SELECT nom FROM Produit)
nom prix catégoriegizmo 100 gadgetscaméra 200 -caméra ?? 225 ?? - Dépend du SGBD
Suppression
Exemple
SQL: il n’existe pas de possibilité pour supprimer une seule occurence d’un n-uplet qui apparaît plusieurs fois dans la relation
110
DELETE FROM Achat WHERE vendeur = ‘Joe’ AND produit = ‘Brooklyn Bridge’
Mise à jour
Exemple
111
UPDATE ProduitSET prix = prix/2WHERE Produit.nom IN ( SELECT produit FROM Achat WHERE Date =’26 Oct 2005’);
Définition des données en SQL
• Data Manipulation Language – DML• Maintenant: Data Definition Language –
DDL• Types de données
– définit les types• Définition des données
– définit le schéma– crée les tables– supprime les tables– modifie le schéma
• Index– pour améliorer les performances
112
Types de données en SQL
• Caractères– CHAR(20)– VARCHAR(40)
• Nombres– INT, REAL et autres variations
• Heure et date– DATE, DATETIME
• Possibilité de réutiliser un domaine– CREATE DOMAIN adresse AS
VARCHAR(55)113
Création de table
Exemple
114
CREATE TABLE Personne ( nom VARCHAR(30), numéroSécuritéSociale INT, âge SHORTINT, ville VARCHAR(30), sexe BIT(1), date-de-naissance DATE);
Supprimer ou modifier une table
• Suppression– à utiliser avec précaution !
• Modification (ajout ou suppression d’un attribut)
115
DROP TABLE Personne;
ALTER TABLE Personne ADD téléphone CHAR(16);
ALTER TABLE Personne DROP âge;
Valeur par défaut
Spécification de valeurs par défaut
Défaut des valeurs par défaut: NULL116
CREATE TABLE Personne( nom VARCHAR(30), numéroSécuritéSociale INT, âge SHORTINT DEFAULT 100, ville VARCHAR(30) DEFAULT ‘Paris’, sexe CHAR(1) DEFAULT ‘?’, date-de-naissance DATE);
Index
• Important si on veut optimiser le temps de réponse des requêtes
• Supposons une relation
et beaucoup de n-uplets (disons 60Gb !)
une recherche séquentielle peut prendre du temps, beaucoup de temps !
117
Personne (nom, âge, ville)
SELECT *FROM PersonneWHERE nom = “Martin”;
Création d’index
Syntaxe
118
CREATE INDEX nomIndex ON Personne(nom)
Création d’index (2)
Un index peut être créé sur un ou plusieurs attributs
Exemple
E)cace pour:
Mais pas pour:
119
CREATE INDEX doubleIndex ON Personne(âge,ville)
SELECT * FROM Personne WHERE âge = 55 AND ville = “Seattle”
SELECT * FROM Personne WHERE ville = “Seattle”
Création d’index (3)
Un index peut également servir pour les requêtes sur des intervalles:
Arbre B+ e)cace pour:
Pourquoi ne pas tout indexer ?120
CREATE INDEX ageIndex ON Personne(âge)
SELECT * FROM Personne WHERE âge > 25 AND âge < 28
Les vues
• Les vues sont des relations qui ne sont pas stockées physiquement dans le SGBD
• Utilisées pour présenter di!érentes infos à des utilisateurs di!érents
• Certains utilisateurs ont accès à Employé, d’autres n’ont accès qu’à Développeur
121
Employé(nss, nom, département, projet, salaire)
CREATE VIEW Développeur AS SELECT nom, projet FROM Employé WHERE département = “Développement”
Exemple
On a une nouvelle table (virtuelle):
122
Personne(nom, ville)Achat(acheteur, vendeur, produit, magasin)Produit(nom, fabriquant, catégorie)
CREATE VIEW vueNancy AS SELECT acheteur, vendeur, produit, magasin FROM Personne, Achat WHERE Personne.ville = “Nancy” AND Personne.nom = Achat.vendeur
vueNancy(acheteur, vendeur, produit, magasin)
Utilisation d’une vue
On peut alors utiliser la vue
123
SELECT nom, magasinFROM vueNancy, ProduitWHERE vueNancy.produit = Produit.nom AND Produit.catégorie = “guitare”
Que se passe-t-il alors ?
124
SELECT nom, vueNancy.magasin FROM vueNancy, Produit WHERE vueNancy.produit = Produit.nom AND Produit.catégorie = “guitare”
SELECT nom, Achat.magasinFROM Personne, Achat, ProduitWHERE Personne.ville = “Nancy” AND Personne.nom = Achat.acheteur AND Achat.produit = Produit.nom AND Produit.catégorie = “guitare”
Types de vues
• Vues virtuelles:– utilisées dans les SGBD– calculées à la demande – plus lent à
l’exécution– toujours à jour
• Vues matérialisées– utilisées dans les entrepôts de données– pré-calculées – plus rapide à l’exécution– peuvent contenir des données non à jour
125
Mettre à jour une vue
Comment insérer un n-uplet dans quelque chose qui n’existe pas ?
L’insertion suivante…
…devient:
126
Employé(nss, nom, département, projet, salaire)CREATE VIEW Développeur AS SELECT nom, projet FROM Employé WHERE département = “Dévelopement”
INSERT INTO Développeur VALUES (“Tom”, “Codeur”)
INSERT INTO Employé VALUES (NULL, “Tom”, “Dévelopement”, “Codeur”, NULL)
Vues non modifiables
Comment insérer le n-uplet suivant dans la vue ? (“Tom”, “Guitare”, “Art’Music”)
On doit ajouter “Tom” dans Personne, mais on n’a pas tous les attributs nécessaires
127
CREATE VIEW vueNancy AS SELECT vendeur, produit, magasin FROM Personne, Achat WHERE Personne.ville = “Nancy” AND Personne.nom = Achat.acheteur
Vues non modifiables (2)
• Les vues qui comportent des fonctions d’agrégation
• Pourquoi ?
128
Répondre aux requêtes avec des vues
Supposons que l’on ait la vue vueNancy
et que l’on veuille répondre à:
129
SELECT acheteur, vendeurFROM Personne, AchatWHERE Personne.ville = “Nancy” AND Personne.nom = Achat.vendeur AND Achat.produit= “gizmo”
CREATE VIEW vueNancy AS SELECT acheteur, vendeur, produit, magasin FROM Personne, Achat WHERE Personne.ville = “Nancy” AND Personne.nom = Achat.vendeur
Réécriture de la requête avec la vue
Requête
130
SELECT acheteur, vendeurFROM vueNancyWHERE produit= “gizmo”
Constraintes en SQL
• Contrainte = propriété que l’on veut voir respecter par la base
• Le système assure le respect des contraintes en prenant des décisions:– interdire une mise à jour– ou e!ectuer des mises à jour de
compensation
131
Contraintes en SQL (2)
Contraintes en SQL:• Clés, clés étrangères• Contraintes au niveau des attributs• Contraintes au niveau des n-uplets• Contraintes globales: assertions
Plus la contrainte est complexe, plus il est di"cile de la vérifier et de la faire respecter
132
Simple
Complexe
Clés
ou
133
CREATE TABLE Produit ( nom CHAR(30) PRIMARY KEY, catégorie VARCHAR(20))
CREATE TABLE Produit ( nom CHAR(30), catégorie VARCHAR(20), CONSTRAINT nomPK PRIMARY KEY (nom))
Clés avec attributs multiples
134
CREATE TABLE Produit ( nom CHAR(30), catégorie VARCHAR(20), prix INT, CONSTRAINT nomcatéPK PRIMARY KEY (nom, catégorie))
Autres clés
Il y a au plus une Primary Key;il peut y avoir plusieurs Unique
135
CREATE TABLE Produit ( produitID CHAR(10), nom CHAR(30), catégorie VARCHAR(20), prix INT, PRIMARY KEY (produitID), UNIQUE (nom, catégorie))
Contraintes clés étrangères
Contraintes d’intégrité référentielle
nomProduit est une clé étrangère pour Produit(nom)nom doit être une clé dans Produit
(nom,catégorie) doit être une clé primaire136
CREATE TABLE Achat ( nomProduit CHAR(30) REFERENCES Produit(nom), date DATETIME)
CREATE TABLE Achat ( nomProduit CHAR(30), catégorie VARCHAR(20), date DATETIME, CONSTRAINT nomcatéFK FOREIGN KEY (nomProduit, catégorie) REFERENCES Produit(nom, catégorie)
Possibilité de les ajouter a posteriori
• N’oubliez pas de nommer vos contraintes !
137
ALTER TABLE Achatadd CONSTRAINT nomcatéFK# FOREIGN KEY (nomProduit, catégorie)# REFERENCES Produit(nom, catégorie);
Que se passe-t-il lors des mises à jour ?
Types de mises à jour:• dans Achat: insert/update• dans Produit: delete/update
138
Nom CatégorieGizmo GadgetIxus40 Photo
OneClick PhotonomProduit Magasin
Gizmo WizIxus40 Phot’Antik
OneClick Giz
Produit
Achat
Que se passe-t-il lors des mises à jour ?
• SQL possède trois façons pour maintenir l’intégrité référentielle:– rejet des modifications qui violent les
contraintes (défaut)– cascade: après un delete/update faire un
delete/update– set-null: mettre les attributs clés étrangères à
NULL
139
Contraintes sur les attributs et les n-uplets
• Contraintes sur les attributs– NOT NULL -- trivial– CHECK condition -- n’importe quelle condition !
• Contraintes sur les n-uplets– CHECK condition
140
Contraintes sur les attributs et les n-uplets (2)
Quelle est la di!érence avec une clé étrangère ?
141
CREATE TABLE Achat ( nomProduit CHAR(30) CHECK (nomProduit IN SELECT Produit.nom FROM Produit), date DATETIME NOT NULL)
Assertions
142
CREATE ASSERTION monAssertion CHECK NOT EXISTS ( SELECT Produit.nom FROM Produit, Achat WHERE Produit.nom = Achat.nomProduit GROUP BY Produit.nom HAVING count(*) > 200)
Commentaires sur les contraintes
• Il est préférable de les nommer
• Il faut savoir exactement quand elles sont vérifiées
• Il faut savoir exactement quelles sont les actions déclenchées lorsqu’elles échouent
143
Triggers
Permettent au programmeur de spécifier– quand vérifier une contrainte– quoi faire lorsque la contrainte est violée
Un trigger possède 3 parties– un événement (par ex. maj d’un attribut)– une condition (par ex. une requête à vérifier)– une action (par ex. suppression)
Lorsque l’événement survient, le système vérifie la condition, et si celle-ci est satisfaite, exécute l’action 144
Triggers (2)
• Important: les triggers peuvent entraîner des e!ets en cascade
• Les vendeurs de SGBD n’ont pas attendu de standards pour les triggers !
145
Triggers (3)
• En SQL 3– moment d’exécution de l’action: avant, après
ou à la place de l’événement– l’action peut référencer l’état avant ou après la
modification– les événements update peuvent spécifier un
(ou des) attribut(s) particulier(s)– la condition est définie avec la clause WHEN– l’action peut être exécutée soit
• une fois pour chaque n-uplet, ou• une fois pour tous les n-uplets modifiés par
l’opération sur la base146
Exemple de trigger
• Niveau ligne
147
CREATE TRIGGER PrixBasAFTER UPDATE OF prix ON ProduitREFERENCING OLD AS AncienNuplet NEW AS NouveauNupletWHEN (AncienNuplet.prix > NouveauNuplet.prix) UPDATE Produit SET prix = AncienNuplet.prix WHERE nom = NouveauNuplet.nomFOR EACH ROW
Exemple de trigger (2)
• Niveau instruction
148
CREATE TRIGGER PréservePrixMoyenINSTEAD OF UPDATE OF prix ON ProduitREFERENCING OLD_TABLE AS Ancien NEW_TABLE AS NouveauWHEN (1000 < (SELECT AVG (prix) FROM ((Produit EXCEPT Ancien) UNION Nouveau))DELETE FROM Produit WHERE (nom, prix, compagnie) IN Ancien;INSERT INTO Produit (SELECT * FROM Nouveau)