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 :

Questions sur les Jointures et sur le "AND"


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Questions sur les Jointures et sur le "AND"
    Bonjour à vous ,


    Je débute en SQL et j'ai certaines difficultés avec l'ordre dans lequel je dois placer mes instructions après le WHERE ,

    1) Est-ce que les conditions que je place sur les jointures on un ordre qui importe , c'est à dire , est-ce que les deux ecritures suivantes sont équivalentes ?
    Je cite la consigne onnez la liste des noms d'articles commandés par les habitants de paris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT NOMA                                                                                                                 SELECT NOMA
    FROM ARTICLE A , DetailCo D, Commande C , Client Cl                                                           FROM ARTICLE A , DetailCo D, Commande C , Client Cl
    WHERE VILC='PARIS'                                                                                                          WHERE  A.codeart=D.codeart
    AND A.codeart=D.codeart                                                                                                   and Vilc='Paris'
    and D.numcom=C.numcom                                                                                                 and D.numcom=C.numcom
    and C.codecli=Cl.codecli                                                                                                                                    and C.codecli=Cl.codecli
    Quand est-ce que je suis supposée mettre le conditions portant sur une jointure , avant ou après avoir déclaré cette jointure ?



    2) Lorsque je fais plusieurs jointures d'affilés , est-ce que je suis censée partir des jointures qui sont tous en bas du schéma que j'aurai fais à la main , de manière à partir de l'élément rechercher et à remonter petit a petit vers le haut ?
    Je ne sais pas si ma questions est claire , j'ai fais un petit schéma : voir lien


    En gros mes questions portent sur l'odre de déclaration après une jointure , je ne sais pas s'il y a un ordre a respecté ou si celui ci n'a pas d'importance ,
    excusez moi de ces questions qui peuvent paraitre stupide , j'ai commencé le SQL il y a deux semaines

    Merci à vous , bonne journée
    Images attachées Images attachées  

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 126
    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 126
    Points : 38 509
    Points
    38 509
    Billets dans le blog
    9
    Par défaut
    bonjour,
    Ce sont les conditions de jointure qui comptent et non l'ordre dans lequel vous les décrivez.

    De plus, il est préférable de distinguer les critères de jointure (JOIN) des critères de filtrage (WHERE)

    Ainsi, votre requête devrai ressembler à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT  ART.Noma
            DET.Detailco
            CLI.Client 
    FROM ARTICLE as ART
    INNER JOIN DETAILCO as DET 
       ON DET.codeart= ART.Codeart
      AND DET.xxxx   = ART.yyyyy
      AND etc...
    INNER JOIN CLIENT as CLI 
       ON CLI.numcom = DET.numcom
      AND etc...
    WHERE CLI.VILC='PARIS' 
      AND DET.xxxx etc...
    Si vous utilisez INNER JOIN vous aurez l'intersection des éléments communs aux tables jointes
    Si vous utilisez LEFT ou RIGHT OUTER JOIN vous aurez tous les éléments de la table INNER, et les éléments de la table OUTER si présents, NULL si absents
    Si vous utilisez FULL OUTER JOIN vous appareillez les 2 tables qu'il y ait correspondance ou non

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci à vous de votre réponse complète , en effet je n'ai utilisé que des jointures simples car le professeur nous a demandé de commencer avec cet écriture afin d'éviter les erreurs dans notre prochain contrôle , c'est un peu une ecriture très simplifiée , même si nous avons quand meme abordés les autres jointures que vous avez précisés dans votre réponse ,

    je pense avoir encore une derniere question , il semble que dans nos exemples , parfois il est possible de ne pas transcrire une jointure existante , pourquoi donc*?
    Voici l'exemple en question


    En sachant que dans l'énoncé*:

    Client(Codecli,nomc,catc,vilc)
    Article(Codeart,noma,couleur,Qtestk)
    Commande(NUMCOM,#codecli,Datecom)
    Detaico(#numcom,#codeart,qtecom)

    La consigne est*: donnez la liste des articles (CODEART,NOMA) de couleur mauve qui n'ont jamais été commandé*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select A.codeart,A.noma
    From Article
    Where codeart not in (Select codeart 
                                       FROM detailco)
    and couleur='mauve'

    pourquoi n'a-t-on pas fais sur A.codeart une jointure avec «*lui même*» afin de récupérer le nomA , car lors de la soustraction nous faisons une projection sur codeart et donc nous ne pouvons pas récuperer après cette soustraction le nomA de l'article*.
    Images attachées Images attachées  

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 126
    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 126
    Points : 38 509
    Points
    38 509
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par nihon96 Voir le message
    En sachant que dans l'énoncé*:

    Client(Codecli,nomc,catc,vilc)
    Article(Codeart,noma,couleur,Qtestk)
    Commande(NUMCOM,#codecli,Datecom)
    Detaico(#numcom,#codeart,qtecom)

    La consigne est*: donnez la liste des articles (CODEART,NOMA) de couleur mauve qui n'ont jamais été commandé*:
    On peut faire comme vous le proposez avec une requete not in, l'inconvénient de cette méthode c'est que la requete imbriquée va construire autant de sous-ensembles qu'il y a d'articles de couleur mauve dans la table articles.
    Si on travaille chez le fabricant de la poupée barbie ça peut faire rapidement beaucoup d'articles

    La bonne méthode est de faire un test d'existence, avec un where (not) exists, qui présente l'avantage de tester la présence d'une et une seule occurrence et de ne pas transporter le résultat (les colonnes) mais seulement un booléen (1=oui, 0=non)

    Ainsi votre requête devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select  codeart,
           noma
    From Article as main
    Where not exists
         (select 1 from detailc as subq
          where subq.codart = main.codart)
      and couleur='mauve'
    Sur une base de données de quelques millions d'enregistrements à plusieurs milliards, la différence en termes de performances est très très significative !

  5. #5
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Que ce que tu penses de ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    
    select  codeart,noma From Article as main left joindetailc as subqon subq.codart = main.codart 
    
    Where main.couleur='mauve'
    and subq.codart is null
    J'ai essayé les deux requêtes proposées et bien sur la mienne, je n'ai trouvé pas grande différence, sur table de dizaine de milliers d'enregistrements.
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 126
    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 126
    Points : 38 509
    Points
    38 509
    Billets dans le blog
    9
    Par défaut
    C'est une alternative souvent proposée, à ma connaissance elle n'est jamais plus performante, mais parfois moins, en tout cas beaucoup mieux que la requete not in

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 756
    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 756
    Points : 52 534
    Points
    52 534
    Billets dans le blog
    5
    Par défaut
    Des différentes manières d'écrire une semi anti jointure....

    Et il y en a d'autres....
    https://technet.microsoft.com/fr-fr/...ql.105%29.aspx

    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/ * * * * *

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/07/2011, 14h35
  2. Double Incrémentation 1 sur les lignes 1 sur les colonnes
    Par MatMout dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/07/2010, 17h35
  3. Une question aux Grands du Sql, sur les jointures externes
    Par tonton67 dans le forum Développement
    Réponses: 3
    Dernier message: 26/01/2009, 09h08
  4. Travailler sur les Bitmap, ou sur les loaders directement
    Par minimolo dans le forum ActionScript 3
    Réponses: 4
    Dernier message: 14/12/2008, 12h08

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