Chapitre II : Langage de requêtes SQL
SQL (Structured Querry Language) dans sa version 2 de 1992 est un langage structuré
regroupant un ensemble d'instructions permettant la création, la structuration et
l'interrogation des bases de données relationnelles.
SQL offre trois catégories de langages :
- Langage de Manipulation de Données (LMD) : Offre les instructions pour ajouter,
supprimer et modifier des lignes à savoir : SELECT, INSERT, UPDATE et DELETE.
- Langage de Description de Données (LDD) : Offre les instructions permettant la
création de la base de données : Base de données, Tables, Attributs, Clés primaires, Clés
étrangères, index... à savoir : CREATE, ALTER et DROP
- Langage de Contrôle de Données (LCD) : Offre les instructions permettant de définir
des permissions pour les utilisateurs pour gérer les droits d’accès, à savoir : GRANT,
REVOKE et DENY
I. Langage de Manipulation de Données (LMD) :
1) Instruction SELECT :
L’affichage des données se fait à l'aide de l'instruction Select.
La syntaxe complète pour cette instruction est :
Select colonne1, colonne2,...
From table1, table2,...
Where Condition
Group By colonne_Regroupement1, Attribut_Regroupement2
Having Condition_Regroupeme
Order By Critère_Tri1 Asc| Desc, Critère_Tri2 Asc| Desc
Remarque : Pour éliminer les répétitions des lignes utilisez le mot
clé distinct
Select distinct prenom from employé
clause where:
Pour exprimer une condition on utilise la clause WHERE.
Les conditions peuvent être exprimée à l'aide des opérateurs =, >, >= ,<, <=, Between, in,
like, is Null, exists, any, all, union, intersect, minus et peuvent être combinées à l'aide des
opérateurs logiques : and, or et not
- Between : Permet de tester l'appartenance de la valeur d'une colonne à un intervalle
Select *from Employé
Where salaireDeBase Between 5000 and 10000
1
Ce qui est équivalent à :
Where salaireDeBase >= 5000 and salaireDeBase <= 10000
- in : Teste si les valeurs d'une colonne appartiennent à un groupe de valeur. Le
groupe de valeurs pouvant s'exprimer à l'aide de valeurs constantes ou d'une
requête select
Select * from employé
Where grade in (‘cadre’, ’technicien’)
Ou
Select * from departement
Where localisation in (Select ville From employé)
- Like : Permet une comparaison entre une chaîne de caractères et les valeurs d'une
colonne. Elle utilise deux caractères spéciaux % et _
% : signifie plusieurs caractères
_ : signifie un seul caractère
Exemples :
1) Les employés avec un nom qui commence par A
Select * from employé where nom like 'A%'
2) Les employés avec un nom se compose de deux lettres et commence par A
Select * from employé where nom like 'A_'
3) Les employés avec un nom se compose de trois lettres et commence par A
Select * from employé Where nom like 'A__'
- Any : Compare une colonne avec une liste de valeurs fournies par une sous
requête. Si une des valeurs de la liste rend la condition vraie alors la ligne est
sélectionnée
- All : compare une colonne avec une liste de valeurs fournies par une sous
requête. Si toutes les valeurs de la liste rendent la condition vraie alors la ligne
est sélectionnée
- Exists : Est évalué à vrai si la sous-requête qui le suit donne au moins une ligne en
retour
- Union : Permet de réaliser l'union entre deux ensembles( tables)
(Select...From...Where...)
Union
(Select...From...Where...)
- Intersect : Permet de réaliser l'intersection entre deux ensembles (tables)
- Minus : Permet de réaliser la différence entre deux ensembles (tables)
clause Order by : permet d’exprimer des critères de tri
2
clause Group by : Effectue des regroupements sur certains attributs. En général, il
est utilisé pour obtenir des statistiques et calculs en exploitant les fonctions offertes
par SQL : Sum (Somme), Min(Minimum), Max(Maximum), Count(Nombre),
Avg(Moyenne).
- Remarque : pour exprimer des conditions sur les éléments de regroupement après
group by on utilise : HAVING
2) La jointure entre les tables :
La jointure consiste à associer des lignes de 2 tables en associant l’égalité des valeurs
d’une colonne d’une première table par rapport à la valeur d’une colonne d’une
deuxième table.
Jointure interne :
La jointure interne est la fusion de 2 tables qui ont une colonne commune avec une
condition d’égalité de cette colonne.
Pour écrire une jointure interne entre deux tables Table1 et Table2 on utilise :
Select Table1. Colonne1, Table2.Colonne2
From Table1, Table2
WhereTable1.ColonneJointure1=Table2.ColonneJointure2
- Dans les nouvelles versions de SQL, la jointure s’écrit :
Select Table1. Colonne1, Table2.Colonne2
From Table1 inner join Table2
On Table1.ColonneJointure1=Table2.ColonneJointure2
Exemples :
Soient les 2 tables suivantes :
DEPARTEMENT (NumDept, nomDept, ville)
EMPLOYE (NumEmp, nomEmp, adresse, dateEmbauche, NumDept*)
1- Afficher le nom et l’adresse de l’employé numéro 5.
Select nomEmp, adresse
From EMPLOYE
WHERE NumEmp = 5
2- Afficher le numéro du département où l’employé numéro 4 travaille.
3
Select NumDept
From EMPLOYE
Where NumEmp = 4
3- Afficher la ville du département où l’employé numéro 2 travaille.
Select ville
From EMPLOYE, DEPARTEMENT
Where NumEmp=2
AND EMPLOYE.NumD= DEPARTEMENT.NumD
4- Afficher les noms des employés et les noms de leurs départements où ils travaillent.
Select nomEmp, nomDept
From EMPLOYE, DEPARTEMENT
Where EMPLOYE.NumD= DEPARTEMENT.NumD
3) Instructions de Mise à jour des données :
La mise à jour désigne les différentes opérations de suppression, de modification et d'insertion
des informations dans les tables.
a- Insertion d’une ligne :
La syntaxe utilisée est la suivante :
insert into Nom_Table (col1,col2, col3,….)
values (valeur1, valeur2, valeur3,…..)
On peut insérer des valeurs dans toutes les colonnes de la table en écrivant :
insert into Nom_table values (val1, val2, val3, ....)
Exemple :
insert into DEPT values (2, ‘informatique’, ‘casa’)
insert into DEPT ( Dnum, Dnom) values ( 1, ‘logistique’)
insert into EMP values ( 100, ‘eeee1’,’responsable achat’,’2000/02/15’,NULL ,2)
Un autre moyen d’insérer des lignes dans une table est d'utiliser une instruction select qui
prend des informations à partir d'autres tables pour les insérer dans une table voulue
Insert into Nom_table Select Col1, Col2,... From Nom_Table1, Nom_Table2...Where...
Exemple:
Insert into ANCIEN select * from EMP WHERE dateEmb< ‘1990/01/01’
4
b- Suppression de ligne :
Delete from Nom_Table [where Condition]
c- Modification de ligne:
Update Nom_Table
set colonne 1= new val, colonne2= new val, ……
[where Condition]
Exemples : Soit la table Produit (codep, libéllé, prix)
• Supprimer les produits ayant un prix qui dépasse 200
delete from Produit Where prix>200
• Supprimer tous les produits de la table.
delete from Produit
• Doubler le prix des produits qui commencent par L
update Produit
Set prix = prix*2
Where libéllé like ‘L%’
• Ajouter le produit ‘pc portable’ qui a le code ‘P008’ et coute 150
insert into Produit values ( ‘P008’, ‘pc portable’, 150)
• Diminuer le prix des produits qui se terminent par S de 5%.
Update Produit
Set prix= prix – prix *0.05
Where libéllé like ‘%S’
5
II. Langage de Description de Données (LDD) :
Création de bases de données
create Database nom_de_la_base
Pour utiliser la base de données créée on écrit :
Use nom_de_la_base
1- Création de tables
Pour créer une table, on déclare les champs de la table puis on déclare les contraintes en
spécifiant sur quelle colonne porte chaque contrainte.
create table nom_table (col1 type, col2 type, …….,
[Constraint Nom_Contrainte ]
Primary Key (nom_col_Clé1, nom_col_Clé2...
Foreign key(nom_col_clé_étrangère) references Table_Origine
Check (condition)
Exemple :
create table EMP ( Enum int,
Enom varchar (20),
dateEmb dateTime ,
prof varchar (20),
sal float,
Dnum int ,
constraint pk1 primary key ( Enum),
constraint fk1foreign key (Dnum) references DEPT( Dnum)
)
Remarque :
• Il est possible de ne pas attribuer des noms à certaines contraintes en éliminant le mot clé Constraint mais à
ce moment-là il ne sera pas possible d'éliminer cette contrainte par code
SQL de la table
• La contrainte Check permet le contrôle de :
- La validité par rapport à des constantes ou des listes de constantes
Create table DEPT ( ……………………………..,
Constraint pk1 primary key …………..,
Constraint ck1 check ville in ( ‘casa’ , ‘rabat’)
6
- La cohérence entre deux colonnes de la table
Exemple : constraint CK Check (date fin >=datedebut)
Pour créer une colonne numéro auto incrémentable, on utilise IDENTITY, et le type
de colonne doit être dans ce cas de type numérique : int, bigint, smallint, tinyint,
decimal ou numeric
Exemple :
Enum int IDENTITY (1,1)
Dans ce cas, le champ Enum va démarrer avec la valeur 1 et sera incrémenté de 1 à chaque
instruction INSERT
Conseil pratique : Pour créer les tables d'une base de données, on commence toujours par
créer les tables ne contenant pas de clés étrangères puis on passe à la création des tables où
les clés primaires de ces tables ont glissé comme clé étrangère car il n'est pas possible de créer
un lien avec des tables qui n'existent pas.
2- Modification de tables
Alter Table Nom_Table
Add Nom_col Type_col
Add Constraint Nom_Contrainte Check(condition)
Primary Key (nom_col_Clé1, Nom_col_Clé2...)
Foreign key(Attribut_clé_étrangère) references
Table_Origine
Alter column nomcolonne_A_Changer nouveau type [null ou not null]
Drop Column Nom_Colonne
Drop Constraint Nom_Contrainte
3- Suppression de tables
Drop table Nom_Table
Remarque :
Dans des bases de données relationnelles, on aura généralement besoin d’appliquer des
contraintes en cascades c’est-à-dire : accepter la modification et réaliser un certain nombre
7
d’opérations en parallèle sur l’ensemble des tables concernées soit en supprimant des lignes,
soit en les modifiant.
Pour spécifier des contraintes de type cascade la syntaxe serait :
... Constraint Nom_Contrainte Foreign key ...References Table_Origine
[ ON DELETE CASCADE ]
[ ON UPDATE CASCADE ]