0% ont trouvé ce document utile (0 vote)
114 vues20 pages

Introduction aux Bases de Données et SQL

Transféré par

najatmaichan04
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
114 vues20 pages

Introduction aux Bases de Données et SQL

Transféré par

najatmaichan04
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

CHAPITRE 1 : Introduction aux Bases de Données

1. Qu’est ce qu’une base de données ?


Une base de données peut être vue comme le besoin de mémoriser de façon durable des données et
de pouvoir exprimer le plus précisément possible les relations qu’entretiennent ces données.
Une fois cette représentation faite, il est nécessaire d’associer des fonctionnalités (programmes et
des requêtes) à cette base de données afin de pouvoir l’exploiter le plus facilement possible.

Toutes les personnes exploitant la même base de données n’ont pas la même fonction et n’ont
donc pas forcément besoin de voir les mêmes informations ou d’appliquer les mêmes actions
à la base de données. Les systèmes des privilèges, des vues et des programmes stockés
permettent de délimiter rigoureusement ces différentes visions d’une même base de données
(chaque vision est nommée schéma externe).

Enfin, plusieurs utilisateurs peuvent appliquer simultanément des modifications à la même


base de données, il est alors nécessaire d’utiliser des techniques d’isolation et de synchronisation
afin de garantir la cohérence de ces modifications.

2. Qu’est-ce qu’un système de gestion de base de données (SGBD)

Un SGBD est la structure d’accueil d’une ou plusieurs bases de données : il offre les outils
nécessaires à la mise en place d’une base de données. On pourrait comparer le SGBD au système
d’exploitation et la base de données à un programme d’application utilisant les services du système.
Les bases de données et les systèmes de gestion de bases de données ont été créés pour répondre à un
certain nombre de besoins et pour résoudre un certain nombre de problèmes.
Des objectifs principaux ont été fixés aux systèmes de gestion de bases de données dès l'origine de
ceux-ci et ce, afin de résoudre les problèmes causés par la démarche classique.

Voici quelques-unes des caractéristiques d’un SGBD :

a) Capacité de gérer des données persistantes et structurées.


b) Capacité à gérer, autant que possible, la sémantique des données et à garantir des
propriétés (les contraintes, assertions, domaines des attributs, triggers et procédures
stockées)
c) Pouvoir manipuler facilement et efficacement de très grands volumes de données.
d) Permettre l’exécution de transactions concurrentes par un ou plusieurs utilisateurs tout en
conservant les propriétés de la BD.
e) Assurer la sécurité des données :
f) contrôler les accès en fonction de droits accordés aux différents utilisateurs.
g) tolérer les pannes logicielles ou matérielles grâce à des procédures de reprise.
h) Procurer l’indépendance physique : le SGBD permet de manipuler les données
indépendamment de leurs implantations matérielles.
i) Procurer l’indépendance logique : chaque utilisateur ne voit de la base que les données
qui lui sont nécessaires (schéma externe).
j) Le cœur d’un SGBD est le modèle de données qu’il supporte, c’est à dire la manière
d’organiser les données qu’il offre. Le modèle actuellement le plus utilisé est le relationnel
inventé dans les années 1970 dont une belle qualité est probablement la symétrie naturelle

Pr.Jaber EL BOUHDIDI 1
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

qu’il offre dans les associations inter-données. Il existe d’autres modèle de données :
hiérarchique, réseau et objet, qui eux ne sont pas franchement symétriques.
k) Fournir un langage de haut niveau adapté au modèle : SQL pour le modèle relationnel,
CODASYL pour le modèle réseau, OQL pour le modèle objet.
l) Exemples de SGBD relationnels : Oracle,PostgreSQL,MySQL,Access et plein d’autres !

3. Exécution d'un programme d'application par le SGBD


Un programme est fait uniquement à partir de la connaissance de la BD au travers d'un schéma
externe , le SGBD doit pouvoir interpréter les instructions exprimées en termes du schéma externe ,
pour les convertir en termes du schéma conceptuel puis en ordres sur la BD physique.

Programme Niveau externe Niveau conceptuel Niveau


physique

utilisateur

4. Concepts du modèle relationnel


Avant d’attaquer le vif du sujet, un petit glossaire du jargon des bases de données :
Domaine : ensemble des valeurs d’un attribut.
Relation : sous ensemble du produit cartésien d’une liste de domaines. C’est en fait un
tableau à deux dimensions dont les colonnes correspondent aux domaines et dont les
lignes contiennent des tuples. On associe un nom à chaque colonne.
Attribut : une colonne d’une relation, caractérisé par un nom.
Tuple : liste des valeurs d’une ligne d’une relation.

Une relation est un peu une classe (programmation orientée objet) qui ne possèderait
que des attributs et donc chaque instance représenterait un tuple.

Exemple d’une relation

Une relation est une table comportant des colonnes (appelées aussi attributs) dont le nom et le type
caractérisent le contenu qui sera inséré dans la table.

Imaginons que l’on veuille stocker dans notre base de données notre carnet d’adresses. On va donc
créer la relation Personne qui aura pour attributs : nom, prénom, adresse, téléphone. Autrement dit,
c’est une table nommée Personne possédant les colonnes : nom, prénom, adresse, téléphone.

Les lignes que contiendra cette table seront appelées enregistrements ou tuples.

5. Algèbre relationnelle
Une algèbre relationnelle est un ensemble d’opérateurs agissant sur des relations et produisant des
relations. Voici la liste des opérations possibles :
Pr.Jaber EL BOUHDIDI 2
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

Opérations ensemblistes (binaires) :


 Union
 Intersection
 différence
 produit cartésien

Opérations spécifiques aux relations


 (unaires) : restriction, projection
 (binaire) : jointure

Projection : on ne sélectionne qu’un ou plusieurs attributs d’une relation (on ignore les autres). Par
exemple n’afficher que les colonnes nom et prénom de la table Personnes.

Jointure : on fabrique une nouvelle relation à partir de 2 ou plusieurs autres en prenant comme pivot 1
ou plusieurs attributs. Par exemple, on concatène la table du carnet d’adresse et celle des inscrits à la
bibliothèque en fonction du nom de famille (c’es typiquement du recoupement de fichiers).

Sélection : on sélectionne tous les tuples ou bien seulement une partie en fonction de critères de
sélection qui portent sur les valeurs des attributs. Par exemple n’afficher que les lignes de la table
Personnes qui vérifient la condition suivante : le nom ne commence pas par la lettre ‘C’.

Cette algèbre est facilement possible avec les commandes de SQL (SELECT… FROM…
WHERE…).

Pr.Jaber EL BOUHDIDI 3
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

CHAPITRE 2 : Langage de manipulation des Bases de Données SQL

1. Qu’est ce que SQL ?

SQL (Structured Query Language) 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 bases de données : 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.

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, même si, à
priori, vous ne connaissez pas son utilisation. Ainsi, avec SQL, 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).

2. Famille du Langage SQL

Le langage SQL se répartit en 3 familles principales:


a) Langage de manipulation des données LMD

LMD (Langage de Manipulation de Données) permet la manipulation des tables et des vues. Pour
manipuler la Base de Données on a les commandes :
 Select : Pour la recherche de données
 Insert : Pour l'insertion dans une table
 Delete : Pour la suppression dans une table
 Update : Pour la modification dans une table

b) LDD (Langage de Définition de Donnée)


Permet la création et la définition des tables, vues, index, attributs. Pour définir le schéma de BD on a
les commandes :

 Déclaration de tables, des vues


 Déclaration des droits d'accès
 Déclaration de contraintes d'intégrités

c) LCD (Langage de Contrôle de Données)


Permet de définir des permissions au niveau des utilisateurs d'une base de données.

3. La maintenance d’une base de données

La première série de commandes sert à la maintenance de la base de données :


création des tables et des indexes, modification de la structure d'une table ou
suppression d'une table ou d'un index.

Remarque : La maintenance des bases de données dépend étroitement de la base de données utilisée,
notamment en ce qui concerne les types de données, vérifiez donc toujours les types de données supportés par
votre SGBD avant de créer une table avec SQL. Il se peut qu'il en supporte plus que ceux indiqués plus bas.

SQL dispose pour cela des instructions suivantes :


1) ALTER TABLE
Pr.Jaber EL BOUHDIDI 4
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

2) CREATE TABLE
3) Drop TABLE

2.1 La commande CREATE Table

La commande CREATE TABLE permet de créer une table dans la base de


données courante. Sa syntaxe est la suivante :

CREATE TABLE Nom_Table (champ type CONSTRAINT champ propriétés, ... );

Exemple :

Nom de la clé Primaire

CREATE TABLE Client(Code_cli integer constraint PK Primary Key, Nom_cli char(30), Pre_cli
char(30), Email char(30) NOT NULL );

Remarque:

Pour le champ Email on l’a marqué NOT NULL, c-à-d, si on n’insère pas l’email du client courant
et on veut insérer un autre enregistrement, le message d’erreur suivant apparaitra :

Le tableau suivant récapitule les types de données et les propriétés des champs
supportés par SQL :

Champ Nom du champ


Type Type de données, dans la plupart des versions de SQL, vous aurez droit aux types de
données suivants :

 Char(x) : chaîne de caractères, x est le nombre maximum de caractères


autorisés dans le champ.
 Integer : Nombre entier, positif ou négatif
 Decimal (x,y) : Nombre décimal, x est le nombre maximum de chiffres et y
le nombre maximum de chiffres après la virgule.
Decimal ne fonctionne pas avec Access, il ne supporte que le type 'float'
(flottant), le type float ne permet pas d'indiquer le nombre de chiffres après
ou avant la virgule
 Date : Une date et/ou heure ;
 Logical – Deux valeurs possibles : oui / non

Propriétés Propriétés du champ :


NULL ou NOT NULL : autorise ou non que le champ puisse être vide.
UNIQUE : indique que deux enregistrements ne pourront avoir la même valeur
dans ce champ.

Pr.Jaber EL BOUHDIDI 5
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

PRIMARY KEY : indique que ce champ est la clef primaire


CHECK (condition) : équivaut à la propriété "ValideSi" d'Access, va forcer SQL a
faire une vérificatio n de la condition avant de valider la saisie, exemple : CHECK
(prix > 100) interdira la saisie dans ce champ si la valeur contenue dans le champ prix
est inférieure à 100.
CHECK ne fonctionne pas avec Access.
DEFAULT = valeur, place une valeur par défaut dans le champ
(ne fonctionne pas avec Access)
DEFAULT ne fonctionne pas avec Access

2.2 La commande DROP TABLE


La commande DROP TABLE permet de supprimer une table, sa syntaxe est :

DROP TABLE Nom_table ;

Exemple :

Drop TABLE Etudiants ;

2.3 la commande ATLER TABLE


La commande ALTER TABLE permet de modifier la structure d'une table, ALTER TABLE permet trois actions,
ces actions sont :

ADD Ajoute un champ a une table


DROP Supprime un champ d'une table
MODIFY Modifie les caractéristiques d'un champ

Syntaxes :

1) Ajout d’une colonne

ALTER TABLE Nom_table


ADD Nom_colonne Type(Taille) ;

Exemple :
ALTER TABLE Client
ADD Adresse char(50) ;

2) Modification de la taille d’une colonne

ALTER TABLE Nom_table


MODIFY Nom_colonne Type(Nouvelle_Taille) ;
Exemple :
ALTER TABLE Client
MODIFY Adresse char(70) ;

Remarque : dans le cas de la modification de la taille il faut que la table soit vide si la nouvelle taille et
inférieure à la précédente.

3) Suppression d’une colonne

ALTER TABLE Nom_table


Drop Nom_colonne;

Pr.Jaber EL BOUHDIDI 6
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

Exemple :
ALTER TABLE Client
Drop Adresse ;

Nota Bene : On ne peut faire qu'une action à la fois (ajout, suppression ou modification dans la
même commande).

3. Manipulation d’une base de données


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 dis pose de 5 instructions :

INSERT
UPDATE
DELETE
SELECT
CREATE VIEW (non utilisé dans Access)

5.1 La commande INSERT


5.1.1 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 :

a) Première forme

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...

b) Deuxième Forme

INSERT
INTO table (champ1,champ2,...)
(requête);

Dans cette seconde forme, 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 les deux cas, les valeurs insérées doivent correspondre au type de données du champ dans lequel
l'insertion va être faite, on ne peut pas , par exemple demander l'insertion d'une chaîne de caractères dans un
champ de type numérique ou monétaire. Les chaînes de caractères doivent être placées entre apostrophes
( ' ), les champs numériques ou vides (NULL) ne doivent pas être placés entre apostrophes.

3.1.2 Insérer tout ou une partie d’enregistrement

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
Pr.Jaber EL BOUHDIDI 7
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

table, sans oublier un seul champ.

Faites attention en utilisant cette syntaxe, si la structure de la table change plus tard, la commande qui était
bonne risque de ne plus fonctionner correctement. Il vaut mieux toujours indiquer explicitement le nom des
champs sur lesquels on veut agir.

La syntaxe est alors :

INSERT
INTO table
VALUES ('valeur1','valeur2','valeur3',...);
Par exemple, dans notre table Client, si nous voulons insérer un nouveau client, nous allons entrer :

INSERT INTO Clients

VALUES (23,'TARIFI','Khalid',’rue azhar’,NULL);

La commande ci-dessus va insérer un enregistrement dans la table 'Clients' avec les informations
suivantes : Le client 23, dont le nom est 'TARIFI', dont le prénom est 'Khalid', l'adresse est 'Rue azhar' et
la ville est NULL.

Eclaircissements :
1) Notez que le numéro de client, qui est un champ de type 'NuméroAuto' a été indiqué explicitement.
Lors d'une création d'un enregistrement avec une commande SQL, le numéro automatique n'est pas
toujours généré automatiquement, vérifiez les possibilités offertes par votre SGBD.
2) Notez aussi l'utilisation de NULL : Si on insère moins de valeurs de champ qu'il y a de champs dans
la table, soit on écrit explicitement le nom des champs à insérer, soit on insère la valeur NULL dans
le champ où il n'y a rien à mettre, à condition que la propriété du champ "NULL interdit" soit à
NON, sinon, il y aura une erreur lors de la création de l'enregistrement.

La syntaxe est : INSERT


INTO table (champ1, champ3) VALUES
('valeur1','valeur3');

Ou

INSERT INTO table


VALUES ('valeur1',NULL,'valeur3');

Dans notre exemple, le champ 'Nom_cli' à sa propriété "NULL interdit" à NON, on n'est donc pas obligé de
saisir des noms, ce qui est le cas ici, on entre donc NULL, ce qui signifie à Access que le champ est vide.

3.1.3 Insérer plusieurs enregistrements ou plusieurs parties d’enregistrements

On peut insérer simultanément plusieurs enregistrements ou parties d'enregistrements dans une table. Dans ce
cas, les données insérées vont être récupérées d’une ou plusieurs autres tables.

Par exemple, si nous voulons placer dans une table nommée Clients_Ville les clients habitant Agadir, nous
allons procéder ainsi :

1) Créer une table "Clients_Ville" avec Access, nous allons supposer que cette table comporte 3
champs: le nom, le prénom et l'adresse.

2) Taper la commande :

INSERT
INTO Clients_Ville (nom,prenom,adresse)
(SELECT nom,prenom,adresse
FROM Clients

Pr.Jaber EL BOUHDIDI 8
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

WHERE ville='Agadir’)

La partie entre ( ) est une requête SQL, nous verrons cela en détail plus bas, elle va sélectionner les
champs nom, prénom et adresse de la table Clients pour les enregistrements dont la ville est "Agadir". Le
résultat de cette requête va être inséré dans la table Clients_Ville.

Remarque : La commande INSERT INTO avec requête ne déplace pas les enregistrements de la table
"Clients" vers la table "Clients_ville", elle se contente de faire une copie. Pour effacer les enregistrements de
la table Clients, nous utiliserons la commande DELETE.

3.2 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.

Par exemple, si nous voulons, dans la table produit, modifier le prix d'un produit dont le nom est
"Imprimante", nous taperons :

UPDATE produits
SET prix_unitaire = 1000
WHERE libelle = ' Imprimante';

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é.

Tout comme la commande INSERT, la commande UPDATE peut contenir une requête. Dans ce cas la syntaxe
est la suivante :

UPDATE table
SET champ1 = nouvelle_valeur1, champ2=
nouvelle_valeur2, champ3 =
nouvelle_valeur3
WHERE condition =(requête);
La requête est une requête faite avec la commande SELECT.

3.3 La commande DELETE


Pour supprimer des enregistrements d'une table, utilisez la commande DELETE. La syntaxe est la
suivante :

DELETE
FROM table
WHERE condition;

Pr.Jaber EL BOUHDIDI 9
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

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.

Par exemple, pour supprimer tous les clients dont la ville est Tanger :

DELETE
FROM Clients
WHERE ville='Tanger';
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.

On peut aussi, 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 );

3.4 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.

Exemple :

Pour sélectionner les champs "prénom" et "nom" de tous les enregistrements de la table Clients :

SELECT prénom,nom
FROM clients ;
Va renvoyer les prénom et nom de tous les clients de la table Clients.

Si on veut récupérer tous les champs des enregistrements sélectionnés, la syntaxe est la suivante :

SELECT *
FROM table;

Attention : 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 :

Pr.Jaber EL BOUHDIDI 10
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

SELECT * FROM
Clients

WHERE code_postal = 75000;

3.4.1 Opérateurs de comparaison

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 DH :

SELECT *
FROM lients
WHERE prix_unitaire > 100;

3.4.2 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
enregistrement 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 'Kamraoui' qui habitent Tanger :

SELECT * FROM
Clients
WHERE nom = 'Kamraoui' AND ville = 'Tanger';

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 'Kamraoui' ou 'Karkouri' :

SELECT *
FROM Clients
WHERE nom = 'Kamraoui' OR nom = 'Karkouri';

AND et OR peuvent être combinés :

SELECT *
FROM Clients
WHERE nom = 'Kamraoui' AND (ville = 'Tanger' OR ville = 'Rabat');

Nous sélectionnons ici les clients nommés "Kamraoui" qui habitent soit à Tanger, soit à Rabat. Pourquoi avons-
nous placé des parenthèses ? Pour résumer, on peut dire que l'opérateur AND a une plus grande priorité que
l'opérateur OR. Ce qui signifie que SQL va d'abord sélectionner les conditions séparées par des AND, puis
celles séparées par des OR, si on avait omis les parenthèses ici, SQL aurait cherché les clients nommés
"Kamraoui" vivant à Tanger ou les clients habitant à Rabat, ce qui n'est pas le but recherché. Pour généraliser,
mettez toujours des parenthèses pour bien séparer vos conditions.

3.4.4 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.

Pr.Jaber EL BOUHDIDI 11
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

Exemple : Pour sélectionner les clients vivant à Tanger ou Rabat

SELECT *
FROM Clients
WHERE ville IN ('Tanger', 'Rabat');

Ou pour sélectionner les produits dont le prix est compris entre 100 et 1000 DHs :
SELECT *
FROM Produits
WHERE prix_unitaire BETWEEN 100 AND 1000;

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;

De la même façon, NOT IN sélectionne les enregistrements exclus de la liste spécifiée après IN.

Remarques : Notez que NOT a une priorité plus grande que AND :
NOT Condition1 AND Condition2 sélectionnera les enregistrements ne satisfaisant pas la condition1 et
satisfaisant la condition2, alors que NOT (Condition1 AND Condition2) sélectionnera les
enregistrements ne satisfaisant pas les deux conditions 1 et 2. Une fois de plus, n'hésitez pas à mettre des
parenthèses !

3.4.5 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.

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 *. Consultez donc la
documentation de votre SGBD.

3.4.6 Les jointures


La jointure va nous permettre de sélectionner des informations dans plusieurs tables grâce aux relations existant
entre ces tables(via des clés étrangères). 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, prenom


FROM Clients, Commande
WHERE Commande.num_client=Client.num_client AND num_commande = 1;

La clause WHERE indique que le numéro de commande doit être égal à 1 et que la jointure va se faire sur le
numéro de client : une fois que SQL va trouver la commande n° 1 dans la table commande, il va prendre le
numéro de client contenu dans l'enregistrement et avec ce numéro, aller chercher dans la table Clients le nom
et le prénom correspondants à ce numéro.

Nota Bene : Notez que lorsqu'on utilise plusieurs tables, il faut faire attention que deux tables n'aient pas de
champs ayant le même nom, si c'est le cas, et pour les différencier, on utilise, comme dans l'exemple, la

Pr.Jaber EL BOUHDIDI 12
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

notation: table.nom_du_champ. Si on est sur que le nom ne se retrouvera pas dans plusieurs tables, on peut
l'utiliser sans le préfixer avec le nom de la table.

3.4.7 Supprimer les doubles avec 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 – nous ne voulons pas savoir ce qu'a acheté chaque
client – nous voulons juste connaître les clients qui ont acheté quelque chose. Pour cela, 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, nous allons utiliser la clause DISTINCT.

Nous allons d'abord faire une jointure entre les tables Clients et Commande, et ajouter la clause
DISTINCT sur le champ ou la répétition peut se produire :

SELECT client.code_cli,nom_cli,pre_cli
FROM Client, Commande
WHERE Commande.code_cli= Client.code_cli;

Si on exécute cette requête directement, SQL va nous renvoyer une liste des numéros, prénom et nom
correspondants aux noms et prénoms des clients ayant passé chaque commande, il est clair qu'un client ayant
passé plusieurs commandes va se retrouver plusieurs fois dans cette liste( voir le résultat ci-dessous) :

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.

Requête :
SELECT DISTINCT client.code_cli,nom_cli,pre_cli
FROM Client, Commande
WHERE Commande.code_cli= Client.code_cli;

Résultat :

On peut même rendre le résultat de la sélection plus agréable à la lecture en utilisant la clause
ORDER BY :

Requête:
SELECT client.code_cli,nom_cli,pre_cli

Pr.Jaber EL BOUHDIDI 13
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

FROM Client, Commande


WHERE Commande.code_cli= Client.code_cli
order by nom_cli, pre_cli ;

Résultat:

La sélection renvoyée est classée


alphabétiquement d'abord sur
le nom, puis sur le prénom.

3.4.8 les fonctions d’agrégation

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

SUM() Donne le total d'un champ de tous les enregistrements satisfaisant la condition de la
requête. Le champ doit bien sur être de type numérique

AVG() donne la moyenne d'un champ de tous les enregistrements satisfaisant la condition de la
requête

MAX() donne la valeur la plus élevée d'un champ de tous les enregistrements satisfaisant la
condition de la requête

MIN() Donne la valeur la plus petite d'un champ de tous les enregistrements satisfaisant la
condition de la requête.

COUNT(*) Renvoie le nombre d'enregistrements satisfaisant la requête.

Exemples :
Requête 1 : Nom de la colonne

SELECT MIN(prix_art) as Prix_minimum , MAX(prix_art)as Prix_maximum,AVG(prix_art) as Moyenne_Prix


FROM Article;

Résultat 1 : la requête affiche le prix le plus petit de la table Article, le prix le plus élevé et la moyenne des prix.

Requête 2 :

SELECT COUNT (*) as NB_article


FROM Article
WHERE Nom_art LIKE 'S*';

Résultat 2 : la requête retourne le nombre de produits dont le nom commence par la lettre 'S'.

Pr.Jaber EL BOUHDIDI 14
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

3.4.9 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 clients, avec pour chaque client le nombre de commandes qu'il a passé :

Requête : Abréviations des noms des tables

SELECT c.cod_cli, nom_cli, count(*) AS [Nombre de commandes]


FROM client AS c, commande AS co
WHERE c.cod_cli=co.cod_cli
GROUP BY c.cod_cli, nom_cli;
Résultat:

Attention :

Quand on utilise une fonction d’agrégation telle que Count() avec la clause GROUP BY tous les champs qui
précédent la fonction Count() doivent être ajoutés dans la clause GROUP BY.
Dans l’exemple précédent on a ajouté code_cli et nom_cli.

3.4.10 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).

Supposons que l’on veuille afficher les clients qui ont commandé le produit 2 ;
select distinct nom_cli,pre_cli,vil_cli,code_cli
from client
Sous-requête
where code_cli in (
select code_cli
from commande as c, contenucommande as cc
Requête principale where c.num_cmd=cc.num_cmd and cc.code_art=2 ;
)
;

Résultat :

Pr.Jaber EL BOUHDIDI 15
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

Vous pouvez constater que condition de la requête est basée sur le résultat d'une autre requête. Dans cet
exemple, à chaque fois qu'un client aura acheté un article dont le code est 2, son numéro (Numéro du client)
apparaîtra.

La clause DISTINCT est utilisée pour éliminer les doubles.

IMPORTANT : N'oubliez pas cette règle à propos des sous-requêtes : Lorsque vous faites une sous-
requête dans la clause WHERE, la clause SELECT de cette sous-requête doit avoir un nombre et des
types de champs correspondants à ceux se trouvant après la clause WHERE de la requête principale.
Autrement dit, si vous avez "WHERE champ = ( SELECT ... );", le résultat du SELECT doit être un
seul champ puisqu'il n'y a qu'un seul champ après le WHERE, ET leur type doit correspondre (les
deux doivent être numériques ou être des chaînes de caractères, etc.), sinon, la requête ne renverra rien
ou sortira avec une erreur selon les systèmes.

3.4.11 UNION

Lorsqu'on veut que les résultats de plusieurs requêtes soient combinés entre eux, on utilise la clause
UNION. UNION va fusionner les résultats des requêtes.

Par exemple, supposons que nous voulions afficher les clients habitant Tanger et les clients habitant
Rabat:

SELECT *
FROM Client
WHERE vil_cli='Tanger'
UNION
SELECT *
FROM Client
WHERE vil_cli='Rabat'
;
Résultat:

IMPORTANT : Notez que SQL requiert que le type des champs sélectionnés dans les clauses SELECT
corresponde, colonne par colonne (le premier champ du premier SELECT doit avoir le même type que le
premier champ du deuxième SELECT, etc...). Notez aussi que SQL supprime automatiquement les
doubles lorsque UNION est utilisé, là où il aurait fallu utiliser la clause DISTINCT pour une requête simple.

6. Sous requête
6.1 Sous-requête renvoyant une seule valeur
Lorsque cette autre requête ne revoie qu’une valeur, on peut utiliser = et tous les autres opérateurs de
comparaison logique .
Exemple : pour afficher les commandes d’un client (par exemple ‘NAOUM’) on peut utiliser une sous-
requête.
Requête :
SELECT num_cmd, date_cmd
FROM commande
WHERE code_cli in ( SELECT code_cli
FROM client
where nom_cli='naoum'
);
Résultat :

Pr.Jaber EL BOUHDIDI 16
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

6.2 Sous-requête renvoyant une liste de valeurs

Les sous-requêtes qui renvoient une liste de valeurs peuvent être naturellement utilisées par l’opérateur IN.
Exemple : on veut les commandes de tous les clients dont le nom commence par E.

Requête :

SELECT num_cmd, date_cmd


FROM commande
WHERE code_cli IN ( SELECT code_cli
FROM client
where nom_cli like 'E*'
);
Résultat :

Mais on peut utiliser d’autres fonctions, le langage SQL offre d’autres mot-clé pour ce type de sous-requête,
qui sont résumés dans le tableau suivant :

Opérateur Signification
IN Il comporte une liste de valeurs et teste si une valeur
spécifiée apparait dans une liste ou bien dans une sous-
requête.
EXIST Il contient une sous-requête qui associe à la condition
de EXIST, peut être évaluée comme vrais ou fausse.
ALL Permet de comparer une valeur V avec un ensemble
des valeurs de même type que celui de V d’une sous-
requête SELECT. Le teste de comparaison ALL est
valide si le teste de comparaison entre la valeur V et
chaque élément de l’ensemble est valide.
ANY Permet de comparer une valeur V avec un ensemble
des valeurs de même type que celui de V d’une sous-
requête SELECT. Le teste de comparaison ANY est
valide si le teste est valide au moins entre la valeur V
et un élément de l’ensemble.

Découvrons ces mots clés par l’exemple.


Se traduit en SQL par ALL
Exemple 1 :

On veut les articles dont le prix est supérieur ou égale à tous les articles dont la quantité en stock est supérieure à
10 :
Requête :

SELECT Code_art,nom_art,prix_art,qte_stock
FROM Article
WHERE prix_art>=ALL ( SELECT prix_art

Pr.Jaber EL BOUHDIDI 17
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

FROM article
where qte_stock>10
);
Résultat :

Se traduit en SQL par ANY


Exemple 2 :

On veut les articles dont le prix est supérieur ou égale à l’un des articles dont la quantité en stock est supérieure à
10 :
Requête :

SELECT Code_art,nom_art,prix_art,qte_stock
FROM Article
WHERE prix_art>=ANY ( SELECT prix_art
FROM article
where qte_stock>10
);
Résultat :

Exemple 3 :

Tous les articles mais seulement s’il en existe un de quantité en stock supérieure à 30 ;

Requête :
SELECT Code_art,nom_art,prix_art,qte_stock
FROM Article
WHERE EXISTS ( SELECT prix_art
FROM article
where qte_stock>30
);
Résultat:

Pr.Jaber EL BOUHDIDI 18
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

ATTENTION: Si il n’y a aucun article dont la quantité en stock est supérieure à 30, la requête n’affichera
rien .

Exemple 4 :

Tous les articles mais seulement s’il n’en existe pas de quantité en stock supérieure à 30 ;

Requête :
SELECT Code_art,nom_art,prix_art,qte_stock
FROM Article
WHERE NOT EXISTS ( SELECT prix_art
FROM article
where qte_stock>30
);
Résultat:

6.2 Sous-requête renvoyant plusieurs colonnes

Une sous-requête renvoyant une ou plusieurs colonnes peut être utilisée comme table dans la clause FROM. Cela
peut servir par exemple à ne sélectionner que les plus gros clients :

7. Condition sur les groupes


Si on veut sélectionner les clients qui ont passé au moins deux commandes vous allez, peut être, écrire
quelque chose qui se ressemble à ceci :

Select c.Code_cli,Nom_cli,Pre_cli, count(*) as nb_commande

From Client as C , Commande as cd


where c.code_cli=cd.code_cli and count(*)>=2
group by c.Code_cli,Nom_cli,Pre_cli;

pourtant, cette requête ne donnera rien, car on n’a pas le droit d’utiliser la clause de condition where
pour comparer une valeur issue d’une fonction d’agrégation telle que count(), il faudra utiliser la
clause HAVING.
D’où la syntaxe suivante :

SELECT c.Code_cli,Nom_cli,Pre_cli, count(*) as nb_commande


FROM Client as C , Commande as cd
WHERE c.code_cli=cd.code_cli

Pr.Jaber EL BOUHDIDI 19
CPGE-Omar EL KHAYYAM- Rabat 2 ème ECT

GROUP BY c.Code_cli,Nom_cli,Pre_cli
HAVING count(*)>=2 ;
Résultat :

ET FINALEMENT ON VOUS RAPPELLE PAR L’ORDRE DES EXPRESSIONS EN SQL

SELECT <Liste des champs> FROM <Liste des tables concernées>


[WHERE <Condition sur les champs à lister>]
[GROUP BY <Expression des critères de regroupement>]
[HAVING <Condition sur les champs regroupés>]
[ORDER BY <Expression des critères de tri>];

Pr.Jaber EL BOUHDIDI 20

Vous aimerez peut-être aussi