Vous êtes sur la page 1sur 49

Introduction à SQL

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

La réponse est une relation avec un seul attribut


nom, et tuples avec le nom de chaque boisson
fabriqué par Soumam, comme Ole.
6
Signification de la requête à
relation unique
 Commencez par la relation dans la
clause FROM.
 Appliquez la sélection indiquée par
la clause WHERE.
 Appliquez la projection étendue
indiquée par la clause SELECT.

7
Sémantique
opérationnelle
name manf

Ole Soumam Inclure t.name


dans le résultat, si oui
Tester si
Soumam

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

... ...

Maintenant, le résultat à tous les attributs de


La relation Drinks .
10
Renommage des Attributs
 Si vous souhaitez que le résultat ait des
noms d'attribut différents, utilisez « AS
<nouveau nom> » pour renommer un
attribut.
 Exemple: Drinks(name, manf):
SELECT name AS drink, manf
FROM Drinks
WHERE manf = ’Soumam’
11
Resultat :
drink manf
Bud 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

marquet drink price


Joe Coca NULL
SELECT marquet
FROM Sells
WHERE price < 2.00 OR price >=
2.00; UNKNOWN UNKNOWN

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

FROM Likes, (SELECT drinker


FROM Frequents
WHERE marquet = ’Joe’)JD
WHERE Likes.drinker = JD.drinker; 32
Sous requête qui Retourne un
Tuple
 S'il est garanti qu'une sous-requête
produira un tuple, alors la sous-requête
peut être utilisée comme valeur.
 Habituellement, le tuple a un
composant.
 Une erreur d'exécution se
produit s'il n'y a pas de tuple
ou plus d'un tuple.

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.

 <> peut être remplacé par tout


opérateur de comparaison

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

Vous aimerez peut-être aussi