Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
L’information incomplète dans les Bases de Données
L’information incomplète dans les Bases deDonnées
Amélie Gheerbrant
Université Paris DiderotUFR InformatiqueLaboratoire d’Informatique Algorithmique : Fondements et Applications
24 novembre 2017
1 / 44
L’information incomplète dans les Bases de Données
SQL et l’information incomplète
2 / 44
L’information incomplète dans les Bases de Données
Théorie versus pratique
La théorie de l’information incomplèteI C’est quoi, l’information incomplète ?I Quelles opérations relationnelles peuvent être évaluées
correctement en présence d’information incomplète ?I Ça veut dire quoi "évalué correctement" ?
L’information incomplète dans SQLI Les choses sont beaucoup trop simplifiées.I Mène à des réponses incohérentes.I Mais parfois les nulls peuvent être très utiles.
3 / 44
L’information incomplète dans les Bases de Données
C’est quoi une valeur de donnée nulle ?Parfois il nous manque certaines informations.Film titre réalisateur acteur
Dr. Strangelove Kubrick SellersDr. Strangelove Kubrick Scott
null Polanski Nicholsonnull Polanski Huston
Star Wars Lucas FordFrantic null Ford
"null", c’est à dire ?...Il y a trois possibilités :
I Information pertinente mais absente : la valeur existe, mais onne la connait pas pour l’instant.
I Information non pertinente : la valeur n’existe pas (exemple :un film sans acteurs).
I Information inconnue : il n’y a pas d’information.4 / 44
L’information incomplète dans les Bases de Données
Représenter des relations avec des nulls : les tables de Codd
I Dans les tables de Codd, on met des variables distinctes pourles valeurs nulles :Film titre réalisateur acteur
Dr. Strangelove Kubrick SellersDr. Strangelove Kubrick Scott
x Polanski Nicholsony Polanski Huston
Star Wars Lucas FordFrantic z Ford
I La sémantique de la table de Codd appelée Film est l’ensemblePOSS(Film) de toutes les tables sans nulls qu’elle représente.
I i.e., on substitue des valeurs aux variables.
5 / 44
L’information incomplète dans les Bases de Données
Tables dans POSS(Film)
Les tables suivantes sont toutes dans POSS(Film) (qui estl’ensemble des relations qu’elle représente) :
titre réalisateur acteurDr. Strangelove Kubrick SellersDr. Strangelove Kubrick Scott
Star Wars Polanski NicholsonTitanic Polanski Huston
Star Wars Lucas FordFrantic Cameron Ford
titre réalisateur acteurDr. Strangelove Kubrick SellersDr. Strangelove Kubrick Scott
Titanic Polanski NicholsonTitanic Polanski Huston
Star Wars Lucas FordFrantic Lucas Ford
titre réalisateur acteurDr. Strangelove Kubrick SellersDr. Strangelove Kubrick Scott
Chinatown Polanski NicholsonChinatown Polanski HustonStar Wars Lucas FordFrantic Polanski Ford
titre réalisateur acteurDr. Strangelove Kubrick SellersDr. Strangelove Kubrick Scott
Solaris Polanski NicholsonStalker Polanski Huston
Star Wars Lucas FordFrantic Tarkovski Ford
etc...
6 / 44
L’information incomplète dans les Bases de Données
Poser des requêtes sur des tables de CoddI Soit Q une requête de l’algèbre relationnelle, ou une requête
SQL, et T une table de Codd. Comment définir la réponseQ(T ) à la requête ?
I On sait seulement appliquer Q à des relations sans nulls. Si onfait ça on trouve :
QPOSS(T ) = {Q(R) | R ∈ POSS(T )}
I S’il y avait une table de Codd T ′ telle quePOSS(T ′) = QPOSS(T ), alors on pourrait dire que T ′ estQ(T ), i.e. :
POSS(Q(T )) = {Q(R) | R ∈ POSS(T )}
I Question : est-ce qu’on peut toujours trouver une table T ′
satisfaisant cette propriété ?7 / 44
L’information incomplète dans les Bases de Données
Poser des requêtes sur des tables de Codd
I Soit la requête Q :SELECT * FROM FilmWHERE titre=‘Frantic’;
I Soit la table de Codd Film′ :titre realisateur acteur
Frantic z Ford
I T ′ est bien telle que POSS(Film′) = QPOSS(Film), et doncFilm′ est Q(Film), i.e. :
POSS(Q(Film)) = {Q(R) | R ∈ POSS(Film)}
8 / 44
L’information incomplète dans les Bases de Données
Systèmes de représentationI Façon correcte de répondre aux requêtes sur les tables :
I Question : peut-on toujours trouver Q(T ) pour toute table Tet requête Q dans un language de requête ?
I Mauvaise nouvelle : même pour des requêtes très simples del’algèbre relationnelle, ce n’est pas possible.
9 / 44
L’information incomplète dans les Bases de Données
La sélection et les tables de CoddSoient :
T A B0 1x 2
Q : σA=3(T )
Existe-t-il T ′ telle que POSS(T ′) = {Q(R) | R ∈ POSS(T )} ?
Soient :
R1 A B0 12 2
R2 A B0 13 2
Q(R1) = ∅,Q(R2) = {(3, 2)}, et donc T ′ ne peut pas exister, car
∅ ∈ POSS(T ′) si et seulement si T ′ = ∅
10 / 44
L’information incomplète dans les Bases de Données
Que peut-on faire ?
I Idée 1 : considérer les réponses certaines.I Un tuple t est dans la réponse certaine à Q sur T1, . . . ,Tn si
t ∈ Q(R1, . . . ,Rn) pour toutR1 ∈ POSS(T1), . . . ,Rn ∈ POSS(Tn)
I Idée 2 : étendre les tables de Codd en ajoutant des contraintessur les valeurs de données nulles (e.g., certaines doivent êtreégales, certaines doivent ne pas être égales, etc).
I Combiner ces idées permet d’évaluer les requêtes lorsquel’information contenue dans les tables est incomplète.
I Malheureusement les algorithmes d’évaluation, et - pire - lesrésultats des requêtes, sont souvent très compliqués.
11 / 44
L’information incomplète dans les Bases de Données
L’information incomplète dans SQL
I L’approche SQL : il y a un seul NULL "multi fonction" pourtous les cas d’information manquante/inapplicable
I Les nulls apparaissent comme des entrées dans les tables ;parfois ils sont affichés comme NULL, parfois comme "_".
I Leur présence provoque des soucis dès que l’on essaie de fairedes comparaisons
I L’union de SELECT * FROM R WHERE R.A=1; etSELECT * FROM R WHERE R.A<>1; devrait donner la mêmechose que SELECT * FROM R;
I Mais en fait, non.I Parce que, si R.A est NULL, alors ni R.A=1 ni R.A<>1 n’est vrai.
12 / 44
L’information incomplète dans les Bases de Données
L’information incomplète dans SQLI R.A a trois valeurs : 1, null, et 2.
I SELECT * FROM R WHERE R.A=1; retourneA1
I SELECT * FROM R WHERE R.A<>1; retourneA2
I Comment tester = NULL ? Nouvelle comparaison : IS NULL(IS NOT NULL est disponible aussi)
I SELECT * FROM R WHERE R.A IS NULL; retourneA
NULLI SELECT * FROM R; est l’union de
SELECT * FROM R WHERE R.A=1;SELECT * FROM R WHERE R.A<>1;SELECT * FROM R WHERE R.A IS NULL;
13 / 44
L’information incomplète dans les Bases de Données
Les nulls et les autres opérationsI Ca donne quoi, 1+NULL ? Quelle est la valeur de vérité de
3=NULL, 3<>NULL ?I Les nulls ne peuvent pas être utilisés explicitement dans des
opérations et des sélections comme WHERE R.A=NULL etSELECT 5-NULL.
I Pour toute opération arithmétique, sur les chaînes decaractères, etc., si un argument est null, alors le résultat estnul.
I Pour R.A={1,NULL}, S.B={2},SELECT R.A + S.BFROM R, S;retourne {3, NULL}.
I Quelle est la valeur de R.A=S.B ? Si R.A=1, S.B=2, alors c’estfaux. Si R.A=NULL, S.B=2, la valeur est inconnue (UNKNOWN).
14 / 44
L’information incomplète dans les Bases de Données
La logique des nullsI Comment la valeur "UNKNOWN" intéragit-elle avec les
connecteurs Booléens ? Qu’est ce que "NOT UNKNOWN" ?Qu’est-ce que "UNKNOWN OR TRUE" ?
x NOT xvrai fauxfaux vrai
inconnu inconnu
ET vrai faux inconnuvrai vrai faux inconnufaux faux faux faux
inconnu inconnu faux inconnuOU vrai faux inconnuvrai vrai vrai vraifaux vrai faux inconnu
inconnu vrai inconnu inconnu
I Problème avec les nulls : les gens pensent rarement en termesde logique tri-valuée !
15 / 44
L’information incomplète dans les Bases de Données
La logique des nulls
L’évaluation d’un prédicat (e.g., dans une clause WHERE), sur uneligne particulière peut donc renvoyer la valeur TRUE, FALSE, maisaussi UNKNOWN :
I C IS TRUE vaut TRUE si C vaut TRUE, et FALSE si C vautFALSE ou UNKNOWN ;
I C IS FALSE vaut TRUE si C vaut FALSE, et FALSE si C vautTRUE ou unknown ;
I C IS UNKNOWN vaut TRUE si C vaut UNKNOWN, et FALSE si Cvaut TRUE ou FALSE.
Les formes inverses IS NOT TRUE, IS NOT FALSE etIS NOT UNKNOWN sont aussi disponibles.
16 / 44
L’information incomplète dans les Bases de Données
Les nulls et l’agrégation
Supposons que SELECT * FROM R retourne
Alors SELECT COUNT(*) FROM R retourne 2.
Mais SELECT COUNT(R.A) FROM R retourne 1...
17 / 44
L’information incomplète dans les Bases de Données
Les nulls et l’agrégation
I On s’attendrait à ce que les nulls soient propagés à travers lesopérations arithmétiques
I SELECT SUM(R.A) FROM R est la somme
a1 + a2 + . . .+a n
de toutes les valeurs dans la colonne A ; si l’une est inconnue,alors le résultat devrait être inconnu aussi.
I Mais SELECT SUM(R.A) FROM R retourne 1 si R.A = {1, null}I Règle la plus commune pour les fonctions d’agrégation :
d’abord, ignorer tous les nulls,ensuite, calculer la valeur.
I Seule exception : COUNT(*).
18 / 44
L’information incomplète dans les Bases de Données
Sommes et valeurs nullesEn présence de valeurs null, la somme n’est pas distributive, i.e.,SUM(A + B) n’est pas nécessairement égal à sum(A) + sum(B).
select TITULAIRE, sum(H_COURS) + sum(H_TP) as CHARGEfrom ACTIVITEgroup by TITULAIRE;
donne
19 / 44
L’information incomplète dans les Bases de Données
Sommes et valeurs nullesEn présence de valeurs null, la somme n’est pas distributive, i.e.,SUM(A + B) n’est pas nécessairement égal à sum(A) + sum(B).
select TITULAIRE, sum(H_COURS + H_TP) as CHARGEfrom ACTIVITEgroup by TITULAIRE;
donne
20 / 44
L’information incomplète dans les Bases de Données
Sommes et valeurs nullesUne façon de contourner le problème :
WITH heures AS (select TITULAIRE, sum(H_COURS) as CHARGEfrom ACTIVITEwhere H_COURS IS NOT NULLgroup by TITULAIREUNION ALLSELECT TITULAIRE, sum(H_TP) as CHARGEfrom ACTIVITEwhere H_TP IS NOT NULLgroup by TITULAIRE)SELECT titulaire, SUM(CHARGE) as chargeFROM heuresGROUP BY titulaire ;
21 / 44
L’information incomplète dans les Bases de Données
Sommes et valeurs nullesUne façon de contourner le problème :
SELECT titulaire, SUM(CHARGE) as chargeFROM (select TITULAIRE, sum(H_COURS) as CHARGEfrom ACTIVITEwhere H_COURS IS NOT NULLgroup by TITULAIREUNION ALLSELECT TITULAIRE, sum(H_TP) as CHARGEfrom ACTIVITEwhere H_TP IS NOT NULLgroup by TITULAIRE) as heuresGROUP BY titulaire ;
22 / 44
L’information incomplète dans les Bases de Données
Les nulls dans les sous requêtesI Supposons :
R1.A = {1, 2} R2.A = {1, 2, 3, 4}
I SELECT R2.AFROM R2WHERE R2.A NOT IN (SELECT R1.A
FROM R1);I Résultat : {3, 4}
I Maintenant, insérons un null dans R1 :
R1.A = {1, 2, null}
et lançons la même requête.I Le résultat est maintenant ∅ !
23 / 44
L’information incomplète dans les Bases de Données
Les nulls dans les sous requêtesI Bien que ce résultat puisse sembler contre-intuitif, il est
correct.I Quelle est la valeur de 3 NOT IN (SELECT R1.A FROM R1) ?
3 NOT IN {1,2,null}= NOT (3 IN {1,2,null})= NOT((3 = 1) OR (3=2) OR (3=null))= NOT(false OR false OR unknown)= NOT (unknown)= unknown
I De même, l’évaluation de 4 NOT IN {1,2,null} estunknown, et celle de 1 NOT IN {1,2,null} et de2 NOT IN {1,2,null} est false.
I La requête retourne donc ∅.24 / 44
L’information incomplète dans les Bases de Données
Les nulls dans les sous requêtesI Considérons maintenant :
R1.A = {1, 2} R2.A = {1, 2, 3, 4}
I SELECT R2.AFROM R2WHERE NOT EXISTS (SELECT R1.A
FROM R1 WHERE R1.A=R2.A);I Résultat : {3, 4}I Cette requête est réputée équivalente à la précédente.I Maintenant, insérons un null dans R1 :
R1.A = {1, 2, null}
et lançons la même requête.I Cette fois-ci le résultat ne change pas et on obtient {3, 4} !
25 / 44
L’information incomplète dans les Bases de Données
Les nulls dans les sous requêtesI "En théorie", ça donnerait quoi un résultat d’évaluation correct
pour cette requête en présence d’information incomplète ?I Le résultat de
SELECT R2.AFROM R2WHERE R2.A NOT IN (SELECT R1.A
FROM R1);
surR1 A
12x
etR2 A
1234
donnerait quelque chose comme
A condition3 x = 04 x 6= 03 y = 04 y = 0
I "Tables conditionnelles" : pas implémenté en pratique (tropcompliqué)
26 / 44
L’information incomplète dans les Bases de Données
Les nulls dans les sous requêtes
Supposons que l’on recherche les films pour lesquels il n’y a pas defilm plus long.
SELECT titreFROM Film F1WHERE NOT EXISTS (SELECT *
FROM Film F2WHERE F2.duree > F1.duree);
En plus des réponses attendues, on obtiendra tous les films dont ladurée est inconnue. La valeur de duree étant NULL, la conditionF2.duree > F1.duree vaut UNKNOWN et l’ensemble entreparenthèses est vide. Le prédicat NOT EXISTS est évalué à TRUE, etla ligne est retenue !
27 / 44
L’information incomplète dans les Bases de Données
Les nulls peuvent être dangereux !I Prenons le Système de défense antimissile de l’OTAN et sa
base de données recensant des missiles ciblant des villes, ainsique les missiles lancés pour les intercepter.
I Requête : est-ce qu’il y a un missile qui cible une ville, maisqui n’a pas encore été intercepté ?
SELECT M.numero, M.cibleFROM Missiles MWHERE M.cible IN (SELECT Nom
FROM Ville) ANDM.numero NOT IN (SELECT I.Missile
FROM Intercepte IWHERE I.Statut = ‘actif’);
I Supposons qu’un missile "intercepteur" ait été lancé, mais quesa cible n’ait pas été entrée dans la base de données.
28 / 44
L’information incomplète dans les Bases de Données
Les nulls peuvent être dangereux !Missile numero cible
M1 ParisM2 LondresM3 Berlin
Intercepte num_int missile statutI1 M1 actifI2 NULL actif
SELECT M.numero, M.cibleFROM Missiles MWHERE M.cible IN (SELECT Nom
FROM Ville) ANDM.numero NOT IN (SELECT I.Missile
FROM Intercepte IWHERE I.Statut = ‘actif’);
I La requête retourne l’ensemble vide, car l’évaluation de :M2 NOT IN {M1, null} AND M3 NOT IN {M1, null}donne UNKNOWN.
I bien que ni M2 ni M3 n’aient été interceptés !
I Situation très improbable ? Oui, oui, probablement...(Heureusement !)
29 / 44
L’information incomplète dans les Bases de Données
La propagation des nulls : résumé
Les expressions de calcul
Une expression dont l’évaluation renvoie une valeur numérique,caractères ou temporelle est évaluée à NULL si l’un de sesarguments est NULL :
I A + B + C vaut NULL si A ou B ou C est NULL ;I recette - (SELECT budget from .. WHERE ..) vaut NULL si la
sous-requête from-where correspond à l’ensemble vide ;I cast(attribut as varchar(10)) vaut null si attribut = NULL ;I Mr. || nom vaut NULL si nom = NULL ;I budget - budget vaut NULL si budget = NULL.
30 / 44
L’information incomplète dans les Bases de Données
La propagation des nulls : résumé
Les fonctions agrégatives
Ces fonctions travaillent sur des ensembles dont les éventuellesvaleurs null sont ignorées. Si l’ensemble est vide, les fonctions SUM,AVG, MIN, et MAX renvoient NULL, tandis que COUNT renvoie 0.
On notera que cette règle ne suit pas celle des expressions decalcul. En effet, la fonction SUM devrait, comme toute somme,renvoyer NULL dès que l’un au moins de ses éléments est null, cequi n’est pas le cas. L’intuition l’emporte ici sur la rigueur.
31 / 44
L’information incomplète dans les Bases de Données
SQL et les nulls : deux recommendations
Le détachement des colonnes facultatives
Problème : genre souvent non renseigné dansFilm(titre, annee, realisateur, genre)
Solution : Décomposer la relation de manière à extraire toutattribut (ou groupe d’attributs) facultatif sous la forme d’une tableautonome
CREATE TABLE Film (titre .. NOT NULL PRIMARY KEY,annee .. NOT NULL,realisateur .. NOT NULL);
CREATE TABLE GenreFilm(titre .. NOT NULL PRIMARY KEY,genre .. not null,foreign key (titre) reference Film);
Ces deux tables ne comportent plus que des colonnes NOT NULL.
32 / 44
L’information incomplète dans les Bases de Données
SQL et les nulls : deux recommendations
Utilisation de valeurs par défautLa colonne facultative est déclarée NOT NULL, mais estaccompagnée d’une valeur par défaut. La prise en compte de cettevaleur est à charge de l’utilisateur.
CREATE TABLE Film (titre .. NOT NULL PRIMARY KEY,annee .. NOT NULL,realisateur .. NOT NULL;genre .. DEFAULT ‘inconnu’ NOT NULL);
Une dernière règle de prudence : en présence de valeurs null, biendistinguer dans les requêtes SQL les cas sans et avec valeurs null.
33 / 44
L’information incomplète dans les Bases de Données
Utilisation de IS NOT NULL
Une dernière règle de prudence : en présence de valeurs null, biendistinguer dans les requêtes SQL les cas sans et avec valeurs null.
La technique présenté au transparent 13 peut être généralisée.Réécriture de la requête du transparent 23 :
SELECT R2.AFROM R2WHERE R2.A NOT IN (SELECT R1.A
FROM R1 WHERE R1.A IS NOT NULL);
c.f. "Making SQL Queries Correct on Incomplete Databases : A Feasibility Study",
PODS’16 (Guagliardo, Libkin)
34 / 44
L’information incomplète dans les Bases de Données
Utilisation de IS NOT NULLUne dernière règle de prudence : en présence de valeurs null, biendistinguer dans les requêtes SQL les cas sans et avec valeurs null.
Réécriture de la requête du transparent 27 :
SELECT titreFROM Film F1WHERE F1.durée IS NOT NULLAND NOT EXISTS (SELECT *
FROM Film F2WHERE F2.duree > F1.duree);
c.f. "Making SQL Queries Correct on Incomplete Databases : A Feasibility Study",
PODS’16 (Guagliardo, Libkin)
Plus compliqué en présence de GROUP BY (c.f. transparents 21 et22).
35 / 44
L’information incomplète dans les Bases de Données
Utilisation de IS NOT NULLUne dernière règle de prudence : en présence de valeurs null, biendistinguer dans les requêtes SQL les cas sans et avec valeurs null.
Réécriture de la requête des transparents 28 et 29 :
SELECT M.numero, M.cibleFROM Missiles MWHERE M.cible IN (SELECT Nom
FROM Ville) ANDM.numero NOT IN (SELECT I.Missile
FROM Intercepte IWHERE I.Statut = ‘actif’AND I.Missiles IS NOT NULL);
c.f. "Making SQL Queries Correct on Incomplete Databases : A Feasibility Study",
PODS’16 (Guagliardo, Libkin)36 / 44
L’information incomplète dans les Bases de Données
Utilisation de IS NOT NULL
Une dernière règle de prudence : en présence de valeurs null, biendistinguer dans les requêtes SQL les cas sans et avec valeurs null.
I Attention ! Plus compliqué en présence de GROUP BY (c.f.transparents 21 et 22).
I Cas non traité dans "Making SQL Queries Correct onIncomplete Databases : A Feasibility Study", PODS’16(Guagliardo, Libkin)
37 / 44
L’information incomplète dans les Bases de Données
Lorsque les nulls sont utiles : les jointures externes
I Exemple :Studio nom titre
‘United’ ‘Licence to kill’‘United’ ‘Rain man’
‘Dreamworks’ ‘Gladiator’
Film titre bénéfice‘Licence to kill’ 156‘Rain man’ 412‘Fargo’ 25
I Requête : pour chaque studio, trouver le bénéfice total générépar ses filmsSELECT Studio.Nom, SUM(Film.benefice)FROM Studio NATURAL JOIN FilmGROUP BY Studio.Nom;
I Réponse : (‘United’, 568)I Mais souvent on voudrait (‘Dreamworks’, ...) aussi !I ‘Dreamworks’ est perdu parce que ‘Gladiator’ ne correspond à
rien dans Film.
38 / 44
L’information incomplète dans les Bases de Données
Les jointures externes
I Et si on ne veut pas perdre ‘Dreamworks’ ?I Alors on utilise des jointures externes :
SELECT Studio.nom, SUM(Film.bénéfice)FROM Studio NATURAL LEFT OUTER JOIN FilmGROUP BY Studio.Nom;
I Résultat : (‘United’, 568), (‘Dreamworks’, null)I Studio NATURAL LEFT OUTER JOIN Film correspond à :
nom titre bénéfice‘United’ ‘Licence to kill’ 156‘United’ ‘Rain Man’ 412
‘Dreamworks’ ‘Gladiator’ null
39 / 44
L’information incomplète dans les Bases de Données
Les autres jointures externesI Studio NATURAL RIGHT OUTER JOIN Film correspond à :
nom titre bénéfice‘United’ ‘Licence to kill’ 156‘United’ ‘Rain Man’ 412null ‘Fargo’ 25
I Studio NATURAL FULL OUTER JOIN Film correspond à :nom titre bénéfice
‘United’ ‘Licence to kill’ 156‘United’ ‘Rain Man’ 412
‘Dreamworks’ ‘Gladiator’ nullnull ‘Fargo’ 25
I Idée : on fait une jointure, mais on garde aussi certains destuples qui n’ont pas de correspondant, en les complétant avecdes nulls.
40 / 44
L’information incomplète dans les Bases de Données
Les jointures externes
I Avec R NATURAL LEFT OUTER JOIN S, on conserve les tuplesde R sans correspondant (i.e., de la relation de gauche).
I Avec R NATURAL RIGHT OUTER JOIN S, on conserve lestuples de S sans correspondant (i.e., de la relation de droite).
I Avec R NATURAL FULL OUTER JOIN S, on conserve les tuplessans correspondant de R et de S (i.e., des deux relations).
41 / 44
L’information incomplète dans les Bases de Données
Les jointures externes et l’agrégationI Attention : si on utilise des jointures externes dans les requêtes
d’agrégation, on obtient des nulls comme résultat pour tousles agrégats sauf COUNTCREATE VIEW V (B1, B2) ASSELECT Studio.nom, Film.bénéficeFROM Studio NATURAL LEFT OUTER JOIN Film;SELECT * FROM V;
RetourneB1 B2
‘Dreamworks’ null‘United’ 156‘United’ 412
I SELECT B1, SUM(B2) FROM V GROUP BY B1; retourne(‘Dreamworks’, null), (‘United’, 568).
I SELECT B1, COUNT(B2) FROM V GROUP BY B1; retourne(‘Dreamworks’, 0), (‘United’, 2).
42 / 44
L’information incomplète dans les Bases de Données
Les jointures externes
I Il y a des systèmes qui n’aiment pas le mot NATURAL et qui nevous laisseront faire que
R LEFT/RIGHT/FULL OUTER JOIN S ON conditionI Exemple :
SELECT *FROM Studio LEFT OUTER JOIN Film ONStudio.titre=Film.titre;
I Résultat :nom titre titre bénéfice
‘United’ ‘Licence to kill’ ‘Licence to kill’ 156‘United’ ‘Rain man’ ‘Rain man’ 412
‘Dreamworks’ ‘Gladiator’ null null
43 / 44
L’information incomplète dans les Bases de Données
Clause check en présence de NULL
44 / 44