Introduction au langage SQL et gestion des données
Introduction au langage SQL et gestion des données
SQL (Structured Query Language) a été introduit par IBM comme le langage
d’interface de son prototype de système de gestion de base de donnée relationnelle, System-R.
Le premier système SQL disponible sur le marché a été introduit en 1979 par Oracle.
Aujourd’hui, SQL est devenu un standard de l’industrie et Oracle est un leader dans la
technologie des systèmes de gestion de bases de données relationnelles.
Comme SQL est un langage non procédural, des ensembles d’enregistrements peuvent être
manipulés à la fois. La syntaxe est naturelle et souple, ce qui permet de se concentrer sur la
présentation des données.
SQL–le standard
L’ANSI (American National Standards Institute) a déclaré SQL le langage standard pour les
systèmes de gestion de bases de données relationnelles. La plupart des entreprises qui
produisent des systèmes de gestion de bases de données relationnelles sont compatibles avec
SQL et essaient de respecter le standard SQL89.
1- Définitions
La définition de données dans SQL permet la description des objets manipulés par le SGBD.
Les commandes du LDD sont :
- CREATE : création des objets.
- ALTER : modification de structure de l’objet.
- DROP : Suppression d’objets.
Celle-ci consiste à définir son nom, les colonnes qui la composent et leurs types. Elle se fait
avec la commande : CREATE TABLE
Syntaxe :
• CHAR : stocke des chaînes comportant au maximum 255 caractères dans une
colonne de longueur fixe : CHAR(n). Si on ne spécifie pas la longueur :
CHAR, une colonne de ce type ne stocke qu’un seul caractère.
• DATE : permet de stocker des informations concernant les dates et les heures.
EX :
Créer une table correspondante à l’entité client avec comme clé le champ numéroclient. Cette
table comprend les champs relatifs au nom, téléphone, adresse, code postal et ville.
Une contrainte d’intégrité est une règle qui définit la cohérence d’une donnée ou d’un
ensemble de données de la base de données.
SQL définit certaines contraintes telles que :
- Non nullité des valeurs d’un attribut : L’utilisateur doit saisir la valeur de l’attribut. La
commande est : NOT NULL
- Unicité de la valeur d’un attribut ou d’un groupe d’attributs : la valeur doit être unique.
La commande est : UNIQUE.
- Clé primaire (un attribut ou un groupe) : indique que l’attribut est une clé primaire. Elle
peut être définie comme contrainte de table ou comme contraint de colonne.
Clé primaire comme contrainte de colonne : en ajoutant devant la colonne clé primaire
Primary key.
Remarque :
Dans le cas de clé primaire multiple, la clé primaire doit être comme contrainte de table
(Syntaxe 1).
create table piece (codpiece number(5) primary key, despiece varchar(10), coulpiece
varchar(10));
Create table LigneCde (Num_cde number(5), NumProd number(5), Datecde date, Qtecde
number(5), constraint pk_lignecde primary key (Num_cde, NumProd));
- Clé étrangère (intégrité référentielle ) : Lorsque la clé primaire figure dans une autre table
en tant qu’un attribut non clé.
La clé étrangère peut être définie comme contrainte de table ou comme contrainte de colonne.
Remarque :
Il est impossible de créer une clé étrangère si la clé primaire associée n’existe pas.
- Contrainte de valeur avec la clause check : Permet de limiter les valeurs possibles pour
une colonne en vérifiant une certaine condition. Le contrôle se fera lors des insertions des
données.
CONSTRAINT nom_contrainte check (colonne condition)
Un opérateur de comparaison.
La clause between val1 and val2.
La clause in (liste de valeurs).
Exemples :
1-
create table commande
(codvnt number(6) primary key,
article number(5),
qte number(5),
constraint ck_commande check (qte >0));
2-
create table produit
(codprod number(5) primary key,
desprod varchar(10),
coulprod varchar(10),
constraint ck_produit check (coulprod in (‘r’,’g’,’b’)));
Application:
Correction :
ORACLE définit trois possibilités de modification de structure de table qui permettent soit
d’ajouter des colonnes, soit de modifier la structure d’une colonne, soit de supprimer des
colonnes existantes.
Syntaxe :
Rq:
Quand on veut ajouter un champ en lui choisissant son emplacement:
ADD coln type [(taille)] [null / not null] before colp
Ex:
Supposons qu’on veut ajouter une colonne type_pdt à la table produit:
ALTER TABLE produit
ADD (type_pdt char(3)) ;
Syntaxe :
Ex :
ALTER TABLE produit
MODIFY (type_pdt char (5)) ;
Rq:
Pour modifier le nom d’une colonne :
RENAME COLUMN nom_table.ancien_nom TO nom_table.nouveau_nom ;
Syntaxe :
Ex :
Supposons qu’on veut supprimer le champ num_fax de la table fournisseur :
ALTER TABLE fournisseur DROP num_fax ;
Syntaxe :
Ex:
ALTER TABLE emp ADD constraint cletran FOREIGN KEY (Mgr) references dept
(deptno);
Rq:
L’option cascade est ajoutée pour pouvoir supprimer une clé primaire référencée.
Remarque :
Pour retrouver les différentes contraintes avec leurs propriétés, on peut utiliser la commande
suivante :
Select * from user_constraints
[where table_name = ‘NOMTABLE’];
Il est à remarquer que pour cette commande, le nom de la table doit être écrit en majuscule.
Syntaxe :
Ex :
Supposons qu’on veut supprimer la table client_tunis :
Syntaxe :
Il est également possible de donner à une même table plusieurs noms différents appelés
synonymes.
Syntaxe :
Syntaxe :
Rq :
La suppression d’une table implique la suppression des synonymes correspondants.
1- Insertion de données
Syntaxe :
INSERT INTO nom_table [(les champs de la table)] VALUES (liste des valeurs) ;
Les valeurs des colonnes de type caractère ou chaîne de caractères doivent apparaître entre
deux cotes (‘’). Si la valeur est nulle on doit mettre deux cotes successives (sans blanc).
Ex :
INSERT INTO produit VALUES (‘P007’,’chaise’,98.12, 15) ;
EX :
On peut ne pas mettre certaines colonnes de la table s’il en existe une valeur qui sera remplie
par défaut, par exemple le champ ville est par défaut SFAX :
b- 2ème forme : Insertion à travers la copie des valeurs des colonnes d’une autre table
Syntaxe :
Ex :
2- Modification de données
L’opération de modification consiste à mettre à jour les colonnes d’une table par des
nouvelles valeurs.
Syntaxe :
UPDATE nom_table
SET col1 = val1,…., coln = valn
WHERE condition ;
Rq :
- Il n’est pas possible de mettre à jour plus qu’une table à la fois.
- Les valeurs peuvent être des constantes, des expressions ou des résultats de
sous requêtes.
Ex :
Modifier l’adresse du client TRIKI qui devient 15, cité des fleurs.
UPDATE client SET adr_clt =’ 15, cité des fleurs’ WHERE nom_clt = ‘TRIKI’ ;
3- Suppression de données
Syntaxe :
Ex:
1) Supprimer toutes les commandes qui datent avant le 28/04/99.
DELETE FROM commande WHERE num_clt = (select num_clt from client where nom =
‘TRIKI’);
4- Consultation de données
4-1- Présentation
SQL est basé sur l’utilisation de blocks de qualification dont la structure est composée
principalement de trois éléments :
SELECT : permet de définir la liste des colonnes que l’on peut obtenir.
FROM : n’indique que les noms des tables nécessaires pour obtenir le résultat
souhaité.
WHERE : définit la condition que doit vérifier un n-uplet donné pour qu’il fasse partie
du résultat.
Syntaxe :
a- Notion d’Alias
Chaque fois qu’une requête d’interrogation est exécutée, les noms des colonnes définies
dans la structure de la table apparaissent comme titres de colonnes. On peut modifier ces
noms de colonnes, à l’affichage uniquement, en ajoutant des alias.
La commande devient :
b- Condition de sélection
En plus des opérateurs classiques de comparaison (=, <>, <, >, >=, <=) ORACLE dispose
d’un certain nombre d’opérateurs spécifiques dont principalement :
- IS NULL : permet de tester si le contenu d’une colonne est une valeur nulle (indéfinie).
- IN (liste de valeurs) : permet de tester si le contenu d’une colonne coïncide avec l’une des
valeurs de la liste.
- BETWEEN V and V2 : permet de tester si le contenu d’une colonne est compris entre les
valeurs V1 et V2.
- LIKE chaîne générique : permet de tester si le contenu d’une colonne ressemble à une
chaîne de caractères obtenues à partir de la chaîne générique. La chaîne générique est une
chaîne de caractères qui contient l’un des caractères suivants :
% : remplace une autre chaîne de caractères qui peut être même une chaîne vide.
- : remplace un seul caractère.
Tous les opérateurs spécifiques peuvent être mis sous forme négative en les faisant précéder
de l’opérateur de négation NOT : NOT IN, NOT BETWEEN, NOT LIKE, IS NOT NULL.
EX :
1) Lister tous les produits dont la quantité en stock est inférieur à 20.
SELECT * FROM produit WHERE qtestk <20;
2) Sélectionner la désignation et le prix unitaire des produits dont le prix unitaire est
compris entre 5 et 10.
SELECT design, prixU FROM produit WHERE prixU BETWEEN 5 and 10;
SELECT design, prixU FROM produit WHERE qtestk>0 and prixU BETWEEN 5 and 10;
8) Majorer de 5% les prix unitaires des produits dont le prix est supérieur à 10.
UPDATE produit SET prisU = prixU * 1.05 WHERE prixU > 10 ;
Ex :
Magasins (magnum, magloc, magger)
M1 sfax triki
M2 tunis fki
- ADD_MONTHS (d, n) : permet d’ajouter n mois à la date d sachant que n est un entier.
- GREATEST (d1, d2) : permet d’avoir la date le plus récente parmi d1 et d2.
- MONTHS_BETWEEN (d1, d2) : permet d’avoir le nombre de mois qui se trouvent entre
la date d1 et la date d2.
- LAST_DAY (d) : permet d’avoir la date du dernier jour de la date d.
- SYSDATE : donne la date et l’heure système.
Ex :
LAST_DAY (‘02/01/02’) donne : 31/01/02
Rq :
Quelques formats de fonctions :
YYYY Année sans virgule
YYY 3 derniers chiffres de l’année
YY 2 derniers chiffres de l’année
Y Dernier chiffre de l’année
MM Numéro du mois (1 à 12)
DD Numéro de jour dans le mois (1 à 31)
D Numéro de jour dans la semaine (1 à 7)
SS Secondes (1 à 60)
YEAR Année en toute lettre
MON Nom du mois abrégé en toute lettre
DAY Nom du jour sur 9 caractères
SP Nombre en toute lettre
Ex :
Ventes (numvnt, …, datvnt,..)
1 03/01/00
ORACLE dispose d’un ensemble de fonctions appelées fonctions agrégats qui s’appliquent à
un ensemble de données :
- AVG : permet d’avoir la moyenne arithmétique d’un ensemble donné.
- COUNT : permet d’avoir le nombre d’occurrences des enregistrements.
- MAX : permet d’avoir la valeur maximale dans une colonne.
- MIN : permet d’avoir la valeur minimale dans une colonne.
- SUM : permet d’avoir la somme des éléments.
- STDDEV : permet d’avoir l’écart type.
- VARIANCE : permet d’avoir la variance.
Rq :
On ne peut pas mettre une fonction de groupe après la clause WHERE parce qu’elle s’agit
d’une valeur inconnue.
Ex :
Sélectionner tous les étudiants qui ont une note supérieure à la note moyenne de tous les
étudiants.
SELECT * FROM etudiant WHERE note_etu > (SELECT AVG (note_etu) FROM etudiant);
EX :
1) Sélectionner les noms distincts des clients qui ont fait des commandes.
SELECT DISTINCT nom_clt from commande;
Il est possible de regrouper (classifier) les résultats obtenus permettant d’avoir ensemble les
lignes ayant une même valeur pour la colonne de classification. La classification permet aussi
d’effectuer un calcul tel que la moyenne ou la somme des valeurs de chaque groupe et de
présenter le résultat sous forme d’une ligne par groupe.
La clause qui permet la classification est :
GROUP BY expression
[HAVING condition]
Ex:
Trouver la somme des quantités commandées par produit et par client qui sont supérieures à
10.
Rq:
Si on ne spécifie pas asc ou desc par défaut le tri est croissant (asc).
Ex :
Donner la liste des produits par ordre de prix unitaire croissant et ceux ayant le même prix par
ordre alphabétique décroissant.
SELECT * FROM produit ORDER BY prixU, design desc;
La requête imbriquée figure lorsqu’une sous requête apparaît dans la clause WHERE de la
requête principale.
Ex :
1) Trouver la désignation des produits dont le prix unitaire est égal à celui des chaises.
SELECT design FROM produit WHERE prixU = (SELECT prixU FROM produit
WHERE design = ‘chaise’) ;
Requête 1
Opérateur
Requête 2
a- L’union : UNION
Elle permet d’avoir les résultats de la première requête suivis de ceux de la deuxième requête.
Ex :
Donner les noms des clients dont la matricule est C001 ou C002 ou C003 et les noms des
clients qui habitent Sfax.
Elle permet d’avoir les lignes communes aux résultats des deux requêtes.
Ex :
Donner les noms des clients dont la matricule est C001 ou C002 ou C003 et en même temps
qui habitent Sfax.
INTERSECT
SELECT nom FROM client WHERE ville = ‘Sfax’;
c- La différence : MINUS
MINUS permet d’avoir les lignes qui apparaissent dans la première requête et qui
n’apparaissent pas dans la seconde.
Ex :
Donner les noms de tous les clients sauf ceux qui habitent Sfax.
a- Produit cartésien
Le produit cartésien consiste à croiser toutes les données d’une table avec celles d’une autre
table. Pour construire les n-uplets résultants, on combine chaque n-uplet de la première table
avec tous les n-uplets de la seconde table.
Avec SQL, on spécifie les tables à croiser dans la clause FROM et les colonnes résultantes
dans la clause SELECT.
Ex :
Lister toutes les commandes (num_cde, dat_cde, num_pdt, num_clt,qte_cde) avec pour
chaque commande la date de la vente correspondante.
SELECT C. num_cde, C. dat_cde, C. num_pdt, C. num_clt, C. qte_cde, V.dat_vnt FROM
commande C, vente V;
b- La jointure
• La jointure simple
Elle permet de faire un rapprochement de deux tables par comparaison d’une ou de plusieurs
colonnes communes aux deux tables. La jointure est un sous ensemble du produit cartésien.
Les colonnes utilisées pour la comparaison doivent être de même type et de même taille et
sont appelées colonnes de jointure.
La forme générale d’une requête de jointure est :
SELECT col1, col2,…, coln
FROM table1,…,tablen
WHERE condition;
Ex:
• L’autojointure
Elle consiste à faire le rapprochement d’une table avec elle-même ; c'est-à-dire ramener sur
une même ligne des informations qui proviennent de plusieurs lignes de la même table. Pour
cela il faut créer un SYNONYM de la table ou utiliser des variables ALIAS.
Ex :
Trouver la désignation et le prix unitaire des produits dont le prix est supérieur à celui du
produit chaises.
1ère solution:
CREATE SYNONYM prod FOR produit ;
SELECT [Link], [Link] FROM prod, produit WHERE [Link] = ‘chaise’
AND [Link] > [Link];
2ème solution:
SELECT [Link], [Link] FROM produit p1, produit p2
WHERE [Link] = ‘chaise’ AND [Link] > [Link];
Elle consiste à définir sa structure c'est-à-dire son nom, les colonnes qui la composent et les
données qui lui sont rattachées.
Syntaxe :
Rq :
Si on supprime la table de laquelle est issue la vue, la vue sera inutilisable.
Ex :
CREATE VIEW vprod (des, qte, prix)
AS SELECT design, SUM (qte_stk), AVG (prixU * qtestk)
FROM produit
GROUP BY design;
Syntaxe :
Toutes les requêtes de consultation possibles sur les tables le sont aussi sur les vues.
TRAVAUX DIRIGES
TD N°1
LE LANGAGE SQL
Travail demandé :
Création de la base de données, contraintes d’intégrité
1) Créer la table DEPT. Ne pas oublier de définir le numéro de département DEPTNO comme
clé primaire. Intégrer également la contrainte de domaine suivante : le nom d'un département
(DNAME) ne peut être que ACCOUNTING, RESEARCH, SALES ou OPERATIONS.
3) Ajouter les contraintes d’intégrité nécessaires à la table EMP (clé primaire et clés
étrangères) à l’aide de la commande ALTER TABLE EMP ADD CONSTRAINT…
4) Dans EMP, parmi ces nouveaux employés quelles insertions on peut effectuer, justifier :
(7369, 'WILSON', 'MANAGER', 7839, '17/11/91', 3500.00, 600.00, 10);
(7657, 'WILSON', 'MANAGER', 7839, '17/11/91', 3500.00, 600.00, 50);
(7657, 'WILSON', 'MANAGER', 7000, '17/11/91', 3500.00, 600.00, 10);
(7657, 'WILSON', 'MANAGER', 7839, '17/11/91', 3500.00, 600.00, 10);
CORRECTION DU TD N°1
LE LANGAGE SQL
6) SELECT ENAME FROM EMP WHERE SAL > (SELECT SAL FROM EMP WHERE
ENAME='JONES');
7) SELECT ENAME FROM EMP WHERE JOB = (SELECT JOB FROM EMP WHERE
ENAME='JONES') AND ENAME<>’JONES’;
8) SELECT ENAME FROM EMP WHERE MGR = (SELECT MGR FROM EMP WHERE
ENAME='CLARK') AND ENAME<>'CLARK';
TD N°2
LE LANGAGE SQL
Exercice 1 :
Clés primaires
Clés étrangères
Formuler en langage SQL les commandes de création de la structure de cette base, puis
exprimer les requêtes suivantes :
1) Donner pour chaque service le poids de la pièce commandée de couleur bleue la plus
pesante.
2) Donner le poids moyen des pièces commandées pour chacun des services “Promotion”.
3) Donner les pièces de couleur bleue qui sont commandées par plus de trois services
différents.
4) Donner le maximum parmi les totaux des quantités des pièces commandées par les
différents services.
Exercice 2 :
Clés primaires
Clés étrangères
CORRECTION DU TD N°2
LE LANGAGE SQL
Exercice 1 :
3) SELECT [Link]
FROM PRODUIT P
WHERE COULEUR=’bleu’
AND 3 <
(SELECT COUNT (DISTINCT NOS)
FROM COMMANDE C
WHERE [Link]=[Link]);
4) SELECT MAX(SUM(QUANTITE))
FROM COMMANDE
GROUP BY NOS;
Exercice 2: