III. Le langage SQL
Le langage SQL (Structured
Query Langage) s’appui sur les opérateurs de l’algèbre
relationnelle définit en 1970 par Codd, mathématicien, chercheur chez IBM. Le langage SQL est basé sur le concept
de relation de la théorie des ensembles.
Opérateurs de l’algèbre relationnelles :
Les opérations de base :
Les opérations ensemblistes
PROJECTION
Cet opérateur ne porte que sur 1 relation.
Il permet de ne retenir que certains attributs spécifiés d'une relation.
On obtient tous les n-uplets de la relation à l'exception des doublons.
SELECT DISTINCT liste d'attributs FROM table ;
SELECT liste d'attributs FROM table ;
Exemples :
SELECT
DISTINCT Espèce FROM Champignons ;
SELECT DISTINCT Espèce, Catégorie FROM Champignons ;
La clause DISTINCT permet d'éliminer les doublons.
SELECTION
Cet opérateur porte sur 1 relation.
Il permet de ne retenir que les n-uplets répondant à une condition exprimée à l'aide des opérateurs arithmétiques ( =, >, <, >=, <=, <>) ou logiques de base (ET, OU, NON).
Tous les attributs de la relation sont conservés.
Un attribut peut ne pas avoir été renseigné pour certains n-uplets. Si une condition de sélection doit en tenir compte, on indiquera simplement : nom_attribut "non renseigné".
SELECT * FROM table WHERE condition ;
Exemple :
SELECT * FROM Champignons WHERE Catégorie="Sec" ;
La condition de sélection exprimée derrière la clause WHERE peut être spécifiée à l'aide :
des opérateurs de comparaison : =, >, <, <=, >=, <>
des opérateurs logiques : AND, OR, NOT
des opérateurs : IN, BETWEEN, LIKE, IS
Autres exemples :
Soit la table ETUDIANT (N°Etudiant, Nom, Age, CodePostal, Ville)
SELECT *
FROM ETUDIANT
WHERE Age IN (19, 20, 21, 22, 23) ;
SELECT *
FROM ETUDIANT
WHERE Age BETWEEN 19 AND 23 ;
SELECT *
FROM ETUDIANT
WHERE CodePostal LIKE '42%' ;
SELECT *
FROM ETUDIANT
WHERE CodePostal LIKE '42___' ;
SELECT *
FROM ETUDIANT
WHERE Ville IS
NULL ; // Etudiants pour lesquels la ville
n'est pas renseignée
SELECT *
FROM ETUDIANT
WHERE Ville IS
NOT NULL ; // Etudiants pour lesquels la ville
est renseignée
JOINTURE (R1, R2, condition d'égalité entre attributs)
- Cet opérateur porte sur 2 relations qui doivent avoir au moins un attribut défini dans le même domaine (ensemble des valeurs permises pour un attribut).
- La condition de jointure peut porter sur l'égalité d'un ou de plusieurs attributs définis dans le même domaine (mais n'ayant pas forcément le même nom).
- Les n-uplets de la relation résultat sont formés par la concaténation des n-uplets des relations d'origine qui vérifient la condition de jointure.
Remarque : Des jointures plus complexes que l'équijointure peuvent être réalisées en généralisant l'usage de la condition de jointure à d'autres critères de comparaison que l'égalité (<,>, <=,>=, <>).
En SQL, il est possible d'enchaîner plusieurs jointures dans la même instruction SELECT.
En SQL de base :
SELECT * FROM table1, table2, table3, ...
WHERE table1.attribut1=table2.attribut1 AND table2.attribut2=table3.attribut2 AND ...;
Exemple :
SELECT * FROM Produit, Détail_Commande
WHERE Produit.CodePrd=Détail_Commande.CodePrd
;
ou en utilisant des alias pour les noms des tables :
SELECT * FROM Produit A, Détail_Commande
B
WHERE A.CodePrd=B.CodePrd
;
Les opérations ensemblistes
UNION (R1, R2)
Cet opérateur porte sur 2 relations qui doivent avoir le même nombre d'attributs définis dans le même domaine (ensemble des valeurs permises pour un attribut). On parle de relations ayant le même schéma.
La relation résultat possède les attributs des relations d'origine et les n-uplets de chacune, avec élimination des doublons éventuels.
SELECT liste d'attributs FROM table1
UNION
SELECT
liste d'attributs
FROM table 2 ;
Exemple :
SELECT n°enseignant, NomEnseignant FROM
E1
UNION
SELECT n°enseignant, NomEnseignant FROM E2 ;
INTERSECTION (R1, R2)
Cet opérateur porte sur deux relations de même schéma.
La relation résultat possède les attributs des relations d'origine et les n-uplets communs à chacune.
Exemple :
E1 : Enseignants élus au CA
E2 : Enseignants représentants syndicaux
n° enseignant
nom_enseignant
n°enseignant
nom_enseignant
1
DUPONT
1
DUPONT
3
DURAND
4
MARTIN
4
MARTIN
6
MICHEL
5
BERTRAND
On désire connaître les enseignants du CA qui sont des représentants syndicaux.
R2 = INTERSECTION (E1, E2)
n°enseignant
nom_enseignant
1
DUPONT
4
MARTIN
En SQL de base :
SELECT attribut1, attribut2, ... FROM
table1
WHERE attribut1 IN (SELECT attribut1 FROM table2) ;
ou avec SQL2 :
SELECT attribut1, attribut2,
... FROM table1
INTERSECT
SELECT attribut1,
attribut2, ... FROM
table2 ;
Exemple :
SELECT n°enseignant, NomEnseignant FROM
E1
WHERE n°enseignant IN (SELECT n°enseignant
FROM E2) ;
ou
SELECT n°enseignant, NomEnseignant FROM
E1
INTERSECT
SELECT n°enseignant, NomEnseignant FROM E2 ;
DIFFERENCE (R1, R2)
Cet opérateur porte sur deux relations de même schéma.
La relation résultat possède les attributs des relations d'origine et les n-uplets de la première relation qui n'appartiennent pas à la deuxième.
Attention ! DIFFERENCE (R1, R2) ne donne pas le même résultat que DIFFERENCE (R2, R1)
Exemple :
E1 : Enseignants élus au CA E2 : Enseignants représentants syndicaux
n° enseignant
nom_enseignant
n°enseignant
nom_enseignant
1
DUPONT
1
DUPONT
3
DURAND
4
MARTIN
4
MARTIN
6
MICHEL
5
BERTRAND
On désire obtenir la liste des enseignants du CA qui ne sont pas des représentants
syndicaux.
R3 = DIFFERENCE (E1, E2)
n°enseignant
nom_enseignant
3
DURAND
5
BERTRAND
SELECT attribut1, attribut2, ...
FROM table1
WHERE attribut1 NOT IN (SELECT attribut1 FROM table2) ;
SELECT table1.attribut1, table1.attribut2,...
FROM table1 LEFT OUTER JOIN table2 ON table1.attribut1
= table2.attribut1
WHERE table2.attribut1 IS NULL ;
Exemple :
SELECT n°enseignant, NomEnseignant FROM
E1
WHERE n°enseignant NOT IN (SELECT
n°enseignant FROM E2) ;
ou
SELECT n°enseignant, NomEnseignant FROM
E1
EXCEPT
SELECT n°enseignant, NomEnseignant FROM E2 ;
ou encore
SELECT E1.n°enseignant, E1.NomEnseignant
FROM E1 LEFT OUTER JOIN E2 ON E1.n°enseignant = E2.n°enseignant
WHERE E2.n°enseignant IS NULL ;
voici le résultat renvoyé par la jointure externe gauche entre E1 et E2 :
E1.n°enseignant
E1.NomEnseignant
E2.n°enseignant
E2.NomEnseignant
1
DUPONT
1
DUPONT
3
DURAND
NULL
NULL
4
MARTIN
4
MARTIN
5
BERTRAND
NULL
NULL
PRODUIT (R1, R2)
- Cet opérateur porte sur deux relations.
- La relation résultat possède les attributs de chacune des relations d'origine et ses n-uplets sont formés par la concaténation de chaque n-uplet de la première relation avec l'ensemble des n-uplets de la deuxième.
Exemple :
Etudiants Epreuves
n°étudiant
nom
libellé épreuve
coefficient
101
DUPONT
Informatique
2
102
MARTIN
Mathématiques
3
Gestion financière
5
Examen = PRODUIT (Etudiants, Epreuves)
n°étudiant
nom
libellé épreuve
coefficient
101
DUPONT
Informatique
2
101
DUPONT
Mathématiques
3
101
DUPONT
Gestion financière
5
102
MARTIN
Informatique
2
102
MARTIN
Mathématiques
3
102
MARTIN
Gestion financière
5
-
SELECT * FROM table1, table2 ;
Exemple :
SELECT * FROM Etudiants, Epreuves ;
-
La création d’une table peut être réalisée au moyen de la commande suivante :
CREATE TABLE nom_table
Le langage SQL dispose également des commandes suivantes :
ALTER TABLE : permet la modification de la structure d’une table, ajout d’une colonne, ajout d’une contrainte, modification de la définition d’une colonne, suppression d’une contrainte, etc.
DROP TABLE : permet de supprimer une table.
RENAME : permet de modifier le nom d’une table.
Le langage de manipulation des données comprend quatre instructions principales :
SELECT : pour l’interrogation d’une ou plusieurs tables ;
INSERT : pour l’ajout des lignes dans une table ;
UPDATE : pour la modification des lignes ;
DELETE : pour la suppression des lignes.
Les contraintes de colonnes et les contraintes de table matérialisent les différentes contraintes d’intégrité dont les SBS prend en charge la vérification systématique :
· La contrainte d’unicité (clause UNIQUE) : permet d’assurer qu’il n’existe pas de valeur dupliquée dans la colonne ;
· La contrainte d’obligation (clause NOT NULL) autorise et gère une valeur particulière appelée la valeur nulle. Cette valeur nulle traduit à la fois la valeur manquante et la valeur inexistante (ex. le nom de jeune fille pour un homme). NOT NULL est toujours une contrainte colonne, et ne peut pas être une contrainte de table ;
· Clé primaire
Ensemble minimum d'attributs qui permet de distinguer chaque n-uplet de la Table par rapport à tous les autres.
Chaque Table doit avoir une clé primaire.
La contrainte de clé primaire (clause PRIMARY KEY) : permet de choisir une colonne (ou un groupe de colonnes) unique privilégiée dans une table ;
Clé candidate
Ensemble minimum d'attributs susceptibles de jouer le rôle de clé primaire
· La contrainte d’intégrité référentielle admet deux syntaxes selon qu’elle porte sur une colonne (contrainte de colonne) ou sur plusieurs (contrainte de table). Dans le premier cas, on utilise la clause REFERENCES. Dans le second, on utilise l’expression FOREIGN KEY.
Clé étrangère
Elle fait référence à la clé primaire d'une autre Table.
Elle traduit un lien sémantique avec une autre Table.
Elle matérialise une dépendance d’inclusion entre deux colonnes appartenant à deux tables différentes ou deux groupes de colonnes. Par défaut, la contrainte référentielle référence la clé primaire de la table visée ;
· La contrainte sémantique (clause CHECK) : permet de spécifier les conditions logiques portant sur une ou plusieurs colonnes d’une même table.
Traduction du schéma relationnel de la Fig. 13b en langage SQL
NumCli char (12) not null,
Adresse char (60) not null,
primary key (NumCli) );
NumCli char (12) not null,
NumContr char (38) not null,
Type decimal (4) not null,
Date date not null,
primary key (NumCli, NumCtr),
foreign key (NumCli) references CLIENT);
NumVeh char (16) not null,
Marque char (30) not null,
Modele decimal (30) not null,
NumCli char (12) not null,
NumContr decimal (8) not null,
primary key (NumVeh),
unique (Numcli, NumContr),
foreign key (NumCli) references CONTRAT);
NumAcc char (10) not null,
Date date not null,
primary key (NumAcc) );
NumVeh char (16) not null,
NumAcc char (10) not null,
primary key (NumVeh, NumAcc),
foreign key (NumVeh) references CLIENT
foreign key (NumAcc) references CLIENT);