qu’est-ce qu’un sgbd où utilise-t-on des sgbd · et puis on écrit les programmes c ou java...

38
1 Introduction aux bases de données Olivier Perrin [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

Upload: buixuyen

Post on 14-Sep-2018

217 views

Category:

Documents


0 download

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)

Attention aux choses bizarres

149

CREATE TRIGGER TriggerFouAFTER UPDATE OF prix IN ProduitREFERENCING OLD AS Ancien NEW AS NouveauWHEN (Nouveau.prix > 50) UPDATE Produit SET prix = Nouveau.prix * 2 WHERE nom = Nouveau.nomFOR EACH ROW

150