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 :

La clause AND


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut La clause AND
    Bonjour,

    Je souhaite afficher quels auteurs ont travaillé chez 'maisonculture' et 'centrejeunesse' depuis au moins 5 ans ?

    Voici en partie ma table Author:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    noAuthor     lieu                         experience  
    1               maisonculture           5
    1               centrejeunesse         10
    2               centrejeunesse         3
    2               maisonculture           12
    Normalement je dois obtenir: l'author 1.

    mais le code suivant me retourne aucun résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT  Author.noAuthor 
    FROM Author
    Where Author.experience>=5 and (Author.lieu='maisonculture' and Author.lieu='centrejeunesse');
    J'ai essayé avec un between, mais ça ne change rien.

    Avez-vous des idées ?

    Merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    L'article complet de SQLPro sur cette problématique : http://sqlpro.developpez.com/cours/divrelationnelle/

    Pour votre cas précis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT A.noAuthor 
    FROM Author AS A
    WHERE EXISTS (SELECT null from Author AS A1
                  WHERE A1.noAuthor = A.noAuthor 
                  AND A1.lieu = 'maisonculture'
                  AND A1.experience >= 5)
    AND EXISTS (SELECT null from Author AS A2
                WHERE A2.noAuthor = A.noAuthor 
                AND A2.lieu = 'centrejeunesse'
                AND A2.experience >= 5)
    On pourrait d'ailleur gagner une condition vu qu'il s'agit de la même table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT A.noAuthor 
    FROM Author AS A
    WHERE A.lieu = 'maisonculture'
    AND A.experience >= 5
    AND EXISTS (SELECT null from Author AS A2
                WHERE A2.noAuthor = A.noAuthor 
                AND A2.lieu = 'centrejeunesse'
                AND A2.experience >= 5)

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 390
    Points
    28 390
    Par défaut
    Par ailleurs, AND n'est pas une clause mais un opérateur

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par Waldar Voir le message
    L'article complet de SQLPro sur cette problématique : http://sqlpro.developpez.com/cours/divrelationnelle/

    On pourrait d'ailleur gagner une condition vu qu'il s'agit de la même table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT A.noAuthor 
    FROM Author AS A
    WHERE A.lieu = 'maisonculture'
    AND A.experience >= 5
    AND EXISTS (SELECT null from Author AS A2
                WHERE A2.noAuthor = A.noAuthor 
                AND A2.lieu = 'centrejeunesse'
                AND A2.experience >= 5)
    Tout un sport pour faire une requête qui pourtant me semblait simple.

    Merci bien, et surtout merci pour l'article intéressant.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 : 21 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    Plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT noAuthor 
    FROM   Author
    WHERE  experience >= 5 
    AND    lieu = 'maisonculture'
    INTERSECT
    SELECT noAuthor 
    FROM   Author
    WHERE  experience >= 5 
    AND    lieu = 'centrejeunesse';
    A +

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT noAuthor 
    FROM   Author
    WHERE  experience >= 5 
    AND    lieu = 'maisonculture'
    INTERSECT
    SELECT noAuthor 
    FROM   Author
    WHERE  experience >= 5 
    AND    lieu = 'centrejeunesse';
    A +
    En effet

  7. #7
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 783
    Points : 3 036
    Points
    3 036
    Par défaut
    Citation Envoyé par persia Voir le message
    (Author.lieu='maisonculture' and Author.lieu='centrejeunesse');
    Petite remarque pour vous aider à comprendre pourquoi cela ne fonctionnera pas comme vous l'écrivez : vous demander à trouver les enregistrements dont le lieu est 'maisonculture' ET 'centrejeunesse' or ceci est impossible : c'est soit l'un soit l'autre.

    Ceci est une erreur de langage : en Français, on peut s'autoriser à dire "Donnez-moi la liste des gens qui habitent à Paris et à Bruxelles". Tout le monde comprendra qu'il faut la liste des Parisiens et la liste des Bruxellois. En informatique, ce type de "et" doit être traduit en OR.

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 741
    Points
    11 741
    Par défaut
    Pour creuser la piste linguistique... ce n'est pas une erreur de langage, mais deux logiques différentes. Quand je dis "Donnez-moi la liste des gens qui habitent à Paris et à Bruxelles", je raisonne (explicitement) en termes de populations. Si on voulait traduire ça en SQL, ce serait Parisiens UNION Bruxellois.

    Si maintenant on va dans la clause WHERE, on ne raisonne plus en termes de populations, mais selon les conditions qui définissent ces populations. Et effectivement, une UNION sur des populations se traduit par un OR sur des conditions.

  9. #9
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 783
    Points : 3 036
    Points
    3 036
    Par défaut
    J'ai enseigné la rédaction de queries à des adultes dont l'informatique n'était pas forcément leur tasse de thé. L'exemple que j'ai donné est, typiquement, le genre d'erreur (bien volontaire) que je faisais en leur demandant de créer des queries.

    Au début, tous se faisaient avoir et tous commettaient l'erreur du AND jusqu'au moment ou, oui, ils ont commencé à traduire en opérateur OR.

  10. #10
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 091
    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 091
    Points : 31 510
    Points
    31 510
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par cavo789 Voir le message
    tous commettaient l'erreur du AND jusqu'au moment ou, oui, ils ont commencé à traduire en opérateur OR.
    Reprenons la formulation initiale de persia :
    «Je souhaite afficher quels auteurs ont travaillé chez 'maisonculture' et 'centrejeunesse'.»
    Si l’on vous suit, on aurait tendance à reformuler la chose ainsi :
    Je souhaite afficher quels auteurs ont travaillé chez 'maisonculture' ou 'centrejeunesse'.
    Ce qui évidemment n’est pas le but de la manœuvre.

    Quand persia code :
    WHERE ... Author.lieu='maisonculture' AND Author.lieu='centrejeunesse' ;
    Il demande au système de rechercher dans la table Author chaque ligne vérifiant une double condition qui ne peut être satisfaite que dans un univers quantique, façon chat de Schrödinger.

    En réalité, persia doit demander au système de réaliser un ensemble d'opérations que l'on peut décrire ainsi :

    1) Produire un 1er ensemble E1, dont les éléments sont les auteurs pour lesquels, dans la table Author, la condition Author.lieu='maisonculture' est vérifiée,

    2) Produire un 2e ensemble E2, dont les éléments sont les auteurs pour lesquels, dans la table Author, la condition Author.lieu='centrejeunesse' est vérifiée,

    3) Au final, produire un ensemble E3 dont les éléments appartiennent à la fois à E1 et E2. Il s'agit donc d'une intersection.

    => Ainsi, la bonne formulation est celle de SQLpro.

    Je rappelle ce que dit la théorie relationnelle :

    Soit a et b deux relations de même type.

    L’intersection de ces relations, a INTERSECT b, est une relation du même type, dont le corps est constitué de tous les tuples t tels que t apparaît à la fois dans a ET dans b.
    L’union de ces relations, a UNION b, est une relation du même type, dont le corps est constitué de tous les tuples t tels que t apparaît dans a OU b ou les deux.

    (Traduisez relation par valeur de table et tuple par ligne).

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par cavo789 Voir le message
    Petite remarque pour vous aider à comprendre pourquoi cela ne fonctionnera pas comme vous l'écrivez : vous demander à trouver les enregistrements dont le lieu est 'maisonculture' ET 'centrejeunesse' or ceci est impossible : c'est soit l'un soit l'autre.

    Ceci est une erreur de langage : en Français, on peut s'autoriser à dire "Donnez-moi la liste des gens qui habitent à Paris et à Bruxelles". Tout le monde comprendra qu'il faut la liste des Parisiens et la liste des Bruxellois. En informatique, ce type de "et" doit être traduit en OR.
    Mais en informatique il existe la notion de AND

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par fsmrel Voir le message

    1) Produire un 1er ensemble E1, dont les éléments sont les auteurs pour lesquels, dans la table Author, la condition Author.lieu='maisonculture' est vérifiée,

    2) Produire un 2e ensemble E2, dont les éléments sont les auteurs pour lesquels, dans la table Author, la condition Author.lieu='centrejeunesse' est vérifiée,

    3) Au final, produire un ensemble E3 dont les éléments appartiennent à la fois à E1 et E2. Il s'agit donc d'une intersection.
    SqlPro à déjà traduit ça en une requette sql, mais merci comme même pour les détails

  13. #13
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 091
    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 091
    Points : 31 510
    Points
    31 510
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par persia Voir le message
    SqlPro à déjà traduit ça en une requette sql
    C'est bien la remarque que j'avais faite dans mon message précédent, en concluant le détail des opérations que vous citez :
    Ainsi, la bonne formulation est celle de SQLpro.

Discussions similaires

  1. Réponses: 7
    Dernier message: 28/04/2017, 13h47
  2. LEFT JOIN et l'ajout d'une clause AND
    Par aelmalki dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/08/2013, 17h14
  3. clause and / OR
    Par gancau dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2010, 15h52
  4. FORMS 10G - "From Clause Query" and :value
    Par rdemolin dans le forum Forms
    Réponses: 6
    Dernier message: 05/02/2009, 16h47
  5. est-ce que la clause AND IF existe?
    Par dirtyjs dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/10/2006, 22h46

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