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.

Opération PROJECTION

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

Opération SELECTION

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é (<,>, <=,>=, <>).

Opération JOINTURE (équijointure)

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.

Opération UNION

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

Opération INTERSECTION

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

 

Opération DIFFERENCE

En SQL de base :

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

-          

Opération PRODUIT CARTESIEN

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.

 

SQL – Interrogation des données

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

create table       CLIENT (

NumCli      char (12)   not null,

Nom          char (38)   not null,

Adresse     char (60)   not null,

primary key        (NumCli) );

create table       CONTRAT (

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);

create table       VEHICULE (

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);

create table       ACCIDENT (

NumAcc     char (10)   not null,

Date         date         not null,

primary key        (NumAcc) );

create table       CONCERN (

NumVeh    char (16)   not null,

NumAcc     char (10)   not null,

primary key        (NumVeh, NumAcc),

foreign key (NumVeh) references CLIENT

foreign key (NumAcc) references CLIENT);