1. Mohamed Prénom 3 BOUDIA
UPHF, CNRS, UMR 8201 - LAMIH, F-59313 Valenciennes, France
Email : mohamedPrénom 3.boudia@uphf.fr
Système de Gestion des Bases de
Données (SGBD)
FISE 3A ESE
CM6 : Le langage SQL (Partie 2)
2. Objectif : sélectionner des données à partir de la BD qui satisfont des conditions
▪ Sélectionner : SELECT col1, col2, …
▪ À partir de la BD : FROM table1, table2, …
▪ Conditions à satisfaire : WHERE <condition>
Requête SELECT sur tables et opérations algébriques sur relations
▪ Projection 𝜋𝑎1…𝑎𝑛𝑅 : sur les colonnes précisées après le SELECT
▪ Sélection 𝜎𝑝𝑟𝑒𝑑𝑖𝑐𝑎𝑡 𝑅 : sur les lignes qui répondent à la <condition>
▪ précisée après WHERE
▪ Produit cartésien R𝑋𝑆: des tables avec évaluation de la <condition>
▪ Le résultat de toute opération est une relation : propriété de fermeture
Interrogation des données
4. Syntaxe générale
SELECT [DISTINCT|UNIQUE| ALL] {listeColonnes/expression}
FROM nomTable1, [, nomTable2]
[WHERE condition]
[GROUP BY <colonne>|<expression>]
[HAVING <condition>]
[{UNION|UNION ALL|INTERSECT|MINUS} (sousRequête)]
[ORDER BY <colonne>|<expression> [asc|desc]];
5. SELECT [DISTINCT|UNIQUE|ALL] ListeColonnes
▪ DISTINCT/UNIQUE : permet de donner les valeurs uniques (sans doublons)
▪ ALL : prend en compte les doublons
▪ ListeColonnes
{*|expression1 [[AS] alias1 ] [,expression2 [AS] alias2 ]…}
✓ * : pour désigner toutes les colonnes
✓ expression : nom de la colonne, fonction, constante ou calcul
✓ alias : renomme l’expression
✓ nom1, nom2, … : alias pour désigner la colonne
4
Clause SELECT
6. SELECT Monotable
SELECT FROM <Table> [Alias]
▪ Une table après la clause SELECT
▪ La table peut être nommée avec un synonyme (alias) : l’intérêt étant
d’utiliser une abréviation du nom de la table
SELECT Multi-tables
SELECT FROM <Table1> [Alias], <Table2> [Alias], …
▪ Plusieurs tables après la clause SELECT
▪ Les tables peuvent être nommées à l’aide d’un alias
Clause FROM
7. RefProd Designation Categorie Prix Stock
18 Tabouret A 16,78 200
23 Chaise B 23,00 350
25 Table B 123,00 36
Clauses SELECT…FROM : exemples SELECT
SELECT RefProd, Stock FROM Produit;
RefProd Designation Categorie Prix Stock
18 Tabouret A 16,78 200
23 Chaise B 23,00 350
25 Table B 123,00 36
Toutes les
colonnes
SELECT * FROM PRODUIT;
8. [WHERE CONDITION]
▪ La clause WHERE permet de préciser un prédicat sur les lignes
▪ Condition : expression logique (retournant VRAI ou FAUX) composée de
colonnes, expressions, constantes qui sont des opérandes liés par des
opérateurs
▪ <opérateur> de base
✓ De comparaison (>, =, <, >=, <=, <>, !=)
✓ Logiques (NOT, AND, OR)
<opérande> <opérateur> <opérande>
Clause WHERE : forme générale
9. Clause WHERE : opérateurs ensemblistes (1)
a IN (X) Couleur IN (‘bleu’, ‘blanc’, ‘rouge’)
a NOT IN (X) Diplôme NOT IN (1,2,3)
a= ANY(X) Condition vraie si satisfaite pour une ou plusieurs
a= SOME(X) valeurs de la liste
PRIX < ANY (12, 24, 45)
a<> ALL(X)
Condition vraie si satisfaite pour toutes les valeurs de
la liste
a> ALL(X) PRIX < ALL (12, 24, 45)
a>= ALL(X)
IS [NOT] NULL Condition vraie si la valeur est [n’est pas] NULL
X : (x1,x2,...,xN); a : colonne, valeur, expression
Attention, ne jamais utiliser les opérateurs ‘=‘ ou ‘<>’ devant la valeur NULL.
Utiliser strictement IS NULL, IS NOT NULL
X=NULL est toujours évaluée à faux
10. Clause WHERE : opérateurs (2)
a[NOT] BETWEEN
v1 AND v2
Condition vraie si a est (ou n’est pas) compris entre les
deux valeurs données v1 et v2 (bornes comprises) Datefact
Between ’01-JAN-95’ AND ’31-DEC-95’
[NOT] EXISTS
<sous-requête>
Condition vraie si la requête retourne (ou ne retourne pas)
au moins un tuple (voir plus tard)
a[NOT] LIKE
<exp>
Condition vraie si a contient (ou ne contient pas) un
ensemble de caractères définis avec les jokers « - » et
« % »
_: caractère quelconque
%: suite de caractères quelconques
NOM like ‘___O%’
11. Opérande
▪ Nom de colonne
▪ Valeur
o Numérique (entière ou décimale)
o Alphanumérique (entre quotes ‘’)
o Date
▪ Expression
o Arithmétique (utilisant les + ,- ,*, /)
o Fonctions
▪ Sous-requête : Requête fournissant une valeur ou une liste de valeurs compatibles
Clause WHERE : opérateurs (3)
12. Utilisées dans les expressions, opérandes des conditions
Fonctions catégorisées selon le type des arguments associés
▪ Fonctions numériques
▪ Fonctions chaînes de caractères
▪ Fonctions date
▪ Fonctions de conversion
▪ Autres fonctions
Clause WHERE : fonctions (1)
13. Fonctions arithmétiques
ABS(<n>) Valeur absolue de n
CEIL(<n>) Entier supérieur ou égal à n
FLOOR(<n>) Troncature à valeur entière
MOD(<m>,<n>) Reste de la division de m par n
POWER(<m>,<n>) m élevé à la puissance n
ROUND(<m>,<n>) m arrondi à n décimales
SIGN(<n>) Signe (-1 si <0, 0 si =0, 1 si >0)
SQRT(<n>) Racine carrée de n (0 si n<0)
TRUNC(<m>,<n>) m tronqué à n décimales
LN (<n>) Logarithme népérien
EXP(n) e (2.7182) à la puissance n
14. Fonctions sur les chaînes de caractères
INITCAP(<c>) La première lettre de chaque mot est
mise en majuscules
LOWER(<c>) Conversion en minuscules
UPPER(<c>) Conversion en majuscules
LTRIM(<c>) Suppression des espaces à gauche
RTRIM(<c>) Suppression des espaces à droite
REPLACE(<c>,<c1>,<c2>) Remplacement dans c de c1 par c2
SOUNDEX(<c>) Donne le son des mots de la chaîne (permet de
faire des recherches en phonétique)
SUBSTR(<c>,<c1>,<c2>) Sous-chaîne extraite commençant au
caractère de rang d et de longueur l
LENGTH(<c>) Longueur de la c
15. Fonctions sur les dates
ADD_MONTH(<d>,<n>) Ajoute n mois à la date d
LAST_DAY(<d>) Dernier jour du mois d
MONTH_BETWEEN(<d1>,<d2
>)
Nombre de mois entre les dates d1 et
d2
NEW_TIME(…) Date et heure dans un autre méridien
SYSDATE Date et heure système
CURRENT_DATE Retourne la date courante
LAST_DAY(d) Retourne le dernier jour
16. Autres fonctions
TO_CHAR(c) Retourne a chaîne c en VARCHAR2
GREATEST(expression[,e
xpression]…)
Retourne la plus grande des
expressions
LEAST(expression[,expr ession]…) Retourne la plus petite des
expressions
NULLIF(expr1, expr2) Retourne NULL si expr1=expr2, expr1
sinon
NVL(expr1, expr2) Retourne expr2 si expr1=NULL
17. Les résultats d'un SELECT peuvent être triés (ordonnés) selon une ou plusieurs clés : nom ou
position de colonne
ORDER BY <expression1 >[ASC/DESC], expression2 [ASC/DESC], …
▪ Exemples
SELECT RefProd, Prix FROM Produit ORDER BY Prix DESC;
Affichage du produit
le plus cher au
produit le moins cher
RefProd Prix
18 16,78
23 23,00
25 123,00
RefProd Prix
25 123,00
23 23,00
18 16,78
Projection avec SELECT
sans ORDER BY
Projection avec SELECT ...
ORDER BY
CLAUSE ORDER BY
18. Permettent de construire des ensembles à partir des résultats de SELECT considérés
comme des ensembles de lignes
SELECT ….FROM nomTable1 [WHERE…]
Opérateur
SELECT ….FROM nomTable2 [WHERE…]
▪ Pas d’opérateur de division (DIVIDE) !
▪ Résultats du select compatibles (nombre de colonnes, types de colonnes)
▪ Attention à l’ordre des SELECT
A B A - B
A B
MINUS
UNION|UNION ALL INTERSECT
Opérateurs ensemblistes
19. Les tables doivent être compatibles: même nombre d’attributs de mêmes
types
Union: les lignes des deuxtables sont concaténées verticalement sans
doublons dans le résultat. L’opération est commutative
Intersection : les lignes communes aux deux tables sont ajoutées au résultat.
L’opération est commutative
Différence : les lignes présents dans la première table et absents dans la seconde
table sont ajoutées au résultat. L’opération n’est pas commutative
20. ▪ <Exp> : colonne ou groupe de colonnes de regroupement
▪ <Prédicat> : condition sur les groupes (et non sur les tuples !!)
▪ Les fonctions figurant dans le SELECT suivi du GROUP BY sont des fonctions de groupe
▪ Les colonnes figurant dans le SELECT, doivent figurer dans le GROUP BY
Regroupe des tuples (crée des groupes ou des partitions) ayant les mêmes valeurs pour des
expressions sur les colonnes
Une fonction de groupe (d'agrégation) agrège les valeurs d'une colonne en une
seule valeur de sortie
GROUP BY <Exp> [HAVING <Prédicat>]
Indique comment créer
les groupes de tuples
Indique quels groupes
sélectionner/filtrer
CLAUSE GROUP BY
21. Fonctions arithmétiques de groupe
AVG(<n>) Moyenne des valeurs de n (valeurs nulles non comptées)
COUNT(*) Nombre de tuples renvoyés par la requête
COUNT(<n>) Nombre de valeurs non nulles
SUM(<n>) Somme des valeurs de n
MAX(<n>) Valeur maximum de n
MIN(<n>) Valeur minimum de n
STDDEV(<n>) Ecart type de n (valeurs nulles non
comptées)
VARIANCE(<n>)
EVERY
ANY|SOME
• Variance de n (valeurs nulles nom comptées)
• Renvoie un booléen SQL qui vaut vrai si les occurrences
sont toutes vraies
• Renvoie un booléen SQL si au moins une occurrence
est vraie
22. Rappel du produit cartésien entre deux tables : RXS
▪ Le résultat d'un produit cartésien RXS comprend |𝑅 | X | 𝑆 | tuples : combinaison des
tuples des tables R et S par juxtaposition
Commande
RefCom CodCli
21A12 18
34B10 2
CodCli Nom Prenom
18 TOTO Martin
2 TITI Amelie
Client
RefCom CodCliCo CodCliCl Nom Prénom
21A12 18 18 TOTO Martin
21A12 18 2 TITI Amelie
34B10 2 18 TOTO Martin
34B10 2 2 TITI Amelie
Commande X Client
Jointures
23. Jointure naturelle : 𝑅 ⑅ 𝑆
▪ Une jointure naturelle est un produit cartésien sur lequel est appliqué
une sélection sur les attributs communs
Commande
RefCom CodCli
21A12 18
34B10 2
CodCli Nom Prenom
18 TOTO Martin
2 TITI Amelie
Client
RefCom CodCliCo CodCliCl Nom Prénom
21A12 18 18 TOTO Martin
34B10 2 2 TITI Amelie
(Commande X Client)Commande.CodCli=Client.CodCli
24. Types
▪ Jointure relationnelles : une seule clause FROM qui relie des tables deux à deux
✓ Equi-jointure : opérateur d’égalité dans la clause de jointure
✓ Inéqui-jointure : opérateur (<>, <, >, >=, <=, BETWEEN, LIKE, IN) dans la clause de
jointure
✓ Auto-jointure : cas particulier de l’équijointure qui met en œuvre deux fois la même
table. L'utilisation d'un alias devient nécessaire pour distinguer les tables sources des
lignes jointes
✓ Jointure externe : favorise une table dite dominante par rapport à l’autre dite
subordonnée. Les lignes de la table dominante sont retournées même si elles ne
répondent pas à la condition de jointure
▪ Jointure procédurale : requêtes qui contiennent des sous- interrogations
(SELECT comme sous-interrogation).
Jointures
25. Jointure en forme procédurale : Sous-interrogations
SELECT colonnesTable1
FROM Table1
WHERE colonnes |expression(s) {IN|=|opérateur}
(SELECT colonne(s)Table2 FROM Table2
WHERE colonnes |expression(s) {IN|=|opérateur}
(SELECT…)
[AND (conditionsTable2)]
)
…
[AND (conditionsTable1)];
Niveau 1
Niveau 2
Niveau 3
Niveau i
Forme générale
26. Principes
▪ Chaque niveau i (i>1) est une sous-requête de la requête de
niveau i-1 (niveau supérieur)
▪ Le résultat d’une sous-requête de niveau i peut être à l’entrée
d’un opérateur dans la requête de niveau i-1 (supérieur)
▪ Deux types de jointures procédurales :
✓ Sous-interrogations non synchronisées
✓ Sous-interrogations synchronisées
Jointure en forme procédurale : Sous-interrogations
27. Principe d’évaluation
▪ Seules les colonnes du SELECT de premier niveau sont extraites
▪ Une sous-interrogation est exécutée avant la requête de niveau supérieur.
Le résultat qu’elle retourne est utilisé par la requête de niveau supérieur
▪ Une sous interrogation peut être
✓ Monoligne : retourne une seule ligne grâce aux opérateurs =, >, <, >=
✓ Multilignes : retourne plusieurs lignes grâce aux opérateurs [NOT] IN, ANY, ALL
Sous-interrogations non synchronisées
28. Principe
▪ Sous-interrogation mono ou multi-lignes
▪ Exécutée pour chaque ligne retournée de la sous-interrogation vers
l’interrogation de niveau supérieur
▪ Exécution équivalente à des boucles imbriquées
Forme générale
Select alias1.col1
FROM nomTable1 alias1
WHERE col(s) opérateur (SELECT alias2.col2
FROM nomTable2 alias2
WHERE alias1.x opérateur alias2.y)
[AND (condition)];
Sous-interrogations synchronisées
29. Principe de l’opérateur [NOT] EXISTS
▪ Retourne une valeur VRAI ou FAUX
✓ Vrai : si la sous-interrogation retourne au moins un tuple
✓ Faux : si la sous-interrogation ne retourne aucun tuple
▪ NOT EXISTS -> ensemble vide
▪ Permet de mettre en œuvre la division
SELECT col1, col2,…
FROM Table t1
WHERE [NOT] EXISTS
(SELECT {col | valeur}
FROM Table t2
WHERE t1.col1=t2.col2);
Sous-interrogations synchronisées et l’opérateur [NOT] EXISTS