Programme Introduction aux BD et aux SGBD Le modèle relationnel Le langage de requête SQL La conception d’une BD relationnelle Protection des informations Perspectives des BD
Structured Query Language SQL Structured Query Language
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)
Instance
Instance (suite)
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
Clauses minimales SELECT attr1, attr2, .... attrn FROM relation; Exemples: SELECT Nom_d FROM Département; SELECT Nom, Nod "numéro" FROM Projet;
Joker SELECT * FROM Projet;
Elimination des doublons SELECT DISTINCT Local_proj FROM Projet;
Synonymes SELECT P.Nom, P.Nod FROM Projet P;
Clause WHERE SELECT 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;
Exemples Liste des employés dont la commission est supérieure à leur salaire SELECT No_ss FROM Employé WHERE Comm > Salaire; Liste des employés du département 5 dont le salaire est supérieur à 300 kF WHERE Salaire > 300 AND Nod = 5; Liste des employés qui ne sont pas du département 5 SELECT No_ss FROM Employé WHERE Nod <> 5; Liste des départements localisés à Paris ou à Fontainebleau SELECT Num_dept FROM Dept_local WHERE Id_loc IN ('Paris', 'Fontainebleau');
Clause ORDER BY ORDER BY {attribut [DESC | ASC]} Liste des employés ordonnée par ordre croissant de salaire SELECT No_ss FROM Employé ORDER BY Salaire;
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;
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;
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; ou FROM Travaille_sur T, Employé E 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
Sous-requêtes SELECT 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');
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;
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
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;
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
AVG ( ) Donner la moyenne des salaires. SELECT AVG(Salaire) FROM Employé; Donner la moyenne des revenus d'un salarié SELECT AVG(Salaire + Comm)
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;
MIN( ) Quel est le revenu minimum (commission comprise) ? SELECT MIN(Salaire + Comm) FROM Employé;
MAX( ) Quel est la commission maximale perçue ? SELECT MAX(Comm) FROM Employé;
COUNT() Quel est le nombre d'employés du département 5 ? SELECT COUNT(No_ss) FROM Employé WHERE Nod = 5; ou SELECT COUNT(*)
Exemples Attention SELECT Nom_emp, AVG(Salaire) FROM Employé; Donner le plus haut salaire, le plus bas salaire et la différence entre les deux SELECT MAX(Salaire), MIN(Salaire), MAX(Salaire) - MIN(Salaire) FROM Employé;
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
Exemple Donner le nombre d'employés par département. SELECT Nod, COUNT(*) FROM Employé GROUP BY Nod;
Evaluation du résultat Relation initiale
Evaluation du résultat Tri et partitionnement
Evaluation du résultat
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
Exemples Donner le salaire moyen des femmes par département. SELECT Nod, AVG(Salaire + Comm) FROM Employé WHERE Sexe = 'F' GROUP BY Nod;
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;
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;
Opérateurs ensemblistes Opérateurs binaires Deux relations de même schéma en entrée
Union Donner la liste des dépenses composant la masse salariale (salaire et commission). SELECT Salaire FROM Employé UNION SELECT Comm L'opérateur d'union élimine automatiquement les doublons
Exemple Attention aux schémas Donner la liste des départements avec leurs directeurs et des départements avec leurs localisations SELECT No_dept, No_dir FROM Département UNION SELECT Num_dept, Id_loc FROM Dept_local Problème
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
Différence Donner la liste des employés qui n'encadrent personne. SELECT No_ss FROM Employé EXCEPT SELECT No_chef
Questions quantifiées Prédicats ANY ALL EXISTS
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 WHERE No_ss =13334)
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é)
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);
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;
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))
Synthèse SQL 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
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;
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
INSERT Insérer des tuples dans une relation en spécifiant les valeurs à insérer INSERT INTO <relation> VALUES (<liste de valeurs>); INSERT INTO relation(<liste d'attributs>) Liste des noms d'attributs optionnelle
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);
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....
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
Exemple Augmenter de 10 % tous les employés n'ayant pas de commission. UPDATE Employé SET Salaire = Salaire *1.1 WHERE Comm = 0;
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
Exemple Traiter la fin du projet Produit Y DELETE FROM Travaille_sur WHERE Nom = 'produitX';
TRUNCATE Suppression de tous les tuples d'une relation TRUNCATE TABLE relation; Vider la relation "projets" (après un archivage par exemple) TRUNCATE Projet;
SQL : aspect programmation
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)
Traitement d'une requête SQL 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
Concepts Précompilateur Variable hôte 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).
Exemple: Pro*C if (sqlca.sqlcode == 0) main() { 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"); { printf("erreur:%d\n", sqlca.sqlcode); exit();