Académique Documents
Professionnel Documents
Culture Documents
Select-From-Where
Requêtes à relations multiple
Sous-requêtes
1
Pourquoi SQL?
SQL est un langage de très haut niveau.
Dites « que faire » plutôt que « comment le
faire ».
Évitez les nombreux détails de manipulation
de données nécessaires dans les langages
procéduraux tels que C++ ou Java.
Le système de gestion de base de données
détermine le « meilleur » moyen d'exécuter
une requête.
Appelé « optimisation des requêtes ».
2
Select-From-Where
SELECT attributs
FROM une ou plusieurs tables
WHERE condition sur les tuples des
tables
3
Exemple
Toutes les requêtes SQL des exemples
vont se baser sur le schéma suivant.
Drinks(name, manf)
market(name, addr, license)
Drinkers(name, addr, phone)
Likes(drinker, drink)
Sells(market, drink, price)
Frequents(drinker, market)
4
Exemple
Using Drink(name, manf), what drinks
are made by Soumam?
SELECT name
FROM drinks
WHERE manf = ’Soumam’;
5
Resultat de la requête
name
Ole
...
7
Sémantique
opérationnelle
name manf
variable t
boucle sur tous
Les tuples 8
* dans SELECT
Lorsqu'il y a une relation dans la
clause FROM, * dans la clause SELECT
signifie "tous les attributs de cette
relation".
Example: Using Drinks(name, manf):
SELECT *
FROM Drinks
WHERE manf = ’Soumam’;
9
Resultat :
name manf
Ole Soumam
... ...
... ...
12
Expressions dans les
clauses de SELECT
Toute expression qui a du sens peut
apparaître comme un élément d'une
clause SELECT.
Exemple: Sells(marquet, drink, price):
SELECT marquet, drink,
price*164 AS priceInDinar
FROM Sells;
13
Resultat
marquet drink priceInDinar
Joe’s Coca 285
Sue’s shweps 342
… … …
14
Exemple: Constantes en tant
qu'expressions
Likes(drinker, drink):
SELECT drinker,
’likes Coca’ AS whoLikesCoca
FROM Likes
WHERE drink = ’Coca’;
15
Résultat
drinker whoLikesBud
Sally likes Coca
Farid likes Coca
… …
16
Conditions complexes
dans la clause WHERE
Opérateurs Booleans AND, OR, NOT.
Comparisons =, <>, <, >, <=, >=.
Et de nombreux autres
opérateurs.
17
Exemple: Conditions
complexes
Sells(marquet, drink, price), trouver le
prix du boisson “Coca” vendu dans le
magasin de “Joe” :
SELECT price
FROM Sells
WHERE marquet = ’Joe’ AND
drink = ’Coca’;
18
Motifs ou « patterns »
Une condition peut comparer une
chaîne à un motif par:
<Attribute> LIKE <pattern> or
<Attribute> NOT LIKE <pattern>
Pattern est un string entre des ‘’
avec % = “tout string”; _ = “tout
charactère.”
19
Exemple: LIKE
Drinkers(name, addr, phone)
trouver les “drinkers” qui ont un tel
qui se termine avec un 55:
SELECT name
FROM Drinkers
WHERE phone LIKE ’%55’;
20
Valeurs NULL
Les tuples dans les relations SQL peuvent
avoir NULL comme valeur pour un ou
plusieurs composants.
Le sens dépend du contexte. Deux cas
courants :
– Valeur manquante : ex., nous savons que le
magasin de Joe a une adresse, mais nous
ne savons pas ce que c'est.
– Inapplicable : ex., la valeur de l’attribut
conjointe pour une personne non mariée.
21
Comparer les NULL’s aux
Valeurs
La logique des conditions en SQL est en
réalité une logique à 3 valeurs : VRAI, FAUX,
INCONNU.
La comparaison de n'importe quelle valeur
(y compris NULL lui-même) avec NULL
donne UNKNOWN.
Un tuple est dans une réponse à une
requête si la clause WHERE est TRUE (pas
FALSE ou UNKNOWN).
22
Logique à trois valeurs
Pour comprendre comment AND, OR et
NOT fonctionnent dans une logique à 3
valeurs, pensez à TRUE = 1, FALSE = 0
et UNKNOWN = ½.
AND = MIN; OR = MAX, NOT(x) = 1-x.
Exemple:
TRUE AND (FALSE OR NOT(UNKNOWN)) =
MIN(1, MAX(0, (1 - ½ ))) =
MIN(1, MAX(0, ½ )) = MIN(1, ½ ) = ½.
23
Exemple
UNKNOWN 24
Requêtes à plusieurs
relations
Les requêtes intéressantes
combinent souvent les données de
plusieurs relations.
Nous pouvons traiter plusieurs
relations dans une requête en les
listant toutes dans la clause FROM.
Distinguer les attributs du même
nom avec “<relation>.<attribute>” .
25
Exemple: Joindre deux
Relations
soient Likes(drinker, drink) et
Frequents(drinker, marquet), trouvez les
boissons appréciées par au moins une
personne qui fréquente le magasin de Joe.
SELECT drink
FROM Likes, Frequents
WHERE marquet = ’Joe’ AND
Frequents.drinker =
Likes.drinker;
26
Etapes
1. Commencez par le produit de
toutes les relations dans la clause
FROM.
2. Appliquez la condition de sélection
de la clause WHERE.
3. Projeter sur la liste d'attributs et
d'expressions dans la clause
SELECT.
27
Exemple
drinker marquet drinker drink
tv1 tv2
Sally Coca
Sally Joe’s
check
for Joe Likes
Frequents
check these to output
are equal
28
Variables de tuple
explicites
Parfois, une requête doit utiliser deux
copies de la même relation.
Distinguez les copies en faisant suivre
le nom de la relation par le nom d'une
variable de tuple, dans la clause
FROM.
C'est toujours une option de
renommer les relations de cette façon,
même si cela n'est pas essentiel.
29
Exemple: Auto-jointure
de Drinks(name, manf), retrouvez toutes
les paires de boissons du même fabricant.
Ne produisez pas de paires
comme (Coca, Coca).
Ordre alphabétique, e.g. (Coca,
Shweps)et pas (shweps, Coca).
SELECT b1.name, b2.name
FROM drinks b1, drinks b2
WHERE b1.manf = b2.manf AND
b1.name < b2.name;
30
Sous-Requêtes
Une instruction SELECT-FROM-
WHERE entre parenthèses (sous-
requête ) peut être utilisée comme
valeur à plusieurs endroits, y compris
les clauses FROM et WHERE.
Exemple: à la place d'une relation
dans la clause FROM, nous pouvons
utiliser une sous-requête puis
interroger son résultat.
31
Exemple: sous requêtes
dans FROM
Trouvez les boissons appréciées par au
moins une personne qui fréquente le
magasin de Joe.
Drinkers who
SELECT drink frequent Joe’s marquet
33
Exemple:
Sells(marquet, drink, price), trouvez les
magasins qui vendent ‘Shweps’ pour le
même prix que Joe facture pour Coca.
Deux requêtes fonctionneraient
sûrement :
1. Trouvez le prix que Joe facture
pour Coca .
2. Trouvez les magasins qui vendent
Shweps à ce prix.###
34
Requête + Sous-requêtes
SELECT marquet
FROM Sells
WHERE drink = ’Shweps’ AND
price = (SELECT price
FROM Sells
The price at
which Joe WHERE marquet = ’Joe’
sells Coca
AND drink = ’Coca’);
35
Opérateur IN
<tuple> IN (<sous-requête>) est
vrai SSi le tuple est un membre de
la relation produite par la sous-
requête
Opposé: <tuple> NOT IN (<sous-
requête>).
IN peut apparaitre dans les clauses
WHERE.
36
Exemple: IN
En utilisant Drinks(name, manf) et
Likes(drinker, drink), trouver le fabricant
de chaque boisson que Fred aime.
SELECT *
FROM drinks
WHERE name IN (SELECT drink
ensemble de boissons que fred aiment
FROM Likes
WHERE drinker = ’Fred’);
37
l’opérateur Exists
EXISTS(<sous-requête>) est vrai
ssi la sous-reqête n’a pas de
résultats.
Exemple: Drinks(name, manf) ,
Trouver les boisson qui sont les
seuls boissons de leurs fabricants.
38
Example: EXISTS
SELECT name
FROM Drinks b1
WHERE NOT EXISTS (
SELECT *
FROM drinks
WHERE manf = b1.manf AND
name <> b1.name);
39
L’Opérateur ANY
x = ANY(<sous-requêtes>) est vrai ssi
x est égal à au moins un tuple du
résultat de la sous reqête.
= peut être remplacé par tout opérateur
dr comparison.
Exemple: x >= ANY(<sous-requêtes>)
Noter que les tuples doivent avoir un seul
attribut.
40
L’Opérateur ALL
x <> ALL(<subquery>) ssi chaque
tuple t du résultat est différent de
x.
41
Union, Intersection, et
Différence
Union, intersection, et difference
sont exprimé comme suit
(<sous-requête>) UNION (<sous-
requête>)
(<sous-requête>) INTERSECT (<sous-
requête>)
(<sous-requête>) EXCEPT (<sous-
requête>)
42
Exemple: Intersection
Likes(drinker, drink), Sells(marquet,
drink, price), et Frequents(drinker,
marquet), trouver les consommateur
et les boissons tels que:
1. Le consommateur aime le boisson et
2. Le consommateur fréquente au moins
un magasin qui vend le boisson.
43
Solution
(SELECT * FROM Likes)
INTERSECT
(SELECT drinker, drink
FROM Sells, Frequents
WHERE Frequents.marquet =
Sells.marquet
);
44
Elimination des redondances
Forcer le résultat d’être un
ensemble SELECT DISTINCT . . .
Forcer le résultat d’être un bag
(i.e., ne pas éliminer les
redondances) par ALL, comme
dans . . . UNION ALL . . .
45
Exemple: DISTINCT
Sells(marquet, drink, price),
trouver les différents prix des
boissons:
SELECT DISTINCT price
FROM Sells;
46
Exemple: ALL
Frequents(drinker, marquet)
Likes(drinker, drink):
(SELECT drinker FROM Frequents)
EXCEPT ALL
(SELECT drinker FROM Likes);
47
Produit et jointure
naturelle
Natural join:
R NATURAL JOIN S;
Product:
R CROSS JOIN S;
Exemple:
Likes NATURAL JOIN Sells;
48
Theta Jointure
R JOIN S ON <condition>
Exemple: Drinkers(name, addr) ,
Frequents(drinker, marquet):
Drinkers JOIN Frequents ON
name = drinker;
donne tous les quadruplets (d, a, d, b)
tels que le drinker d habite l’adresse
a et frequente le magasin b.
49