SQL Select

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 38

(6) Structured Query Language

SQL

2019-2020
SQL: un Langage Complet

Origine: Conçu et implémenté au CR d’IBM

Langage permettant de définir, manipuler et contrôler les données d’une BD


relationnelle

C’est un langage complet:

 LDD: Langage de Définition de Données

 LMD: Langage de Manipulation de Données

 LCD: Langage de Contrôle de Données

2
SQL: un Langage Complet

 Langage de Définition de Données (LDD)


 Création de relations : CREATE TABLE
 Modification de relations: ALTER TABLE
 Suppression de relations: DROP TABLE

 Langage de Manipulation de Données (LMD)


 Insertion de tuples: INSERT
 Mise à jour des tuples: UPDATE
 Suppression de tuples: DELETE
 Sélection de tuples: SELECT

3
Schéma Relationnel de Référence

EMPLOYÉ (Prénom, Nom, N°SS, Date_Naissance, Adresse, Sexe,


Salaire, N°SS_Sup, #N°Serv, Grade)

SERVICE ( N°Serv, NomServ, N°SS_Dir)

PROJET (N°Proj, Nomproj, Emplacement, #N°Serv)

TRAVAILLER (N°SS, N°Proj, Nbr_heures)


SUR

4
LMD: commande SELECT

SELECT <LISTE D’ATTRIBUTS>


FROM NOM DE RELATION
WHERE CONDITION;

La clause «WHERE» est optionnelle. Lorsqu’elle ne figure pas, il s’agit d’effectuer


une projection simple.

5
LMD: commande SELECT

La condition peut être multiple. On peut utiliser les opérateurs «AND» et «OR »
pour des conditions multiples.

Exemples:
WHERE Salaire>1450 AND Sexe= ‘M’

Ou

WHERE (Salaire>1450 AND Sexe= ‘ M’) OR (Salaire>4450 AND Sexe= ‘F’)

6
SELECT: Expression de la Projection

« Donner les noms et adresses des employés ».

SELECT Nom, Adresse


FROM EMPLOYÉ;

 Les autres colonnes de la relation n’apparaîtront pas.

7
SELECT: Expression de la Sélection

« Donner tous les renseignements concernant les employés dont


le nom est Tounsi. »

SELECT *
FROM EMPLOYÉ
WHERE Nom= ‘‘Tounsi’’;

Taper * ou citer l’ensemble des colonnes de la table EMPLOYÉ

8
SELECT: Opérateurs de Comparaison

 {=, !=, <, <=, >, >=}: L'opérateur différent peut aussi s'écrire <>
 IS [NOT] NULL : Teste si le contenu d'une colonne est une valeur nulle
ou pas

 [NOT] IN (liste de valeur) : Teste si le contenu coïncide avec le


contenu de la liste qui suit entre parenthèses ou pas

 [NOT] BETWEEN v1 AND v2 : Teste si le contenu d'une colonne est


compris entre v1 et v2 ou pas

9
SELECT: Opérateurs de Comparaison

 [NOT] LIKE : Compare la valeur de la colonne et celle de la chaîne de


caractères qui suit en utilisant des caractères génériques :

% substitue 0 ou plusieurs caractères


_ substitue 1 seul caractère

10
Sous-requête indépendante, pouvant renvoyer
plusieurs lignes

La condition de sélection utilise l’opérateur IN ou un opérateur simple (=, <>, <,


>, …) précédé de ALL ou ANY:

 IN : la condition est vraie si elle est vérifiée pour une des valeurs renvoyées
par la sous-requête

 ALL : la comparaison est vraie si elle est vraie pour chacune des valeurs
renvoyées par la sous-requête

 ANY : la comparaison est vraie si elle est vraie pour au moins une des
valeurs renvoyées par la sous-requête.

◦Remarque : IN est équivalent à =ANY


11
Opérateurs de Comparaison

« Donner les noms des employés dont on ne connaît pas


l’adresse».
SELECT Nom
FROM EMPLOYÉ
WHERE Adresse IS NULL;

« Lister toutes les informations sur les employés habitant à Tunis,


Gafsa ou Jendouba »
SELECT *
FROM EMPLOYÉ
WHERE Adresse IN (‘‘Tunis’’, ‘‘Gafsa’’, ‘‘Jendouba’’);
12
Opérateurs de Comparaison

« Lister Les employés dont la date de Naissance est entre 06-


07-78 et 06-07-68 ».
SELECT *
FROM EMPLOYÉ
WHERE Date_Naissance BETWEEN ‘06-07-78’ AND ‘06-07-68’;

Lister les Noms et les Adresses des employés dont le nom commence par
un D
SELECT Nom, Adresse
FROM EMPLOYÉ
WHERE Nom LIKE ‘‘D%’’;
13
Projection + Sélection

« Donner les noms des employés qui habitent Bizerte »

SELECT Nom
FROM EMPLOYÉ
WHERE Adresse = ‘‘ Bizerte’’;

REMARQUE : dans la grande majorité des cas la projection et la sélection sont


associées.

14
Expression du Produit Cartésien

Le produit cartésien s’exprime d’une façon très simple : il suffit de citer les deux
relations qui participent au produit.

SELECT *
FROM R1, R2;

15
Expression de la Jointure

« Donner les noms des employés responsables d’un service »

SELECT Nom
FROM EMPLOYÉ, SERVICE
WHERE EMPLOYÉ.N°SS = SERVICE.N°SS_Dir ;

16
Expression de la Jointure

« Donner le nom des employés travaillant pour le service ‘‘Marketing’’ »

SELECT Nom
FROM EMPLOYÉ, SERVICE
WHERE EMPLOYÉ.N°Service = SERVICE.N°Service
AND NomServ= ‘‘Marketing’’;

AUTRE FORMULATION

SELECT Nom
FROM EMPLOYÉ
WHERE N°Service = (SELECT N°Service
FROM SERVICE
WHERE NomServ=‘‘Marketing’’);
17
Expression de Jointures Multiples

« Donner les noms des employés qui travaillent dans les projets sis à
‘‘Gafsa’’»
SELECT Nom
FROM EMPLOYÉ
WHERE N°SS IN (SELECT N°SS
FROM TRAVAILLER_SUR
WHERE N°Proj IN (SELECT N°Proj
FROM PROJET
WHERE Emplacement= ‘‘Gafsa’’));

AUTRE FORMULATION
SELECT Nom
FROM EMPLOYÉ, TRAVAILLER_SUR, PROJET
WHERE EMPLOYÉ.N°SS = TRAVAILLER_SUR.N°SS
AND TRAVAILLER_SUR.N°Proj = PROJET.N°Proj
AND PROJET.Emplacement = ‘‘Gafsa’’;
18
Auto-Jointure

 Il est nécessaire dans le cas d’auto-jointure de préciser un nom de variable après


le nom de la table : c’est l’alias qui différencie les différentes copies d’une même
table.

 Exemple:
ALTER TABLE EMPLOYÉ ADD Grade VARCHAR(12);
 La colonne Grade spécifie le grade de l’employé: ouvrier, cadre, technicien, etc.

19
Auto-Jointure

« Donner les noms des employés ouvriers qui gagnent plus


qu’un cadre. »

SELECT A.Nom
FROM EMPLOYÉ A, EMPLOYÉ M
WHERE A.salaire> M.salaire
AND A.GRADE = ‘‘ouvrier’’
AND M.GRADE = ‘‘cadre’’;

20
Élimination de Tuples Identiques

« Donner la liste des grades au sein de l’entreprise»

SELECT DISTINCT Grade


FROM EMPLOYÉ;

21
Les Opérateurs Ensemblistes: UNION

« Donner tous les Noms des projets auxquels participe un employé


dont le nom est « Tounsi », que ce soit comme simple employé ou
comme responsable du département en charge du projet»

SELECT DISTINCT NomProj


FROM PROJET, EMPLOYÉ, TRAVAILLER_SUR
WHERE Nom = ‘‘Tounsi’’
AND PROJET.N°Proj = TRAVAILLER_SUR.N°Proj
AND EMPLOYÉ.N°SS = TRAVAILLER_SUR.N°SS

UNION
SELECT DISTINCT NomProj
FROM EMPLOYÉ, SERVICE, PROJET
WHERE SERVICE.N°Service =PROJET.N°Service
AND EMPLOYÉ.N°SS = SERVICE.N°SS_Dir
AND Nom = ‘‘Tounsi’’;
22
Les Opérateurs Ensemblistes

On utilise INTERSECT pour l’Intersection, et


MINUS pour la différence.

23
Tri de Résultat

ORDER BY permet de présenter les résultats triés par ordre ascendant (ASC) [par
défaut] ou descendant (DESC).

« Donner le nom des cadres par ordre alphabétique et ordre décroissant


de grade ».

SELECT Nom
FROM EMPLOYÉ
WHERE Grade = ‘‘Cadre’’
ORDER BY Nom ASC, Grade DESC;

24
Fonctions d’Agrégat

 AVG : détermine la moyenne


 SUM : calcule la somme
 MIN : renvoie le minimum des valeurs
 MAX : renvoie le maximum
 COUNT(*) : nombre de lignes

25
Fonctions d’Agrégat: Exemples

« Trouver le nombre des employés de la ville de Tabarka »

SELECT COUNT (*) AS Nombre


FROM EMPLOYÉ
WHERE Adresse = ‘‘Tabarka’’ ;

« Trouver le salaire moyen des salaires des employés »

SELECT AVG(Salaire) AS Moyenne des Salaires


FROM EMPLOYÉ ;

26
Fonctions d’Agrégat: Exemples

« Trouver les noms et les salaires des employés qui gagnent le


plus dans l'entreprise »
SELECT Nom, Salaire
FROM EMPLOYÉ
WHERE Salaire = Max(Salaire);

Il faut une sous-interrogation car MAX(Salaire) n'est pas au même


niveau de regroupement que le simple Salaire :

SELECT Nom, Salaire


FROM EMPLOYÉ
WHERE Salaire = (SELECT MAX(Salaire)
FROM EMPLOYÉ );
27
Fonctions d’Agrégat: Exemple

« Donner les noms des cadres qui gagnent plus que la


moyenne des salaires des employés ».

SELECT Nom
FROM EMPLOYÉ
WHERE Grade = ‘‘Cadre’’
AND Salaire > (SELECT AVG(Salaire)
FROM EMPLOYÉ);

28
Classification du Résultat

On appelle groupe un ensemble de lignes, résultat d’une requête, qui ont une
valeur commune dans une ou plusieurs colonnes.
Cela se fait à l’aide de la clause GROUP BY.

Un ordre SELECT avec une clause GROUP BY rend une ligne résultat pour
chaque groupe

29
Classification du Résultat: Exemples

« Donner la somme des salaires par grade »

SELECT SUM(Salaire), Grade


FROM EMPLOYÉ
GROUP BY Grade ;

« Donner les noms des projets par emplacement»


SELECT NomProj, Emplacement
FROM PROJET
GROUP BY Emplacement ;
30
Classification Conditionnelle du Résultat

On peut, après un GROUP BY introduire une sélection pour éliminer quelques


groupes ne vérifiant pas une condition

« Trouver le nombre d’heures effectuées par employé en éliminant les


employés dont le total est < 50 »

SELECT N°SS, SUM (nbr_heures)


FROM TRAVAILLER_SUR
GROUP BY N°SS

HAVING SUM(nbr_heures) >= 50;

31
Création d’Alias pour l’Affichage

SELECT NomServ As Nom Service


FROM SERVICE;

32
Sous-requête indépendante, renvoyant une seule ligne

« Donner la liste des employés (nom, adresse) ayant le même


salaire que l’employé de N°SS : 1435768998»

SELECT Nom, Adresse


FROM EMPLOYÉ
WHERE Salaire = (SELECT Salaire
FROM EMPLOYÉ
WHERE N°SS=1435768998);

33
Sous-requête indépendante, renvoyant plusieurs ligne

« Donner les N°SS des employés dont le salaire dépasse le salaire de


tous les employés appartenant au service 4»

SELECT N°SS
FROM EMPLOYÉ
WHERE Salaire > ALL (SELECT Salaire
FROM EMPLOYÉ
WHERE N°Service=4);

34
Sous-requête synchronisée avec la requête principale

« Donner les noms des responsables des services dont le salaire est
supérieur à celui des employés de même grade »

SELECT A.Nom
FROM EMPLOYÉ A, SERVICE
WHERE A.N°SS = SERVICE.N°SS_Dir
AND A.Salaire > (SELECT Salaire
FROM EMPLOYÉ B
WHERE A.Grade= B.Grade);

35
L’Opérateur [NOT] EXISTS

Résultat de la sous-requête assimilé à une valeur logique


On veut savoir si le résultat contient ou non des données (est un ensemble
vide ou non)  Les valeurs n'ont aucun intérêt.
Avec EXISTS, le résultat est VRAI si le résultat de la sous-requête est non
vide, FAUX sinon et inversement avec NOT EXISTS.

36
L’Opérateur [NOT] EXISTS: Exemples

« Donner les noms des Services ayant au moins un employé de grade


Technicien».

SELECT NomServ AS Nom Service


FROM SERVICE
WHERE EXISTS ( SELECT *
FROM EMPLOYÉ
WHERE EMPLOYÉ.N°Service = SERVICE.N°Service
AND GRADE= ‘‘Technicien’’);

37
L’Opérateur [NOT] EXISTS: Exemples

« Donner les N°SS des employés les moins âgés».

SELECT N°SS
FROM EMPLOYÉ A
WHERE NOT EXISTS (SELECT *
FROM EMPLOYÉ B
WHERE B.Date_Naissance < A.Date_Naissance);

38

Vous aimerez peut-être aussi