Langage SQL

Y.Safsouf

1

Jusqu'à présent, nous avons vu comment créer une requête en utilisant la fenêtre requête d'ACCESS. Il existe une autre façon de faire les requêtes : en passant directement par le langage SQL. D'ailleurs, ACCESS utilise aussi ce langage pour faire ses requêtes, il traduit ce que vous avez entré en SQL, puis exécute la requête SQL.

2

Qu'est-ce que SQL ?
SQL (Structured Query Language) est un langage de programmation informatique destiné à stocker, à manipuler et à retrouver des données enregistrées dans des bases de données relationnelles. Le langage SQL est apparu pour la première fois en 1974, lorsqu’un groupe d’IBM a mis sur pied le premier prototype d’une base de données relationnelle. La première base de données relationnelle a été commercialisée par Relational Software (plus tard Oracle).

3

4 . modification.Qu'est-ce que SQL ? SQL permet. La maintenance des tables : création. La gestion des droits d'accès aux tables : Contrôle des données : droits d'accès. trois types de manipulations sur les bases de données :    Les manipulations des bases de données : Sélection. suppression. suppression d'enregistrements. pour résumer. modification de la structure des tables. validation des modifications.

LMD (Langage de manipulation des données) Dans ce chapitre nous verrons comment utiliser les requêtes SQL pour la récupération (requête de sélection) et la manipulation des données (l’insertion. la modification et la suppression) 5 .

Sa syntaxe est : SELECT champ1. champ3. 6 .. FROM table. Cette commande va servir à faire des requêtes pour récupérer des données dans les tables. . champ2..La commande SELECT La commande SELECT est la commande la plus utilisée de SQL.

La commande SELECT S'il y a plus d'un champ spécifié après SELECT. Pour sélectionner les champs "prénom" et "nom" de tous les enregistrements de la table Clients : SELECT nom. Exemple. les champs doivent être séparés par des virgules. 7 . prénom FROM Clients .

8 . la syntaxe est la suivante : SELECT * FROM table.La commande SELECT Si on veut récupérer tous les champs des enregistrements sélectionnés.

on peut. indiquer des critères de sélection avec la clause WHERE : SELECT * FROM table WHERE condition. 9 . ensuite.La commande SELECT Les clauses SELECT et FROM doivent obligatoirement apparaître au début de chaque requête.

pour sélectionner tous les Clients de la table "Clients" dont le code postal est 40000 : SELECT * FROM Clients WHERE code_postal = 40000.La commande SELECT Par exemple. 10 .

La commande SELECT Les opérateurs de condition : 11 .

La commande SELECT
Pour sélectionner tous les articles dont le prix est supérieur à 100 DH :
SELECT * FROM Article WHERE prix_unitaire > 100;

12

La commande SELECT
Il est possible de combiner plusieurs conditions avec des opérateurs logiques : L'opérateur AND réunit deux ou plusieurs conditions et sélectionne un enregistrement seulement si cet enregistrement satisfait TOUTES les conditions listées. (C'est-à-dire que toutes les conditions séparées par AND sont vraies).

13

La commande SELECT
Par exemple, pour sélectionner tous les clients nommés ‘Hassan' qui habitent Fes :
SELECT * FROM Clients WHERE nom = 'Hassan' AND ville = 'Fès';

14

La commande SELECT L'opérateur OR réunit deux conditions mais sélectionne un enregistrement si UNE des conditions listées est satisfaite. Par exemple. 15 . pour sélectionner tous les clients nommés 'Hassan' ou 'Mourad' : SELECT * FROM Clients WHERE nom = 'Hassan' OR nom = 'Mourad'.

16 . on utilise les clauses IN et BETWEEN.La commande SELECT Pour sélectionner des enregistrements dont la valeur d'un champ peut être comprise dans une liste ou entre deux valeurs. Par exemple : Pour sélectionner les clients vivant à Marrakech ou Casablanca : SELECT * FROM Clients WHERE ville IN ('Marrakech'. 'Casablanca').

17 .La commande SELECT Ou pour sélectionner les produits dont le prix est compris entre 100 et 1000 DH : SELECT * FROM Produits WHERE prix_unitaire BETWEEN 100 AND 1000.

De la même façon.La commande SELECT Pour sélectionner les produits dont le prix n'est pas dans cet intervalle : SELECT * FROM Produits WHERE prix_unitaire NOT BETWEEN 100 AND 1000. NOT IN sélectionne les enregistrements exclus de la liste spécifiée après IN. 18 .

19 . Par exemple. pour sélectionner les clients dont le nom commence par la lettre D : SELECT * FROM Clients WHERE nom LIKE 'S*'.La commande SELECT La clause LIKE permet de faire des recherches approximatives sur le contenu d'un champ.

La commande SELECT Tout comme dans les requêtes Access. le symbole * remplace un ensemble de caractères. et tous ceux comportant la lettre S : '*S*'. 20 . on utilisera 'H?ssan'. Le symbole ? ne remplace qu'un seul caractère. Si on a deux clients nommés Hassan et Hussan. tous ceux se terminant par S. on utilisera '*S'. on utilisera 'S*'. pour représenter tous les noms commençant par S.

21 .La commande SELECT Attention : certaines versions de SQL n'utilisent pas les caractères * et ? mais d'autres caractères spécifiques. certaines versions utilisent notamment le caractère % à la place de *.

prenom_elv. ville_elv. sexe.Exercice ELEVE(matricule_elv. Les élèves habitant à Rabat et à Fès âgé entre 18 et 26 ans. Les noms et prénoms des élèves dont le nom débute par 'B' . Les matricules et noms des élèves inscrit a l’année 2002 ayant une moyenne inférieur a 10.moy_elv)        Liste des élèves. Les élèves âgé de plus de 25 ans habitant en dehors de Marrakech. nom_elv. Les filles qui habite à Marrakech. Les matricules des élèves possédant une moyenne supérieur à 10. 22 . date_insc. age. cp_elv.

La commande SELECT La jointure va nous permettre de sélectionner des informations dans plusieurs tables grâce aux relations existant entre ces tables. 23 . Il va néanmoins falloir indiquer comment se fait la relation entre ces tables.

Commande WHERE Commande. 24 .num_client AND num_commande = 1. prénom FROM Clients.num_client = Client.La commande SELECT Par exemple : récupérer le nom et le prénom du client ayant passé la commande n°1 : SELECT nom.

25 . Si on est sur que le nom ne se retrouvera pas dans plusieurs tables. si c'est le cas. la notation: Nom_table.nom_du_champ. et pour les différencier.La commande SELECT Notez que lorsqu'on utilise plusieurs tables. on utilise. on peut l'utiliser sans le préfixer avec le nom de la table. il faut faire attention que deux tables n'aient pas de champs ayant le même nom.

n_représentation*.Exercice REPRESENTATION (n_représentation. Donner la liste des noms des musiciens et des titres des représentations auxquelles ils participent. Donner la liste des titres des représentations ayant lieu à l'opéra Hassan2. lieu) MUSICIEN (nom. les lieux et les tarifs pour le mois de janvier. tarif)      Donner la liste des titres des représentations. Donner la liste des titres des représentations. n_représentation*) PROGRAMMER (date. titre_représentation. Donner la liste des titres des représentations. les lieux et les dates auxquelles le musicien ‘Kamal' a participé. 26 .

nous voulons juste connaître les clients qui ont acheté quelque chose. Supposons que nous voulions la liste des clients ayant acheté quelque chose. 27 . nous ne voulons pas savoir ce qu'a acheté chaque client .La commande SELECT Supprimer les doubles avec DISTINCT.

num_client.nom.La commande SELECT SELECT Client. prénom et nom correspondants aux noms et prénoms des clients ayant passé chaque commande. Si on exécute cette requête directement.num_client. SQL va nous renvoyer une liste des numéros.num_client = Client. 28 . prénom FROM Clients. il est clair qu'un client ayant passé plusieurs commandes va se retrouver plusieurs fois dans cette liste. Commande WHERE Commande.

29 . nous allons devoir dire à SQL de supprimer les doubles du résultat de la sélection pour n'afficher les clients qu'une seule fois. Pour cela.nom.La commande SELECT Pour cela. nous allons utiliser la clause DISTINCT.num_client = Client.num_client AND num_commande = 1.num_client. Commande WHERE Commande. prénom FROM Clients. SELECT DISTINCT Clients.

On peut même rendre le résultat de la sélection plus agréable à la lecture en utilisant la clause ORDER BY : 30 .La commande SELECT En indiquant la clause DISTINCT avant le champ num_client. on indique à SQL qu'on ne veut pas voir apparaître plusieurs fois un client ayant ce numéro dans la sélection renvoyée.

31 . ASC spécifie l’ordre ascendant et DESC l’ordre descendant du tri. dans ce cas c'est l'ordre ascendant qui est utilisé par défaut. soit en précisant son n° d'ordre dans l'énumération qui suit le mot clef SELECT. ASC ou DESC peut être omis.La commande SELECT la clause ORDER BY permet de définir le tri des colonnes de la réponse. soit en précisant le nom littéral de la colonne.

ORDER BY nom_cli. dans l'ordre voulu.. on doit placer les noms des colonnes séparées par des virgules juste après le mot clef "ORDER BY". On peut aussi utiliser le rang de chaque colonne dans l'ordre spécifié dans la clause SELECT.La commande SELECT Pour spécifier l'ordre de tri. SELECT * FROM Clients WHERE code_postal = 40000. 32 . prénom DESC.

Afficher pour tous les livres le nom de l’auteur. localite) Écrire les requêtes SQL correspondant aux questions suivantes :        Afficher le nom. cod_aut#. prenom_aut) LIVRE(cod_livre. Afficher la date. adr_cli. prenom_cli. nom_aut. le prénom et la localité des clients. cod_cde#. edition. le nom du livre ainsi que la quantité donnée pour le client dont le code est 23 par ordre chronologique. cod_cli#) CLIENT(cod_cli. Afficher les différentes éditions en ordre décroissant et ceci en évitant les répétitions. Afficher les noms des livres des éditions « Folio » avec le nom de l’auteur. prix) COMPORTER(cod_livre#. nom_livre. date_cde. Afficher les données des livres commandés par des clients dont le nom commence avec la lettre « K ».Exercice AUTEUR(cod_aut. l’édition. quantite) COMMANDE(cod_cde. Afficher pour toutes les commandes les différentes lignes de commande. nom_cli. 33 . ainsi que le nom du livre et ceci trié suivant le nom de l’auteur en laissant de côté le livre d’Andorra. son prénom.

La commande SELECT SQL a cinq fonctions importantes :      SUM AVG MAX MIN COUNT. 34 . On les appelle fonctions d'ensemble parce qu'elles résument le résultat d'une requête plutôt que de renvoyer une liste d'enregistrements.

La commande SELECT 35 .

AVG(prix_unitaire) AS MOYENNE_PRIX FROM PRODUIT. le prix le plus élevé et le prix moyen en renommant la champ de la moyenne.MAX(prix_unitaire). 36 .La commande SELECT Exemple : SELECT MIN(prix_unitaire). Va retourner le prix le plus petit de la table Produit.

37 . Va retourner le nombre de produits dont le libellé commence par la lettre 'P'.La commande SELECT SELECT COUNT (*) FROM Produits WHERE libelle LIKE 'P*'.

pour compter le nombre d'enregistrements dans chaque groupe). Par exemple. avec pour chaque vendeur le nombre de ventes qu'il a fait : 38 . si nous voulons la liste des vendeurs.La commande SELECT Une des utilisations les plus courantes de la clause GROUP BY est son association avec une fonction d'ensemble (le plus souvent COUNT.

La commande SELECT SELECT num_vendeur.COUNT (*) FROM Commandes GROUP BY num_vendeur. Le mot-clé GROUP BY s’utilise lorsque diverses colonnes d’une ou de plusieurs tables sont sélectionnées et qu’une fonctions d'ensemble au moins apparaît dans l’instruction SELECT. 39 .

40 . à la place de la clause WHERE dans l’instruction SQL. vous devez utilisé une deuxième clause.La commande SELECT Si vous avez une condition qui s’applique sur une fonctions d'ensemble utilisé ou non dans la requête la clause WHERE ne sera plus valable. réservée pour les fonctions d’agrégation. il faut utiliser la clause HAVING.

41 . SUM(sales) FROM Store_Information GROUP BY store_name HAVING SUM(sales) > 1500 .La commande SELECT SELECT store_name.

cp_elv. Combien d’élèves participent au thème « La future entreprise ». localite_elv. lib_dpt. Afficher par ordre alphabétique le prénom des élèves qui sont en bâtiment C. code_dpt#) DEPARTEMENT(code_dpt. langue. age. des_theme. prenom_elv. cp_prof)          Etablir une liste avec toutes les données des différents élèves. id_salle#) SALLE(id_salle. Liste des professeurs qui enseigne plus de 3 thèmes dans le bâtiment C. tarif. le prénoms et les numéros de téléphone des l’élèves qui ont payés plus pour être inscrit.Exercice ELEVE(matricule_elv. Calculer l’âge moyen des élèves intéressés dans « Atomthéorie » Quelle département inscrit plus de 20 élèves. dt_inscription. niveau. Faire une liste d’élèves en indiquant le tarif et le code postal pour tous les élèves qui ont leur salle dans le bâtiment C et ceci dans l’ordre décroissant des numéros de téléphone regroupé par département. date_debut. type. sexe. nom_elv. 42 . tel. rue_prof. nom_prof. Afficher le nom et le code postal des professeurs qui tiennent des thèmes en français. localite_prof. prenom_prof. code_dpt#. no_prof#) PROF(no_prof. batiment) THEME(code_theme. rue_elv. Afficher les noms. description.

43 . La condition après la clause WHERE peut porter sur le résultat d'une autre requête (ou sous-requête).La commande SELECT Les sous-requêtes : On peut imbriquer autant de requêtes que l'on veut.

le produit qu'il a acheté et le prix d'achat. 44 . Nous voulons la liste des acheteurs ayant acheté des articles chers. pour chaque acheteur.La commande SELECT Supposons les tables suivantes : Cette table contient. Nous considérerons qu'un article cher est un article dont le prix est supérieur à la moyenne du prix des produits achetés + 100 DH.

Dans cet exemple.La commande SELECT SELECT Num_acheteur FROM Vente WHERE prix > (( SELECT AVG (prix) FROM Vente) + 100) . son numéro apparaîtra. on utilise la clause DISTINCT num_acheteur pour éliminer les doubles. Vous pouvez constater que condition de la requête est basée sur le résultat d'une autre requête. 45 . pour éviter cela. à chaque fois qu'un acheteur aura acheté un article cher.

une table contient un jeu de définitions et elle est destinée à stocker physiquement les données. et elle ne stocke pas physiquement les données. Une vue a également un jeu de définitions.La commande CREATE VIEW Les vues peuvent être considérées comme des tables virtuelles. Généralement. 46 . créé au-dessus des tables ou d’autres vues.

La commande CREATE VIEW La syntaxe pour la création d’une vue est comme suit : CREATE VIEW nom de vue AS requête SQL 47 .

Prénom. il faut saisir : CREATE VIEW V_Client_Kech AS SELECT Nom. Age de la table Client. Age FROM Client WHERE ville = 'Marrakech'.La commande CREATE VIEW et pour créer une vue appelée V_Client_Kech contenant seulement les colonnes Nom. 48 .Prénom.

La commande CREATE VIEW l est aussi possible d’utiliser une vue comme source d’une autre requête SQL : SELECT * FROM V_Client_Kech WHERE Age BETWEEN 30 and 50. 49 .

il faut alors obligatoirement spécifier les noms de colonnes de la vue. Si certaines colonnes résultats du SELECT sont des expressions sans nom. 50 .La commande CREATE VIEW La spécification des noms des colonnes de la vue est facultative : par défaut. Le SELECT peut contenir toutes les clauses d'un SELECT. les colonnes de la vue ont pour nom les noms des colonnes résultats du SELECT. sauf la clause ORDER BY.

les supprimer. on peut commencer à y insérer des données. Toutes ces opérations sont des opérations de manipulation des bases de données.Les manipulations la BD Une fois les tables créées. Pour effectuer ces manipulations. les mettre à jour. SQL dis pose de 3 instructions : INSERT – UPDATE – DELETE 51 .

Elle est utilisée généralement sous deux formes : 52 .La commande INSERT La commande INSERT est utilisée pour ajouter des enregistrements ou des parties d'enregistrements dans des tables.

La commande INSERT 1ère forme : INSERT INTO table (champ1.). le contenu du champ2 sera valeur2..'valeur2'. Cette forme est utilisée lorsqu'on veut insérer un seul enregistrement ou une partie d'un seul enregistrement. 53 . etc........ On créera un nouvel enregistrement dont le contenu du champ1 sera valeur1.) VALUES ('valeur1'.champ2.

.) (requête SELECT)..champ2.La commande INSERT 2ème forme : INSERT INTO table (champ1. 54 .. le résultat de la requête va être inséré dans les champs indiqués de la table. Cette méthode est utilisée lorsque plusieurs enregistrements sont ajoutés simultanément. Dans cette seconde forme.

La commande INSERT Dans les deux cas. par exemple demander l'insertion d'une chaîne de caractères dans un champ de type numérique ou monétaire. on ne peut pas. les champs numériques ou vides (NULL) ne doivent pas être placés entre apostrophes. les valeurs insérées doivent correspondre au type de données du champ dans lequel l'insertion va être faite. Les chaînes de caractères doivent être placées entre apostrophes ( ' ). 55 .

Les valeurs des champs à insérer doivent cependant apparaître dans le même ordre que les noms des champs lors de la création de la table. INSERT INTO table VALUES ('valeur1'..'valeur3'. la liste des noms des champs n'a pas besoin d'être explicitement indiquée dans la commande.. sans oublier un seul champ.).. 56 .La commande INSERT Si des valeurs doivent être insérées dans tous les champs de l'enregistrement de la table.'valeur2'.

'Jalil'. nous allons entrer : INSERT INTO Clients VALUES (100.'Medina N°44'.'Marrakech').40000.La commande INSERT Par exemple.'Mr'. dans notre table Client. si nous voulons insérer un nouveau client.'Dawali'. 57 .

La commande UPDATE La commande UPDATE est utilisée pour changer des valeurs dans des champs d'une table. champ2 = nouvelle_valeur2. champ3 = nouvelle_valeur3 WHERE condition. Sa syntaxe est : UPDATE table SET champ1 = nouvelle_valeur1. 58 .

59 . Les champs non spécifiés après la clause SET ne seront pas modifiés.La commande UPDATE La clause SET indique quels champs de la table vont être mis à jour et avec quelles valeurs ils vont l'être.

modifier le prix d'un produit dont le nom est "prod1". si nous voulons. nous taperons : UPDATE produits SET prix_unitaire = 1000 WHERE libelle = 'prod1'.La commande UPDATE Par exemple. 60 . dans la table produit.

La commande UPDATE La commande UPDATE affecte tous les enregistrements qui répondent à la condition donnée dans la clause WHERE. tous les enregistrements de la table seront affectés. 61 . Si la clause WHERE est absente.

62 .La commande UPDATE Par exemple. si nous tapons : UPDATE produits SET prix_unitaire = 1000. Le prix unitaire de TOUS les produits de la table produit va être modifié.

Dans ce cas la syntaxe est la suivante : UPDATE table SET champ1 = nouvelle_valeur1.La commande UPDATE Tout comme la commande INSERT. 63 . la commande UPDATE peut contenir une requête. champ3 = nouvelle_valeur3 WHERE condition = (requête SELECT). champ2 = nouvelle_valeur2.

utilisez la commande DELETE. La syntaxe est la suivante : DELETE FROM table WHERE condition. 64 .La commande DELETE Pour supprimer des enregistrements d'une table.

La commande DELETE supprime des enregistrements entiers.La commande DELETE On ne peut pas supprimer seulement le contenu de quelques champs des enregistrements. c'est pour cela qu'il n'est pas nécessaire d'indiquer ici des noms de champs. 65 . La condition spécifiée après WHERE va déterminer quels sont les enregistrements à supprimer.

La commande DELETE Par exemple. pour supprimer tous les clients dont la ville est Marrakech : DELETE FROM Clients WHERE ville='Marrakech'. 66 .

Cette variante de la commande DELETE ne supprime pas la table. 67 .La commande DELETE Pour supprimer tous les enregistrements d'une table. elle supprime seulement les enregistrements contenus dans cette table et laisse une table vide. n'indiquez pas de clause WHERE : DELETE FROM table.

comme précédemment utiliser une requête qui servira à déterminer la condition de la suppression. La syntaxe est la suivante : DELETE FROM table WHERE condition = ( requête SELECT).La commande DELETE On peut aussi. 68 .

Quelle est le contact ayant demandé le plus grand nombre d’intervention. Duree. 69 . PrenCont. heure et durée des interventions. Probleme) TECHNICIEN (NumTech. La durée n’est pas de 1.50 heure mais de 2 heures. TelCli) INTERVENIR (NumCli. CivCont. EmailCont. dans l’ordre chronologie. du technicien Ahmed Laalaj pour le mois de septembre 2006. Il s’agit de Mademoiselle Fatima Nassimi. PrenTech) (Les Durée des interventions sont en minutes. Compter le nombre d’interventions de plus d’une heure. Modifier la durée de l’intervention du technicien T007.fatima@bmci. Date. NomCont.Exercice CONTACT (NumCont. Quelle est la durée moyenne des interventions en 2006. DesignCli. #NumCli) CLIENT (NumCli. NomTech. VilleCli. De combien de temps d’intervention a déjà bénéficié la SARL Harvia sonna.ma. Ajouter un nouveau contact pour le client 41100985. Elle se verra attribuer le numéro de contact 41100985A. NumTech. avec l’email n. AdresseCli. Heure. CPCli.)        Afficher les dates.

LDD (Langage de définition des données)
Ce chapitre décrit les instructions SQL qui permette de décrire les tables et autres objets manipulés par le SGBD.

70

Création d'une table
L'ordre CREATE TABLE permet de créer une table définissant le nom et le type de chacune des colonnes la table. Nous ne verrons ici que trois des types données utilisés dans SQL : numérique, chaîne caractères et date. en de de de

Pour pouvoir créer une table dans votre base, il faut que vous ayez reçu le privilège CREATE. Le mécanisme des privilèges est décrit dans le chapitre suivant.

71

Création d'une table

 

table est le nom que l'on donne à la table ; colonne1, colonne2,.. sont les noms des colonnes ; type1, type2,.. sont les types des données qui seront contenues dans les colonnes.

72

Types des colonnes Pour décrire les colonnes d’une table. t chiffres dont d décimales. L’affichage est au format ‘YYYY-MM-DD’. Commentaire Taille fixe (maximum de 255). les SGBD fournit les types prédéfinis suivants : Type CHAR(n) VARCHAR(n) VARCHAR2(n) NUMBER[(t.-C. Le (n) est facultatif p désigne la précision (nombre de chiffres après la virgule Sur 3 octets.p)] SGBD MYSQL et ORACLE MYSQL ORACLE ORACLE MYSQL MYSQL MYSQL et ORACLE Description Chaîne fixe de n octets Chaîne variable de n octets Chaîne variable de n octets Valeur numérique Valeur entière Décimal à virgule fixe Dates du 1er janvier de l’an 1000 au 31 décembre 9999 après J. Taille variable (maximum de 65 535) Taille variable (maximum de 65 535) Le (t. 73 DATE .d) est facultatif. Entier (sur 4 octets).d)] INTEGER[(n)] DECIMAL[(n.

adresse VARCHAR(400) ). villecomp CHAR(20).Types des colonnes Exemple : CREATE TABLE Compagnie ( numcomp INTEGER(4). nomcomp CHAR(15). numcomp -------------- nomcomp -------------------- villecomp adresse -------------------------------------------------------------------- 0012 -------------- Harvia SONA -------------------- Marrakech Massira 3 N° 146 Rue des … -------------------------------------------------------------------- 74 .

Contraintes Les contraintes ont pour but de programmer des règles de gestion au niveau des colonnes des tables. Les contraintes peuvent être déclarées de deux manières :   En même temps que la colonne (valable pour les contraintes monocolonnes) . Après que la colonne est déclarée . ces contraintes sont dites « en ligne » (inline constraints). ces contraintes ne sont pas limitées à une colonne et peuvent être personnalisées par un nom (out-of-line constraints). 75 .

nomcomp CHAR(15) NOT NULL. Exemple : CREATE TABLE Compagnie ( numcomp INTEGER(4). villecomp CHAR(20) DEFAULT ‘Marrakech’.Contraintes Il est recommandé de déclarer les contraintes NOT NULL et DEFAULT en ligne. 76 . adresse VARCHAR(400) ).

.colonne2]...) FOREIGN KEY (colonne1 [...colonne2]...Contraintes Étudions à présent les types de contraintes nommées (out-of-line).colonne2]..) REFERENCES nomTablePere [(colonne1 [.colonne2].) PRIMARY KEY (colonne1 [.)] [ON DELETE {CASCADE | SET NULL}] [ON UPDATE {CASCADE | SET NULL}] CHECK (condition) 77 . Les quatre types de contraintes les plus utilisées sont les suivants : CONSTRAINT nomContrainte UNIQUE (colonne1 [.

78 . Les colonnes clés primaires ne peuvent être ni nulles ni identiques (en totalité si elles sont composées de plusieurs colonnes).Contraintes   La contrainte UNIQUE impose une valeur distincte au niveau de la table (les valeurs nulles font exception à moins que NOT NULL soit aussi appliquée sur les colonnes). Un index est généré automatiquement sur la ou les colonnes concernées. La contrainte PRIMARY KEY déclare la clé primaire de la table.

Contraintes   La contrainte FOREIGN KEY déclare une clé étrangère entre une table enfant (child) et une table père (parent). Les directives ON UPDATE et ON DELETE disposent de deux options : CASCADE propagera la suppression de tous les enregistrements fils rattachés à l’enregistrement père supprimé. SET NULL positionnera leur clé étrangère a NULL. Ces contraintes définissent l’intégrité référentielle. La contrainte CHECK impose un domaine de valeurs ou une condition simple ou complexe entre colonnes (exemple : CHECK (note BETWEEN 0 AND 20). 79 . CHECK (grade='Copilote' OR grade='Commandant')).

80 . • Pour une contrainte clé primaire. fk_ une clé étrangère. • Pour une contrainte clé étrangère. suppression). de la clé. Adoptez les conventions d’écriture suivantes pour vos contraintes :    Préfixez par pk_ le nom d’une contrainte clé primaire. et de la table cible (exemple fk_Pil_compa_Comp). un_ une unicité. réactivation. suffixez du nom de la table la contrainte (exemple pk_Avion). ck_ une vérification. renseignez (ou abrégez) les noms de la table source. et la lisibilité des programmes en sera affectée.Contraintes Il est recommandé de ne pas définir de contraintes sans les nommer (bien que cela soit possible). car il sera difficile de les faire évoluer (désactivation.

Le script de destruction des tables suit le raisonnement inverse. 81 . PRIMARY KEY équivaut à : UNIQUE + NOT NULL.Contraintes    L’ordre n’est pas important dans la déclaration des contraintes nommées. Il faut créer d’abord les tables «pères» puis les tables «fils». L’ordre de création des tables est important quand on définit les contraintes en même temps que les tables.

82 .Structure d’une table DESCRIBE (écriture autorisée DESC) est une commande qui vient de SQL*Plus d’Oracle et qui a été reprise par MySQL. DESCRIBE [nomBase.] nomTableouVue [colonne]. Ou DESC [nomBase. il s’agit de celle en cours d’utilisation. Elle permet d’extraire la structure brute d’une table ou d’une vue.] nomTableouVue [colonne]. Si la base n’est pas indiquée.

Les champs nomComp et nom du pilote ne sont pas NULL.Exercice      La ville par défaut de la compagnie est ‘Casablanca’. Le nom du pilote doit être unique dans la table. Le pilote doit obligatoirement avoir un nombre d’heurs de vole entre 0 et 20000 heurs. 83 . Le champ compa dans la table Pilote est une clé étrangère de la table Compagnie.

car il répond aux besoins de maintenance des applicatifs qui utilisent la base de données. 84 .Évolution d’un schéma   L’évolution d’un schéma est un aspect très important à prendre en compte. L’instruction principalement utilisée est ALTER TABLE (commande du LDD) qui permet d’ajouter. Avant de détailler ces mécanismes. étudions la commande qui permet de renommer une table. de renommer. de modifier et de supprimer des colonnes d’une table. Elle permet aussi d’ajouter et de supprimer des contraintes. Nous verrons qu’il est possible de modifier une base de données d’un point de vue structurel (colonnes) mais aussi comportemental (contraintes).

et CREATE sur la base. Il faut posséder le privilège ALTER et DROP sur la table d’origine. 85 .Renommer une table (RENAME)  L’instruction RENAME renomme une ou plusieurs tables ou vues. Exemple : RENAME Pilote TO Naviguant.

L’exemple suivant décrit comment renommer la table avec l’instruction ALTER TABLE : ALTER TABLE Pilote RENAME TO Naviguant.Modifications structurelles (Renommer la table)  Il est aussi possible d’utiliser l’option RENAME TO de l’instruction ALTER TABLE pour renommer une table existante. (Equivalant a l’instruction RENAME Pilote TO Naviguant.) 86 .

87 .nomTable ADD [COLUMN] nomColonne typeColonne [FIRST|AFTER nomColonne].Modifications structurelles (Ajout de colonnes)  La directive ADD de l’instruction ALTER TABLE permet d’ajouter une nouvelle colonne à une table. Cette colonne est initialisée à NULL pour tous les enregistrements (à moins de spécifier une contrainte DEFAULT. Syntaxe : ALTER TABLE [nomBase]. auquel cas tous les enregistrements de la table sont mis à jour avec une valeur non nulle).

La deuxième commande ajoute deux colonnes initialisées à une valeur non nulle.Modifications structurelles (Ajout de colonnes)  Le script suivant ajoute trois colonnes à la table Pilote. La colonne ville ne sera jamais nulle. La première instruction insère la colonne nbHVol en l’initialisant à NULL pour tous les pilotes (ici il n’en existe qu’une seule). 88 .

Modifications structurelles
(Ajout de colonnes)

L’instruction ADD, permet d’ajouter une colonne a la fin de la table, vous pouvez modifier l’emplacement d’insertion avec les deux instructions FIRST et AFTER.

Exemple :
ALTER TABLE Pilote ADD (nbHVol DECIMAL(7,2)) AFTER ville;

ALTER TABLE Pilote ADD (id INTEGER(2)) FIRST;

89

Modifications structurelles
(Renommer des colonnes)

Il faut utiliser l’option CHANGE de l’instruction ALTER TABLE pour renommer une colonne existante. Le nouveau nom de colonne ne doit pas être déjà utilisé dans la table. Le type (avec une éventuelle contrainte) doit être reprécisé. La position de la colonne peut aussi être modifiée en même temps. La syntaxe générale de cette option est la suivante :
ALTER TABLE [nomBase].nomTable CHANGE [COLUMN] ancienNom nouveauNom typeColonne [NOT NULL | NULL] [DEFAULT valeur] [FIRST|AFTER nomColonne];

90

Modifications structurelles
(Renommer des colonnes)

L’instruction suivante permet de renommer la colonne ville en adresse en la positionnant après la colonne nbHVol :
ALTER TABLE Pilote CHANGE ville adresse VARCHAR(30) AFTER nbHVol;

91

Modifications structurelles (Modifier le type des colonnes)  L’option MODIFY de l’instruction ALTER TABLE modifie le type d’une colonne existante sans pour autant la renommer.nomTable MODIFY [COLUMN] nomColonneAmodifier typeColonne [NOT NULL | NULL] [DEFAULT valeur] [FIRST|AFTER nomColonne]. La syntaxe générale de cette instruction est la suivante. 92 . les options sont les mêmes que pour CHANGE : ALTER TABLE [nomBase].

93 . Les contraintes en ligne peuvent être aussi modifiées par cette instruction. Une fois la colonne changée.Modifications structurelles (Modifier le type des colonnes)   Il est possible d’augmenter la taille d’une colonne numérique (largeur ou précision) – ou d’une chaîne de caractères (CHAR et VARCHAR) – ou de la diminuer si toutes les données présentes dans la colonne peuvent s’adapter à la nouvelle taille. et les données présentes devront toutes vérifier cette nouvelle contrainte. les nouvelles contraintes s’appliqueront aux mises à jour ultérieures de la table.

Modifications structurelles (Modifier le type des colonnes) Le tableau suivant présente différentes modifications de colonnes : 94 .

Modifications structurelles (Valeurs par défaut)  L’option ALTER COLUMN de l’instruction ALTER TABLE modifie la valeur par défaut d’une colonne existante.  Le script suivant définit une valeur par défaut pour la colonne adresse puis supprime celle relative à la colonne compa : 95 .nomTable ALTER [COLUMN] nomColonneAmodifier {SET DEFAULT ‘chaine’ | DROP DEFAULT}. La syntaxe générale de cette instruction est la suivante : ALTER TABLE [nomBase].

La syntaxe des ces options est la suivante : ALTER TABLE [nomBase]. La possibilité de supprimer une colonne évite aux administrateurs d’exporter les données.nomTable DROP { [COLUMN] nomColonne | PRIMARY KEY | FOREIGN KEY nomContrainte} 96 . d’importer les données et de recréer les éventuels contraintes. de recréer une nouvelle table. Lorsqu’une colonne est supprimée.Modifications structurelles (Supprimer des colonnes)   L’option DROP de l’instruction ALTER TABLE permet de supprimer une colonne.

• les colonnes qui sont clés primaires (ou candidates par UNIQUE) référencées par des clés étrangères.Modifications structurelles (Supprimer des colonnes)  Il n’est pas possible de supprimer avec cette instruction : • toutes les colonnes d’une table . Exemple : La suppression de la colonne adresse de la table Pilote est programmée par l’instruction suivante :  97 .

98 .nomTable (RENAME TO nouveau_nomTable) (ADD [COLUMN] nomColonne typeColonne [FIRST|AFTER nomColonne]) (CHANGE [COLUMN] ancienNom nouveauNom typeColonne [NOT NULL | NULL] [DEFAULT valeur] [FIRST|AFTER nomColonne]) (MODIFY [COLUMN] nomColonneAmodifier typeColonne [NOT NULL | NULL] [DEFAULT valeur] [FIRST|AFTER nomColonne] ) (ALTER [COLUMN] nomColonne {SET DEFAULT ‘chaine’ | DROP DEFAULT}) (DROP { [COLUMN] nomColonne | PRIMARY KEY | FOREIGN KEY nomContrainte}) .Modifications structurelles (Résumé) ALTER TABLE [nomBase].

Les seules contraintes existantes sont les clés primaires nommées pk_Compagnie. Faisons évoluer le schéma suivant. pour la table Compagnie. et pk_Avion pour la table Avion. d’activation et de désactivation de contraintes. 99 .Modifications comportementales   Nous étudions dans cette section les mécanismes d’ajout. de suppression.

La syntaxe générale est la suivante : ALTER TABLE [nomBase].colonne2]...nomTable ADD CONSTRAINT nomContrainte typeContrainte Trois types de contraintes sont possibles : UNIQUE (colonne1 [.) REFERENCES nomTablePère (col1 [...) PRIMARY KEY (colonne1 [.col2].) FOREIGN KEY (colonne1 [..colonne2]..colonne2].) [ON DELETE {CASCADE | SET NULL}] [ON UPDATE {CASCADE | SET NULL}] 100 .Modifications comportementales (Ajout de contraintes)  La directive ADD CONSTRAINT de l’instruction ALTER TABLE permet d’ajouter une contrainte à une table...

 Ajoutons la clé étrangère à la table Avion au niveau de la colonne proprio 101 .Modifications comportementales (Ajout de contraintes)  Ajoutons la contrainte d’unicité portant sur la colonne du nom de la compagnie.

sa clé primaire et deux clés étrangères (une vers la table Avion et l’autre vers Compagnie) : 102 .Modifications comportementales (Ajout de contraintes)  Ajoutons à la table Affreter. en une seule instruction.

103 . Contrainte NOT NULL : ALTER TABLE Avion MODIFY proprio CHAR(4) NULL.Modifications comportementales (suppression de contraintes) Il n’existe pas encore l’option DROP CONSTRAINT à l’instruction ALTER TABLE pour supprimer une contrainte de nom donnée Il faut donc utiliser une directive différente de l’instruction ALTER TABLE pour supprimer chaque type de contrainte.

104 .Modifications comportementales (suppression de contraintes) Contrainte Clé étrangère : ALTER TABLE [nomBase]. Contrainte Clé primaire : ALTER TABLE Affreter DROP PRIMARY KEY.nomTable DROP FOREIGN KEY nomContrainte.

il faut d’abord ôter les contraintes de clé étrangère de ces autres tables. 105 .Modifications comportementales (suppression de contraintes) Attention !! :  Si la colonne clé primaire à supprimer contient des clés étrangères.  Si la clé primaire à supprimer est référencée par des clés étrangères d’autres tables. il faut d’abord retirer les contraintes de clé étrangère.

106 .Exercice      Renommer le champ « compa » dans la table pilote par « comp » Supprimer le champ « nrue » de la table Compagnie Ajouter le champ « ville » après le « nom » dans la table Pilote avec une valeur par défaut équivalente a ‘Casablanca’ Supprimer la contrainte valeur par défaut pour le champ « ville » dans la table compagnie Renommer la table compagnie par company.

[nomBase2..] [RESTRICT | CASCADE] 107 .. il faut posséder le privilège DROP sur cette base..] nomTable1 [. L’instruction DROP TABLE entraîne la suppression des données. de la structure et la description dans le dictionnaire des données.]nomTable2. DROP TABLE [IF EXISTS] [nomBase.Suppression d'une table Pour pouvoir supprimer une table dans une base.

fonctions et procédures) ne sont pas supprimés mais sont temporairement inopérants. Les éléments qui utilisaient la table (vues. Attention. RESTRICT et CASCADE ne sont pas encore opérationnels. Le premier permettra de vérifier qu’aucun autre élément n’utilise la table (vue par exemple). une suppression ne peut pas être par la suite annulée. synonymes.Suppression d'une table   IF EXISTS : permet d’éviter qu’une erreur se produise si la table n’existe pas. Le second répercutera la destruction à tous les éléments référencés. 108 .

DROP TABLE Compagnie.Ordre des suppressions Il suffit de relire à l’envers le script de création de vos tables pour en déduire l’ordre de suppression à écrire dans le script de destruction de votre schéma. Exemple: (Les « fils » puis les « pères ») DROP TABLE Pilote. 109 .

LCD (Langage de contrôle des données) Dans ce chapitre nous verrons comment créer un utilisateur et comment lui attribuer des privilèges d’accès selon les besoins. et aussi de pouvoir les retirer. 110 .

111 . l’usager d’un SGBD doit être identifié avant de pouvoir utiliser des ressources. Les accès aux informations et à la base de données doivent être contrôlés à des fins de sécurité et de cohérence.Contrôle des données Comme dans tout système multi-utilisateur.

Création d’un utilisateur (CREATE USER)  Pour pouvoir créer un utilisateur. une fois créés. vous devez posséder le privilège CREATE USER ou INSERT sur la base système mysql.  les utilisateurs. n’ont aucun droit sur aucune base de données 112 . CREATE USER utilisateur [IDENTIFIED BY [PASSWORD] 'motdePasse'].

Renommer un utilisateur (RENAME USER)  Pour pouvoir renommer un utilisateur. Les privilèges et le mot de passe ne changent pas. 113 . vous devez posséder le privilège CREATE USER (ou le privilège UPDATE sur la base de données mysql).  Penser à spécifier l’accès complet à renommer (user@machine). La syntaxe SQL est la suivante : RENAME USER utilisateur TO nouveauNom.

 Il faut spécifier l’accès à éliminer (user@machine). vous devez posséder le privilège CREATE USER (ou le privilège DELETE sur la base de données mysql).Suppression d’un utilisateur (DROP USER)  Pour pouvoir supprimer un utilisateur.utilisateur2 .]. sa suppression ne sera effective qu’à la fin de sa (dernière) session.. La syntaxe SQL est la suivante : DROP USER utilisateur [. Tous les privilèges relatifs à cet accès sont détruits.. 114 . Si l’utilisateur est connecté dans le même temps.

car il a implicitement tous les droits. Dans le cas de root.Attribution de privilèges (GRANT)  L’instruction GRANT permet d’attribuer un (ou plusieurs) privilège(s) à propos d’un objet à un (ou plusieurs) bénéficiaire(s). 115 . aucun problème. L’utilisateur qui exécute cette commande doit avoir reçu lui même le droit de transmettre ces privilèges (reçu avec la directive GRANT OPTION).

GRANT OPTION : permet de donner le droit de retransmettre les privilèges reçus à une tierce personne. DELETE.. voir le tableau suivant. etc... 116 .*} TO utilisateur@host [IDENTIFIED BY [PASSWORD] 'password‘] [WITH GRANT OPTION].). privilège : description du privilège (ex : SELECT..Attribution de privilèges (GRANT) GRANT privilège [ (col1 [.* | nomBase. ] ON [ {TABLE} ] {nomTable | * | *.privilège2 . col2.])] [.

Attribution de privilèges (GRANT) 117 .

Exemples  Adil (en accès local) peut créer ou supprimer des tables dans la base DB. GRANT INSERT. DROP ON DB.CLIENT TO ADIL@localhost WITH GRANT OPTION. supprimer et modifier la colonne ville de la table Livre contenue dans la base DB.* TO ADIL@localhost. Il pourra par la suite retransmettre éventuellement ces droits. DELETE. GRANT CREATE. 118 . extraire. SELECT. UPDATE(ville) ON DB.  Adil peut insérer.

SHOW GRANTS FOR utilisateur.Voir les privilèges  La commande SHOW GRANTS FOR liste les différentes instructions GRANT équivalentes à toutes les prérogatives d’un utilisateur donné. 119 . C’est bien utile quand vous avez attribué un certain nombre de privilèges à un utilisateur sans avoir pensé à les consigner dans un fichier de commande.

.privilège2 .*} FROM utilisateur [. ].* | nomBase.utilisateur2 ...Révocation de privilèges (REVOKE)   La révocation d’un ou de plusieurs privilèges est réalisée par l’instruction REVOKE. Pour pouvoir révoquer un privilège. les options sont les mêmes que pour la commande GRANT: REVOKE privilège [ (col1 [. col2.. Dans la syntaxe suivante... 120 . vous devez détenir (avoir reçu) au préalable ce même privilège avec l’option WITH GRANT OPTION. ] ON [ {TABLE | FUNCTION | PROCEDURE} ] {nomTable | * | *.])] [.

utilisez REVOKE ALL PRIVILEGES. REVOKE ALL PRIVILEGES... utilisateur2 . REVOKE CREATE ON DB.Révocation de privilèges (REVOKE)  ADIL (en accès local) ne peut plus créer de tables dans la base DB.] . Tout en une fois ! Il existe une instruction qui révoque tous les droits en une fois.* FROM ADIL. 121 . GRANT OPTION FROM utilisateur [.

Sign up to vote on this title
UsefulNot useful