M17 :SGBD1 LANGAGE SQL
TDI1GB 2007/2008
PARTIE 2 Mise en place d’une base :LANGAGE LDD Toutes les opérations qui permettent de créer une base de données sont disponibles dans Entreprise Manager sous forme de boıtes de dialogue et de boutons. Mais on peut également les organiser dans un code SQL.
2.1 Une base et son journal Une base de données SQL Server contient au minimum : – un fichier de données principal (d’extension .mdf) où sont stockées les données ; – un journal des transactions (d’extension .ldf) où sont répertoriées toutes les transactions. Lorsque l’on crée une base, il faut donc préciser le nom, l’emplacement et la taille de ces deux fichiers.
Exemple : créons une base de données papeterie CREATE DATABASE papeterie -- le nom de la base ON PRIMARY -- le fichier de données principal 3( 4 NAME = papeterie_data, -- nom logique 5 FILENAME = ’C:\Data\papeterie.mdf’, -- emplacement et nom du fichier 6 SIZE = 60MB, -- taille de départ 7 MAXSIZE = 70MB, -- taille maximale 8 FILEGROWTH = 1MB -- increment 9) 10 LOG ON -- le journal 11 ( 12 NAME = papeterie_log, 13 FILENAME = ’D:\Log\papeterie.ldf’, 14 SIZE = 15MB, 15 MAXSIZE = 20MB, 16 FILEGROWTH = 1MB 17 ) Pour modifier une base de données existante, on utilise l’instruction ALTER DATABASE. Par exemple : 1 ALTER DATABASE papeterie 2 MODIFY NAME cartoleria Remarque : d’autres modifications sont possibles. Pour supprimer une base de données existante, il suffit de taper : 1 DROP DATABASE papeterie 1 2
2.2 Création d’une une table Lors de la création d’une table dans une base de données existante, il faut préciser : – pour chaque colonne : son nom et son type de données ; – une clé primaire (qui permet d’identifier chaque ligne de façon unique). On peut éventuellement préciser pour chaque colonne si vide est interdit et/ou une valeur par défaut.
28/03/2008
1
CFHN
M17 :SGBD1 LANGAGE SQL
TDI1GB 2007/2008
Exemple de création d’une table : CREATE TABLE clients ( 3 clt_num CHAR(8) PRIMARY KEY, -- clé primaire 4 clt_nom VARCHAR(64) NOT NULL, -- vide interdit 5 clt_ca INT DEFAULT 0 -- valeur par défaut 6) 1 2
RQ : NULL représente une absence d’information
Pour modifier une table existante, on utilise l’instruction ALTER TABLE. Exemples : 1 2 3 4 5 6 7 8
ALTER TABLE clients ADD clt_adr VARCHAR(255) -- pour ajouter la colonne adresse ALTER TABLE clients DROP COLUMN clt_adr -- pour retirer la colonne adresse ALTER TABLE clients ALTER COLUMN clt_num INT -- pour reconvertir le type de données
Pour supprimer une table existante, il suffit de taper : 1
DROP TABLE clients
2.3 Numérotation automatique Pour la clé primaire d’une table, il est souvent préférable de laisser SQL Server générer des valeurs distinctes. On dispose pour cela de deux possibilités : – une valeur entière qui s’incrémente automatiquement ; – un identificateur unique universel (GUID. Nous nous contentons de la première alternative : CREATE TABLE clients ( 3 clt_num INT PRIMARY KEY IDENTITY(4,2), 4 -- les numeros des clients successifs seront 4, 6, 8, ... 5 ... 6) Pour avoir un incrément de 1 : IDENTITY(1,1)). 1 2
A titre d’information, la seconde alternative s’emploie ainsi : 1 2
ALTER TABLE clients ALTER COLUMN clt_num UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID()
28/03/2008
2
CFHN
M17 :SGBD1 LANGAGE SQL
TDI1GB 2007/2008
2.4 Définir les relations La commande d’un produit est forcement passée par un client. Donc la table commandes devra contenir une colonne pour savoir quel client est concerné. Cette colonne cmd_clt contiendra en fait la clé primaire du client concerné . Il y a donc une relation entre cmd_clt et la colonne clt_num de la table clients .Comme cmd_clt va chercher ses valeurs dans une autre colonne, elle constitue ce que l’on appelle une clé étrangère.
Relation entre deux tables La syntaxe pour créer la table commandes est alors : CREATE TABLE commandes ( 3 cmd_num INT PRIMARY KEY IDENTITY(1,1), 4 cmd_date DATETIME DEFAULT GETDATE(), 5 -- GETDATE() retourne la date d’aujourd’hui et l’heure courante 6 cmd_clt INT NOT NULL FOREIGN KEY REFERENCES clients(clt_num) 7) 1 2
Remarques : – cmd_clt et clt_num doivent être du même type ; – on pourrait se contenter de REFERENCES clients car clt_num est clé primaire ; – cette relation introduit deux contraintes : – lors d’une nouvelle commande, le client devra déjà exister ; – lors de la suppression d’un client, il ne devra plus faire l’objet de commande. Il est également possible de créer une table en insérant directement des lignes provenant d’une autre table. Exemple :
Select etudiants.mat as matricule_etudiant,note,Ncours as nom_cours into RESEXAM from ETUDIANT,EXAMEN where CONDITION 28/03/2008
3
CFHN
M17 :SGBD1 LANGAGE SQL
TDI1GB 2007/2008
CREATE TABLE bonus (nom, salaire) AS SELECT nom, salaire FROM employé WHERE métier=’chef de service’ ; Dans ce cas les attributs de la nouvelle table est l'ensemble ou un sous-ensemble des attributs de l'ancienne table. Par contre, les contraintes de l’ancienne table ne sont pas recopiées dans la nouvelle.
1.1. Les contraintes d'intégrité Une contrainte d'intégrité est une condition qui doit constamment vérifier le contenu da base de données. Le langage SQL permet de définir des contraintes et le SGBD empêche à tout moment la violation de celles-ci. Le SGBD identifie toute contrainte. Le mot clé CONSTRAINT permet à l'utilisateur de choisir l'identifiant d'une contrainte ce qui permet, lors d'une mise à jour, de localiser rapidement la contrainte objet de la violation.
1.1.1. Nullité d'une colonne On peut imposer à une colonne d'être toujours renseignée. La syntaxe est la suivante : CREATE TABLE NomTable (…., NomCol TYPE()[CONSTRAINT NomCont] NOT NULL, … );
1.1.2. Unicité de valeur dans une colonne On peut imposer à une colonne d'avoir des valeurs différentes (sauf les valeurs non renseignées). La syntaxe est la suivante: CREATE TABLE NomTable(….,NomCol TYPE()[CONSTRAINT NomCont] UNIQUE,…); La syntaxe est la suivante: CREATE TABLE NomTable (….,[CONSTRAINT NomCont] UNIQUE(NomCol1, NomCol2, …), … );
1.1.3. Clé primaire SQL permet de définir un ensemble de colonnes d’une table comme clé primaire. Le SGBD garantit à tout moment l'unicité de la clé dans la table et la non nullité de chaque champ de la clé. S’il existe plusieurs clés candidates, SQL permet de définir une seule comme étant Primary Key. Par contre, pour plus de cohérence, on pourrait définir les autres clés comme étant Unique Si la clé primaire n’est formée que d'une seule colonne, on peut la définir en même temps que la colonne avec la syntaxe suivante : CREATE TABLE NomTable (NomCol1 TYPE(..) [CONSTRAINT NomCont] PRIMARY KEY, …); Si la clé est formée de plusieurs champs, la définition se fait de la façon suivante: CREATE TABLE NomTable (NomCol1 TYPE(..), …, [CONSTRAINT NomCont] PRIMARY KEY(NomCol1, NomCol2,…));
1.1.4. Clés étrangères On peut imposer que les valeurs d'une ou plusieurs colonnes d'une table correspondent à des valeurs existantes d'une clé primaire ou d'un champ unique d'une autre table: c’est l’intégrité référentielle. La syntaxe est la suivante :
28/03/2008
4
CFHN
M17 :SGBD1 LANGAGE SQL
TDI1GB 2007/2008
•
Cas d'une seule colonne
•
CREATE TABLE NomTable(…, NomCol TYPE(..) [CONSTRAINT NomCont] REFERENCES NomTableRef(NomCol) [ON DELETE CASCADE], …); Cas de plusieurs colonnes CREATE TABLE NomTable(…., …, [CONSTRAINT NomCont] FOREIGN KEY (NomCol1, NomCol2, …, NomColn) REFERENCES NomTableRef(Col1, Col2, …, Coln) [ON DELETE CASCADE], …);
La clause ON DELETE CASCADE permet de supprimer les lignes en cas d’effacement d’une ligne de la table référencée.
1.1.5. Ensemble de valeurs admises On peut imposer que les valeurs d'une colonne prennent des valeurs dans un ensemble défini par une condition. La syntaxe est la suivante : •
CREATE ….(…., …,NomColn TYPE()CONSTRAINT NomCont CHECK Condition, …); Ou si la condition porte sur plusieurs attributs CREATE ….(….,NomColn TYPE(), [CONSTRAINT NomCont]CHECK Condition, …);
CREATE TABLE département (numdept NUMBER(3), nomdept CHAR(10) CHECK(nomdept in('info','electronique','langues','maths')) ;
1.2. Modifier la définition d'une table 1.2.1. Ajouter ou modifier des colonnes d’une table : ALTER TABLE nomtable ADD (col1 type1, col2 type2, …); ALTER TABLE table MODIFY (col1 type1, col2 type2, …); Les colonnes doivent exister dans la table et la modification de type est possible si la colonne ne contient que des valeurs NULL ou si le nouveau type est compatible avec le contenu de la colonne (on ne peut pas diminuer sa taille maximale, ni ajouter NOT NULL si elle contient des lignes ou cette colonne n'est pas renseignée).
1.2.2. Ajouter des contraintes à une table : Ajouter une contrainte de clé étrangère: ALTER TABLE nom_table ADD CONSTRAINT nom_contrainte FOREIGN KEY (NomCol1, …, NomColn)REFERENCES NomTable(Col1, …, Coln); Ajouter une contrainte de clé primaire: ALTER TABLE nom_table ADD CONSTRAINT nom_contrainte PRIMARY KEY (NomCol1, NomCol2, …);
1.2.3. Supprimer une colonne ALTER TABLE NOMTABLE DROP COLUMN NOMCOLUMN
1.2.4. Supprimer des contraintes à une table : ALTER TABLE NomTable DROP CONSTRAINT NomCont [CASCADE]; ALTER TABLE NomTable DROP Primary Key [CASCADE]; ALTER TABLE NomTable DROP Unique((NomCol1, NomCol2, …) [CASCADE];
28/03/2008
5
CFHN
M17 :SGBD1 LANGAGE SQL
TDI1GB 2007/2008
On ne peut supprimer une contrainte de type primary key ou unique qui fait partie d’une intégrité référentielle. La Clause CASCADE force à supprimer les contraintes de type clé étrangère qui se réfèrent à une clé primaire ou unique.
1.2.5. Supprimer une table DROP TABLE NomTable [CASCADE CONSTRAINTS]; La suppression d’une table permet supprime, à la fois, le schéma et l’extension de celle-ci. La clause Cascade Constraints permet de supprimer toutes les contraintes d’intégrité référentielles qui se réfèrent aux clés unique ou primaire de la table à supprimer.
1.2.6. Renommer une table RENAME NomOldTable to NomNewTable;
28/03/2008
6
CFHN
M17 :SGBD1 LANGAGE SQL
TDI1GB 2007/2008
2. Langage de manipulation de données LMD On peut ajouter, modifier ou supprimer des lignes d’une table.
2.1. Insertion de lignes dans une table Quand les valeurs de toutes les colonnes sont connues, la syntaxe est : INSERT INTO NomTable VALUES( Val [, …]); Quand certaine(s) valeur(s) ne sont pas connues, la syntaxe est : INSERT INTO NomTable(NomCol [, ….]) VALUES( Val [, …]); Il doit y avoir parfaite correspondance entre la liste des colonnes et la liste de valeurs. Les colonnes non précisées sont automatiquement remplies avec la valeur NULL ou la valeur définie dans le DEFAULT.
Insertion de lignes résultant d’un select : Clause SELECT INSERT INTO NomTable[(NomCol , …)] SELECT … CREATE TABLE CLIENT insert into CLIENT Select Num, Nom, Prenom, Adresse from CLIENT_REC Where condition_recherche;
2.2. Mise à jour de lignes d’une table La syntaxe est : Update NomTable SET NomCol = Expression [, ….] [WHERE Condition]; Update NomTable SET (NomCol1,…)
= Select …[WHERE Condition];
La condition WHERE permet de sélectionner les lignes mises à jour. Si la clause WHERE n'existe pas, toutes les lignes sont mises à jour. Expression peut être une constante, une expression arithmétique. Exemple : Update Client Set Ville=’New York’ Where NumClient=’C1’ ; Update Employe Set salaire=salaire*1.1 ;
2.3. Suppression de lignes d’une table La syntaxe est : DELETE FROM NomTable [WHERE Condition]
28/03/2008
7
CFHN