Cours de bases de données,
[Link]
SQL conjonctif
1Philippe Rigaux
SQL, première partie
Cette session présente les requêtes SQL conjonctives, celles qui s’expriment sans
négation ni disjonction.
Dans cette session :
• Forme d’un requête SQL : variables-nuplet, conditions, construction du
nuplet-résultat
• Requête mono-variables
• Requêtes multi-variables
Ces diapositives correspondent au support en ligne disponible
sur le site [Link]
2
Variables nuplet
SQL manipule des nuplets libres de la forme t(a1 , a2 , · · · , an ) Nous les appellerons des
variables nuplet.
La quantification porte sur la variable nuplet t : ∃t et ∀t.
On désigne les attributs en les rattachant à t : t.a1 , t.a2 , etc.
On peut exprimer des comparaisons : [Link] =0 a0 ou [Link] = [Link]
3
Requête mono-variable
Les requêtes les plus simples utilisent une seule variable nuplet. Leur forme logique est :
{t.a1 , t.a2 , · · · , [Link] |T (t) ∧ Fcond (t)}
La forme SQL :
select [distinct] t.a1, t.a2, ..., [Link]
from T as t
where <condition>
C’est un “bloc” avec trois clauses :
• le from définit la variable libre et sa portée
• le where définit la condition sur la variable libre
• le select (avec distinct optionnel) construit le nuplet-
résultat
4
Parlons du distinct
Une relation n’a pas de doublons. Or certaines requêtes peuvent en produire :
select [Link] from Logement as l
type
Auberge
Hôtel
Gîte
Hôtel
Le distinct garantit que les doublons sont éliminés.
select distinct [Link] from Logement as l
Certaines requêtes ne peuvent pas produire de doublon ! À
approfondir.
5
Premier exemple
Code, nom et type des logements en Corse.
select [Link], [Link], [Link]
from Logement as t
where [Link] = ’Corse’
Correspond à la formule
{[Link], [Link], [Link]|Logement(t) ∧ [Link] = ’Corse’}
Forme simplifiée.
select code, nom, type
from Logement
where lieu = ’Corse’
6
Interprétation
La variable peut être affectée à tous les nuplets de la table définie par la portée.
On garde toutes les affectations qui satisfont la condition Fcond .
La seule affectation correcte est surlignée ci-dessous.
code nom capacité type lieu
pi U Pinzutu 10 Gîte Corse
ta Tabriz 34 Hôtel Bretagne
ca Causses 45 Auberge Cévennes
ge Génépi 134 Hôtel Alpes
Trivial ? Oui, et tant mieux, car cette interprétation fonctionne
pour toutes les requêtes.
7
Requête multi-variables
Regardons pour deux variables : la généralisation est facile.
Forme de la requête :
select [distinct] t1.a1, ..., [Link], t2.a1, ..., [Link]
from T1 as t1, T2 as t2
where <condition>
Interprétation
Parmi toutes les affectations possibles des variables, on ne
conserve que celles qui satisfont la condition exprimée par
Fcond .
8
Un exemple détaillé : logements où on peut
pratiquer le ski
Nous avons besoin de deux variables :
• la première s’affecte aux nuplets de Activité ;
• la seconde s’affecte aux nuplets de Logement
• l’attribut codeActivité de la première est Ski.
• les deux variables partagent le même code logement
select [Link], [Link]
from Logement as l, Activité as a
where [Link] = [Link]
and [Link]é = ’Ski’
9
Interprétation : affectation des deux variables
Logement (variable l)
code nom capacité type lieu
pi U Pinzutu 10 Gîte Corse
ta Tabriz 34 Hôtel Bretagne
ca Causses 45 Auberge Cévennes
ge Génépi 134 Hôtel Alpes
Activité (variable a)
codeLogement codeActivité
ca Randonnée
ge Piscine
ge Ski
pi Plongée
pi Voile
10
Deuxième exemple : les paires de logements qui sont
du même type
Nous avons besoin de deux variables,
• chacune ayant pour portée la table Logement
• les deux variables partagent le même attribut type
select distinct [Link] as nom1, [Link] as nom2
from Logement as l1, Logement as l2
where [Link] = [Link]
Soit la formule
{l1 .nom, l2 .nom|Logement(l1 )∧Logement(l2 )∧l1 .type = l2 .type}
11
Interprétation : affectation des deux variables
Logement (variable l1 )
code nom capacité type lieu
pi U Pinzutu 10 Gîte Corse
ta Tabriz 34 Hôtel Bretagne
ca Causses 45 Auberge Cévennes
ge Génépi 134 Hôtel Alpes
Logement (variable l2 )
code nom capacité type lieu
pi U Pinzutu 10 Gîte Corse
ta Tabriz 34 Hôtel Bretagne
ca Causses 45 Auberge Cévennes
ge Génépi 134 Hôtel Alpes
12
Autre affectation possible
Logement (variable l1 )
code nom capacité type lieu
pi U Pinzutu 10 Gîte Corse
ta Tabriz 34 Hôtel Bretagne
ca Causses 45 Auberge Cévennes
ge Génépi 134 Hôtel Alpes
Logement (variable l2 )
code nom capacité type lieu
pi U Pinzutu 10 Gîte Corse
ta Tabriz 34 Hôtel Bretagne
ca Causses 45 Auberge Cévennes
ge Génépi 134 Hôtel Alpes
13
Encore une autre (et trois autres encore possibles)
Logement (variable l1 )
code nom capacité type lieu
pi U Pinzutu 10 Gîte Corse
ta Tabriz 34 Hôtel Bretagne
ca Causses 45 Auberge Cévennes
ge Génépi 134 Hôtel Alpes
Logement (variable l2 )
code nom capacité type lieu
pi U Pinzutu 10 Gîte Corse
ta Tabriz 34 Hôtel Bretagne
ca Causses 45 Auberge Cévennes
ge Génépi 134 Hôtel Alpes
14
À retenir
Quelle que soit sa complexité, l’interprétation d’une requête SQL peut toujours se faire
de la manière suivante.
• Chaque variable du from peut être affectée à tous les nuplets de sa portée.
• Le where définit une condition sur ces variables : seules les affectations satisfaisant
cette condition sont conservées
• Le nuplet résultat est construit à partir de ces affectations
15