Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parGwenaël Prost Modifié depuis plus de 10 années
1
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
2
Structured Query Language
SQL Structured Query Language
3
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)
4
Instance
5
Instance (suite)
6
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
7
Clauses minimales SELECT attr1, attr2, .... attrn FROM relation;
Exemples: SELECT Nom_d FROM Département; SELECT Nom, Nod "numéro" FROM Projet;
8
Joker SELECT * FROM Projet;
9
Elimination des doublons
SELECT DISTINCT Local_proj FROM Projet;
10
Synonymes SELECT P.Nom, P.Nod FROM Projet P;
11
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;
12
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');
13
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;
14
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;
15
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;
16
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
17
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');
18
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;
19
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
20
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;
21
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
22
AVG ( ) Donner la moyenne des salaires.
SELECT AVG(Salaire) FROM Employé; Donner la moyenne des revenus d'un salarié SELECT AVG(Salaire + Comm)
23
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;
24
MIN( ) Quel est le revenu minimum (commission comprise) ?
SELECT MIN(Salaire + Comm) FROM Employé;
25
MAX( ) Quel est la commission maximale perçue ? SELECT MAX(Comm)
FROM Employé;
26
COUNT() Quel est le nombre d'employés du département 5 ?
SELECT COUNT(No_ss) FROM Employé WHERE Nod = 5; ou SELECT COUNT(*)
27
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é;
28
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
29
Exemple Donner le nombre d'employés par département.
SELECT Nod, COUNT(*) FROM Employé GROUP BY Nod;
30
Evaluation du résultat
Relation initiale
31
Evaluation du résultat
Tri et partitionnement
32
Evaluation du résultat
33
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
34
Exemples Donner le salaire moyen des femmes par département.
SELECT Nod, AVG(Salaire + Comm) FROM Employé WHERE Sexe = 'F' GROUP BY Nod;
35
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;
36
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;
37
Opérateurs ensemblistes
Opérateurs binaires Deux relations de même schéma en entrée
38
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
39
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
40
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
41
Différence Donner la liste des employés qui n'encadrent personne.
SELECT No_ss FROM Employé EXCEPT SELECT No_chef
42
Questions quantifiées
Prédicats ANY ALL EXISTS
43
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é SELECT No_ss FROM Travaille_sur WHERE No_projet = ANY (SELECT No_projet WHERE No_ss =13334)
44
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é)
45
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);
46
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;
47
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))
48
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
49
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;
50
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
51
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
52
Exemples Créer le nouveau département "Distribution" de numéro 6, dirigé par à 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 La date d'affectation est pour l'instant inconnue. INSERT INTO département (No_dept, nom_d, No_dir) VALUES (6, 'Distribution', 18886);
53
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....
54
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
55
Exemple Augmenter de 10 % tous les employés n'ayant pas de commission.
UPDATE Employé SET Salaire = Salaire *1.1 WHERE Comm = 0;
56
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
57
Exemple Traiter la fin du projet Produit Y DELETE FROM Travaille_sur
WHERE Nom = 'produitX';
58
TRUNCATE Suppression de tous les tuples d'une relation
TRUNCATE TABLE relation; Vider la relation "projets" (après un archivage par exemple) TRUNCATE Projet;
59
SQL : aspect programmation
60
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)
61
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
62
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).
63
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();
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.