Le langage SQL

 

  1. Introduction
  2. Le langage SQL (Structured Query Language) peut être considéré comme le langage d’accès normalisé aux bases de données. Il est aujourd’hui supporté par la plupart des produits commerciaux que ce soit par les systèmes de gestion de bases de données micro tel que Access ou par les produits plus professionnels tels que Oracle ou Sybase. Il a fait l’objet de plusieurs normes ANSI/ISO dont la plus répandue aujourd’hui est la norme SQL2 qui a été définie en 1992. Nous décrivons ici les principaux aspects de cette norme.

    Le succès du langage SQL est du essentiellement à sa simplicité et au fait qu’il s’appuie sur le schéma conceptuel pour énoncer des requêtes en laissant le SGBD responsable de la stratégie d’exécution. Le langage SQL propose un langage de requêtes ensembliste et assertionnel. Néanmoins, le langage SQL ne possède pas la puissance d’un langage de programmation : entrées/sorties, instructions conditionnelles, boucles et affectations. Pour certains traitements il est donc nécessaire de coupler le langage SQL avec un langage de programmation complet au sens Turing du terme.

    Le langage SQL comporte :

       une partie sur la définition des données :
    le langage de définition des données (LDD) qui permet de définir des relations, des vues externes et des contraintes d’intégrité;

       une partie sur les requêtes :
    le langage de manipulation des données (LMD) qui permet d’interroger une base de données sous forme déclarative sans se préoccuper de l’organisation physique des données;

       une partie sur le contrôle des données :
    le langage de contrôle des données (LCD) qui permet de contrôler la sécurité et les accès aux données.

    Nous présentons ici les principaux aspects du langage en utilisant une méthode par l’exemple.

     

  3. Le langage de définition des données (LDD)
  4. Le langage de définition des données permet de définir et de manipuler les concepts du modèle relationnel liés au schéma : relation, attribut, clé, contraintes d’intégrité, vues ainsi que certains éléments liés à l’administration de la base de données : index, droits des utilisateurs.

    Les types de données disponibles dépendent du SGBD mais on retrouve généralement les types entier, réel, chaînes de caractères et date. Les principaux types de données disponibles en SQL sont : SMALLINT, INTEGER, DECIMAL, FLOAT, DOUBLE, DATE, TIME, TIMESTAMP, CHAR et VARCHAR.

    1. Les relations
      1. Définition
      2. cf. modèle relationnel

      3. Commandes

      Relations

      Nom

      Commentaires

      Exemple

      ALTER TABLE

      Fonction :
      Modifie le schéma de relation.

      Syntaxe :
      ALTER TABLE <nom_de_relation> ADD ( <nom_d'attribut> <type_de_données> )

      voir l'exemple

      ALTER TABLE CLIENT ADD (EMAIL CHAR(30))

      CREATE TABLE

      Fonction :
      Crée une relation

      Syntaxe :
      CREATE TABLE <nom_de_relation> ( <nom_d’attribut> <type_de_données> [NOT NULL] [, ...]
      [, PRIMARY KEY (<nom_d’attribut> [, ...] ) ]
      [, FOREIGN KEY (<nom_d’attribut>) REFERENCES <nom_de_relation> [, ...] ] )
      [CHECK (<condition>)]

      voir l'exemple

      DROP TABLE

      Fonction :
      Permet de supprimer une relation d’un schéma de base de données.

      Syntaxe :
      DROP TABLE <nom_de_relation> [CASCADE CONSTRAINTS]

      voir l'exemple

      Suppression de la relation VOYAGE :
      DROP TABLE VOYAGE

      Clause

      CASCADE CONSTRAINS

      Fonction :
      Permet de supprimer toutes les contraintes d’intégrités référentielles qui réfèrent aux clés (PRIMARY KEY et unique) de la relation supprimée.
      Cette clause concerne les relations où des contraintes de clés étrangères ont été spécifiées. Par exemple, la suppression de la relation VOYAGE remet en cause la contrainte référentielle sur CodeVoy spécifiée dans la relation RESERVATION.

      Syntaxe :
      DROP TABLE <nom_de_relation> [CASCADE CONSTRAINTS]

      voir l'exemple

      DROP TABLE VOYAGE CASCADE CONSTRAINS

       

       

    2. Les index
      1. Définition
      2. La création d’un index permet de réduire les temps de recherche.

        La création d’index ne fait pas partie de la norme ANSI SQL. Néanmoins, tous les produits sérieux SQL supportent la création d’index. L’effet de cette commande est la création d’un index en général de type B-arbre sur les attributs spécifiés avec les clés triées soit par ordre ascendant (ASC) ou descendant (DESC). Si le mot clé UNIQUE est utilisé, le SGBD interdit les doublons.

      3. Commandes

      Index

      Nom

      Commentaires

      Exemple

      CREATE INDEX

      Fonction :
      Crée un index.

      Syntaxe :
      CREATE [UNIQUE] INDEX <nom_de_l’index>
      ON <nom_de_relation> (<nom_d’attribut> [{ASC | DESC}] [, ...])

      voir l'exemple

      CREATE INDEX INOM
      ON ABONNE (NOM ASC)

      DROP INDEX

      Fonction :
      Permet de supprimer un index.
      Comme pour la commande DROP TABLE, le contenu de l’index et la définition de l’index elle-même sont supprimés.

      Syntaxe :
      DROP INDEX <nom_de_l’index>

      voir l'exemple

      DROP INOM

       

       

    3. Les vues
      1. Définition
      2. Une vue consiste en un ensemble d’enregistrements en provenance d’une ou plusieurs tables de la base de données. La clause WITH CHECK OPTION garantit que toute opération de mise à jour (INSERT, UPDATE, DELETE) exécutée sur la vue sera contrôlée pour voir si le changement est conforme à la définition de la vue. Un changement non conforme sera rejeté. Si cette clause n’est pas indiquée, les changements pourront être acceptés par les relations sur lesquelles est définie la vue.

      3. Commandes

      Vues

      Nom

      Commentaires

      Exemple

      CREATE VIEW

      Fonction :
      Crée une vue.

      Syntaxe :
      CREATE VIEW <nom_de_la_vue> AS <commande_SELECT> [WITH CHECK OPTION]

      voir l'exemple

      CREATE VIEW VUE

      AS

      SELECT *

      FROM ABONNE

      WHERE Ville='Grenoble'

      DROP VIEW

      Fonction :
      Permet de supprimer une vue.
      Contrairement à la commande DROP TABLE, les données incluses dans la vue ne seront pas détruites. Seule la définition de la vue est supprimée du catalogue.

      Syntaxe :
      DROP VIEW <nom_de_la_vue>

      voir l'exemple

      DROP VIEW VUE

       

       

    4. La mise à jour
    5. Instructions de mises à jour

      Nom

      Commentaires

      Exemple

      INSERT

      Fonction :
      Insère un ou plusieurs éléments dans une relation en précisant toutes les valeurs ou uniquement les non-nulles.

      Syntaxe :
      INSERT INTO <nom_de_relation> [VALUES]

      voir l'exemple

      Insertion d'un enregistrement complet :
      INSERT INTO PRET VALUES(12, 521, 740, '29-SEP-00')

      DELETE

      Fonction :
      Supprime un ou plusieurs éléments dans une relation.
      Si la relation devient vide après l'action de DELETE, la relation n'est pas supprimée.

      Syntaxe :
      DELETE [ <element > ] FROM < nom_de_relation > [WHERE ... ]

      voir l'exemple

      Suppression de l'abonné "Vouni":
      DELETE FROM ABONNE WHERE Nom="Vouni"

      UPDATE

      Fonction :
      Permet de modifier un ou plusieurs individus.

      Syntaxe :
      UPDATE <nom_de_relation> SET < champ >

      voir l'exemple

      Modification du prénom de Vouni :
      UPDATE ABONNE SET Prenom="Donald" WHERE Nom="Vouni"

       

       

    6. Les contraintes d'intégrité
      1. Définition
      2. cf. Modèle relationnel

        Pour déterminer le comportement à adopter en fonction des contraintes d'intégrité, il est possible d'ajouter une clause lors de la définition de la contrainte.

      3. Commandes

      Contraintes d'intégrités

      Nom

      Fonction

      Exemple

      RESTRICT

      Interdit la suppression.

      voir l'exemple

      CREATE TABLE COMMANDE (

      No_commande: integer,

      No_client: integer,

      No_vendeur: integer,

      ...

      FOREIGN KEY (No_client) reference Client ON DELETE RESTRICT )

      CASCADE

      Permet de faire des suppressions éventuellement en cascade.

      voir l'exemple

      CREATE TABLE COMMANDE (

      No_commande: integer,

      No_client: integer,

      No_vendeur: integer,

      ...

      FOREIGN KEY (No_client) reference Client ON DELETE RESTRICT

      FOREIGN KEY (No_vendeur) reference Client ON DELETE CASCADE)

      SET NULL

      Remet les références à nul.

     

     

  5. Le langage de manipulation des données
    1. Expression générale d’une requête
      1. Présentation d'une requête
      2. Une requête se présente généralement sous la forme " SELECT ... FROM ... WHERE " :

            la clause SELECT exprime le résultat attendu sous la forme d’une liste d’attributs auxquels il est possible d’appliquer différents opérateurs et fonctions.

            la clause FROM liste les relations utilisées pour évaluer les requêtes;

            la clause WHERE qui est facultative énonce une condition que doivent respecter les enregistrements sélectionnés.

      3. Syntaxe
      4. SELECT [DISTINCT] { * | <nom_de_relation>,<nom_d’attribut> [alias] | <nom_d’attribut>[alias] [, ...]
        FROM [<nom_d’utilisateur>]<nom_de_relation> [alias] [, ...]
        [WHERE
        <condition>]
        [GROUP BY <nom_d’attribut> [, ...] [HAVING <condition>] ]
        [ {UNION | INTERSECT | MINUS [ALL]} <commande_SELECT>
        [ ORDER BY {<nom_d’attribut> | <numéro_de_colonne>} [{ASC | DESC}] [, ... ]

         

      5. Lien entre algèbre relationnelle et SQL
      6. Avant d’introduire l’utilité des différentes clauses facultatives ainsi que les différentes possibilités offertes par SQL, nous montrons le lien entre algèbre relationnel et SQL.

        Soient les schémas relationnels R1, R2, R3 et R4 définis comme suit :

        R1 (A :D1, B :D2)
        R2 (C :D1, D :D2)
        R3 (A :D1, E :D3)
        R4 (B :D2)

        Opération

        Expression algébrique

        Expression SQL équivalente

        Projection

        P A ( R1 )

        SELECT A FROM R1

        Sélection

        s < condition > ( R1 )

        SELECT * FROM R1 WHERE <condition >

        Produit cartésien 

        R1 X R2

        SELECT * FROM R1, R2

        Jointure

        R1 * R3

        SELECT * FROM R1, R3 WHERE R1.A = R3.A

        Union

        R1 U R2

        SELECT * FROM R1 UNION SELECT * FROM R2

        Intersection 

        R1 Ç R2

        SELECT * FROM R1, R2 WHERE R1.A = R2.C and R1.B = R2.D

        Différence 

        R1 / R2

        SELECT * FROM R1 WHERE not exists (SELECT * FROM R2 WHERE R2.C = R1.A and R2.D = R1.B )

        Division

        R1 : R2

        SELECT A FROM R1 GROUP BY A HAVING COUNT (distinct B ) = (SELECT count (distinct B ) FROM R4

       

    2. Le langage SQL
      1. Les requêtes imbriquées
      2. Requêtes imbriquées

        Nom

        Commentaires

        Exemple

        IN

        Permet de tester la présence d'une valeur particulière dans un ensemble.

        voir l'exemple

        N° de téléphone des abonnés qui ont un auteur comme homonyme :

        SELECT Telephone

        FROM ABONNE

        WHERE Nom IN (SELECT Nom FROM AUTEUR )

        NOT IN

        Permet de tester l'absence d'une valeur particulière dans un ensemble.

        voir l'exemple

        N° de téléphone des abonnés qui n'ont pas d'auteur comme homonyme :

        SELECT Telephone

        FROM ABONNE

        WHERE Nom NOT IN (SELECT Nom FROM AUTEUR )

        ALL

        Compare chacune des valeurs de l'ensemble à une valeur particulière et retourne "VRAI" si la comparaison est évaluée pour chacun des éléments.
        Les comparateurs sont: <, <=, >, >=, =, != .

        voir l'exemple

        Nom du salarié qui gagne le plus :

        SELECT Nom

        FROM PERSONNEL

        WHERE Salaire => ALL (SELECT Salaire FROM PERSONNEL )

        ANY

        Compare chacune des valeurs de l'ensemble à une valeur particulière et retourne "VRAI" si la comparaison est évaluée à "VRAI" pour au moins un des éléments.
        Les comparateurs sont les même que ceux cités précédement.

        voir l'exemple

        Nom des salariés qui possède un homonyme chez les abonnés :

        SELECT Nom

        FROM PERSONNEL

        WHERE Nom = ANY (SELECT Nom FROM ABONNE )

        EXISTS

        Retourne "VRAI" si une requête imbriquée retourne au moins une ligne.

        voir l'exemple

        Liste des numéros d'abonné qui n'ont pas empruntés d'ouvrage :

        SELECT NumAbo

        FROM ABONNE

        WHERE NOT EXISTS (PRET )

         

      3. Les prédicats
      4. Prédicats

        Nom

        Commentaires

        Exemple

        BETWEEN

        Teste l'appartenance d'une valeur à un intervalle.

        voir l'exemple

        Nom et prénom des salairés qui gagne entre 10000 et 12000 f. :

        SELECT Nom, Prenom

        FROM PERSONNEL

        WHERE Salaire BETWEEN 10000 and 12000

        LIKE

        Permet de faire une recherche approximative.

        voir l'exemple

        Nom des abonnés qui habitent en Isère :

        SELECT Nom

        FROM ABONNE

        WHERE CodeP LIKE '38---' OR Ville LIKE '%ISERE%'

        IS NULL

        Permet de tester si un champ a été affecté.

        voir l'exemple

        Liste des abonnés qui n'ont pas le téléphone (ou qui sont sur liste rouge) :

        SELECT Nom

        FROM ABONNE

        WHERE Telephone IS NULL

         

      5. Les clauses
      6. Clauses

        Nom

        Commentaires

        Exemple

        GROUP BY

        Application de fonction agégats à des collections d'enregistrements reliées sémentiquement.

        voir l'exemple

        Nombre d'abonné dans chaque ville :

        SELECT Ville, count(*)

        FROM ABONNE

        GROUP BY Ville

        HAVING

        Cette clause ne s'emploie qu'avec un "GROUP BY".
        Exprime une condition sur le groupe d'enregistrement associé à chaque valeur du groupage.

        voir l'exemple

        Nombre de pret effectué avant le 22 mai par abonné

        SELECT NumAbo, count(*)

        FROM PRET

        GROUP BY NumAbo

        HAVING DatePret <= '22/05/00'

        ORDER BY

        Permet l'ordonnancement du résultat avant l'affichage.

        voir l'exemple

        Liste des salaires annuels classés par ordre décroissant :

        SELECT Salaire * 12

        FROM PERSONNEL

        ORDER BY Salaire

        DISTINCT

        Elimine les doublons avant d'utiliser une fonction agrégat.

        voir l'exemple

        Liste de toutes les villes où habite au moins un abonné :

        SELECT DISTINCTVille

        FROM ABONNE

         

      7. Les fonctions agrégats
      8. Ces fonctions ne peuvent être utilisées que dans une clause SELECT ou dans une clause HAVING .

        Fonctions agrégats

        Nom

        Commentaires

        Exemple

        COUNT

        Fonction :
        Dénombre les lignes sélectionnées.

        Syntaxe :
        COUNT (expr )

        voir l'exemple

        Nombre de salariés :

        SELECT COUNT( *)

        FROM PERSONNEL

        SUM

        Fonction :
        Additionne les valeurs de type numérique.

        Syntaxe :
        SUM ( expr )

        voir l'exemple

        Somme des salaires des employé dont le prénom est "Pierre" :

        SELECT SUM( Salaire)

        FROM PERSONNEL

        WHERE Prenom='Pierre'

        MIN

        Fonction :
        Retourne la valeur minimale d'une colonne de type caractère ou numérique.

        Syntaxe :
        MIN ( expr )

        voir l'exemple

        Abonné le plus ancien (plus petit numéro d'abonné) :

        SELECT MIN( NumAbo)

        FROM ABONNE

        MAX

        Fonction :
        Retourne la valeur maximale d'une colonne de type caractère ou numérique.

        Syntaxe :
        MAX (expr )

        voir l'exemple

        Plus gros salaire parmis les employés Grenoblois :

        SELECT MAX( Salaire)

        FROM PERSONNEL

        WHERE Adresse LIKE '%Grenoble%'

        AVG

        Fonction :
        Calcule la moyenne d'une colonne de type numérique.

        Syntaxe :
        AVG ( expr )

        voir l'exemple

        Moyenne des salaires des bibliothécaires :

        SELECT AVG(Salaire)

        FROM PERSONNEL

        WHERE Fonction='Bibliothécaire'

        On peut préfixer expr par les mots clés [DISTINCT | ALL] .

       

    3. Insertion de données dans une relation
    4. Fonction
      La commande INSERT permet d’ajouter des enregistrements à une relation dont le schéma a été préalablement définie soit un enregistrement à la fois soit en utilisant une expression de sélection. La syntaxe de cette commande est :

      Syntaxe
      INSERT INTO <nom_de_relation > [(<liste_d’attributs>)] VALUES (<liste_de_valeurs >) ou
      INSERT INTO <nom_de_relation> [(<liste_d’attributs>)] <expression_de_sélection>

      Il est évident que dans beaucoup d’applications, il est préférable d’utiliser une interface graphique conviviale pour ajouter de nouvelles données à la base. Néanmoins, l’utilisation de fichiers de commandes permet une certaine indépendance vis à vis du SGBD cible et peut aider à la migration d’un système vers un autre. De plus, certaines interfaces graphiques génèrent automatiquement le code correspondant aux commandes.

       

    5. Suppression de données dans une relation
    6. Fonction
      La commande DELETE permet de supprimer des enregistrements d’une relation. Cette opération n’affecte pas le schéma de la relation et ceci même dans le cas où la commande a pour effet de supprimer tous les enregistrements de la relation.

      Syntaxe
      DELETE FROM < nom_de_relation > [WHERE < expression_de_selection > ]

      voir l'exemple

      Suppression de tous les enregistrements de la relation ABONNE :
      DELETE * FROM ABONNE

      Suppression de l’abonné numéro 1234 :
      DELETE FROM ABONNE WHERE NumAbo = 1234

       

      Problèmes
      La suppression de certains enregistrements peut poser des problèmes de respect d’intégrité référentielle. Par exemple, si l’on souhaite supprimer un disque actuellement emprunté par un abonné, la contrainte " FOREIGN KEY NumDisque REFERENCES DISQUE " sera violée. Pour dicter au SGBD l’attitude à avoir dans un tel cas, une clause " ON DELETE " peut être ajoutée en même temps que la définition de la contrainte d’intégrité référentielle.
      Quatre options sont disponibles :

       

    7. Exemples et exercices
      1. Requêtes simples
      2. Q1 : Quel est le contenu de la relation LIVRE ?

        Solution

        SELECT *
        FROM LIVRE

        Dans ce premier exemple, notons l’utilisation du symbole * pour spécifier que l’on souhaite conserver dans le résultat tous les attributs de la relation LIVRE.

         

        Q2 : Quels sont les titres des romans édités par Flammarion ?

        Solution

        SELECT Titre
        FROM LIVRE
        WHERE Editeur = ‘Flammarion’ and Genre = ‘Roman’

        Dans cette requête la condition porte sur les attributs Editeur et Genre et le résultat retourné par la requête est la liste des titres. Il n’y a en effet pas nécessairement de liens entre les attributs retournés et ceux sur lesquels portent la condition.

         

        Q3 : Liste des titres que l’on retrouve à la fois comme titre de disque et titre de livre ?

        Solution

        SELECT D.Titre
        FROM DISQUE D, LIVRE L
        WHERE D.titre = L.Titre

         

        Q4 : Quelle est l’identité des auteurs qui ont fait des disques et écrit des livres ?

        Solution

        SELECT A1.Identité
        FROM DISQUE D, LIVRE L, AUTEUR A1, AUTEUR A2
        WHERE D.CodeOuv = A1.CodeOuv and L.CodeOuv = A2.CodeOuv and A1.Identité = A2.Identité

         

      3. Requêtes avec des clauses
      4. Q5 : Quels sont les différents styles de disques proposés ?

        Solution

        SELECT distinct Style
        FROM DISQUE

        La clause distinct permet de supprimer les doublons au niveau du résultat. Par défaut , SQL conserve les doublons pour optimiser le temps d’exécution et pour répondre à une éventuelle attente de l’utilisateur.

         

        Q6 : Quel est le salaire annuel des membres du personnel gagnant plus de 150 000 F en ordonnant le résultat par salaire descendant et nom croissant ?

        Solution

        SELECT Nom, Prénom, Salaire * 12
        FROM PERSONNEL
        WHERE Salaire * 12 > 150 000
        order by Salaire DESC, Nom ASC

        La clause ORDER BY permet l’ordonnancement du résultat avant affichage.

         

        Q7 : Donnez le nombre de prêts en cours pour chaque famille en considérant qu’une famille regroupe des personnes de même nom et possédant le même numéro de téléphone ?

        Solution

        SELECT Nom, Téléphone, count(*)
        FROM ABONNE A, PRET P
        WHERE A.NumAbo = P.NumAbo
        GROUP BY Nom, Téléphone

         

        Q8 : Quel est le code du disque dont la médiathèque possède le plus grand nombre d’exemplaires?

        Solution

        SELECT CodeOuv
        FROM E_DISQUE
        GROUP BY CodeOuv
        HAVING COUNT(*) = ( SELECT max(count(*))
        FROM E_DISQUE
        GROUP BY CodeOuv )

         

      5. Requêtes avec des prédicats
      6. Q9 : Quels sont les éditeurs pour lesquels l’attribut Collection n’a pas été renseigné ?

        Solution

        SELECT Editeur
        FROM LIVRE
        WHERE Collection IS NULL

        La présence de valeurs nulles dans une relation peut être autorisée mais rarement souhaitable car leur interprétation est complexe. Comment opérer la moyenne d’une colonne de type numérique possédant des valeurs nulles ?

         

        Q10 : Quels sont les abonnés dont le nom contient la chaîne " ALDO " et habitant en Isère ?

        Solution

        SELECT *
        FROM ABONNE
        WHERE Nom = ‘%ALDO%’ and CodeP =’38---‘

        Certains opérateurs SQL permettent une recherche approximative pour les attributs de type chaîne :
        le caractère de remplacement % indique la possibilité d’avoir 0 ou plusieurs caractères quelconques;
        le caractère spécial - indique l’obligation d’avoir exactement un caractère quel que soit sa valeur.

         

      7. Requêtes avec des agrégats
      8. Q11 : Quel est le nombre de prêts en cours ?

        Solution

        SELECT count(*)
        FROM PRET

         

        Q12 : Quels sont les salaires minimum, maximum et moyen des employés exerçant une fonction de bibliothécaire ?

        Solution

        SELECT min(Salaire), max(Salaire), avg(Salaire)
        FROM PERSONNEL
        WHERE Fonction = ‘bibliothécaire’

         

        Q13 : Quel est le nombre de genres de livres différents ?

        Solution

        SELECT count(distinct Genre)
        FROM LIVRE

         

        Q14 : Quel est le nombre de disques achetés en 1998 ?

        Solution

        SELECT count(*)
        FROM E_DISQUE
        WHERE DateAchat >= ‘01-JAN-98’ and DateAchat <= ‘31-DEC-98’

         

      9. Requêtes avec des opérateurs numériques
      10. Q15 : Quel est le salaire annuel des membres du personnel gagnant plus de 150 000 F ?

        Solution

        SELECT Nom, Prénom, Salaire * 12
        FROM PERSONNEL
        WHERE Salaire * 12 > 150 000

        Il est possible d’utiliser les opérateurs arithmétiques classiques (+, -, *, /) à la fois au niveau de la clause SELECT et de la clause WHERE.

         

      11. Requêtes avec des jointures et opérations ensemblistes
      12. Q16 : Quel est le nom , le prénom et l’adresse des abonnés ayant emprunté un disque le ‘ 12-JAN-99 ’ ?

        Solution

        SELECT Nom, Prénom, Rue, Ville, CodeP
        FROM ABONNE A, PRET P, DISQUE D
        WHERE A.NumAbo = P.NumAbo and P.CodeOuv = D.CodeOuv and DatePrêt = ‘ 12-JAN-99 ’

         

        Q17 : Quels sont les titres des livres et des disques actuellement empruntés par Marlène Sirva ?

        Solution

        SELECT Titre
        FROM ABONNE A, PRET P, DISQUE D
        WHERE A.NumAbo = P.NumAbo and P.CodeOuv = D.CodeOuv and Nom = ‘ Sirva ’ and Prénom = ‘ Marlène ’
        UNION
        SELECT Titre
        FROM ABONNE A, PRET P, LIVRE L
        WHERE A.NumAbo = P.NumAbo and P.CodeOuv = L.CodeOuv and Nom = ‘ Sirva ’ and Prénom = ‘ Marlène ’

         

        Q18 : Quels sont les titres des ouvrages livres policiers ou disques de jazz empruntés par Olivier Lobry ?

        Solution

        SELECT CodeOuv

        FROM PRET P, ABONNE A

        WHERE

        P.NumAbo = A.NumAbo and

        Prénom = ‘Olivier’ and

        Nom = ‘lobry’ and

        CodeOuv in (SELECT CodeOuv FROM LIVRE WHERE Genre = ‘Policier’) or

        CodeOuv in (SELECT CodeOuv FROM DISQUE WHERE Style = ‘Jazz’)

         

        Q19 : Quelle est l’identité des auteurs qui n’ont écrit que des romans policiers (genre = policier) ?

        Solution

        SELECT Identité

        FROM AUTEUR A, LIVRE L

        WHERE

        A.CodeOuv = L.CodeOuv and Genre = ‘Policier’ and

        !=ALL (SELECT Identité FROM AUTEUR A, LIVRE L WHERE A.CodeOuv = L.CodeOuv and

        Genre <> ‘Policier’)

         

        Q20 : Quels sont les codes des ouvrages des livres pour lesquels il y a au moins un exemplaire emprunté et au moins un exemplaire disponible ?

        Solution

        SELECT P.CodeOuv
        FROM E_LIVRE E1, PRET P1
        WHERE E1.CodeOuv = P1.CodeOuv
        intersect
        SELECT CodeOuv
        FROM E_LIVRE E2
        WHERE not exists (SELECT * FROM PRET P2 WHERE E2.CodeOuv = P2.CodeOuv and E2.NumEx = P2.NumEx)

         

         

  6. Le langage de contrôle des données
  7. Cette partie du langage SQL comporte deux commandes, la commande GRANT pour donner des droits à des utilisateurs et la commande REVOKE pour supprimer des droits préalablement accordés.

    1. Attribution de droits
    2. Fonction
      La commande GRANT permet d’attribuer des privilèges. Un privilège est une autorisation d’exécuter un acte. Les privilèges les plus courants sont la permission d’insérer (INSERT) des enregistrements dans une relation donnée, la permission de supprimer (DELETE) des enregistrements dans une relation donnée et enfin la permission de sélectionner (SELECT) des enregistrements dans une relation donnée. Un utilisateur ne peut exécuter que les commandes SQL pour lesquelles les droits lui ont été explicitement attribués ou qu’il possède implicitement car l’objet accédé a été créé par lui-même.

      Les privilèges sur un objet (TABLE, VIEW) sont distribués soit pour un utilisateur donné, soit pour tout le monde (PUBLIC).

      Syntaxe
      GRANT < privilège > [, ...] ON [TABLE] <nom_de_relation> TO {<nom_d’utilisateur > [, ...] | PUBLIC}

      voir l'exemple

      GRANT SELECT ON DISQUE TO PUBLIC
      Signifie que toute personne ayant le droit d’accéder à la base de données peut accéder à la relation DISQUE.

      GRANT INSERT ON DISQUE TO Marion

       

    3. Suppression de droits
    4. Fonction
      La commande REVOKE permet de supprimer des privilèges.

      Syntaxe
      REVOKE <privilège > [, ...] ON [TABLE] <nom_de_relation> FROM {<nom_d’utilisateur> [, ...] | PUBLIC}

      voir l'exemple

      REVOKE INSERT ON DISQUE FROM Bastien

     


Le modèle relationnel Mise en oeuvre