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

Langage SQL Discussion :

sql AND & OR difference


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 2
    Par défaut sql AND & OR difference
    bonjour
    svp je veut savoir la différence de résultat entre ces deux requêtes au niveau d'utilisation du AND et OR

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT max(sapod) INTO :gpod FROM sg10lf, sa18lf WHERE      
    sapsq=sgpsq and SGNR1 not like 'COMM%' and 
    sgnr1 not like'FRAIS%' and sgnr1 not like'FR %' and sgnr1 not like'DIVID%'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT max(sapod) INTO :gpod FROM sg10lf, sa18lf WHERE      
    sapsq=sgpsq and (SGNR1 not like 'COMM%' or sgnr1 not like'FRAIS%' 
    or sgnr1 not like'FR %' or sgnr1 not like'DIVID%'  )
    merci d'avance

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Tables de vérités

    A--B--(A AND B)--(A OR B)
    1--0------0----------1
    1--1------1----------1
    0--0------0----------0
    0--1------0----------1

    Dans la première requête, il faut que 'sgnr1' soit différent de tous les cas cités
    alors que dans la deuxième il suffit que 'sgnr1' soit différent d'un seul cas pour que la parenthèse soit vraie.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 2
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Tables de vérités

    A--B--(A AND B)--(A OR B)
    1--0------0----------1
    1--1------1----------1
    0--0------0----------0
    0--1------0----------1

    Dans la première requête, il faut que 'sgnr1' soit différent de tous les cas cités
    alors que dans la deuxième il suffit que 'sgnr1' soit différent d'un seul cas pour que la parenthèse soit vraie.


    merci mais dans certain cas le résultat est différente par exple

    sgnr1=COMM IMP EFFET BQE H

    le résultat est différent entre ces deux requêtes

  4. #4
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Relis bien la réponse de CinePhil...

    Allez, on va donner un exemple.

    1)Que ceux qui sont ni informaticien, ni humain lèvent la main !
    2)Que ceux qui ne sont soit non-informaticien, soit non-humain, lèvent la main !

    Premier cas, comme t'es humain tu lèves pas la main.
    Deuxième cas, tu lèves la main...

    (Squelettor l'informaticien serait passé dans les mêmes filtres pour les raisons inverses)
    (Je te taquine un peu, c'est pas méchant, hein !)

  5. #5
    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
    Bonsoir,

    mmbmm, considérez les tables de vérité fournie par Cinephil, en interprétant 1 et 0 respectivement comme VRAI et FAUX.

    Complétons ces tables pour tenir compte de l’opérateur NOT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A | NOT A
    --|------
    1 |  0
    0 |  1
    Utilisons les symboles suivants pour les opérateurs :
    + pour OR
    * pour AND
    ¬ pour NOT
    Utilisons les symboles suivants :
    A pour SAPSQ = SGPSQ
    B pour SGNR1 LIKE 'COMM%'
    C pour SGNR1 LIKE 'FRAIS%'
    D pour SGNR1 LIKE 'FR %'
    E pour SGNR1 LIKE 'DIVID%'
    Dans votre 1re requête, la clause WHERE revient donc à ceci :

    (1) A * ¬B * ¬C * ¬D * ¬E

    Et pour la 2e requête :

    (2) A (¬B + ¬C + ¬D + ¬E)

    Selon les tables de vérité, si la valeur de vérité de A est FAUX, celle du résultat final est FAUX.
    Si la valeur de vérité de A est VRAI, celle du résultat final dépend seulement des valeurs de vérité de B, C, D et E, auquel cas (1) et (2) peuvent être simplifiés :

    (3) ¬B * ¬C * ¬D * ¬E

    et

    (4) ¬B + ¬C + ¬D + ¬E

    Si par exemple la valeur de vérité est VRAI pour B et FAUX pour C, D et E, (3) prend la valeur de vérité :

    (5) ¬VRAI * ¬FAUX * ¬FAUX * ¬FAUX

    c'est-à-dire

    (6) FAUX * VRAI * VRAI * VRAI

    donc

    (7) FAUX.

    En revanche, (4) prend la valeur de vérité :

    (8) ¬VRAI + ¬FAUX + ¬FAUX + ¬FAUX

    c'est-à-dire

    (9) FAUX + VRAI + VRAI + VRAI

    donc

    (10) VRAI

    Il y a quand même une différence notoire entre (7) et (10)...

    En y regardant de plus près, d'après votre requête, si la valeur de vérité de B est VRAI, celle de C, D et E est nécessairement FAUX puisque l'on ne peut pas vérifier simultanément SGNR1 LIKE 'COMM%' et SGNR1 LIKE 'FRAIS%', etc.
    Autrement dit, les variables B, C, D et E ne sont pas indépendantes les unes des autres, mais au final, ceci n'a pas d'incidence sur la valeur de vérité du résultat.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/05/2012, 10h52
  2. [MySQL] Requete sql avec 2 id different mais qui utilise la meme table
    Par guigui69 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 05/11/2008, 16h32
  3. [SQL] extraire les enregistrements différents de 2 tables (access 2000)
    Par DonQuiShoote dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 29/11/2006, 08h58
  4. [SQLEXP2005]difference SQL server and express
    Par clovis dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/08/2006, 17h38
  5. SQL :select et AND
    Par Shabata dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/05/2003, 13h39

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