Université des Sciences et de la Technologie Houari Boumedienne
Faculté d’Electronique et d’Informatique
Département d’Informatique, Licences ACAD & ISIL
2.3. Le langage SQL
Le langage SQL (Structured Query Language) a été développé dans les laboratoires d'IBM
pour le système relationnel expérimental SYSTEM-R, durant les années 70. Par la suite, il est
devenu un standard pour les SGBD relationnels. Il comporte quatre groupes d'instructions:
1. les instructions d'interrogation de données,
2. les instructions de définition de données pour la création de tables, d'introduction de
nouveaux attributs dans la les tables existantes et la création des index,
3. les instructions de manipulation des données par l'insertion, la suppression et la
modification des données,
4. les instructions de contrôles pour la mise en place et la suppression des autorisations
d'accès aux données de la base.
Nous nous intéressons pour l'instant au premier type d'instructions, i.e., l'interrogation des
données. Nous verrons les autres types d'instructions au niveau du chapitre quatre.
Une requête d'interrogation est représentée syntaxiquement comme un bloc de qualification :
Select <liste d'attributs>
From < nom-relation>
[Where <prédicat>]
[Group By <attribut>]
[Having <prédicat>]
[Order By <attribut>[Desc]];
La forme la plus simple du Select
Select <liste d'attributs>
From < nom-relation>;
Permet d'extraire de la table une sous-table obtenue par projection selon le (ou les) attribut(s)
précisé(s). Le Select a donc le sens de l'opérateur Project
L'option * (Astérix) à la place du nom des attributs permet l'édition de la table dans sa totalité.
Exemple:
1. Donner les numéros et les codes des fournisseurs d'Alger, s'écrit :
Select NF, CODE
From Fournisseur
Where Ville = 'Alger';
2. Donner toutes les informations sur les fournisseurs s'écrit :
Select *
From Fournisseur;
42
Université des Sciences et de la Technologie Houari Boumedienne
Faculté d’Electronique et d’Informatique
Département d’Informatique, Licences ACAD & ISIL
Lors de l'opération de projection, SQL n'élimine pas les doubles dans la réponse à une
interrogation. Si l'utilisateur désire le faire, il doit l'exprimer explicitement à l'aide du mot clé
Unique. L'élimination des n-uplets redondants est une opération très coûteuse, aussi SQL
laisse la liberté d'utilisation de ce mot clé aux utilisateurs.
Exemple :
3. Donner toutes les villes où résident des fournisseurs s'écrit :
Select Unique VILLE
From Fournisseur;
Le prédicat de la clause Where peut inclure les opérateurs de comparaison : =, , , , , et
les opérateurs booléens And, Or, Not.
D'autres opérateurs ont été introduits dans les dernières versions d'Oracles, nous citons :
• Between : exp1 Between expr2 And exp3 vrai si exp1 est comprise entre exp2 et exp3,
faux sinon.
• IN : exp1 IN (exp2, exp3, …) vrai si exp1 est égale à l’une des expressions de la liste
entre parenthèses.
• LIKE : exp LIKE <chaîne> où chaîne est une chaîne de caractère pouvant contenir un
caractère joker - qui remplace un caractère quelconque ou bien % qui remplace une
chaîne de longueur quelconque.
Exemples :
1. Donner le nom des fournisseurs dont le code est compris entre 15 et 30
SELECT NOM
FROM FOURNISSEU
WHERE CODE BETWEEN 120 AND 130 ;
2. Sélectionner les pièces qui son en fer ou en zinc :
SELECT NOM
FROM PIECE
WHERE MATERIAU IN (fer, zinc) ;
3. Donner le nom des fournisseurs dont le nom commence par la lettre M :
SELECT NOM
FROM FOURNISSEUR
WHERE NOM LIKE M% ;
4. Donner le nom des fournisseurs dont le nom comprend la lettre L en deuxième
position :
SELECT NOM
FROM FOURNISSEUR
WHERE NOM LIKE -L% ;
43
Université des Sciences et de la Technologie Houari Boumedienne
Faculté d’Electronique et d’Informatique
Département d’Informatique, Licences ACAD & ISIL
5. Donner le nom des fournisseurs d’Alger dont le code est supérieur à 120 :
SELECT NOM
FROM FOURNISSEUR
WHERE VILLE = Alger AND Code > 120 ;
Le tri du résultat d’un SELECT
Le résultat d’un select peut être trié dans l’ordre ascendant ou descendant en fonction d’une
ou plusieurs colonnes. Les critères du tri sont spécifiés par la clause ORDER BY dont la
syntaxe est :
ORDER BY <attribut1> [DESC][,<attribut2> [DESC],…]
Le tri se fait d’abord selon la première colonne spécifiée dans l’order by, puis les lignes ayant
la même valeur dans la première colonne sont triées selon la deuxième colonne de l’order by
etc.…Le tri peut être ascendant ou descendant pour chaque colonne. Par défaut, il est
ascendant.
Exemple :
SELECT VILLE NOM
FROM FOURNISSEUR
ORDER BY VILLE ;
Opération de jointure
La jointure en SQL s’exprime en imbriquant des blocs de sélection et en utilisant des
opérateurs d’appartenance (IN, NOT IN) (CONTAINS, NOT CONTAINS),…
Exemple :
Donner le nom des fournisseurs qui fournissent la pièce P2.
SELECT NOM
FROM FOURNISSEUR
WHERE NF IN SELECT NF
FROM FOURNITURE
WHERE NP = P2 ;
Parfois, nous avons besoin d’utiliser une référence inter-block dans une requête SQL pour
répondre à une question telle que :
Donner le nom des fournisseurs qui ne fournissent pas P1
SELECT NOM
FROM FOURNISSEUR
44
Université des Sciences et de la Technologie Houari Boumedienne
Faculté d’Electronique et d’Informatique
Département d’Informatique, Licences ACAD & ISIL
WHERE P1 NOT IN SELECT NP
FROM FOURNITURE
WHERE NF = FOURNISSEUR.NF ;
Attention une requête SQL du type suivant ne répond pas à la question :
SELECT NOM
FROM FOURNISSEUR
WHERE NF IN SELECT NF
FROM FOURNITURE
WHERE NP P1 ;
Car un fournisseur produisant P1 peut être sélectionné.
Nous pouvons imbriquer des blocs SELECT en faisant intervenir la même relation.
Exemple :
Donner les numéros de fournisseurs fournissant au moins une pièce fournie par le fournisseur
F2, s’écrit
SELECT UNIQUE NF
FROM FOURNITURE
WHERE NP IN SELECT NP
FROM FOURNITURE
WHERE NF = F2 ;
Il est parfois nécessaire d’introduire les variables synonymes pour lever certaines ambiguïtés.
Exemple :
Donner les numéros des pièces fournies par plus d’un fournisseur.
SELECT UNIQUE NP
FROM FOURNITURE x
WHERE NP IN SELECT NP
FROM FOURNITURE
WHERE NF x.NF ;
Une autre manière d’exprimer la jointure en SQL est illustrée par l’exemple suivant :
Exemple :
Pour chaque pièce, donner son numéro et le nom des villes des fournisseurs fournissant cette
pièce.
SELECT UNIQUE NP
FROM FOURNITURE, FOURNISSEUR
WHERE FOURNITURE ? NF = FOURNISSEUR.NF ;
45
Université des Sciences et de la Technologie Houari Boumedienne
Faculté d’Electronique et d’Informatique
Département d’Informatique, Licences ACAD & ISIL
Le prédicat EXISTS contient une sous-interrogation qui, associée à la condition du EXISTS,
peut être évaluée comme vraie ou fausse. Le prédicat EXISTS peut être utilisé à chaque fois
qu’une interrogation employant le prédicat IN peut être utilisée. Il est également possible de
formuler une interrogation à l’aide de NOT EXISTS.
Exemples :
• Donner le nom des fournisseurs fournissant la pièce P2.
SELECT NOMF
FROM FOURNISSEUR FR
WHERE EXISTS (SELECT *
FROM FOURNITURE
WHERE NF = FR.NF AND NP = P2 ;
• Donner le nom des fournisseurs ne fournissant pas P2.
SELECT NOM
FROM FOURNISSEUR FR
WHERE NOT EXISTS (SELECT *
FROM FOURNITURE
WHERE NF = FR.NF AND NP = P2 ;
Les requêtes ci-dessus en langage prédicatif :
• Donner le nom des fournisseurs fournissant la pièce P2 :
fr.Nomf / Fournisseur(fr) u ( Fourniture (u) (u.NP = ‘P2’ ) (u.NF = fr.NF) )
• Donner le nom des fournisseurs ne fournissant pas P2 :
fr.Nomf / Fournisseur(fr) /x ( Fourniture(x) (x.NP = ‘P2’)
(x.NF = fr.NF) )
46
Université des Sciences et de la Technologie Houari Boumedienne
Faculté d’Electronique et d’Informatique
Département d’Informatique, Licences ACAD & ISIL
47