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 :

Nos amis les joins


Sujet :

Langage SQL

  1. #1
    Membre actif Avatar de crashtib
    Homme Profil pro
    Support technico-fonctionnel
    Inscrit en
    Avril 2009
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Support technico-fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 221
    Points : 204
    Points
    204
    Par défaut Nos amis les joins
    Salut à tous.

    Je viens de passer deux heures sur des tutos sur les joins, dont celui de développez, ppour essayer de comprendre ce qu'est un join et à quoi il sert. Je pense que je suis loin d'avoir tout compris, et j'écris ce post pour essayer de m'éclaircir les idées. Ce que je voudrais vous demander, c'est de me corriger dans les affirmations que je vais présenter ci-dessous:

    un join est une relation d'égalité entre une ou plusieurs bases.
    un natural join est équivalent en temps, perf et logique qu'un "WHERE table1.valeur = table2.valeur".

    un outer join est équivalent à un natural join à l'exception près que ce dernier comprend aussi toutes les entrées de la table stipulée après FROM pour un left outer join et après RIGHT OUTER JOIN pour un right outer join. Ca sert donc à vérifier une égalité tout en englobant dans la sélection toutes les entrées dont le champ comparé est NULL.

    Je vous avouerait que j'ai eu beaucoup de mal à saisir le concept, et de plus que je n'ai aucun moyen (ni droit) pour tester un quelconque code, ni en voir les conséquences. Si vous avez des remarques à faire, essayez, s'il vous plait, d'être clairs. Je suis néophyte et en plus, depuis cet aprèm, j'ai l'impression d'être très con.

    merci à tous

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    un join est une relation d'égalité entre une ou plusieurs bases.
    Non je ne sais pas ce que tu voulais dire mais ce n'est pas "entre plusieurs bases".
    un natural join est équivalent en temps, perf et logique qu'un "WHERE table1.valeur = table2.valeur".
    Grossièrement oui
    C'ést également équivalent à un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INNER JOIN TABLE2
    on table1.valeur = table2.valeur
    un outer join est équivalent à un natural join à l'exception près que ce dernier comprend aussi toutes les entrées de la table stipulée après FROM pour un left outer join et après RIGHT OUTER JOIN pour un right outer join.
    Non
    un outer join est équivalent à un inner join
    On peut avoir un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FROM Table1 
    left outer join Table2
    on Table1.Champ1=Table2.champ2
    Ca sert donc à vérifier une égalité tout en englobant dans la sélection toutes les entrées dont le champ comparé est NULL.
    Non dont le champ comparé n'a pas de correspondance dans l'autre table.

    J'espère que je ne t'ai pas noyé encore plus.
    a+
    Soazig

  3. #3
    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
    Laissez tomber pour le moment natural join, ce n'est qu'une facilité d'écriture qui n'apporte rien.

    Concentrez-vous d'abord sur inner join, aussi appelé jointure forte.
    Attaquez ensuite le cross join, à savoir le produit cartesien. Le concept et la syntaxe sont très simples.
    Une fois que vous aurez bien compris, vous pourrez attaquer le principe de jointure externe.

    Vous ne raisonnez pas de la bonne façon, il faut raisonner en ensemble de données, surement pas en syntaxe d'écriture avant ou après tel mot.

  4. #4
    Membre actif Avatar de crashtib
    Homme Profil pro
    Support technico-fonctionnel
    Inscrit en
    Avril 2009
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Support technico-fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 221
    Points : 204
    Points
    204
    Par défaut
    Tout d'abord merci de vos réponses

    Citation:
    un outer join est équivalent à un natural join à l'exception près que ce dernier comprend aussi toutes les entrées de la table stipulée après FROM pour un left outer join et après RIGHT OUTER JOIN pour un right outer join.
    Non
    un outer join est équivalent à un inner join
    On peut avoir un
    Code :

    FROM Table1
    LEFT OUTER JOIN Table2
    ON Table1.Champ1=Table2.champ2
    Mais alors quelle est la différence entre un inner join et un outer join?



    Ca sert donc à vérifier une égalité tout en englobant dans la sélection toutes les entrées dont le champ comparé est NULL.
    Non dont le champ comparé n'a pas de correspondance dans l'autre table.
    Mais alors qu'est ce qu'un join restreint? Quels sont les champs filtrés? sur quel critère?

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Pédagogie par l'exemple devrait aider la compréhension...

    Règle de gestion :
    "Un projet est dirigé par une seule personne et une personne peut diriger plusieurs projets."

    MCD :
    Personne -0,n----Diriger----1,1- Projet

    Tables :
    Personnes (Per_Id, Per_Nom, Per_Prénom, ...)
    Projets (Prj_Id, Prj_Nom, Prj_IdChefProjet, ...)

    Requêtes :
    1) Je cherche à obtenir la liste des noms de projets avec pour chacun le nom et le prénom du chef de projet.

    Je fais une jointure interne :

    a) Ancienne syntaxe à bannir et à oublier très vite après lecture, elle est obsolète depuis 1992 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT p1.Prj_Nom AS NomProjet, p2.Per_Nom AS NomCPJ, p2.Per_Prénom AS PrénomCPJ
    FROM Projets AS p1, Personnes AS p2
    WHERE p1.Prj_IdChefProjet = p2.Per_Id
    ORDER BY p1.Prj_Nom
    b) Syntaxe normalisée depuis 1992 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT p1.Prj_Nom AS NomProjet, p2.Per_Nom AS NomCPJ, p2.Per_Prénom AS PrénomCPJ
    FROM Projets AS p1
    INNER JOIN Personnes AS p2 ON p1.Prj_IdChefProjet = p2.Per_Id
    ORDER BY p1.Prj_Nom
    2) Je cherche les noms et prénoms des personnes qui ne dirigent pas de projet.

    Je fais une jointure externe dans laquelle je retient les lignes de la table Personnes dont l'identifiant (Per_Id) n'est pas utilisé en clé étrangère (Prj_IdChefProjet) dans la table Projets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT p2.Per_Nom AS NomCPJ, p2.Per_Prénom AS PrénomCPJ
    FROM Personnes AS p2
    LEFT OUTER JOIN  Projets AS p1 ON p1.Prj_IdChefProjet = p2.Per_Id
    WHERE p2.Prj_IdChefProjet IS NULL
    ORDER BY p2.Per_Nom, p2.Per_Prénom
    LEFT OUTER JOIN permet de prendre toutes les lignes de la table située dans le FROM et d'essayer de les mettre en correspondance comme dans INNER JOIN. Les lignes qui n'ont pas de correspondance sont gardée avec NULL pour les colonnes de la table de droite, celle située après le LEFT OUTER JOIN.

    Avec ces deux formes de JOIN, INNER et LEFT OUTER, vous résoudrez 90% de vos besoins. Dans certains cas de jointures multiples, vous aurez besoin de RIGHT OUTER JOIN à la place de LEFT OUTER JOIN.
    Pour les autres formes, vous aurez bien le temps de revenir sur les tutoriels.

  6. #6
    Membre actif Avatar de crashtib
    Homme Profil pro
    Support technico-fonctionnel
    Inscrit en
    Avril 2009
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Support technico-fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 221
    Points : 204
    Points
    204
    Par défaut
    Merci pour cette réponse. je me rends compte à quel point je n'avais rien compris. juste un petit détail, normalement dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT p2.Per_Nom AS NomCPJ, p2.Per_Prénom AS PrénomCPJ
    FROM Personnes AS p2
    LEFT OUTER JOIN  Projets AS p1 ON p1.Prj_IdChefProjet = p2.Per_Id
    WHERE p2.Prj_IdChefProjet IS NULL
    ORDER BY p2.Per_Nom, p2.Per_Prénom
    C'est pas plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE p1.Prj_IdChefProjet IS NULL
    ?

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Exact !

  8. #8
    Membre actif Avatar de crashtib
    Homme Profil pro
    Support technico-fonctionnel
    Inscrit en
    Avril 2009
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Support technico-fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 221
    Points : 204
    Points
    204
    Par défaut
    Bon bah je vous remercie tous beaucoup pour avoir pris le temps de m'expliquer tout ça ; je ne mets pas le marqueur résolu au cas où il y a quelque chose d'autre que je ne comprendrais pas.

  9. #9
    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 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    un join est une relation d'égalité entre une ou plusieurs bases.
    NON : une jointure est une opération de l'algèbre relationnelle visant à mettre en correspondance des données d'une table et d'une autre.
    L'égalité n'est qu'un cas particulier. On peut faire des equi-jointures (donc par égalité), des inéqui-jointures donc par inégalité (> >= < <=) et enfin des non equi-jointures (par exemple <> LIKE ...).

    un natural join est équivalent en temps, perf et logique qu'un "WHERE table1.valeur = table2.valeur".
    Pas tout à fait : la jointure naturelle qui n'a d'ailleurs par beaucoup d'intérêt, recherches TOUTES les colonnes ayant le même nom dans une table et dans l'autre. Le problème est qu'il peut y avoir des jointures "naturelles" sur des colonnes qui ne peuvent porter le même nom (multi associations de mêmes entités). Comme il se peut qu'une base mal modélisée possède dans des tables différentes des colonnes de même nom, n'ayant pas la même définition ni la même sémantique.

    un outer join est équivalent à un natural join à l'exception près que ce dernier comprend aussi toutes les entrées de la table stipulée après FROM pour un left outer join et après RIGHT OUTER JOIN pour un right outer join. Ca sert donc à vérifier une égalité tout en englobant dans la sélection toutes les entrées dont le champ comparé est NULL.
    Pas tout à fait : oubliez encore une fois l'égalité qui est un cas particulier, certes très répandus de jointure, mais pas le seul.
    La jointure externe sert à imposer que l'on prenne en compte toute les lignes de la table mère et les éventuelle ligne de la table fille s'il y a correspondance en comblant les manques par des marqueurs NULL.

    A +

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Timezone chez nos amis les québécois
    Par Mr Belette dans le forum Langage
    Réponses: 6
    Dernier message: 12/03/2012, 11h25
  2. Réponses: 2
    Dernier message: 01/09/2009, 10h26
  3. Les namespace sont nos amis....
    Par oldfox dans le forum C++
    Réponses: 16
    Dernier message: 23/03/2006, 19h37

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