44
L’information incomplLte dans les Bases de DonnØes L’information incomplLte dans les Bases de DonnØes AmØlie Gheerbrant UniversitØ Paris Diderot UFR Informatique Laboratoire d’Informatique Algorithmique : Fondements et Applications [email protected] 24 novembre 2017 1 / 44

L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

[email protected]

24 novembre 2017

1 / 44

Page 2: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

L’information incomplète dans les Bases de Données

SQL et l’information incomplète

2 / 44

Page 3: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 4: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 5: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 6: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 7: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 8: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 9: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 10: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 11: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 12: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 13: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 14: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 15: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 16: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 17: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 18: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 19: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 20: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 21: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 22: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 23: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 24: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 25: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 26: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 27: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 28: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 29: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 30: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 31: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 32: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 33: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 34: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 35: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 36: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 37: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 38: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 39: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 40: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 41: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 42: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 43: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

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

Page 44: L’information incomplète dans les Bases de Donnéesamelie/InfoIncomplete1718.pdf · 2017-11-24 · L’informationincomplètedanslesBasesdeDonnées L’information incomplète

L’information incomplète dans les Bases de Données

Clause check en présence de NULL

44 / 44