Upload
gwenael-prost
View
106
Download
0
Embed Size (px)
Citation preview
Evry, 29-31 mai 2000 1© INT
Programme
• Introduction aux BD et aux SGBD
• Le modèle relationnelLe langage de requête SQL
• La conception d’une BD relationnelle
• Protection des informations
• Perspectives des BD
SQL
Structured Query Language
Evry, 29-31 mai 2000 3© INT
Schéma de la base de référence
• Employé(Nom_emp, Prénom_emp, No_ss, Date_naiss, Adresse_emp, Sexe, Salaire, Comm, No_chef, Nod)
• Département(Nom_d, No_dept, No_dir, Date_affect)
• Dept_local(Num_dept, Id_loc)
• Projet(Nom, No_proj, Local_proj, Nod)
• Travaille_sur(No_ss, No_projet, Nb_heures)
Evry, 29-31 mai 2000 4© INT
InstanceEmployé Nom_emp Prénom_emp No_ssDate_naiss Adresse_emp Sexe Salaire Comm No_chefNod
Amelmou Karl 1123409/01/55 1, rue de la paix- Fontainebleau M 300 0 13334 5
Ball Jean 1333408/12/45 15, rue Bonaparte- Fontainebleau M 400 100 18886 5
Couvert Armelle 2999819/07/58 101, rue Blondel- Fontainebleau F 350 200 29876 4
Diocy Kelly 2987620/06/41 18, avenue F Roosevelt- Fontainebleau F 430 0 18886 4
Eigery Tom 1666815/09/65 21, rue Mouffetard- Paris M 380 0 13334 5
Hea Aline 2453431/07/62 3, Av. du château- Fontainebleau F 50 300 13334 5
Gol Henry 1987929/03/59 36, Bd Napoléon- Nemours M 250 100 29876 4
Kamil Sim 1888610/11/27 8, impasse des hirondelles- Avon M 550 150 null 1
Département Nom_d No_dept No_dir Date_affect
R&D 5 13334 22/05/78
DRH 4 29876 01/01/85
DG 1 18886 19/06/71
Dept_local Num_dept Id_loc
1 Paris
4 Paris
5 Fontainebleau
5 Paris
5 Melun
Evry, 29-31 mai 2000 5© INT
Instance (suite)Projet Nom No_proj Local_proj Nod
ProduitX 1 Fontainebleau 5
ProduitY 2 Melun 5
ProduitZ 3 Paris 5
Réorganisation 15 Paris 1
Informatisation 26 Paris 4
Prospect 27 Paris 4
Travaille_sur No_ss No_projet Nb_heures
11234 1 32.5
11234 2 7.5
16668 3 40
24534 1 20
24534 2 20
13334 2 10
13334 3 10
13334 26 10
13334 15 10
29998 27 30
29998 26 10
19879 26 35
19879 27 5
29876 27 20
29876 15 15
18886 15 null
Evry, 29-31 mai 2000 6© INT
Interrogation de la base de données
Présentation des résultats sous forme tabulaire où:– en-tête de colonne: attribut– largeur de colonne cf. définition du domaine de
l'attribut
alias possible pour entête de colonne
Evry, 29-31 mai 2000 7© INT
SELECT attr1, attr2, .... attrn
FROM relation;
• Exemples:SELECT Nom_d
FROM Département;
SELECT Nom, Nod "numéro"
FROM Projet;
Clauses minimales
Résultat Nom_d
R&D
DRH
DG
Résultat Nom Numéro
ProduitX 5
ProduitY 5
ProduitZ 5
Réorganisation 1
Informatisation 4
Prospect 4
Evry, 29-31 mai 2000 8© INT
Joker
SELECT *
FROM Projet;
Résultat Nom No_proj Local_proj Nod
ProduitX 1 Fontainebleau 5
ProduitY 2 Melun 5
ProduitZ 3 Paris 5
Réorganisation 15 Paris 1
Informatisation 26 Paris 4
Prospect 27 Paris 4
Evry, 29-31 mai 2000 9© INT
Elimination des doublons
SELECT DISTINCT Local_proj
FROM Projet;Résultat Local_proj
Fontainebleau
Melun
Paris
Evry, 29-31 mai 2000 10© INT
Synonymes
SELECT P.Nom, P.Nod
FROM Projet P;Résultat Nom Nod
ProduitX 5
ProduitY 5
ProduitZ 5
Réorganisation 1
Informatisation 4
Prospect 4
Evry, 29-31 mai 2000 11© INT
Clause WHERESELECT attr1, attr2, .... attrn
FROM relation
WHERE condition;
Exemple:
« Liste des employés travaillant plus de 20 heures sur un projet. »
SELECT No_ss, No_projet
FROM Travaille_sur
WHERE Nb_heures > 20;
Evry, 29-31 mai 2000 12© INT
Exemples• Liste des employés dont la
commission est supérieure à leur
salaireSELECT No_ss
FROM Employé
WHERE Comm > Salaire;
• Liste des employés du département 5
dont le salaire est supérieur à 300 kFSELECT No_ss
FROM Employé
WHERE Salaire > 300
AND Nod = 5;
• Liste des employés qui ne
sont pas du département 5SELECT No_ss
FROM Employé
WHERE Nod <> 5;
• Liste des départements
localisés à Paris ou à
FontainebleauSELECT Num_dept
FROM Dept_local
WHERE Id_loc IN ('Paris', 'Fontainebleau');
Evry, 29-31 mai 2000 13© INT
Clause ORDER BY
• ORDER BY {attribut [DESC | ASC]}
• Liste des employés ordonnée par ordre croissant de salaireSELECT No_ss
FROM Employé
ORDER BY Salaire;
Evry, 29-31 mai 2000 14© INT
Exemples• Liste des employés et
leurs départements ordonnée par ordre décroissant de salaire à partir de 300 kF
SELECT No_ss
FROM Employé
WHERE Salaire > 300
ORDER BY Salaire DESC;
• Liste des employés et leurs départements ordonnée par ordre croissant de salaire et par ordre décroissant de département
SELECT No_ss
FROM Employé
ORDER BY Salaire, 1, Nod DESC;
Evry, 29-31 mai 2000 15© INT
Requête multi-relations
• Critère de jointure: clause WHERE• Notation préfixée (relation.attribut)• Exemple: Dans quelles villes sont les
départements R&D? (Equi-jointure)SELECT Id_loc
FROM Département, Dept_local
WHERE Nom_d = 'R&D'
AND No_dept = Num_dept;
Evry, 29-31 mai 2000 16© INT
Exemples• Sur quels projets travaillent des
femmes ?SELECT No_projet
FROM Travaille_sur, Employé
WHERE Sexe = 'F'
AND Travaille_sur.No_ss = Employé.No_ss;
ouSELECT No_projet
FROM Travaille_sur T, Employé E
WHERE Sexe = 'F'
AND T.No_ss = E.No_ss;
• Employés qui gagnent plus que leur responsable (auto-jointure)SELECT Nom_emp
FROM Employé E, Employé CHEF
WHERE E.No_chef = CHEF.No_ss
AND E.Salaire > CHEF.Salaire
Evry, 29-31 mai 2000 17© INT
Sous-requêtesSELECT attr1, attr2, .... attrn
FROM relation
WHERE attribut opérateur (SELECT ...);
• Quels sont les employés des départements R&D ? SELECT Nom_emp
FROM Employé
WHERE Nod IN ( SELECT No_dept
FROM Département
WHERE Nom_d = 'R&D');
Evry, 29-31 mai 2000 18© INT
Expressions et fonctions numériques dans la clause
SELECT
• Liste des employés et de leur rémunération totale (salaire et commission)
SELECT E.No_ss, E.Salaire + E.Comm
FROM Employé E;
Evry, 29-31 mai 2000 19© INT
Expressions numériques dans la clause WHERE
• Liste des employés dont la commission dépasse la moitié de leur salaire.
SELECT E.No_ss
FROM Employé E
WHERE E.Comm > 0.5 * E.Salaire
Evry, 29-31 mai 2000 20© INT
Expressions numériques dans la clause ORDER BY
• Liste des employés triée par ordre croissant de rémunération totale
SELECT E.No_ss
FROM Employé E
ORDER BY E.Comm+ E.Salaire;
Evry, 29-31 mai 2000 21© INT
Fonctions agrégats
• 5 fonctions agrégatives:– AVG ( ): calcul de la moyenne– SUM ( ): calcul de la somme– MIN ( ): calcul de la valeur minimale– MAX ( ): calcul de la valeur maximale– COUNT ( ): calcul du nombre de tuples
Evry, 29-31 mai 2000 22© INT
AVG ( )
• Donner la moyenne des salaires.SELECT AVG(Salaire)
FROM Employé;
• Donner la moyenne des revenus d'un salariéSELECT AVG(Salaire + Comm)
FROM Employé;
Evry, 29-31 mai 2000 23© INT
SUM( )• Donner la somme des salaires, et la somme des
commissions perçues par les employés.SELECT SUM(Salaire), SUM(Comm)
FROM Employé;
• Donner la somme des salaires des employés ne percevant pas de commission.SELECT SUM(Salaire)
FROM Employé
WHERE Comm = 0;
Evry, 29-31 mai 2000 24© INT
MIN( )
• Quel est le revenu minimum (commission comprise) ?
SELECT MIN(Salaire + Comm)
FROM Employé;
Evry, 29-31 mai 2000 25© INT
MAX( )
• Quel est la commission maximale perçue ?
SELECT MAX(Comm)
FROM Employé;
Evry, 29-31 mai 2000 26© INT
COUNT()• Quel est le nombre d'employés du département 5
?SELECT COUNT(No_ss)
FROM Employé
WHERE Nod = 5;
ou
SELECT COUNT(*)
FROM Employé
WHERE Nod = 5;
Evry, 29-31 mai 2000 27© INT
Exemples
AttentionSELECT Nom_emp, AVG(Salaire)
FROM Employé;
• Donner le plus haut salaire, le plus bas salaire et la différence entre les deuxSELECT MAX(Salaire), MIN(Salaire),
MAX(Salaire) - MIN(Salaire)
FROM Employé;
Evry, 29-31 mai 2000 28© INT
Clause GROUP BY• Regroupement de tuples
• Relation initiale partitionnée horizontalement selon les valeurs d'un attribut ou d'un groupe d'attributs.
• Permet de répondre aux questions du type: – donner le nombre d'employés par département. – constituer des groupes d'employés pour chaque
département– évaluer au sein de chacun de ces groupes le nombre
d'éléments
Evry, 29-31 mai 2000 29© INT
Exemple
• Donner le nombre d'employés par département.SELECT Nod, COUNT(*)
FROM Employé
GROUP BY Nod;
Evry, 29-31 mai 2000 30© INT
Evaluation du résultat
Employé Nom_emp Prénom_emp No_ss Date_naiss Adresse_emp Sexe Salaire Comm No_chef Nod
Amelmoux Karl 11234 09/01/55 1, rue de la paix- Fontainebleau M 300 0 13334 5
Ball Jean 13334 08/12/45 15, rue Bonaparte- Fontainebleau M 400 100 18886 5
Couvert Armelle 29998 19/07/58 101, rue Blondel- Fontainebleau F 350 200 29876 4
Diocy Kelly 29876 20/06/41 18, avenue F Roosevelt- Fontainebleau F 430 0 18886 4
Eigery Tom 16668 15/09/65 21, rue Mouffetard- Paris M 380 0 13334 5
Hea Aline 24534 31/07/62 3, Av du château- Fontainebleau F 50 300 13334 5
Gol Henry 19879 29/03/59 36, Bd Napoléon- Nemours M 250 100 29876 4
Kamil Sim 18886 10/11/27 8, impasse des hirondelles- Avon M 550 150 null 1
• Relation initiale
Evry, 29-31 mai 2000 31© INT
Evaluation du résultat
• Tri et partitionnement
Employé Nom_emp Prénom_emp No_ss Date_naiss Adresse_emp Sexe Salaire Comm No_chef Nod
Kamil Sim 18886 10/11/27 8, impasse des hirondelles- Avon M 550 150 null 1
Couvert Armelle 29998 19/07/58 101, rue Blondel- Fontainebleau F 350 200 29876 4
Diocy Kelly 29876 20/06/41 18, avenue F Roosevelt- Fontainebleau F 430 0 18886 4
Gol Henry 19879 29/03/59 36, Bd Napoléon- Nemours M 250 100 29876 4
Amelmoux Karl 11234 09/01/55 1, rue de la paix- Fontainebleau M 300 0 13334 5
Ball Jean 13334 08/12/45 15, rue Bonaparte- Fontainebleau M 400 100 18886 5
Eigery Tom 16668 15/09/65 21, rue Mouffetard- Paris M 380 0 13334 5
Hea Aline 24534 31/07/62 3, Av du château- Fontainebleau F 50 300 13334 5
Evry, 29-31 mai 2000 32© INT
Evaluation du résultat
• Résultat
Résultat Nod Count(*)1 14 35 4
Evry, 29-31 mai 2000 33© INT
Exemples
Attention: tous les attributs figurant dans la clause SELECT sans être soumis à un agrégat doivent apparaître dans la clause GROUP BY
SELECT Nom_emp, AVG(Salaire)
FROM Employé
GROUP BY Nod; Problème
Evry, 29-31 mai 2000 34© INT
Exemples
• Donner le salaire moyen des femmes par département.SELECT Nod, AVG(Salaire + Comm)
FROM Employé
WHERE Sexe = 'F'
GROUP BY Nod;
Evry, 29-31 mai 2000 35© INT
Clause HAVING
• Exprimer des conditions sur le résultat après partitionnement
• Exemple: Donner la liste des salaires moyens par département si celui-ci excède 400 kF.
SELECT Nod, AVG(Salaire)
FROM Employé
GROUP BY Nod
HAVING AVG(Salaire) > 400;
Evry, 29-31 mai 2000 36© INT
Exemple
• Donner la liste des salaires moyens des femmes par département si celui-ci excède 400 kF.SELECT Nod, AVG(Salaire)
FROM Employé
WHERE Sexe = 'F'
GROUP BY Nod
HAVING AVG(Salaire) > 400;
Evry, 29-31 mai 2000 37© INT
Opérateurs ensemblistes
• Opérateurs binaires
• Deux relations de même schéma en entrée
Evry, 29-31 mai 2000 38© INT
Union• Donner la liste des dépenses composant la masse
salariale (salaire et commission).SELECT Salaire
FROM Employé
UNION
SELECT Comm
FROM Employé
• L'opérateur d'union élimine automatiquement les doublons
Evry, 29-31 mai 2000 39© INT
Exemple Attention aux schémas• Donner la liste des départements avec leurs directeurs
et des départements avec leurs localisationsSELECT No_dept, No_dir
FROM Département
UNION
SELECT Num_dept, Id_loc
FROM Dept_local Problème
Evry, 29-31 mai 2000 40© INT
Intersection
• Quels sont les employés qui encadrent d'autres employés et qui travaillent sur un projet ?SELECT No_chef
FROM Employé
INTERSECT
SELECT No_ss
FROM Travaille_sur
Evry, 29-31 mai 2000 41© INT
Différence
• Donner la liste des employés qui n'encadrent personne.SELECT No_ss
FROM Employé
EXCEPT
SELECT No_chef
FROM Employé
Evry, 29-31 mai 2000 42© INT
Questions quantifiées
• Prédicats– ANY– ALL– EXISTS
Evry, 29-31 mai 2000 43© INT
ANY• Teste si la valeur d'un attribut satisfait un critère de
comparaison avec au moins un résultat d'une sous-requête
• Exemple: Quels sont les employés travaillant sur au moins un des projets de l'employé 13334.
SELECT No_ss
FROM Travaille_sur
WHERE No_projet = ANY (SELECT No_projet
FROM Travaille_sur
WHERE No_ss =13334)
Evry, 29-31 mai 2000 44© INT
ALL
• Teste si la valeur d'un attribut satisfait un critère de comparaison avec tous les résultats d'une sous-requête.
• Exemple: Quels sont les employés les mieux payés.
SELECT No_ss
FROM Employé
WHERE Salaire >= ALL (SELECT Salaire
FROM employé)
Evry, 29-31 mai 2000 45© INT
EXISTS• Teste si la réponse à une sous-requête est vide.• Exemple: Donner le nom des employés travaillant
au moins sur un projet.
SELECT Nom_emp
FROM Employé E
WHERE EXISTS ( SELECT No_projet
FROM Travaille_sur T
WHERE T.No_ss = E.No_ss);
Evry, 29-31 mai 2000 46© INT
Exemple
• Quels sont les noms d'employés ayant au moins un autre employé sous leurs ordres.SELECT Nom_emp
FROM Employé E1
WHERE EXISTS ( SELECT No_ss
FROM Employé E2
WHERE E2.No_chef = E1.No_ss)
ORDER BY Nom_emp;
Evry, 29-31 mai 2000 47© INT
Prédicat EXISTS pour exprimer une division
• Quels sont les départements répartis sur tous les sites?– Un département est conservé s'il n'existe aucun site sur lequel il ne soit pas
situé.
SELECT No_dept
FROM département D
WHERE NOT EXISTS (SELECT Id_loc
FROM Dept_local L1
WHERE NOT EXIST (SELECT L2.*
FROM Dept_local L2
WHERE L2.Id_loc = L1.Id_loc
AND L2.Num_dept = D.No_dept))
Evry, 29-31 mai 2000 48© INT
SynthèseSQL Equivalent AR
• SELECT liste d'attributs, agrégats Projection
• FROM liste de relations Produit cartésien
• WHERE conditions Restriction + jointure ou autre requête Division, jointure
• GROUP BY liste d'attributs
• HAVING condition, agrégats
• ORDER BY liste d'attributs
• UNION | INTERSECTION | EXCEPT Union, intersection, différence
Evry, 29-31 mai 2000 49© INT
Exemple complet• Liste des départements avec le nombre d'employés ne percevant pas
de commission et travaillant sur un projet si celui-ci est supérieur à 1 triée par ordre croissant de département.
SELECT D.Nom_d, D.No_dept, COUNT(*)
FROM Département D, Employé E, Travaille_sur T
WHERE E.Comm=0
AND D.No_dept =E.Nod
AND E.No_ss = T.No_ss
GROUP BY No_dept
HAVING COUNT(*) > 1
ORDER BY No_dept;
Evry, 29-31 mai 2000 50© INT
Commandes de mise à jour
• Insertion de nouveaux tuples: INSERT
• Mise à jour de valeurs: UPDATE
• Suppression de tuples: DELETE
• Suppression de tous les tuples d'une relation: TRUNCATE
Evry, 29-31 mai 2000 51© INT
INSERT
• Insérer des tuples dans une relation en spécifiant les valeurs à insérerINSERT INTO <relation>
VALUES (<liste de valeurs>);
INSERT INTO relation(<liste d'attributs>)
VALUES (<liste de valeurs>);
• Liste des noms d'attributs optionnelle
Evry, 29-31 mai 2000 52© INT
Exemples• Créer le nouveau département "Distribution" de numéro 6,
dirigé par 18886 à partir du 15/09/96.
INSERT INTO département
VALUES ('Distribution', 6, 18886, '15/09/96');• Créer le nouveau département "Distribution" de numéro 6,
dirigé par 18886. La date d'affectation est pour l'instant inconnue.
INSERT INTO département (No_dept, nom_d, No_dir)
VALUES (6, 'Distribution', 18886);
Evry, 29-31 mai 2000 53© INT
Insertion à partir d'autres relations
• Insertion de tuples provenant d'une requête considérée comme une sous-requête
INSERT INTO relation
SELECT...• Création de relation avec insertion simultanée de
données
CREATE TABLE relation
AS SELECT....
Evry, 29-31 mai 2000 54© INT
UPDATE
• Modification des valeurs d'un ou de plusieurs attributs, dans un ou plusieurs tuples existants d'une relation.
UPDATE <relation>
SET <attribut> = <valeur>
WHERE <expression logique>• En l'absence de clause WHERE toutes les lignes
sont mises à jour
Evry, 29-31 mai 2000 55© INT
Exemple
• Augmenter de 10 % tous les employés n'ayant pas de commission.
UPDATE Employé
SET Salaire = Salaire *1.1
WHERE Comm = 0;
Evry, 29-31 mai 2000 56© INT
DELETE
• Suppression des tuples d'une relation vérifiant un certain critère
DELETE FROM <relation>
WHERE <expression logique>
• En l'absence de la clause WHERE tous les tuples sont supprimés
Evry, 29-31 mai 2000 57© INT
Exemple
• Traiter la fin du projet Produit Y
DELETE FROM Travaille_sur
WHERE Nom = 'produitX';
Evry, 29-31 mai 2000 58© INT
TRUNCATE
• Suppression de tous les tuples d'une relationTRUNCATE TABLE relation;
• Vider la relation "projets" (après un archivage par exemple)TRUNCATE Projet;
SQL : aspect programmation
Evry, 29-31 mai 2000 60© INT
Contexte
• Limites du SQL interactif : – absence de structure de contrôle – absence de variable
=> Adopter un langage de type procédural
• SQL doit rester le seul langage d'accès aux données
=> SQL intégré (Embedded SQL)
Evry, 29-31 mai 2000 61© INT
SELECT nom, âge
FROM Employé
WHERE âge >30
Analyse Syntaxique
Vérification
DD
Optimisation
Génération d'un plan d'exécution
Forme exécutable de la requête
Exécution
Traitement d'une requête SQL
Evry, 29-31 mai 2000 62© INT
Concepts• Précompilateur
– Programme + ordres SQL => programme + appels bas niveaux BD
• Variable hôte– Variable déclarée dans le programme hôte pour le transfert
des données entre les ordres SQL intégrés et le programme hôte
– Utilisations:• Variables paramètres des ordres SQL (programme -> SGBD);• Zone de réception des données renvoyées par une interrogation
(SGBD -> programme).
Evry, 29-31 mai 2000 63© INT
Exemple: Pro*Cmain(){
exec sql include sqlca;exec sql begin declare section;
int num; /* no employé*/char nom[16]; /*nom employé*/
float sal: /* salaire*/ exec sql end declare section; printf("entrer le numéro de l'employé: "); scanf("%d", &num); exec sql select nom_emp, salaire
from Employé Where num_emp =: num into:nom,:sal;
if (sqlca.sqlcode == 0) { printf("nom: %s, salaire:%f\n", nom,
sal); } else { if (sqlca.sqlcode == 100) { printf("Pas d'employé ayant ce
numéro\n"); } else { printf("erreur:%d\n", sqlca.sqlcode); } } exit(); }