IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MySQL Discussion :

Qu'est-ce qu'exactement "non-identify relation" ?


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 218
    Billets dans le blog
    16
    Par défaut SQL et logique trivalente, suite...
    Bonsoir,


    Citation Envoyé par escartefigue
    J'avoue être complètement perdu par cette présentation : j'ai mis en couleur ce qui me semble faux, mais sans doute est-ce du au fait que je n'arrive pas à lire ce tableau
    Quoi qu'il en soit vrai ou inconnu donne vrai et non inconnu
    Dans le tableau que j’ai présenté, vrai ou inconnu donne bien vrai. Je suis désolé si la présentation paraît sibylline, mais c’est celle de C .J. Date (francisée), qu’il fournit ça et là, par exemple à la page 333 de Date on Database: Writings 2000-2006, et qu’il reprend chez Codd, voyez le paragraphe 8.9 « The Three-Valued Logic of RM/V1 », page 236 de l’ouvrage (téléchargeable) The Relational Model for Database Management, Version 2.

    Dans cet ouvrage, la présentation des tables de vérité par Codd est la suivante (francisée) :


    
        A      | NON A
    -----------+--------
       vrai    | faux 
       inconnu | inconnu
       faux    | vrai
    
    
                |           B
                |-------------------------
    A ET B      | vrai    | inconnu | faux
    ------------+---------+---------+-----
      | vrai    | vrai    | inconnu | faux
    A | inconnu | inconnu | inconnu | faux
      | faux    | faux    | faux    | faux
    
    
    
                |           B
                |-------------------------   
    A OU B      | vrai    | inconnu | faux   
    ------------+---------+---------+--------
      | vrai    | vrai    | vrai    | vrai   
    A | inconnu | vrai    | inconnu | inconnu
      | faux    | vrai    | inconnu | faux   
    
    

    Cela dit, votre tableau est vraisemblablement plus facile à lire.



    Citation Envoyé par SQLpro
    SQL étant un langage normalisé, la norme nous dit ceci :
    Les 3 valeurs de tests de la logique ternaire sont :
    •True
    •False
    •Unknown
    On est d’accord, inconnu (unknown) est bien une valeur.



    Citation Envoyé par SQLpro
    Page 24 :
    The data type boolean comprises the distinct truth values true and false.
    Unless prohibited by a NOT NULL constraint, the boolean data type also supports the unknown truth value as the null value.
    CQFD
    Hum... Dans son ouvrage SQL and Relational Theory, au chapitre 4 « No Duplicates, No Nulls », C.J. Date ne manque pas de remettre les pendules à l’heure et montre que cet énoncé est faux, à savoir que Null et la « valeur de vérité unknown » ne sont pas interchangeables.

    Histoire de troller un peu, Je répète ce que j’ai déjà écrit (post #13) à propos de cet énoncé :

    « Comme le note malicieusement Peter Gulutzan (|i]SQL-99 Complete, Really[/i], page 212), selon la norme il revient au même de dire : « Je ne sais pas » et « Je sais que l’information est absente » ! »


    Dans SQL and Relational Theory, Date relève « quelques » inepties et approximations dans SQL en relation avec NULL. Par exemple, je trouve que la remarque suivante qu’il fait est de bon sens et caractérise les approximations de la norme sur le sujet :

    « NOT NULL doesn’t apply to data types, it applies to uses of data types (typically as part of column definition). »


    Il est aussi écrit dans la norme :

    « All boolean data type values and SQL truth values are mutually comparable and assignable. The value true is greater than the value false, and any comparison involving the null value or an unknown truth value will return an unknown result. »

    Je vous renvoie aux commentaires de Date...



    Citation Envoyé par Artemus24
    Nous sommes d'accord sur le fait que la valeur NULL est une marque pour indiquer l'absence de valeur. Inutile de revenir sur ce point.
    Une fois encore, on ne peut pas accoler valeur et NULL.



    Citation Envoyé par Artemus24
    Sauf qu'ici, on substitue Inconnue par NULL ?????
    On n’a pas à substituer. Si l’évaluation d’une expression donne inconnu au lieu de vrai ou faux, le SGBD doit réaliser le marquage. Dans le cas de DB2 for z/OS, marquer à Null consiste à remplacer X'00' par X'FF' dans l’octet de service fait pour ça, associé à chaque cellule concernée.



    Citation Envoyé par Artemus24
    Le OU logique se comporte comme la recherche du maximum dans le classement : Faux < Inconnu < Vrai.
    Le ET logique se comporte comme la recherche du minimum dans le classement : Faux < Inconnu < Vrai.
    Ce qui revient à dire que Faux = 0 et Vrai = 1. Alors Inconnu est une valeur comprise entre 0 et 1.
    Certes. Et cela vaut pour la norme SQL, comme il y est écrit (cf. ci-dessus), « All boolean data type values and SQL truth values are mutually comparable » : « TRUE > FALSE » est donc légal et renvoie TRUE, par contre, selon la norme « TRUE > UNKNOWN » est légal, mais renvoie NULL (UNKNOWN)...



    Citation Envoyé par Artemus24
    si c'est une marque, et bien ce n'est pas une valeur et de ce fait, il ne peut pas être traité dans la logique ternaire de Kleene.
    La logique trivaluée de SQL ou de Codd se contente du domaine (type) booléen étendu à trois valeurs : {vrai, faux, inconnu}.



    Citation Envoyé par Artemus24
    On remarque que la logique binaire est incluse dans la logique ternaire de Kleene.
    Tout comme elle est incluse dans la logique ternaire de Chamberlin, quand celui-ci a défini les tables de vérité de SQL, en 1976, logique qui aurait plus à voir avec celle de Bochvar, même si elle n’en est pas issue : je vous renvoie à l’article de David McGoveran, « Classical Logic: Nothing Compares 2 U », paru en janvier 1994 dans Database Programming & Design. J’en extrais ceci :

    The most common versions of many-valued logic are variations on other systems, such as those developped by Łukasiewicz, Post and Kleene. Variations of Łukasiewicz’s systems are sometimes referred to as the basis for SQL’s 3VL. While this supposition cannot be true,⁴ it is worth examining the properties of the Łukasiewicz systems. Łukasiewicz systems are not truth functionally complete (so the system would not be able to verify some facts using the available operators), nor are they natural extensions of the classical propositional logic. Certain tautologies of the propositional logic cease to be true in the Łukasiewicz systems, and, conversely, certain tautologies of the Łukasiewicz systems have no counterpart in the propositional logic. In our terminology, they are deviants.

    Łukasiewicz’s where intended to treat contingent (especially future contingent) propositions as meaning "temporarily unknown." The "UNKNOWN" in his 3VL is similar to Codd’s A-marks. For example, the truth value of "it will rain tomorrow" would be "UNKNOWN", but would eventually be determined as either "TRUE" or "FALSE". Therefore the Łukasiewicz "UNKNOWN" is a temporary placeholder for a standard truth value. These various facts about Łukasiewicz systems eliminate them from further considerations: They are not candidates for use as a DBMS’s logical system. We can prove that some many-valued logics are truth functionally complete (all are consistent by definition if at least one truth value is undesignated), but have semantics clearly inappropriate for a DBMS. Here are a few examples: in Post’s systems, truth valuations apply only to sets of propositions (that is, sets of rows), each individual proposition having a classical truth valuation, rather than the individual propositions. Kleene had in mind the truth valuations of propositions involving mathematical functions undefined for certain ranges of predicate values. The concept of undefined is similar to the purpose of Codd’s I-marks. Bochvar created a system with a set of "internal" truth tables and a set of "external" truth tables, treating unknown as "undecidable" or "meaningless". This system is similar to SQL in the sense that SQL effectively returns false (the external system) to the user when the answer is unknown (the internal system), but Bochvar’s systems are dissimilar in other respects.

    [...]

    ⁴ Łukasiewicz gave "IMPLIES" and "NOT" as his primitive connectives, deriving "OR" and "AND" from them. His definition of "IMPLIES" is different from that used in the propositional or predicate calculi, which define "P IMPLIES Q" as "NOT P OR Q". In fact, Łukasiewicz ‘s version of "IMPLIES" cannot be derived from the definition of "NOT", "AND", and "OR". This is because "NOT", "AND", and "OR" each preserve "UNKNOWN" from the inputs (and therefore so do any combinations of these), whereas Łukasiewicz version of IMPLIES does not. Since SQL does not define IMPLIES, claims that "it is based on a variant of Łukasiewicz’s 3VL" must be false!

    [...]



    Citation Envoyé par Artemus24
    Si c'est une valeur, alors on peut appliquer la logique ternaire de Kleene.
    A ceci près que, si j’en crois McGoveran, la « troisième valeur de vérité » de Kleene correspond à la marque I-Mark de Codd (traduisible par « sans objet », « inapplicable »). La marque A-Mark (« inconnu », « applicable ») ne serait donc pas prise en considération par Kleene.



    Citation Envoyé par Artemus24
    C'est ce point qui me pose le plus de problème, à savoir traiter la marque comme une valeur.
    On sort de SQL...



    Citation Envoyé par Artemus24
    Un des opérateur qui me pose un problème d'interprétation est le 'IN'.
    Date nous avertit (page 363 de SQL and Relational Theory, Third Edition) qu’à l’origine SQL a été conçu pour ne pas être plaqué sur l’algèbre relationnelle ou sur le calcul relationnel, estimés trop compliqués pour les utilisateurs que nous sommes (avec le temps SQL a grossi et comporte de l’algèbre et du calcul), donc « IN » peut effectivement poser un problème d’interprétation. Néanmoins, on peut l’interpréter comme l’équivalent SQL de l’opérateur d’appartenance à un ensemble « ∈ » (cf. page 91 de l’ouvrage).


    Reprenons la requête :

    
    SELECT P.*
    FROM   P
    WHERE P.Weight NOT IN (SELECT P.Weight
                           FROM   P
                           WHERE  P.City  = 'Oslo') ;
    
    
    La sous-requête renvoie un ensemble, à savoir une table à une seule colonne, censée n’avoir qu’une ligne, donc une seule valeur, mais comme une table est un ensemble, ses éléments sont des lignes (cf. le même ouvrage, page 63). De même, dans « WHERE P.Weight NOT IN », P.Weight est à considérer (Date utilise le terme beaucoup plus fort et précis coerce) comme une expression de ligne (row expression) à une colonne : on compare des lignes avec des lignes.


    Cela dit, (cf. le même ouvrage, page 434) IN peut être remplacé par =ANY et NOT IN par <> (bien que Date recommande de n’en rien faire pour des raisons d’erreurs d’interprétation de notre part, vite arrivées) :

    
    SELECT P.*
    FROM   P
    WHERE P.Weight <> (SELECT P.Weight
                       FROM   P
                       WHERE  P.City  = 'Oslo') ;
    
    
    Maintenant, vous pouvez aussi préférer NOT EXISTS, mais attention ! En SQL, EXISTS n’est pas soumis à la logique trivalente ! Seuls vrai et faux lui sont applicables : attention au résultat ! C’est la surprise garantie... (J'essaierai avec SQL Server).



    Citation Envoyé par Artemus24
    Et rien du tout, ce n'est pas une ligne contenant que des NULL.
    S’attendre un résultat vide est bien légitime, mais MySQL a affiché une ligne où chaque colonne est marquée NULL... Cela dit, la requête suivante renvoie 0 :

    
    SELECT COUNT(*) FROM
    (SELECT P.*
    FROM   P
    WHERE P.Weight NOT IN (SELECT P.Weight
                           FROM   P
                           WHERE  P.City  = 'Oslo')
    )  as truc                     
    ;
    
    

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 925
    Par défaut
    Salut fsmrel.

    Merci de consacrer du temps à mes interrogations.

    Je tiens avant tout à te dire, que je comprends parfaitement comment fonctionne les bases de données.
    Mais ce qui me pose problème, ce sont les choix qui ont été fait et pourquoi cela a été fait ainsi.

    Je reprends les trois tables de vérités de ton dernier messages. Je mets en rouge ce qui appartient à la logique binaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    NON     |                    ET      | vrai    | inconnu | faux           OU      | vrai    | inconnu | faux
    --------+--------            --------+---------+---------+------          --------+---------+---------+-----
    vrai    | faux               vrai    | vrai    | inconnu | faux           vrai    | vrai    | vrai    | vrai
    inconnu | inconnu            inconnu | inconnu | inconnu | faux           inconnu | vrai    | inconnu | inconnu
    faux    | vrai               faux    | faux    | faux    | faux           faux    | vrai    | inconnu | faux
    1) interprétation de la logique ternaire.
    Si on extrait ce qui est en rouge de ce tableau, il reste :
    --> Faux ET Inconnu = Faux
    --> Vrai OU Inconnu = Vrai

    Quand on rencontre Vrai dans un OU logique, il est inutile de poursuivre l'analyse de la condition, car le résultat final de la condition sera Vrai.
    Quand on rencontre Faux dans un ET logique, il est inutile de poursuivre l'analyse de la condition, car le résultat final de la condition sera Faux.
    De ce fait, la valeur Inconnu n'est même pas traité !

    Dans les autres cas, on trouve inconnu
    --> Vrai ET Inconnu = Inconnu
    --> Faux OU Inconnu = Inconnu
    --> NON Inconnu = Inconnu

    La logique qui en découle est de le considérer Inconnu comme la valeur intermédiaire entre Vrai et Faux.
    Le OU logique se comporte comme la recherche du maximum dans le classement : Faux < Inconnu < Vrai.
    Le ET logique se comporte comme la recherche du minimum dans le classement : Faux < Inconnu < Vrai.
    Ce qui revient à dire que Faux = 0 et Vrai = 1. Alors Inconnu est une valeur comprise entre 0 et 1.
    Autrement dit la logique ternaire est une logique multivaluée basée sur une classification de la grandeur des valeurs.

    2) On remarque que la logique binaire est incluse dans la logique ternaire de Kleene.
    Autrement dit, la logique ternaire de Kleene est une extension de la logique binaire.
    Aucune ambiguïté, tant que nous sommes dans des valeurs connues (logique binaire)
    Aucun ambiguïté, tant que l'on considère que nous sommes dans une logique et que nous avons bien trois valeurs identifiée.

    Nous sommes d'accord sur le fait que la valeur NULL est une marque pour indiquer l'absence de valeur. Inutile de revenir sur ce point.

    Sauf qu'ici, on substitue Inconnue par NULL ?????
    Selon le contexte, le NULL prend le sens soit de valeur, soit de marque.
    Il s'agit de l'ambiguïté que je tiens à signaler.

    3) si c'est une marque, et bien ce n'est pas une valeur et de ce fait, il ne peut pas être traité dans la logique ternaire de Kleene.
    C'est ce point qui me pose le plus de problème, à savoir traiter la marque comme une valeur.
    NULL est une absence de valeur et devrait être ignorée.

    4) si c'est une valeur, alors on peut appliquer la logique ternaire de Kleene. Par exemple, sous MySql, nous obtenons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    --------------
    select null or true, null or false, null and true, null and false, not null
    --------------
     
    +--------------+---------------+---------------+----------------+----------+
    | null or true | null or false | null and true | null and false | not null |
    +--------------+---------------+---------------+----------------+----------+
    |            1 |          NULL |          NULL |              0 |     NULL |
    +--------------+---------------+---------------+----------------+----------+
    Ici, et tu ne pourras pas dire le contraire, le NULL est bien considéré comme une valeur !!!

    5) et c'est là où je voulais arriver. Un SGBD traite de la théorie des ensembles.
    Les jointures sont l'exemple le plus frappant avec l'union, l'intersection, la différence ...

    Un des opérateur qui me pose un problème d'interprétation est le 'IN'. Selon moi, il s'agit bien de l'opérateur d'appartenance.
    Comment dois-je l'interpréter ? Et en particulier dans le cas du 'NOT IN' ?
    Toujours d'après moi, je traduis cela par : le complémentaire de la liste données par le 'IN'.
    Je sélectionne toutes les lignes ayant dans la colonne weight autre chose que le NULL.

    Si je reprends ton exemple, je devrais d'après moi, obtenir tous les lignes ne contenant pas NULL dans la colonne 'Weight'.
    Or le résultat produit n'est pas non plus ce que tu indiques, puisque en faisant le test sous MySql, je n'obtiens rien du tout.
    Et rien du tout, ce n'est pas une ligne contenant que des NULL.

    Alors je ne sais plus quoi penser. Théorie des ensembles ou logique ternaire ?
    Voici ce que j'obtiens sous MySql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    create table `test` (
      `Pno`        char(03)    NOT NULL PRIMARY KEY,
      `Pname`   varchar(16)    NOT NULL,
      `Color`   varchar(16)    NOT NULL,
      `Weight`  decimal(5,1)       NULL,
      `City`    varchar(16)    NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`Pno`,`Pname`,`Color`,`Weight`,`City`) values
      ('P1', 'Nut',   'Red',   12.0, 'London'),
      ('P2', 'Bolt',  'Green', 17.0, 'Paris'),
      ('P3', 'Screw', 'Blue',  null, 'Oslo'),
      ('P4', 'Screw', 'Red',   14.0, 'London'),
      ('P5', 'Cam',   'Blue',  12.0, 'Paris'),
      ('P6', 'Cog',   'Red',   19.0, 'London')
    --------------
     
    --------------
    select * from test
    --------------
     
    +-----+-------+-------+--------+--------+
    | Pno | Pname | Color | Weight | City   |
    +-----+-------+-------+--------+--------+
    | P1  | Nut   | Red   |   12.0 | London |
    | P2  | Bolt  | Green |   17.0 | Paris  |
    | P3  | Screw | Blue  |   NULL | Oslo   |
    | P4  | Screw | Red   |   14.0 | London |
    | P5  | Cam   | Blue  |   12.0 | Paris  |
    | P6  | Cog   | Red   |   19.0 | London |
    +-----+-------+-------+--------+--------+
    --------------
    SELECT *
    FROM   test as t
    WHERE  t.Weight NOT IN (SELECT x.Weight
                            FROM   test as x
                            WHERE  x.City  = 'Oslo')
    --------------
     
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Pourquoi selon le contexte, le NULL est soit une marque ou soit une valeur ?

    @+

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Sauf qu'ici, on substitue Inconnue par NULL ?????
    SQL étant un langage normalisé, la norme nous dit ceci :
    Les 3 valeurs de tests de la logique ternaire sont :
    • True
    • False
    • Unknown


    http://webdocs.cs.ualberta.ca/~yuan/...075-2-1999.pdf
    Page 24 :
    The data type boolean comprises the distinct truth values true and false.
    Unless prohibited by a NOT NULL constraint, the boolean data type also supports the unknown truth value as the null value.


    CQFD

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 925
    Par défaut
    Salut à tous.

    @ SqlPro : c'est juste une question de terminologie qui me perturbe.
    Quand on est en mathématique, on parle plutôt de "indéterminé" ou indécidabilité".
    Dans les bases de donnés, on parle plutôt de "inconnu".

    Ensuite, tu soulèves un autre problème, celui de l'aceptation de la valeur NULL (inconnu) dans un booléen (enfin je devrais plutôt parler d'une variable logique).
    D'après sa définition, une variable logique ne peut prend que deux valeurs possibles soit Vrai (True), ou soit Faux (False).
    --> https://fr.wikipedia.org/wiki/Bool%C3%A9en

    Je cite Fsmrel issu du poste #13 :
    Citation Envoyé par Fsmrel
    (1) La notion de « valeur nulle » est un non-sens. Null est seulement un moyen SQL, une marque, pour justement exprimer l’absence de valeur pour une colonne
    où je suis totalement d'accord avec cette remarque.

    Cela ne signifie pas pour autant que nous nous trouvons dans une logique ternaire de Kleene !

    Citation Envoyé par Escartefigue
    J'avoue être complètement perdu par cette présentation : j'ai mis en couleur ce qui me semble faux, mais sans doute est-ce du au fait que je n'arrive pas à lire ce tableau
    Les tables de vérités sont justes !

    C'est une table à deux entrées.
    (1) : En ligne (en blue), c'est le premier paramètre.
    (2) : En colonne (en marron), c'est le second paramètre.
    En rouge, c'est le résultat de (1) OR (2).
    Dans l'exemple, il s'agit de : "inconnu OR Faux" et l'on obtient comme résultat : "inconnu".
    Le résultat est correcte !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    OU      | vrai    | inconnu | faux
    --------+---------+---------+-----
    vrai    | vrai    | vrai    | vrai
    inconnu | vrai    | inconnu | inconnu
    faux    | vrai    | inconnu | faux
    @+

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 641
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Artemus24 Voir le message

    C'est une table à deux entrées.
    (1) : En ligne (en blue), c'est le premier paramètre.
    (2) : En colonne (en marron), c'est le second paramètre.
    En rouge, c'est le résultat de (1) OR (2).
    Dans l'exemple, il s'agit de : "inconnu OR Faux" et l'on obtient comme résultat : "inconnu".
    Le résultat est correcte !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    OU      | vrai    | inconnu | faux
    --------+---------+---------+-----
    vrai    | vrai    | vrai    | vrai
    inconnu | vrai    | inconnu | inconnu
    faux    | vrai    | inconnu | faux
    OK, je ne suis pas coutumier de cette présentation, du coup je suis d'accord avec le tableau de Fsmrel
    Mais connaissant le niveau d'expertise de ce dernier, le contraire m'eut étonné
    Merci pour cette explication de texte Artemus

  6. #6
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 925
    Par défaut
    Salut Escartefigue.

    Citation Envoyé par Escartefigue
    OK, je ne suis pas coutumier de cette présentation, du coup je suis d'accord avec le tableau de Fsmrel
    Et quel genre de présentation aurais-tu voulu ?

    @+

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 641
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Salut Escartefigue.


    Et quel genre de présentation aurais-tu voulu ?

    @+
    du classique, voir mon post n° 22

  8. #8
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 925
    Par défaut
    Salut à tous.

    Citation Envoyé par Fsmrel
    Cela dit, votre tableau est vraisemblablement plus facile à lire.
    Question d'habitude.

    Citation Envoyé par Fsmrel
    Hum... Dans son ouvrage SQL and Relational Theory, au chapitre 4 « No Duplicates, No Nulls », C.J. Date ne manque pas de remettre les pendules à l’heure et montre que cet énoncé est faux, à savoir que Null et la « valeur de vérité unknown » ne sont pas interchangeables.
    Voilà un argument qui va dans mon sens ! On progresse.

    Citation Envoyé par Fsmrel
    « Comme le note malicieusement Peter Gulutzan (|i]SQL-99 Complete, Really[/i], page 212), selon la norme il revient au même de dire : « Je ne sais pas » et « Je sais que l’information est absente » ! »
    Justement, je ne suis pas d'accord avec cela.
    Une absence de valeur ne signifie pas qu'elle n'existe pas. Donc absence de valeur n'est pas "synonyme" de "inconnu".

    The value true is greater than the value false, and any comparison involving the null value or an unknown truth value will return an unknown result.
    Pour la première partie du message, je suis d'accord. Surtout quand je parle du classement : Faux < inconnu < Vrai, avec Faux = 0 et Vrai = 1.
    Mais pour la seconde affirmation, soit je n'ai rien compris, soit elle est fausse. Exemple : Vrai OU NULL retourne bien Vrai.

    Citation Envoyé par Fsmrel
    On n’a pas à substituer.
    Je ne substitue rien du tout. Ce sont les théoriciens qui ont fait le choix de remplacer inconnu par NULL. Et je continue d'affirmer que c'est une erreur d'interprétation.
    Inconnu est une valeur, tandis que NULL est une marque.

    Citation Envoyé par Fsmrel
    Certes. Et cela vaut pour la norme SQL
    Encore heureux qu'ils appliquent correctement la logique ternaire de Kleene.

    Citation Envoyé par Fsmrel
    La logique trivaluée de SQL ou de Codd se contente du domaine (type) booléen étendu à trois valeurs : {vrai, faux, inconnu}.
    Et bien non. c'est {vrai, faux, null}. Ici, null est traité comme une valeur d'où l'ambiguïté que je signale depuis le début.
    Et un booléen ne prend que deux états possibles Vrai ou Faux.

    so the system would not be able to verify some facts using the available operators
    Voilà une incohérence que je tiens à signaler.

    nor are they natural extensions of the classical propositional logic.
    Exactement ce que je dis depuis le début.

    They are not candidates for use as a DBMS’s logical system.
    Et voici la confirmation.

    treating unknown as "undecidable" or "meaningless".
    Ce qui n'est pas le sens du NULL.

    Lukasiewicz gave "IMPLIES" and "NOT" as his primitive connectives, deriving "OR" and "AND" from them.
    L'implication mathématique est une notion floue. En fait, il y a trois définition différente de ce même concept.

    1) l'implication logique. C'est l'opérateur que l'on utilise pour le calcul des propositions.
    C'est la plus simple à comprendre et il n'y a aucun ambiguïté. Elle se note "A => B" et se traduit par "NON A OU B" et on a quatre résultats différents :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      A  |   B  || A => B |
    =====+======++========+
    Faux | Faux ||  Vrai  |
    Faux | Vrai ||  Vrai  |
    Vrai | Faux ||  Faux  |
    Vrai | Vrai ||  Vrai  |
    @ Escartefigue : je préfère cette présentation sous forme de colonnes. Toi aussi, je crois.

    2) l'implication mathématique. Qui est un cas particulier de l'implication logique. Mais on la confond aussi avec la troisième implication que l'on nomme "modus ponens", d'où une ambiguïté sur son interprétation.
    Ici, l'implication est nécessairement vrai. C'est l'hypothèse de la définition mathématique.
    Mais à l'inverse du Modus Ponens, il n'y a aucune déducrion à faire. On se retrouve avec trois résultats que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      A  |   B  || A => B |
    =====+======++========+
    Faux | Faux ||  Vrai  |
    Faux | Vrai ||  Vrai  |
    Vrai | Vrai ||  Vrai  |
    Celle où justement l'implication est vrai.

    3) le Modus ponens qui est un raisonnement logique basé sur l'opérateur implication et qui se traduit par "si A alors B".
    Là encore, aucune ambiguïté car cela se traduit par : "A est vrai, A => B est vrai, je déduis alors que B esr Vrai".
    Cela se traduit par le tableau suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      A  |   B  || A => B |
    =====+======++========+
    Vrai | Vrai ||  Vrai  |
    Voici un lien qui explique le problème et la confusion que l'on fait en mathématique de ce que l'on nomme parfoit à tort l'implication : http://xn--georges-barthlemy-ntb.fr/...A9matiques.pdf
    Ou bien devrais-je plutôt dire, que son enseignement porte parfois à confusion.

    Citation Envoyé par Fsmrel
    A ceci près que, si j’en crois McGoveran, la « troisième valeur de vérité » de Kleene correspond à la marque I-Mark de Codd (traduisible par « sans objet », « inapplicable »). La marque A-Mark (« inconnu », « applicable ») ne serait donc pas prise en considération par Kleene.
    S'il y a une subtilité, je ne la comprends pas.

    Je vais essayer de mieux me faire comprendre.
    Soit la proposition suivante : "demain, il va pleuvoir". Après un calcul basé sur la météorologie, on trouve que le résultat est de 70%.
    Cela se traduit par 70% il va pleuvoir et 30% il va faire beau. Je suis dans l'incapacité de savoir si je dois prendre mon parapluie pour demain ou pas.
    Nous sommes bien dans un calcul de probabilité et dans une totale indécidabilité sur la certitude du choix à prendre. Et cela répond à une logique ternaire !

    Inversement, le NULL n'est porteur d'aucune information sur la prise de décision à prendre. On ne sait rien à son sujet.

    Citation Envoyé par Fsmrel
    On sort de SQL...
    Tout au contraire, on est au cœur du problème.

    Il est difficile de dire ce qui est correcte ou pas, car chaque SGBD à ses propres spécificités.
    Seul le respect de la norme permet d'avoir un consensus sur ce qu'il faut faire.
    Mais être en conformité avec la norme, n'a pas la garantie d'être dans le respect d'une logique mathématique.

    Citation Envoyé par Fsmrel
    Date nous avertit (page 363 de SQL and Relational Theory, Third Edition) qu’à l’origine SQL a été conçu pour ne pas être plaqué sur l’algèbre relationnelle ou sur le calcul relationnel, estimés trop compliqués pour les utilisateurs que nous sommes
    A bon ????

    Citation Envoyé par Fsmrel
    donc « IN » peut effectivement poser un problème d’interprétation. Néanmoins, on peut l’interpréter comme l’équivalent SQL de l’opérateur d’appartenance à un ensemble « ∈ » (cf. page 91 de l’ouvrage).
    C'est bien le cas. Et pourtant, il ne fonctionne pas comme l'opérateur d'apartenance.
    Dans le cas de la théorie des ensemble, le NULL serait plus un équivalent de l'ensemble vide.

    @+

Discussions similaires

  1. Bug d'affichage non identifié. . .
    Par TheReturnOfMuton dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 21/06/2006, 20h25
  2. Réponses: 4
    Dernier message: 13/05/2006, 11h18
  3. probleme de non identifier (Run On Server) sur tomcat
    Par subzero82 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 12/05/2006, 19h08
  4. Réponses: 3
    Dernier message: 07/10/2005, 09h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo