Informatique de gestion
Interrogation de Bases de Données
Karim DOUMI
[email protected]
[email protected]
SQL: Introduction
SQL est un langage de manipulation de bases de données
mis au point dans les années 70 par IBM.
Il permet, pour résumer, trois types de manipulations sur les
bases de données :
• La maintenance des tables : création, suppression,
modification de la structure des tables.
• Les manipulations des enregistrements: Sélection,
modification, suppression d'enregistrements.
• La gestion des droits d'accès aux tables : Contrôle des
données : droits d'accès, validation des modifications.
22/03/2023 Doumi Karim 2
SQL: Introduction
• L'intérêt de SQL est que c'est un langage de
manipulation de bases de données standard,
vous pourrez l'utiliser sur n'importe quelle
base de données.
• Vous pouvez gérer une base de données
Access, mais aussi Paradox, dBase, SQL
Server, Oracle ou Informix par exemple (les
bases de données les plus utilisées).
22/03/2023 Doumi Karim 3
Un langage plusieurs aspects
Ordres SQL Aspect du langage
CREATE – ALTER – DROP - COMMENT – Définition des données (LDD)
RENAME – TRUNCATE
INSERT – UPDATE – DELETE – MERGE – Manipulation des données
LOCK TABLE (LMD)
SELECT Interrogation des données
(LID)
GRANT – REVOKE – COMMIT – Contrôle des données (LCD)
ROLLBACK – SAVEPOINT – SET
TRANSACTION
DDL : Tables
• Création de table
CREATE TABLE nomTable
(
colonne1 type1 [DEFAULT valeur1] [NOT NULL]
[, colonne2 type2 [DEFAULT valeur2] [NOT NULL] ]
[CONSTRAINT nomContrainte1 typeContrainte1]…
);
DDL : Tables
● Caractères (CHAR, VARCHAR, VARCHAR2,..) ;
● Valeurs numériques NUMBER ;
● Date/heure DATE;
DDL : contraintes
CONSTRAINT nomContrainte
• UNIQUE (colonne1 [,colonne2]…)
• PRIMARY KEY (colonne1 [,colonne2]…)
• FOREIGN KEY (colonne1 [,colonne2]…)
REFERENCES nomTablePere (colonne1 [,colonne2]…)
• CHECK (condition)
CREATE TABLE utilisateur CREATE TABLE utilisateur
( (
id INT PRIMARY KEY NOT id INT NOT NULL,
NULL, nom VARCHAR(100),
nom VARCHAR(100), prenom VARCHAR(100),
prenom VARCHAR(100), email VARCHAR(255),
email VARCHAR(255), date_naissance DATE,
date_naissance DATE, pays VARCHAR(255),
pays VARCHAR(255), ville VARCHAR(255),
ville VARCHAR(255), code_postal VARCHAR(5),
code_postal VARCHAR(5), nombre_achat INT,
nombre_achat INT CONSTRAINT cle_pr
) PRIMARY KEY (id)
)
DDL : contraintes
Soit le schéma relationnel suivant :
CLIENT(Numcli : NUMBER (7) , Nom : VARCHAR(15) , Prénom :
VARCHAR(15) , Tel : VARCHAR (12) , Adresse : VARCHAR(20) , Ville :
VARCHAR(15) , Pays : VARCHAR (15)) ;
COMMANDE(Numcom : NUMBER (7) , Numcli : NUMBER (7) ,
Datecom : DATE , Datelivrai : DATE) ;
PRODUIT (Numprod : NUMBER (7) , Designation : VARCHAR (15) ,
Description : VARCHAR(100) , Prix : NUMBER (11,2) ,
QteStock :NUMBER (7)) ;
LIGNE_COMMANDE (Numprod : NUMBER (7) , Numcom :
NUMBER(7), Prix : NUMBER (11,2) , Qtecom : NUMBER(9) )
1. Créer la table CLIENT (Numcli est la clé primaire ; Numcli, Nom et prénom ne
doivent pas être nuls).
2. Créer la table PRODUIT (Numprod est la clé primaire ; Numprod et
Designation ne doivent pas être nuls).
3. Créer la table COMMANDE (Numcom est la clé primaire et Numcli est une
clé étrangère).
4. Créer la table LIGNE_COMMANDE (la clé primaire est composée des clés
étrangères suivantes : Numprod et Numcom).
DDL : contraintes
1. CREATE TABLE CLIENT( Numcli NUMBER(7) NOt NULL, Nom VARCHAR(15)
NOT NULL, Prénom VARCHAR(15) NOT NULL, Tél VARCHAR(12), Adresse
VARCHAR(20), Ville VARCHAR(15), Pays VARCHAR(15), CONSTRAINT
clé_pri_cli PRIMARY KEY (Numcli));
2. CREATE TABLE PRODUIT( Numprod NUMBER(7) NOT NULL, Designation
VARCHAR(15) NOT NULL, Description VARCHAR(30), Prix NUMBER(11,2),
QteStock NUMBER(7), CONSTRAINT clé_pri_prod PRIMARY KEY (Numprod));
1. CREATE TABLE COMMANDE( Numcom NUMBER(7) NOT NULL, Numcli
NUMBER(7), Datecom DATE, Datelivrai DATE, CONSTRAINT clé_pri_com
PRIMARY KEY (Numcom), CONSTRAINT clé_étr_com FOREIGN KEY (Numcli)
REFERENCES CLIENT(Numcli));
2. CREATE TABLE LIGNE_COMMANDE ( Numprod NUMBER(7), Prix
NUMBER(11,2), Qtecom NUMBER(9), Numcom NUMBER(7), CONSTRAINT
clé_pri_lign PRIMARY KEY (Numprod,Numcom), CONSTRAINT clé1_étr_lign
FOREIGN KEY (Numprod) REFERENCES PRODUIT(Numprod), CONSTRAINT
clé2_étr_lign FOREIGN KEY (Numcom) REFERENCES
COMMANDE(Numcom));
DDL : ALTER TABLE
Cette commande permet de modifier la structure d’une table et non son
contenu.
Après la création d’une table, il est parfois nécessaire de modifier sa
structure, comme par exemple:
• Ajout d’une nouvelle colonne à la table avec ses contraintes
• Augmente ou diminuer la largeur d’une colonne existante
• Spécification d’une valeur par défaut pour une colonne existante
• Changer le type de données d’une une colonne existante
• Spécification d’autres contraintes pour une colonne existante
• Activer ou désactiver une contrainte
• Détruire une contrainte.
• Détruire une colonne
• Renommer une colonne.
22/03/2023 Doumi Karim 10
DDL : ALTER TABLE
Cette commande permet de modifier la structure d’une table et non son
contenu.
Après la création d’une table, il est parfois nécessaire de modifier sa
structure, comme par exemple:
• Ajout d’une nouvelle colonne à la table avec ses contraintes
• Augmente ou diminuer la largeur d’une colonne existante
• Spécification d’une valeur par défaut pour une colonne existante
• Changer le type de données d’une une colonne existante
• Spécification d’autres contraintes pour une colonne existante
• Activer ou désactiver une contrainte
• Détruire une contrainte.
• Détruire une colonne
• Renommer une colonne.
22/03/2023 Doumi Karim 11
DDL : ALTER TABLE
La commande ALTER TABLE a les options suivantes:
• ADD
• DROP
• MODIFY
• RENAME.
• ENABLE/DISABLE
Exemple:
CREATE TABLE Employes(
NumEmp number(4,0),
nom varchar2(15),
prenom varchar2(20),
ville varchar2(30)
);
22/03/2023 Doumi Karim 12
DDL : ALTER TABLE
L’option ADD: permet d’ajouter une colonne ou une contrainte à une
table.
ALTER TABLE Employes ADD CONSTRAINT emppk PRIMARY KEY
(numeemp);
-- Permet d’ajouter une contrainte de PK pour la table employes sur
l’attribute numeemp.
ALTER TABLE Employes ADD (Salaire NUMBER (8,2));
Peremt d’ajouter un attribut Salaire de type NUMBER(8,2) pour la
table Employes.
ALTER TABLE employes ADD CONSTRAINT cksalaire
CHECK(salaire>3000);
Permet d’ajouter une contrainte sur le salaire. Le salaire doit être plus
grand ou égal que 3000
22/03/2023 Doumi Karim 13
DDL : ALTER TABLE
Soit le schéma relationnel suivant :
CLIENT(Numcli : NUMBER (7) , Nom : VARCHAR(15) , Prénom :
VARCHAR(15) , Tel : VARCHAR (12) , Adresse : VARCHAR(20) , Ville :
VARCHAR(15) , Pays : VARCHAR (15)) ;
COMMANDE(Numcom : NUMBER (7) , Numcli : NUMBER (7) ,
Datecom : DATE , Datelivrai : DATE) ;
PRODUIT (Numprod : NUMBER (7) , Designation : VARCHAR (15) ,
Description : VARCHAR(100) , Prix : NUMBER (11,2) ,
QteStock :NUMBER (7)) ;
LIGNE_COMMANDE (Numprod : NUMBER (7) , Numcom :
NUMBER(7), Prix : NUMBER (11,2) , Qtecom : NUMBER(9) ,)
Ajouter les contraintes d’intégrité suivantes :
1. Pour la table CLIENT, le pays d’un client ne peut être que ‘Maroc’, ‘France’ ou ‘Egypte’.
2. Pour la table COMMANDE, la Datecom doit toujours être inférieure ou égale à Datelivrai.
3. Pour la table PRODUIT, la quantité stockée doit toujours être positive.
DDL : Index
CREATE INDEX nomIndex
ON nomTable ( {colonne1 | expressionColonne1 } …) ;
Exemple:
Pour la table PRODUIT, créer un index pour accélérer la recherche
par la désignation.
CREATE INDEX index_desig on PRODUIT (designation);
Les manipulations des BD
• Une fois les tables créées, on peut commencer à y insérer des
données, les mettre à jour, les supprimer ou y faire des
requêtes. Toutes ces opérations sont des opérations de
manipulation des bases de données.
• Pour effectuer ces manipulations, SQL dispose de 4 instructions
:
INSERT
UPDATE
DELETE
SELECT
22/03/2023 Doumi Karim 16
La commande INSERT
Présentation & syntaxe
La commande INSERT est utilisée pour ajouter des
enregistrements ou des parties d'enregistrements dans des
tables. Elle est utilisée généralement sous deux formes :
INSERT
INTO table (champ1,champ2,...) VALUES
('valeur1','valeur2',...);
Cette forme est utilisée lorsqu'on veut insérer un seul
enregistrement ou une partie d'un seul enregistrement. On
créera un nouvel enregistrement dont le contenu du champ1
sera valeur1, le contenu du champ2 sera valeur2, etc...
22/03/2023 Doumi Karim 17
La commande INSERT
Si des valeurs doivent être insérées dans tous les champs de
l'enregistrement de la table, la liste des noms des champs n'a
pas besoin d'être explicitement indiquée dans la commande.
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, sans oublier un seul champ.
La syntaxe est alors :
INSERT INTO table
VALUES ('valeur1','valeur2','valeur3',...);
22/03/2023 Doumi Karim 18
La commande INSERT
par exemple, dans notre table Client, si nous voulons insérer un
nouveau client, nous allons entrer :
INSERT INTO Clients
VALUES (100,'Mr','Alaoui','Jawad','rue de la paix',’75000’,
,'Rabat',NULL);
La commande ci-dessus va insérer un enregistrement dans
la table 'clients' avec les informations suivantes : Le client
100, dont le titre est 'Mr.', dont le nom est 'Alaoui', dont le
prénom est 'Jawad', l'adresse est 'Rue de la paix', le code postal
est 75000 et la ville est 'Rabat'.
22/03/2023 Doumi Karim 19
La commande UPDATE
La commande UPDATE est utilisée pour changer des valeurs
dans des champs d'une table. Sa syntaxe est :
UPDATE table
SET champ1 = nouvelle_valeur1, champ2 =
nouvelle_valeur2, champ3 = nouvelle_valeur3
WHERE condition;
La clause SET indique quels champs de la table vont être mis à
jour et avec quelles valeurs ils vont l'être. Les champs non
spécifiés après la clause SET ne seront pas modifiés.
22/03/2023 Doumi Karim 20
La commande UPDATE
Par exemple, si nous voulons, dans la table produit,
modifier le prix d'un produit dont le nom est "prod1", nous
taperons :
UPDATE produits
SET prix_unitaire = 1000
WHERE libelle = 'prod1‘;
La commande UPDATE affecte tous les enregistrements qui
répondent à la condition donnée dans la clause WHERE. Si la
clause WHERE est absente, tous les enregistrements de la
table seront affectés.
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é.
22/03/2023 Doumi Karim 21
La commande DELETE
Pour supprimer des enregistrements d'une table, utilisez la
commande DELETE. La syntaxe est la suivante :
DELETE
FROM table
WHERE condition;
On ne peut pas supprimer seulement le contenu de quelques
champs des enregistrements. La commande DELETE supprime
des enregistrements entiers, c'est pour cela qu'il n'est pas
nécessaire d'indiquer ici des noms de champs. La condition
spécifiée après WHERE va déterminer quels sont les
enregistrements à supprimer.
22/03/2023 Doumi Karim 22
La commande DELETE
Par exemple, pour supprimer tous les clients dont la ville est Rabat:
DELETE
FROM Clients
WHERE ville='Rabat';
Pour supprimer tous les enregistrements d'une table, n'indiquez pas
de clause WHERE :
DELETE FROM table;
Cette variante de la commande DELETE ne supprime pas la
table, elle supprime seulement les enregistrements contenus dans
cette table et laisse une table vide.
22/03/2023 Doumi Karim 23
La commande SELECT
La commande SELECT est la commande la plus complexe de SQL.
Cette commande va servir à faire des requêtes pour récupérer des
données dans les tables. Elle peut être associée à une des
commandes de manipulation de tables vues avant pour spécifier une
condition.
Sa syntaxe est :
SELECT champ1, champ2, champ3, ... FROM table;
S'il y a plus d'un champ spécifié après SELECT, les champs doivent
être séparés par des virgules.
Les champs sont retournés dans l'ordre spécifié après la clause
SELECT, et non pas dans l'ordre qu'ils ont été créés dans la table.
22/03/2023 Doumi Karim 24
La commande SELECT
Les clauses SELECT et FROM doivent obligatoirement apparaître au
début de chaque requête, on peut, ensuite, indiquer des critères de
sélection avec la clause WHERE :
SELECT *
FROM table
WHERE condition;
Par exemple, pour sélectionner tous les Clients de la table "Clients"
dont le code postal est 75000 :
SELECT *
FROM Clients
WHERE code_postal = 75000;
22/03/2023 Doumi Karim 25
La commande SELECT
Les opérateurs de condition
On peut utiliser les opérateurs suivants dans les conditions :
Opérateur Signification
= Egal
<> Différent (parfois noté aussi != )
< Inférieur
> Supérieur
<= Inférieur ou égal
>= Supérieur ou égal
Pour sélectionner tous les articles dont le prix est supérieur à 100 F :
SELECT *
FROM Clients
WHERE prix_unitaire > 100;
22/03/2023 Doumi Karim 26
La commande SELECT
Opérateurs logiques:
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 enregistre ment satisfait TOUTES
les conditions listées. (C'est-à-dire que toutes les conditions
séparées par AND sont vraies). Par exemple, pour sélectionner tous
les clients nommés 'Alaoui' qui habitent Rabat:
SELECT *
FROM Clients
WHERE nom = 'Alaoui' AND ville = 'Rabat';
22/03/2023 Doumi Karim 27
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, pour sélectionner tous les clients nommés 'Alaoui' ou
'Alaoui' :
SELECT *
FROM Clients
WHERE nom = 'Alaoui' OR nom = ‘Alami';
AND et OR peuvent être combinés :
SELECT *
FROM Clients
WHERE nom = 'Alaoui' AND (ville = 'Rabat' OR ville = 'Casa');
22/03/2023 Doumi Karim 28
La commande SELECT
Clauses IN et BETWEEN
Pour sélectionner des enregistrements dont la valeur d'un champ peut
être comprise dans une liste ou entre deux valeurs, on utilise les clauses
IN et BETWEEN.
Par exemple : Pour sélectionner les clients vivant à Rabat ou Casa :
SELECT *
FROM Clients
WHERE ville IN ('Rabat', 'Casa');
Ou pour sélectionner les produits dont le prix est compris entre 100 et
1000 F :
SELECT *
FROM Produits
WHERE prix_unitaire BETWEEN 100 AND 1000;
22/03/2023 Doumi Karim 29
La commande SELECT
La clause LIKE
La clause LIKE permet de faire des recherches approximatives sur le
contenu d'un champ. Par exemple, pour sélectionner les clients dont le
nom commence par la lettre S :
SELECT *
FROM Clients
WHERE nom LIKE 'S*';
Tout comme dans les requêtes Access, le symbole * remplace un
ensemble de caractères, pour représenter tous les noms commençant
par S, on utilisera 'S*', tous ceux se terminant par S, on utilisera
'*S', et tous ceux comportant la lettre S : '*S*'. Le symbole ? ne remplace
qu'un seul caractère.
22/03/2023 Doumi Karim 30
Les jointures
La jointure va nous permettre de sélectionner des informations dans
plusieurs tables grâce aux relations existant entre ces tables. Il va
néanmoins falloir indiquer comment se fait la relation entre ces tables.
Par exemple : récupérer le nom et le prénom du client ayant passé la
commande n°1 :
SELECT nom, prénom
FROM Clients, Commande
WHERE Commande.num_client = Client.num_client AND
num_commande = 1;
22/03/2023 Doumi Karim 31
La clause Distinct
Supposons que nous voulions la liste des clients ayant acheté quelque
chose. Nous voulons que chaque client ayant acheté quelque chose ne
soit affiché qu'une seule fois .
Pour cela, nous allons utiliser la clause DISTINCT.
Syntaxe:
SELECT DISTINCT(Client.num_client) ,nom, prénom
FROM Clients, Commande
WHERE Commande.num_client = Client.num_client ;
On peut même rendre le résultat de la sélection plus agréable à la
lecture en utilisant la clause ORDERBY à la fin de la requête (ORDER
BY nom).
22/03/2023 Doumi Karim 32
Les fonctions d’ensemble
SQL a cinq fonctions importantes : SUM, AVG, MAX, MIN et
COUNT. 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.
Fonction Signification
Donne le total d'un champ de tous les enregistrements satisfaisant la
SUM () condition de la requête. Le champ doit bien sur être de type numérique
donne la moyenne d'un champ de tous les enregistrements satisfaisant la
AVG () condition de la requête
donne la valeur la plus élevée d'un champ de tous les enregistrements
MAX () satisfaisant la condition de la requête
Donne la valeur la plus petite d'un champ de tous les enregistrements
MIN () satisfaisant la condition de la requête.
COUNT (*) Renvoie le nombre d'enregistrements satisfaisant la requête.
22/03/2023 Doumi Karim 33
Les fonctions d’ensemble
Exemples :
SELECT MIN(prix_unitaire),MAX(prix_unitaire),AVG(prix_unitaire)
Va retourner le prix le plus petit de la table Produit, le prix le plus
élevé et le prix moyen.
SELECT COUNT (*) FROM Produits
WHERE libelle LIKE 'P*';
Va retourner le nombre de produits dont le libellé commence par la
lettre 'P'.
22/03/2023 Doumi Karim 34
La clause Group by
Une des utilisations les plus courantes de la clause GROUP BY est son
association avec une fonction d'ensemble (le plus souvent COUNT, pour
compter le nombre d'enregistrements dans chaque groupe). Par
exemple, si nous voulons la liste des vendeurs, avec pour chaque
vendeur le nombre de ventes qu'il a fait :
SELECT num_vendeur,COUNT (*) FROM Commandes
GROUP BY num_vendeur;
On peut ajouter une condition à la requête, par exemple, la liste des
vendeurs avec leur nombre de vente pour le mois de janvier.
SELECT num_vendeur,COUNT (*) FROM Commandes
GROUP BY num_vendeur
HAVING mois(date)=1;
22/03/2023 Doumi Karim 35
Les sous requêtes
On peut imbriquer autant de requêtes que l'on veut. La condition après
la clause WHERE peut porter sur le résultat d'une autre requête (ou
sous-requête).
Exemple:
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.
SELECT Num_acheteur
FROM Vente
WHERE prix > ( SELECT AVG (prix) + 100
FROM Vente);
22/03/2023 Doumi Karim 36