• Aucun résultat trouvé

Un peu de logique

Dans le document BASES DE DONNÉES ET MODÈLES DE CALCUL (Page 72-77)

Le langage SQL DML

5.2 CONSULTATION ET EXTRACTION DE DONNÉES DANS UNE TABLE

5.2.6 Un peu de logique

Il n’est peut-être pas inutile de rappeler quelques principes et propriétés de la logique classique. Celle-ci va en effet nous servir à comprendre, exprimer et simpli-fier les conditions de sélection qui apparaissent dans la clause where5.

Sur le plan pratique, outre la négation (communément notée ¬ et dénommée not en SQL), deux opérateurs logiques à deux arguments (les deux conditions P et Q par exemple) nous permettront de construire des conditions composées à partir de conditions plus simples :

• la conjonction, notée P ∧ Q (PetQ en français, PandQ en SQL); cette expres-sion est vraie si les arguments sont vrai;

• la disjonction, notée P ∨ Q(PouQ en français, PorQ en SQL); cette expres-sion est vraie si au moins un des arguments est vrai.

Lors de l’évaluation d’une expression complexe, la négation (not) a priorité sur la conjonction (and), qui elle-même a priorité sur la disjonction (or). On peut imposer un ordre d’évaluation différent à l’aide de parenthèses. Soit, par exemple, l’expres-sion :

LOCALITE = 'Toulouse' and COMPTE < 0 or CAT = ’C1’

Elle indique qu’une ligne de CLIENT est sélectionnée si (LOCALITE = 'Toulouse' et COMPTE < 0) ou si (CAT = ’C1’) ou si les deux conditions sont vérifiées. On aurait pu écrire, de manière équivalente :

(LOCALITE = 'Toulouse' and COMPTE < 0) or CAT = ’C1’

En revanche, l’expression :

LOCALITE = 'Toulouse' and (COMPTE < 0 or CAT = ’C1’)

a une toute autre interprétation. Une ligne de CLIENT est sélectionnée si elle vérifie simultanément deux conditions : d’une part, (LOCALITE = 'Toulouse'), et d’autre 5. On trouvera aussi de telles conditions dans les clauses check, dans les triggers et dans les procédures SQL, comme nous le verrons dans le chapitre 5.

5.2 Consultation et extraction de données dans une table 73

© Dunod – La photocopie non autorisée est un délit.

part, (COMPTE < 0, ou bien CAT = ’C1’, ou encore les deux conditions simultané-ment). Il sera prudent, même lorsqu’elles ne sont pas strictement nécessaires, d’user de parenthèses dans l’écriture d’expressions complexes afin d’éviter toute ambiguïté d’interprétation.

A l’occasion, trois autres opérateurs pourront être utiles :

• la disjonction exclusive, notée P ⊕ Q (ou exclusif en français, absent d’SQL); cette expression est vraie si un et un seul des arguments est vrai;

• l’implication, notée P ⇒ Q (implique en français, absent d’SQL); cette expression est vraie sauf si P est vrai et Q est faux;

• l’équivalence, notée P ⇔ Q (équivaut à en français, absent d’SQL); cette expression est vraie lorsque P et Q ont la même valeur.

Un opérateur logique est complètement défini par sa table de vérité, qui indique la valeur (vrai ou faux) de l’expression pour chaque combinaison de valeurs des arguments. On rappelle les tables des opérateurs mentionnés ci-dessus.

Son interprétation est la suivante : pour toute combinaison de valeurs de P et Q, la ligne correspondante donne la valeur de vérité de chaque opérateur. Par exemple, si P=vrai et Q=faux, alors P ∨ Q=vrai et P ⇒ Q = faux.

Soient P, Q et R trois conditions élémentaires ou composées. On a les équiva-lences suivantes, qu’on démontre aisément en constatant que les tables de vérité des deux membres sont identiques.

Un Ricard, sinon rien (principe du tiers exclu)

Il n’y pas d’autres valeurs que vrai et faux : ce qui n’est pas vrai est faux et inverse-ment.

¬ vrai ≡ faux r1

¬ faux ≡ vrai r2

Le beurre et l’argent du beurre (complémentarité)6

• (¬ P)P ≡ faux r3

• (¬ P)P ≡ vrai r4

P Q ¬ P ¬ Q PQ PQ PQ PQ PQ

vrai vrai faux faux vrai vrai faux vrai vrai

vrai faux faux vrai faux vrai vrai faux faux

faux vrai vrai faux faux vrai vrai vrai faux

faux faux vrai vrai faux faux faux vrai vrai

6. Pour le sourire de la crémière, il faudra recourir à la logique ternaire, qui sera examinée à la Section 6.10.

Vous n’êtes pas sans "ignorer" (double négation)

¬ (¬ P) ≡ P r5

Schtroumpf vert et vert Schtroumpf (commutativité)

• PQ ≡ QP r6

• PQ ≡ QP r7

Jules et Jim (associativité)

• (PQ)R ≡ P(QR) r8

• (PQ)R ≡ P(QR) r9

Les Restos du coeur (distributivité)

• P(QR) ≡ (PQ)(PR) r10

• P(QR) ≡ (PQ)(PR) r11

Purification ethnique (lois de de Morgan)

¬ (PQ) ≡ (¬ P)(¬ Q) r12

¬ (PQ) ≡ (¬ P)(¬ Q) r13

Ariel ou eau de Javel ? (éléments neutres et absorbants)

• Pvrai ≡ P r14

• Pfaux ≡ faux r15

• Pvrai ≡ vrai r16

• Pfaux ≡ P r17

Les Faussaires

L’implication (), la disjonction exclusive (⊕) et l’équivalence (⇔) n’existent pas en SQL, et doivent donc être remplacées par des expressions équivalentes.

• PQ ≡ (¬ P) Q r18

• PQ ≡ (P ∧ ¬ Q) (¬ PQ) r19

• PQ ≡ (PQ) ∧ ¬ (PQ) r20

• PQ ≡ (PQ) ∨ ¬ (PQ) r21

Ces tables et ces règles définissent la logique binaire (à deux valeurs, vrai et faux) ou cartésienne ou encore du tiers exclu. Nous verrons plus tard que certains aspects du langage SQL s’appuient également sur une logique ternaire, utilisant trois valeurs : vrai, faux et inconnu (section 6.10). Les règles ci-dessus ne sont plus d’application dans cette logique.

Appliquons ces règles à quelques exemples concrets, qu’on exprimera selon la syntaxe SQL.

La négation d’une condition complexe

Considérons d’abord les clients de Toulouse dont le compte est négatif. Les rensei-gnements les concernant peuvent être obtenus par la condition composée :

LOCALITE = 'Toulouse' and COMPTE < 0

5.2 Consultation et extraction de données dans une table 75

© Dunod – La photocopie non autorisée est un délit.

Les clients qui ne tombent pas dans cette catégorie sont caractérisés par la condition inverse, soit :

not (LOCALITE = 'Toulouse' and COMPTE < 0) ou encore, par les lois de de Morgan (r12) :

not (LOCALITE = 'Toulouse') or not (COMPTE < 0) ou, en simplifiant :

LOCALITE <> 'Toulouse' or COMPTE >= 0

L’opérateur d’implication

L’opérateur d’implication (P⇒Q) est plus délicat à manier, en particulier parce que sa définition, telle que précisée dans la table de vérité ci-dessus, ne semble pas toujours conforme à l’intuition7, qui interprète l’implication de manière plus restric-tive. Comme il n’est pas disponible en SQL, nous devrons le traduire à l’aide d’opérateurs plus classiques. A titre d’illustration, recherchons les clients qui, s’ils ont un compte négatif, alors sont aussi de catégorie B1. On peut écrire, en SQL étendu :

(COMPTE < 0) (CAT = 'B1')

L’interprétation est la suivante : si un client a un compte négatif et est de catégorie B1, alors il est sélectionné; bien que ceci soit moins intuitif, on admet aussi que, si son compte n’est pas négatif, alors il est sélectionné quelle que soit sa catégorie. Ou encore : les clients sont sélectionnés s’ils ont un compte non négatif ou s’ils sont de catégorie B1 (règle r18). On peut donc réécrire la condition de sélection de ces clients en SQL pur:

(COMPTE >= 0) or (CAT = 'B1')

L’opérateur ou exclusif

Cet opérateur stipule que l’une des conditions doit être vérifiée, et une seulement, ainsi que l’exprime la règle r19 :

P ⊕ Q ≡ (Q and not P) or (P and not Q)

7. Considérons la loi selon laquelle "s’il pleut, alors la chaussée est mouillée" (P ≡ "il pleut" et Q

≡ "la chaussée est mouillée"). On peut affirmer sans risque que "il pleut et la chaussée n’est pas mouillée" décrit une situation qui viole cette loi, d’où, en toute généralité, (P ∧¬ Q) = faux. On en infère que ¬ (P ∧¬ Q) = vrai. Il vient donc, par application de la règle r12, PQ ≡ (¬ P)

Q. D’où la règle r18.

Recherchons par exemple les clients qui n’ont pas de catégorie ou dont le compte est négatif (mais pas les deux) peut s’écrire :

where ((CAT is null) and (COMPTE >= 0)) or ((CAT is not null) and (COMPTE < 0)) ou encore, selon la règle r20 :

where ((CAT is null) or (COMPTE < 0)) and not ((CAT is null) and (COMPTE < 0))

L’opérateur d’équivalence

L’équivalence (P⇔Q) correspond à une double implication :(PQ)(QP). Cet opérateur renvoie vrai lorsque P et Q ont même valeur, soit, selon la règle r21 :

P ⇔ Q ≡ (Q and P) or not (P or Q)

Recherchons les clients qui, si leur compte est négatif, ont une catégorie du type

’Bx’, et inversement, s’ils ont une telle catégorie, alors leur compte est négatif.

Ceux qui vérifient les deux conditions, ou qui n’en vérifient aucune, sont sélec-tionnés. En revanche, ceux qui ne vérifient qu’une seule de ces conditions sont écartés. On écrira :

where ((COMPTE < 0) and (CAT like ’B_’)) or not ((COMPTE < 0) or (CAT like ’B_’)) ou encore, selon la règle r13 :

where ((COMPTE < 0) and (CAT like ’B_’)) or ((COMPTE >= 0) and (CAT not like ’B_’)) 5.2.7 Données extraites et données dérivées

Les données extraites jusqu’à présent proviennent directement de la base de données. La clause select peut cependant spécifier des données dérivées, ou même des constantes :

select 'TVA de ', NPRO, ' = ',0.21*PRIX*QSTOCK from PRODUIT

where QSTOCK > 500

Cette requête produit un tableau des montants TVA des articles en stock dont la quantité restante est supérieure à 500 unités.

5.2 Consultation et extraction de données dans une table 77

© Dunod – La photocopie non autorisée est un délit.

Lors de l’affichage du résultat, les colonnes reçoivent un nom qui est celui du composant de la clause select. Dans le cas de données dérivées, le nom peut appa-raître encombrant et peu significatif. On pourra alors définir explicitement le nom qui apparaît en début de colonne, ce qu’on appelle un alias de colonne. La formula-tion ci-dessous illustre ce principe :

select NPRO as Produit, 0.21*PRIX*QSTOCK as Valeur_TVA from PRODUIT

where QSTOCK > 500

Dans le document BASES DE DONNÉES ET MODÈLES DE CALCUL (Page 72-77)