NFE113 Administration et configuration des bases de données - 2010 SQL. SEarch by QUEry Language. Eric Boniface



Documents pareils
Le Langage De Description De Données(LDD)

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Le Langage SQL version Oracle

Bases de Données relationnelles et leurs systèmes de Gestion

Langage SQL : créer et interroger une base

SQL Historique

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

14/04/2014. un ensemble d'informations sur un sujet : exhaustif, non redondant, structuré, persistant. Gaëlle PERRIN SID2 Grenoble.

Introduction au Système de Gestion de Base de Données et aux Base de Données

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Olivier Mondet

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Intégrité des données

Plan. Bases de Données. Sources des transparents. Bases de SQL. L3 Info. Chapitre 4 : SQL LDD Le langage de manipulation de données : LMD

Bases de données relationnelles

MySQL / SQL EXEMPLES

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Pour les débutants. langage de définition des données

TP3 : Creation de tables 1 seance

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

Administration des bases de données. Jean-Yves Antoine

16H Cours / 18H TD / 20H TP

Le langage SQL (première partie) c Olivier Caron

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

Système de Gestion de Bases de Données Relationnelles. MySQL. Youssef CHAHIR

TP Contraintes - Triggers

PHP 5. La base de données MySql. A. Belaïd 1

Les bases de données

Auto-évaluation Oracle: cours de base

SQL sous SqlServer OLIVIER D. DEHECQ Olivier 0

1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

CREATION WEB DYNAMIQUE

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

1 Introduction et installation

Bases de données et sites WEB

FileMaker 13. Guide de référence SQL

Les BASES de DONNEES dans WampServer

Intégrité sémantique dans les bases de données relationnelles

Chapitre 3 LE MODELE RELATIONNEL ET SQL (DDL)

Notes de cours : bases de données distribuées et repliquées

TD : Requêtes SQL (BDR.TD2-1) INSA 3IF

LE LANGAGE SQL2 1. INTRODUCTION

Compétences Business Objects

Le langage SQL Rappels

Création et Gestion des tables

Historisation des données

Mejdi BLAGHGI & Anis ASSÈS

Partie 0 : Gestion des tablespace et des utilisateurs... 3

Cours SQL. Base du langage SQL et des bases de données

Systèmes de Gestion de Bases de Données

MODE OPERATOIRE OPENOFFICE BASE

Plan Général Prévisionnel (1/2) (non contractuel) Internet et Outils L1/IO S2-IO2 Bases de données: Jointures, Transactions

SQL. Oracle. pour. 4 e édition. Christian Soutou Avec la participation d Olivier Teste

Cours Bases de données 2ème année IUT

Partie II Cours 3 (suite) : Sécurité de bases de données

Introduction aux Bases de Données 2004/2005

Gestion des utilisateurs et de leurs droits

Cours: Administration d'une Base de Données

Bases de Données Avancées

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Exemple accessible via une interface Web. Bases de données et systèmes de gestion de bases de données. Généralités. Définitions

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

OpenPaaS Le réseau social d'entreprise

Bases de données Cours 4 : Le langage SQL pour ORACLE

Gestion de base de données

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

1/ Présentation de SQL Server :

I. MySQL : Serveur et SGBD

A QUOI SERVENT LES BASES DE DONNÉES?

Support de cours. Introduction à SQL et MySQL. 2003, Sébastien Namèche

Optimisation SQL. Quelques règles de bases

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

Bases de données élémentaires Maude Manouvrier

Cours 3. Développement d une application BD. DBA - Maîtrise ASR - Université Evry

Bases de Données. Plan

WEB DEVELOPER SGBD SYSTEME DE GESTION DE BASES DE DONNEES L étudiant sera capable :

INTRODUCTION : Données structurées et accès simplifié

UML et les Bases de Données

Construction d un EDD avec SQL 2008 R2. D. Ploix - M2 Miage - EDD - Création

Présentation du module Base de données spatio-temporelles

FORMATION A L UTILISATION DE PMB QUELQUES NOTIONS DE SQL

Bases de données avancées

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

TP Bases de données réparties

I4 : Bases de Données

Bases de données relationnelles & SQL

Cours Base de données relationnelles. M. Boughanem, IUP STRI

Application web de gestion de comptes en banques

A QUOI SERVENT LES BASES DE DONNÉES?

Session S12 Les bases de l optimisation SQL avec DB2 for i

Gestion des transactions et accès concurrents dans les bases de données relationnelles

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Bases de données. Yamine AIT AMEUR. INPT-ENSEEIHT DIMA 2 Rue Charles Camichel Toulouse Cedex 7

Réplication E-maj Foreign Data Wrapper PostGIS PostgreSQL-f

Résumé S Q L. Auteur: Alexandre PATIN Edition: 22 février alexandre.patin@free.fr URL :

Université de Nice Sophia-Antipolis. Langage SQL. version 5.7 du polycopié. Richard Grin

Transcription:

NFE113 Administration et configuration des bases de données - 2010 SQL SEarch by QUEry Language 1 Eric Boniface

Sommaire Historique et principes Langage de Définition de Données Langage de Manipulation de Données 2

Historique Langage de base de données relationnelles Développé chez IBM (1970-80) d après T. Codd Devenu une norme (ANSI/ISO) en 1986 Standards SQL86 ou SQL87, puis SQL89 SQL92 ou SQL2 SQL99 ou SQL3 SQL:2003 Manipulation XML,«window functions», ordres standardisés, colonnes avec valeurs auto-produites SQL:2008 Fcts de fenêtrage, limitation du nombre de ligne, etc. 3

Principes 2 composants principaux LDD : Langage de Définition de Données LMD : Langage de Manipulation de Données SQL dans un SGBD = adaptation de la norme à ce SGBD Utilisable en interactif comme langage de programmation Langage assertionnel (non procédural) : décrire les caractéristiques des données recherchées et non le chemin d'accès 4

Principes Quelques correspondances Domaine -> Type Attribut -> Colonne (Column), Field en Access Relation -> Table Base de données -> Database Tuple -> Ligne (row) 5

Principes SQL se décompose en 5 parties, à savoir : LDD (langage de définition des données) : modifier la structure de la base de données LMD (langage de manipulation des données) : permet de consulter / modifier le contenu de la base de données LCD (langage de contrôle des données) : gestion des privilèges LCT (langage de contrôle des transactions) : gestion des transactions SQL procédural : PSM (Persistent Stored Module), CLI (Call Level Interface), Embedded SQL, ensemble d'outils pour développer des procédures, déclencheurs (triggers) et fonctions utilisateurs (UDF : User Define Function) et pour que SQL s'interface avec des langages hôtes 6

Principes Environnement SQL Catalogue C1 Schéma Table 1 catalogue et 1 schéma par défaut La norme SQL intègre le concept de métabase mais les règles sont peu suivies par les règles des éditeurs de SGBD 7

Principes Permet de Créer Modifier Supprimer Renommer Les éléments du schéma d'une base de données Les tables Les vues Les index 8

Sommaire Historique et principes Langage de Définition de Données Langage de Manipulation de Données 9

SQL LDD 3 ordres SQL CREATE : créer un objet dans la base de données. ALTER : modifier la structure d un objet existant DROP : supprimer un objet Syntaxe générale Ordre_SQL type_d'objet nom_d'objet ( paramètres ) 10

SQL LDD - Create Création d'une base de données. CREATE DATABASE nom_base_de_donnees paramètres Paramètres variables selon SGBD Allocation d espace disque (données & journal -log), Jeu de caractères (ISO, UTF8 ) Etc. Exemple CREATE DATABASE PERSONNEL 11

SQL LDD - Create Création d'une table CREATE TABLE nomtable ( nomcol1 typecol1 [contraintecol1], nomcol2 typecol2 [contraintecol2],..., contraintetable1, contraintetable2,...); Typecol : type de données, variable selon les SGBD 12

SQL LDD Type de données Caractères : au maximum 255 CHAR ou VARCHAR Exemple : NOM CHAR (15) Numériques : NUMBER(précision,échelle) norme : DECIMAL, REAL, FLOAT,INTEGER) Exemple : NUMBER (8,2) = 8 chiffres dont 2 après la virgule maximum 13

SQL LDD - Type de données Dates : DATE hors norme format standard : DD-MON-YY stocke : siècle, année, mois, jour, heure, minutes et secondes fonctions de conversion de format avec masques D'autres types hors norme : LONG, RAW RAW binaire chaîne d'octet de longueur variable sous forme hexadécimale LONG chaîne longue maximum 64 K 1 seule par table inutilisable dans les expressions, les prédicats et dans les tris 14

SQL LDD - Type de données Données de grande taille (SQL3) BLOB Binary Large Object CLOB Character Large Object Types définis par l utilisateur (SQL3) CREATE TYPE 15

SQL LDD - Create Création de la table EMPLOYE CREATE TABLE EMPLOYE ( matricule INTEGER NOT NULL, nom VARCHAR (32) NOT NULL, service CHAR (3) NOT NULL, telephone INTEGER NULL, sexe CHAR (1) NOT NULL CHECK (sexe IN ('M', 'F')), frais REAL NULL, dtemb DATE NOT NULL ) Création de la table SERVICE CREATE TABLE SERVICE ( service CHAR (3) NOT NULL, nomserv VARCHAR (32) NOT NULL, lieu VARCHAR (32) NOT NULL, resp INTEGER NOT NULL ) 16

SQL LDD Intégrité référentielle Garant de la cohérence du modèle de base de données Mise en œuvre Définition de clés primaires (PK, Primary Key) sur 1 ensemble de colonnes (1 ou plus) Notion d unicité et de référence (domaine) Une seule possible par table Toutes les colonnes la composant doivent être NOT NULL Définition de clés étrangères / secondaires (FK, Foreign Key) Contrainte de valeur d'1 à n colonnes d'une table par rapport à une PK préalablement définie 17

SQL LDD Intégrité référentielle Colonnes obligatoires : nomcol type NOT NULL Exemple : CREATE TABLE FOURNISSEUR(..., F# NOT NULL CONSTRAINT NN_CNT); "CONSTRAINT nom" permet de nommer la contrainte Unicité d'une colonne : nomcol type UNIQUE Exemple : F# NOT NULL UNIQUE Il faut que la colonne soit NOT NULL Il faut que la colonne ne soit pas une clé primaire 18

SQL LDD Intégrité référentielle Unicité de plusieurs colonnes UNIQUE (nomcol1,nomcol2,...) Exemple : UNIQUE (FNOM,VILLE) Clé primaire : nomcol type PRIMARY KEY ou PRIMARY KEY (nomcol1,nomcol2,..) 1 seule par table, il faut que la colonne soit NOT NULL Sera comparée à la clé étrangère par la contrainte référentielle 19

SQL LDD Intégrité référentielle Contrainte référentielle nomcol REFERENCES nomtable (nomcol) Ou FOREIGN KEY (listecolonnes) REFERENCES table(listecolonnes) La (ou les) colonne référencée doit être clé primaire ou colonne unique dans l'autre table Contrainte sémantique : CHECK condition Compare les colonnes d'une même table Exemple : CHECK (AGE BETWEEN 7 AND 77) 20

SQL LDD Intégrité référentielle MySQL CREATE TABLE Persons ( ) P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), UNIQUE (P_Id) 21

SQL LDD Intégrité référentielle SQL Server / Oracle / MS Access CREATE TABLE Persons ( P_Id int NOT NULL UNIQUE, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) ) 22

SQL LDD Intégrité référentielle MySQL / SQL Server / Oracle / MS Access CREATE TABLE Persons ( ) P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CONSTRAINT uc_personid UNIQUE (P_Id,LastName) Pour pouvoir nommer une contrainte UNIQUE, et pour définir une contrainte sur plusieurs colonnes 23

SQL LDD - Alter Utilisation la plus courante : ajout de colonnes dans une table Avec définition d'une valeur par défaut, sans contrôle de valeur ALTER TABLE EMPLOYE ADD salaire REAL NOT NULL DEFAULT 0 Avec restriction sur la valeur ALTER TABLE EMPLOYE ADD salaire REAL NULL CHECK salaire > 80000 dtnais DATE NULL Avec contrôle par rapport à une valeur externe à la table / à la base Ex : contrôle salaire > minimum légal Difficile à obtenir par le DDL, se fera par la mise en oeuvre de triggers 24

SQL LDD - Alter Ajouter une contrainte : ADD contrainte Exemple : ALTER TABLE FOURNISSEUR ADD UNIQUE (FNOM,VILLE); Modifier la définition d'une colonne MODIFY nomcol modif Modifier la taille, le type (pour modifier le type ou réduire la taille, il faut que toute la colonne soit vide) Ajouter NOT NULL (s'il n'y a pas déjà des valeurs nulles) Exemple : ALTER TABLE FOURNISSEUR MODIFY VILLE CHAR(20); 25

SQL LDD - Drop Syntaxe générale DROP type d'objet nom d'objet Suppression d une table DROP TABLE nomtable [RESTRICT CASCADE]; Suppression de la base de données DROP DATABASE PERSONNEL Suppression d une contrainte nommée DROP CONSTRAINT nomcontrainte 26

SQL LDD - Drop Impossible de supprimer une table créée par un autre utilisateur sauf le DBA DROP nomtable supprime aussi les index sur la table DROP nomtable ne supprime pas les vues associées à cette table mais les rend bien sûr indisponibles RESTRICT bloque si une FOREIGN KEY ou un trigger dépend de cette table CASCADE supprime aussi tout ce qui dépend RESTRICT par défaut 27

SQL LDD - Rename Syntaxe générale RENAME anciennom TO nouveaunom; Exemple RENAME FOURNISSEUR TO F; Existe pour MySQL par exemple Oracle / MySQL SQL Server alter table bad_name rename to good_name; EXEC sp_rename 'OldTableName', 'NewTableName' 28

SQL LDD - Vues Ce sont des tables virtuelles Ce sont des questions stockées Permet le contrôle des accès Permet l'indépendance logique des données, plusieurs vues d'un même ensemble de données Matérialisation des vues dans le concept des entrepôts de données 29

SQL LDD - Vues Création CREATE VIEW nomvue [alias1,alias2,...] AS question; Les alias permettent de renommer les colonnes de la table dans la vue Exemple : Fournisseurs de Londres CREATE VIEW FOURN_LOND AS SELECT F#,FNOM,STATUT FROM FOURNISSEUR WHERE VILLE="Londres"; Pas de clause ORDER BY 30

SQL LDD - Vues Suppression DROP VIEW nomvue; Exemple DROP VIEW FOURN_LOND; 31

SQL LDD - Vues En interrogation, comme avec une table réelle : l'ordre SQL de création de la vue ré-exécuté à chaque référence à la vue Exemple create view Bon_Client (id, nom, solde) as select id, nom, solde from Client where solde > 1000 with check option ; select * from Bon_Client ; select * from Bon_Client where lower (nom) like '%gold%' ; 32

SQL LDD - Vues Si la vue doit être utilisée en mise à jour, option WITH CHECK OPTION à la fin de CREATE pour contrôler que les modifications respectent la définition de la vue Restrictions imposées par Oracle pas d opérateurs ensemblistes pas de fonction d agrégation pas de clause group by ou order by pas de sous requête pas de collection dans un select (objet-relationnel) toutes les colonnes de la table définies en NOT NULL sont dans la vue 33

SQL LDD - Vues Exemple avec WITH_CHECK_OPTION Insert into Bon_Client values (15, 'martin', 2000) ; -- OK Insert into Bon_Client values (20, 'dupont', 500) ; -- échec : solde > 1000 Association de «trigger» : suivant les SGBD Oracle / SQL Server / PostgreSQL : OK MySQL : NOK 34

SQL LDD - Index Hors norme Pour garantir l'unicité de certaines données Peuvent être créés sur une ou plusieurs colonnes Créés par l'utilisateur (ou plutôt le DBA) Pas référencés lors de la manipulation L'optimiseur les utilise, le cas échéant Accélère les interrogations Peut pénaliser les mises à jour Index clé : index = physique / clé = logique Un index peut être unique ou non unique Structure interne : principalement B-trees 35

SQL LDD - Index Création CREATE [UNIQUE] INDEX nomindex ON table (nomcol1 [ASC/DESC], nomcol2 [ASC/DESC],...); UNIQUE : 2 lignes de la table indexée ne peuvent pas prendre la même valeur pour le champ d'indexation Exemples FOURNISSEUR(F#,...,VILLE) PRODUIT(P#,...) COMMANDE(F#,P#,DATE,...) CREATE UNIQUE INDEX I1 ON FOURNISSEUR(F#); CREATE INDEX I2 ON FOURNISSEUR(VILLE); Non unique, plusieurs fournisseurs dans la même ville CREATE UNIQUE INDEX I3 ON PRODUIT(P#); CREATE INDEX I4 ON COMMANDE(F#,P#,DATE DESC); Non unique, un même produit peut être commandé plusieurs fois le même jour (par différents clients) 36

SQL LDD - Index Suppression DROP INDEX nomindex; Exemple DROP INDEX I4; 37

SQL LDD - Index En pratique, création des index sur Les colonnes servant souvent de critère de recherche (clé d'accès) Les colonnes de jointure Les colonnes identifiantes A éviter pour Les colonnes souvent modifiées Les colonnes contenant peu de valeurs distinctes 38

Sommaire Historique et principes Langage de Définition de Données Langage de Manipulation de Données 39

SQL Langage Manipulation INTERROGATION SELECT MISE A JOUR INSERT ajout UPDATE modification DELETE suppression 40

SQL Langage Manipulation Schéma relationnel servant pour les exemples Table FOURNISSEUR Table PIECE Table PROJET F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) Table FOURNISSEUR-PIECE-PROJET FPJ(FNO,PNO,JNO,QTE) 41

SQL LMD Interrogations Sélectionne SELECT liste-colonnes FROM nomtable WHERE condition; Les colonnes précisées dans le SELECT (avec alias : nomcol nouveaunom (Oracle) ou nomcol AS nouveaunom (norme SQL)) Provenant de la table précisée dans le FROM Dont les lignes vérifient la condition précisée dans le WHERE Remarques Pour toutes les colonnes : * Sans doubles : DISTINCT Possible expressions calculées/chaînes de caractères (entre ' ') Si condition complexe, utilisation des opérateurs AND, OR et NOT 42

SQL LMD Interrogations F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Numéros et statuts des fournisseurs localisés à Paris SELECT FNO,STATUT FROM F WHERE VILLE='Paris'; Liste des numéros des pièces SELECT PNO FROM P; Liste des numéros de pièces effectivement fournies SELECT DISTINCT PNO FROM FPJ; Numéros des pièces et poids en grammes SELECT PNO,'Poids en grammes : ', POIDS*454 FROM P; 43

SQL LMD Interrogations F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Toutes les informations relatives aux fournisseurs SELECT * FROM F; Numéros des fournisseurs localisés à Paris avec un statut supérieur à 20 SELECT FNO FROM F WHERE VILLE='Paris' AND STATUT>20; Numéros des fournisseurs localisés en France (Paris et Marseille) SELECT FNO FROM F WHERE VILLE='Paris' OR VILLE='Marseille'; 44

SQL LMD Comparaisons =!= ^= <> (différent) >= > <= < BETWEEN valeur minimale AND valeur maximale (au sens large) IS NULL (ne contient pas de valeur) IS NOT NULL (a une valeur, même 0) LIKE chaîne de caractères (avec jokers) % remplace n'importe quelle suite de caractères _ (souligné) remplace n'importe quel caractère IN (,,, ) inclusion d'une valeur dans une liste NOT IN (,,, ) = ANY (,,, ) équivaut à IN < > ALL (,,, ) équivaut à NOT IN Possible d accoler n'importe quel opérateur de comparaison simple (=,!=, >=, >, <=, <) avec ANY ou ALL 45

SQL LMD Interrogations F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Numéros des fournisseurs qui ne sont pas de Londres SELECT FNO FROM F WHERE NOT(VILLE='Londres'); Numéros des fournisseurs qui ont un statut entre 10 et 30 SELECT FNO FROM F WHERE STATUT >= 10 AND STATUT <=30; ou SELECT FNO FROM F WHERE STATUT BETWEEN 10 AND 30; SELECT FNO FROM F WHERE VILLE!= 'Londres'; (!= ou ^= ou <>) 46

SQL LMD Interrogations F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Numéros des fournisseurs dont le statut est 10,20 ou 30 SELECT FNO FROM F WHERE STATUT=10 OR STATUT=20 OR STATUT=30; ou SELECT FNO FROM F WHERE STATUT IN (10,20,30); (ou = ANY(10,20,30)) Numéros des fournisseurs «sans» ville SELECT FNO FROM F WHERE VILLE IS NULL; 47

SQL LMD Interrogations F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Numéros des fournisseurs dont le nom commence par C SELECT FNO FROM F WHERE FNOM LIKE 'C%'; Numéros et noms des fournisseurs dont la deuxième lettre est un C SELECT FNO,FNOM FROM F WHERE FNOM LIKE '_C%'; Numéros des fournisseurs dont le statut n'est ni 10, ni 20, ni 30 SELECT FNO FROM F WHERE STATUT NOT IN (10,20,30); ou SELECT FNO FROM F WHERE STATUT! = ANY (10,20,30); 48

SQL LMD Interrogations Table de vérité 49

SQL LMD Interrogations Interrogations avec tri du résultat SELECT liste-colonnes FROM nomtable WHERE condition ORDER BY liste-colonnes; Dans la clause ORDER BY Des noms de colonnes Des expressions avec noms de colonnes Des numéros de position des colonnes dans la clause SELECT Précision du sens (croissant / décroissant) : ASC ou DESC. Par défaut, croissant Les valeurs nulles sont à la fin en ASC, au début par ordre DESC Si ORDER BY et DISTINCT sont spécifiés, la clause ORDER BY ne peut pas se référer à des colonnes non mentionnées dans la clause SELECT 50

SQL LMD Interrogations F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Numéros des fournisseurs localisés à Paris, dans l'ordre décroissant des statuts SELECT FNO FROM F WHERE VILLE='Paris' ORDER BY STATUT DESC; Numéros des fournisseurs dans l'ordre décroissant des statuts et, pour les fournisseurs de même statut, par ordre alphabétique des noms SELECT FNO FROM F ORDER BY STATUT DESC, FNOM ASC; 51

SQL LMD Interrogations F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Supposons que pour la pièce on a PRIXACHAT et PRIXVENTE, donner la liste des numéros de pièces avec les marges unitaires classées de la plus grande à la plus faible SELECT PNO, PRIXVENTE-PRIXACHAT FROM P ORDER BY 2 DESC; 52

SQL LMD Interrogations avec fonctions Fonctions numériques ABS(n) valeur absolue CEIL(n) partie entière + 1 FLOOR(n) partie entière MOD(m,n) modulo n POWER(m,n) puissance n ROUND(n[,m]) arrondi à m décimales SIGN(n) signe de n : -1, 0 ou 1 SQRT(n) racine carrée TRUNC(n[,m]) tronqué à m décimales 53

SQL LMD Interrogations avec fonctions Quelques fonctions sur les caractères CHR(n) caractère de code n INITCAP(c) transforme la chaîne en 'Titre' (1ère lettre de chaque mot en majuscules) LENGTH(c) longueur de c LOWER(c) tout en minuscules REPLACE(c,chaîne à remplacer,chaîne de remplac.) SOUNDEX(c) représentation phonétique SUBSTR(c,m,n) extrait n caractères à partir du m-ième caractère TRANSLATE(c,c1,c2) remplace partout dans c le caractère c1 par le caractère c2 UPPER(c) tout en majuscules 54

SQL LMD Interrogations avec fonctions Quelques fonctions sur les dates MONTHS_BETWEEN(d1,d2) nombre de mois entre 2 dates SYSDATE date système Quelques autres fonctions TO_DATE(chaîne,format) convertit la chaîne en date dans le format spécifié, ex de format : DD/MM/YY TO_CHAR(date,format) convertit la date en chaîne TO_NUMBER(chaîne) convertit une chaîne en numérique 55

SQL LMD Interrogations F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Statut du fournisseur Dupont (on ne sait pas si les noms ont été saisis en minuscules ou majuscules) SELECT STATUT FROM F WHERE UPPER (FNOM)='DUPONT'; (ou LOWER (FNOM)='dupont') Supposons que l'on ajoute la date de fin de projet DATPROJ dans la table J, rechercher la liste des projets terminés SELECT * FROM J WHERE DATPROJ < SYSDATE; 56

SQL LMD Interrogations Interrogations avec agrégats de lignes SELECT... FROM... WHERE... GROUP BY liste-colonnes HAVING condition; Regroupement des lignes ayant les mêmes valeurs pour l'ensemble des colonnes du GROUP BY Le SELECT contient une fonction qui porte sur un ensemble de valeurs Le HAVING permet de tester une condition contenant une fonction agrégat Liste des principales fonctions agrégats AVG(colonne) COUNT(DISTINCT colonne) COUNT(*) COUNT(colonne) MAX(colonne) MIN(colonne) SUM(colonne) 57

SQL LMD Interrogations Les fonctions agrégats peuvent figurer dans le SELECT ou dans le HAVING Calcul statistique sur un groupe de lignes vérifiant une condition SELECT fonction statistique FROM table WHERE condition; Calcul sur tous les groupes SELECT fonction statistique FROM table GROUP BY col1, col2, ; 58

SQL LMD Interrogations Calcul sur différents groupes avec condition sur le groupe SELECT FROM table GROUP BY colonnes HAVING condition; Remarques Pas de HAVING sans GROUP BY Quand il y a GROUP BY, la clause SELECT ne peut contenir que des calculs statistiques et/ou les colonnes du GROUP BY 59

SQL LMD Interrogations F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Nombre total de fournisseurs SELECT COUNT(*) FROM F; Nombre total de fournisseurs qui fournissent effectivement des pièces SELECT COUNT(DISTINCT FNO) FROM FPJ; Nombre de fournisseurs qui fournissent des pièces de numéro 'P2' SELECT COUNT(DISTINCT FNO) FROM FPJ WHERE PNO='P2'; 60

SQL LMD Interrogations F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Quantité totale de pièce 'P2' vendue SELECT SUM(QTE) FROM FPJ WHERE PNO='P2'; Valeurs minimale et maximale du statut de fournisseur SELECT MIN(STATUT),MAX(STATUT) FROM F; 61

SQL LMD Interrogations F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Quantité totale par type de pièce SELECT PNO, SUM(QTE) FROM FPJ GROUP BY PNO; Quantité moyenne par type de pièce et par projet SELECT PNO,JNO,AVG(QTE) FROM FPJ GROUP BY PNO,JNO; Numéros des pièces fournies par plus d'un fournisseur SELECT PNO FROM FPJ GROUP BY PNO HAVING COUNT(DISTINCT FNO) > 1; 62

SQL LMD Interrogations F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Villes dont les fournisseurs ont tous le même statut SELECT VILLE FROM F GROUP BY VILLE HAVING COUNT(DISTINCT STATUT)=1; Villes ayant des fournisseurs d'au moins 2 statuts SELECT VILLE FROM F GROUP BY VILLE HAVING COUNT(DISTINCT STATUT)>1; ou SELECT VILLE FROM F GROUP BY VILLE HAVING MIN(STATUT)<>MAX(STATUT); 63

SQL LMD Interrogations Calcul sur différents groupes avec condition sur le groupe SELECT FROM table GROUP BY colonnes HAVING condition; Remarques Pas de HAVING sans GROUP BY Quand il y a GROUP BY, la clause SELECT ne peut contenir que des calculs statistiques et/ou les colonnes du GROUP BY 64

SQL LMD Interrogations Sous-interrogations Dans la clause WHERE, on peut faire référence à une clause SELECT Noms des fournisseurs qui fournissent la pièce 'P2' SELECT FNOM FROM F WHERE FNO IN (SELECT FNO FROM FPJ WHERE PNO='P2'); Numéros des fournisseurs localisés dans la même ville que 'F1' SELECT FNO FROM F WHERE VILLE = (SELECT VILLE FROM F WHERE FNO='F1'); 65

SQL LMD Interrogations F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Noms des fournisseurs qui fournissent au moins une pièce rouge SELECT FNOM FROM F WHERE FNO IN (SELECT FNO FROM FPJ WHERE PNO IN (SELECT PNO FROM P WHERE COULEUR='rouge')); Numéros des fournisseurs ayant un statut inférieur au statut maximal SELECT FNO FROM F WHERE STATUT < (SELECT MAX(STATUT) FROM F); 66

SQL LMD Interrogations On doit parfois mettre une colonne dans le GROUP BY pour pouvoir l afficher Le WHERE est appliqué avant le HAVING. Un HAVING sans GROUP BY = WHERE Généralisations du GROUP BY CUBE ROLLUP 67

SQL LMD Jointures Les requêtes SQL vues permettent de récupérer des données d une table Mais le modèle relationnel a pour objectif de lier plusieurs tables Les jointures vont permettre d interroger plusieurs tables Utilisation des clés, primaires, étrangères, etc. 68

SQL LMD Jointures SYNTAXE Oracle Dans la clause FROM, on précise la liste des tables à joindre Dans la clause WHERE, on précise, en plus de la restriction, les critères de jointure On peut donner éventuellement un nom d'alias à chaque table Le nom d'alias est obligatoire pour les auto-jointures (jointures d'une table avec elle-même) 69

SQL LMD Jointures SYNTAXE SQL2 : jointures naturelles SELECT listecolonnes FROM table1 NATURAL JOIN table2; Permet d'éviter de préciser les colonnes concernées par la jointure Le compilateur SQL recherche dans les 2 tables, les colonnes dont le nom est identique. Le type de données doit être le même Rarement accepté par les moteurs SQL 70

SQL LMD Jointures SYNTAXE SQL2 : jointures internes SELECT listecolonnes FROM table1 [INNER] JOIN table2 ON critèredejointure; INNER est facultatif. Par défaut l'absence de précision de la nature de la jointure la fait s'exécuter en jointure interne Exemple SELECT CLI_NOM, TEL_NUMERO FROM T_CLIENT C INNER JOIN T_TELEPHONE T ON C.CLI_ID = T.CLI_ID 71

SQL LMD Jointures F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Noms des fournisseurs qui fournissent la pièce 'P2' SELECT F.FNOM FROM F,FPJ WHERE F.FNO=FPJ.FNO AND FPJ.PNO='P2'; Numéros des fournisseurs localisés dans la même ville que 'F1' SELECT FOUR2.FNO FROM F FOUR1, F FOUR2 WHERE FOUR2.VILLE=FOUR1.VILLE AND FOUR1.FNO='F1'; Noms des fournisseurs qui fournissent au moins une pièce rouge SELECT F.FNOM FROM F,P,FPJ WHERE F.FNO=FPJ.FNO AND P.PNO=FPJ.PNO AND P.COULEUR='rouge'; 72

SQL LMD Jointures F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Donner les combinaisons fournisseurs-pièces localisés au même endroit SELECT F.*, P.* FROM F,P WHERE F.VILLE=P.VILLE; ou SELECT F.*, P.* FROM F,P,FPJ WHERE F.FNO=FPJ.FNO AND FPJ.PNO=P.PNO AND F.VILLE=P.VILLE; Donner les combinaisons fournisseurs-pièces localisés au même endroit, en ignorant les fournisseurs de statut 20 SELECT F.*, P.* FROM F,P WHERE F.VILLE=P.VILLE AND F.STATUT!=20; 73

SQL LMD Jointures F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Donner la paire de villes telle que le fournisseur localisé dans la première ville fournit la pièce stockée dans la seconde ville SELECT DISTINCT F.VILLE,P.VILLE FROM F,P,FPJ WHERE F.FNO=FPJ.FNO AND FPJ.PNO=P.PNO; Noms des fournisseurs qui fournissent au moins une pièce fournie par le fournisseur 'F1' SELECT FOUR1.FNOM FROM F FOUR1, FPJ C1, FPJ C2 WHERE FOUR1.FNO=C1.FNO AND C1.PNO=C2.PNO AND C2.FNO='F1'; 74

SQL LMD Jointures F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Triplets FNO,PNO,JNO tels que fournisseur, pièce et projet soient situés dans la même ville SELECT DISTINCT F.FNO, P.PNO, J.JNO FROM F, P, J WHERE F.VILLE=P.VILLE AND P.VILLE=J.VILLE; Numéros des projets dont au moins un des fournisseurs ne se trouve pas dans la même ville que celle où le projet se déroule SELECT DISTINCT J.JNO FROM FPJ,F,J WHERE FPJ.FNO=F.FNO AND FPJ.JNO=J.JNO AND F.VILLE< >J.VILLE; 75

SQL LMD Jointures externes Permettent d'ajouter (avec des valeurs nulles) les lignes n'ayant pas de correspondant dans l'autre table Ajouter (+) après la colonne à conserver (syntaxe Oracle) Liste des quantités fournies par pièce avec les caractéristiques de la pièce SELECT P.*, FNO, JNO FROM P, FPJ WHERE P.PNO=FPJ.PNO; Ne donne pas ces quantités si la pièce n'est pas décrite dans la table P 76

SQL LMD Jointures externes SYNTAXE SQL2 : jointures externes SELECT... FROM <table gauche> LEFT RIGHT FULL OUTER JOIN <table droite 1> ON <condition de jointure> [LEFT RIGHT FULL OUTER JOIN <table droite 2> ON <condition de jointure 2>]; LEFT fait référence à la table située à gauche du mot clef JOIN RIGHT à la table située à droite de ce même mot clef Le mot FULL indique que la jointure externe est bilatérale 77

SQL LMD Jointures externes SYNTAXE SQL2 : jointures externes SELECT colonnes FROM TGauche LEFT OUTER JOIN TDroite ON condition de jointure Recherche de toutes les valeurs satisfaisant la condition, rajout des lignes de TGauche non prises en compte SELECT colonnes FROM TGauche RIGHT OUTER JOIN TDroite ON condition de jointure Recherche toutes les valeurs satisfaisant la condition de jointure, rajout des lignes de TDroite SELECT colonnes FROM TGauche FULL OUTER JOIN TDroite ON condition de jointure Recherche des valeurs satisfaisant la condition de jointure, rajout des lignes de TGauche et TDroite 78

SQL LMD Jointures externes SELECT P.*, FPJ.* FROM P, FPJ WHERE P.PNO=FPJ.PNO (+); Donne toutes les pièces même si elles n'ont pas été commandées SELECT P.*, FPJ.* FROM P, FPJ WHERE P.PNO (+)=FPJ.PNO; Donne toutes les commandes même celles de pièces non référencées dans P SELECT P.*, FPJ.* FROM P, FPJ WHERE P.PNO (+)=FPJ.PNO(+); Interdit : une seule jointure externe par prédicat 79

SQL LMD Jointures externes Il existe des équivalences entre différentes expressions logiques à base de jointures externes Les principales sont la jointure externe droite peut être obtenue par une jointure externe gauche dans laquelle on inverse l'ordre des tables la jointure externe bilatérale peut être obtenue par la combinaison de deux jointures externes unilatérales avec l'opérateur ensemblistes UNION 80

SQL LMD Exists Avec l'opérateur EXISTS, on peut tester le contenu d'une clause SELECT. Il vaut vrai si le résultat du SELECT contient au moins une ligne, faux sinon Noms des fournisseurs qui fournissent la pièce 'P2' SELECT FNOM FROM F WHERE EXISTS (SELECT * FROM FPJ WHERE FNO=F.FNO AND PNO='P2'); 81

SQL LMD Jointures F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Noms des fournisseurs qui ne fournissent pas 'P2' SELECT FNOM FROM F WHERE NOT EXISTS (SELECT * FROM FPJ WHERE FNO=F.FNO AND PNO='P2'); Noms des fournisseurs qui fournissent toutes les pièces SELECT FNOM FROM F WHERE NOT EXISTS (SELECT * FROM P WHERE NOT EXISTS (SELECT * FROM FPJ WHERE FNO=F.FNO AND PNO=P.PNO)); 82

SQL LMD Opérations ensemblistes On peut réaliser des opérations ensemblistes sur les clauses SELECT 3 opérations ensemblistes UNION union de deux ensembles INTERSECT intersection de deux ensembles MINUS différence de deux ensembles (norme : EXCEPT) 83

SQL LMD Opé. Ensemblistes F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Numéros des pièces fournies par le fournisseur F2 ou qui pèsent plus de 16 livres Avec opérateur ensembliste SELECT PNO FROM P WHERE POIDS > 16 UNION SELECT PNO FROM FPJ WHERE FNO='F2'; Sans opérateur ensembliste SELECT PNO FROM P WHERE POIDS > 16 OR PNO IN (SELECT PNO FROM FPJ WHERE FNO='F2'); 84

SQL LMD Opé. Ensemblistes F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Numéros des pièces fournies par le fournisseur F2 et qui pèsent plus de 16 livres Avec opérateur ensembliste SELECT PNO FROM P WHERE POIDS > 16 INTERSECT SELECT PNO FROM FPJ WHERE FNO='F2'; Sans opérateur ensembliste SELECT PNO FROM P WHERE POIDS > 16 AND PNO IN (SELECT PNO FROM FPJ WHERE FNO='F2'); 85

SQL LMD Opé. Ensemblistes F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Numéros des fournisseurs qui ne fournissent pas la pièce 'P2' Avec opérateur ensembliste SELECT FNO FROM F MINUS SELECT FNO FROM FPJ WHERE PNO='P2'; Sans opérateur ensembliste SELECT FNO FROM F WHERE FNO NOT IN (SELECT FNO FROM FPJ WHERE PNO= P2 ); 86

SQL LMD Mises à jour Modification de lignes UPDATE UPDATE nomtable SET nomcol1=exp1 [,nomcol2=exp2]... [WHERE condition]; Suppression de lignes DELETE DELETE FROM nomtable [WHERE condition]; 87

SQL LMD Mises à jour Insertion de lignes INSERT : INSERT INTO nomtable [(nomcol1[,nomcol2]...)] VALUES (val1[,val2]...); Sans précision du nom des colonnes, elles sont insérées dans l'ordre de leur création dans la table Si toutes les colonnes non précisées, les autres contiennent la valeur nulle. 88

SQL LMD Mises à jour F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Changer la couleur de la pièce 'P2' pour le jaune, accroître son poids de 5 et mettre sa ville à "inconnu" UPDATE P SET COULEUR='jaune', POIDS=POIDS+5, VILLE=NULL WHERE PNO='P2'; Doubler le statut de tous les fournisseurs de Londres UPDATE F SET STATUT=2*STATUT WHERE VILLE='Londres'; 89

SQL LMD Mises à jour F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Mettre à 0 la qté de pièces achetées, tous les fournisseurs de Londres UPDATE FPJ SET QTE=0 WHERE 'Londres'=(SELECT VILLE FROM F WHERE F.FNO=FPJ.FNO); ou bien UPDATE FPJ SET QTE=0 WHERE FNO IN (SELECT FNO FROM F WHERE VILLE = 'Londres'); Changer le numéro du fournisseur F2 en F9 UPDATE F SET FNO='F9' WHERE FNO='F2'; et UPDATE FPJ SET FNO='F9' WHERE FNO='F2'; 90

SQL LMD Mises à jour F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Supprimer le fournisseur 'F1' DELETE FROM F WHERE FNO='F1'; Supprimer tous les fournisseurs de Paris DELETE FROM F WHERE VILLE='Paris'; Supprimer toutes les lignes de FPJ DELETE FROM FPJ; 91

SQL LMD Mises à jour F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Supprimer toutes les informations relatives aux fournisseurs de Londres DELETE FROM FPJ WHERE 'Londres'= (SELECT VILLE FROM F WHERE F.FNO=FPJ.FNO); puis DELETE FROM F WHERE VILLE='Londres'; Rajouter la pièce P7 (VILLE='Athènes', POIDS=24, PNOM="inconnu", COULEUR="inconnu") INSERT INTO P(PNO,VILLE,POIDS) VALUES ('P7','Athènes',24); ou bien INSERT INTO P VALUES ('P7', NULL, NULL, 24, 'Athènes'); 92

SQL LMD Mises à jour F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Construire une table donnant pour chaque pièce fournie le numéro de la pièce et la quantité totale fournie CREATE TABLE TEMP (PNO CHAR(6), QTETOT NUMBER(4)); INSERT INTO TEMP (PNO,QTETOT) SELECT PNO,SUM(QTE) FROM FPJ GROUP BY PNO; 93

SQL LMD Mises à jour F(FNO,FNOM,STATUT,VILLE) P(PNO,PNOM,COULEUR,POIDS,VILLE) J(JNO,JNOM,VILLE) FPJ(FNO,PNO,JNO,QTE) Construire une table contenant la liste des références de pièces livrées soit par un fournisseur londonien soit pour un projet se déroulant à Londres CREATE TABLE LP (PNO CHAR(6)); INSERT INTO LP (PNO) SELECT DISTINCT PNO FROM FPJ WHERE FNO IN (SELECT FNO FROM F WHERE VILLE='Londres') OR JNO IN (SELECT JNO FROM J WHERE VILLE='Londres'); ou bien INSERT INTO LP (PNO) SELECT DISTINCT PNO FROM FPJ, F WHERE FPJ.FNO=F.FNO AND F.VILLE='Londres' UNION SELECT DISTINCT PNO FROM FPJ,J WHERE FPJ.JNO=J.JNO AND J.VILLE='Londres'; 94

SQL LMD Autres SELECT dans le FROM SELECT ncom FROM ((SELECT ncom,npro FROM lignecommande) MINUS (SELECT ncom,npro FROM lignelivraison)); Commandes dont une ligne au moins n a pas de livraison Permet de simplifier le résultat 95

SQL LMD Autres Requête récursive : courses cyclistes, Etape (villedépart, villearrivée) SELECT villearrivée FROM Etape START WITH villedépart= Dunkerque CONNECT BY PRIOR villearrivée=villedépart; Donne toutes les villes d arrivée après Dunkerque Idem avec LEVEL dans le SELECT qui donne le niveau de l élément dans le parcours 96

SQL LMD Autorisations Le créateur d'une table (ou d'une vue) en est le propriétaire Par défaut, les autres utilisateurs n'ont pas accès à ces objets, ni interrogation, ni mise à jour Le propriétaire d'une table ou d'une vue peut autoriser d'autres utilisateurs à effectuer certaines opérations Seul le droit de suppression (DROP VIEW ou DROP TABLE) ne peut se céder 97

SQL LMD Autorisations L'autorisation GRANT liste de droits ON objet TO liste d'utilisateurs [WITH GRANT OPTION]; Les droits SELECT UPDATE INSERT DELETE ALTER INDEX ALL UPDATE peut être suivi d'une liste de colonnes ALL autorise toutes les opérations (sauf DROP) 98

SQL LMD Autorisations Les objets : table ou vue Pour donner un droit à tous les utilisateurs, il faut préciser PUBLIC au lieu d'une liste d'utilisateurs WITH GRANT OPTION donne en plus la possibilité de transmettre le droit 99

SQL LMD Autorisations Exemples GRANT SELECT ON F TO DUBOIS GRANT INSERT, UPDATE, DELETE ON TABLE F TO DUVAL, DUBOIS GRANT SELECT, INSERT, DELETE ON TABLE F TO DURAND WITH GRANT OPTION 100

SQL LMD Autorisations Suppression d'une autorisation REVOKE liste de droits ON objet FROM liste d'utilisateurs; Ne peut être retiré que par l'utilisateur qui l'a accordé ou par le DBA Si le droit avait été transmis avec l'option WITH GRANT OPTION, suppression en cascade Exemple : interdire toute opération à tout utilisateur sur la table F REVOKE ALL ON F FROM PUBLIC; 101

SQL Conclusion Un langage simple et puissant La normalisation induit une logique commune et une évolution homogène Chaque SGBD garde, malgré la norme, des spécificités qui sont plutôt des atouts que des limites Difficulté d inscrire un langage assertionnel/déclaratif dans une logique procédurale Intégration dans des langages de programmation (C, PHP, Java, etc.) 102

SQL Exercice Soit la base de données suivante SERVIR (Bar, Bière) FREQUENTER (Buveur, Bar) AIMER (Buveur, Bière) Exprimer les requêtes suivantes en SQL Les bars qui servent une bière appréciée par 'Dupont Les buveurs qui vont dans les mêmes bars que Dupont Les buveurs qui fréquentent au moins un bar où l'on sert une bière qu'ils aiment Les buveurs qui ne fréquentent aucun bar où l'ont sert une bière qu'ils aiment Les buveurs qui fréquentent tous les bars 103

SQL Exercices Soit la base de données suivante SERVIR (Bar, Bière) FREQUENTER (Buveur, Bar) AIMER (Buveur, Bière) Les buveurs qui fréquentent tous les bars qui servent au moins une bière qu'ils aiment Les buveurs qui ne fréquentent que les bars qui servent une bière qu'ils aiment Donner pour chaque buveur, le nombre de bars servant une bière qu'ils aiment Les buveurs qui fréquentent au moins 2 bars où l'on sert une bière qu'ils aiment 104

SQL Exercices correction Correction SELECT Bar FROM Aimer A, Servir S WHERE S.Bière = A.bière AND Buveur ='Dupont'; SELECT F1.Buveur FROM Fréquenter F1, Fréquenter F2 WHERE F1.Bar = F2.Bar AND F2.Buveur = 'Dupont'; SELECT F.Buveur FROM Fréquenter F, Aimer A, Servir S WHERE A.Bière = S.Bière AND S.Bar = F.Bar AND A.Buveur = F.Buveur ; SELECT Buveur FROM Fréquenter F WHERE Buveur NOT IN (SELECT Buveur FROM Aimer A, Servir S WHERE S.Bar = F.Bar AND S.Bière = A.Bière ); 105

SQL Exercices correction Correction SELECT Buveur FROM Fréquenter WHERE Buveur NOT IN (SELECT F1.Buveur FROM Fréquenter F1, Fréquenter F2 WHERE F1.Buveur NOT IN (SELECT Buveur FROM Fréquenter WHERE Bar=F2.Bar) ); SELECT Buveur FROM Fréquenter F WHERE Buveur NOT IN (SELECT A.Buveur FROM Servir S, Aimer A WHERE S.Bière=A.Bière AND A.Buveur NOT IN (SELECT Buveur FROM Fréquenter WHERE Bar=S.Bar) ); 106

SQL Exercices correction Correction SELECT Buveur FROM Fréquenter WHERE Buveur NOT IN (SELECT Buveur FROM Fréquenter F WHERE Buveur NOT IN (SELECT Buveur FROM Servir S, Aimer A WHERE S.Bar = F.Bar And S.Bière = A.Bière)); 107

SQL Exercices correction Correction SELECT Buveur, COUNT(DISTINCT Bar) FROM Servir S, Aimer A WHERE S.Bière = A.Bière GROUP BY Buveur; SELECT Buveur FROM Servir S, Aimer A, Fréquenter F WHERE S.Bière = A.Bière AND A.Buveur = F.Buveur AND F.Bar = S.Bar GROUP BY Buveur HAVING COUNT(Bar)>2; 108