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 :

Différences entre les types de jointures


Sujet :

Langage SQL

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 31
    Par défaut Différences entre les types de jointures
    Bonjour,

    J'essaie de comprendre la différence entre plusieurs types de jointures car certaines définitions ne me semblent pas très claires. (Indépendamment des SGBD ou du langage SQL)

    1. Définition (mathématique) de la jointure (en général) par rapport à celle de la theta-jointure ?
    2. Définition de l'équi-jointure par rapport à celle de la jointure naturelle ?
    3. Définition de la jointure externe par rapport à celle de la semi-jointure ?
    4. Est-ce qu'on peut dire que la condition de la jointure est un prédicat ?
    5. Si on veut faire une hiérarchie en partant de la définition générale d'une jointure jusqu'aux cas particuliers, comment les mettre dans l'ordre ?

    Merci.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 986
    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 986
    Billets dans le blog
    6
    Par défaut
    La jointure est l'une des 8 opérations de l'algèbre relationnelle.
    Le jointure peut être équi, par égalité de colonne, simple ou multiples :
    Exemples:
    • A = A'
    • A = A' AND B = B'
    • (A, B) = (A', B')

    Les deux dernières notations étant équivalente du fait du Row value Constructor.

    Lorsque les jointures sont faites en rapport des liens d'intégrité on les appellent jointures naturelle (à ne pas confondre avec le NATURAL JOIN de SQL qui n'a en principe rien à voir). La plupart des définitions sur Internet sont fausses et disent que les attributs doivent porter le même nom. C'est une stupidité ! Vous pouvez avoir une jointure naturelle sur des attributs ayant un nom non identique...

    Une jointure par égalité d'attribut est dite équi-jointure. La plupart des jointures naturelle sont des équi-jointures sauf pour le cas de la forme normale domaine clef...

    Lorsqu'une jointure n'est pas par égalité (donc non équi) on parle de theta jointure (θ-join).
    Exemple :
    • A > A'
    • B <> B'
    • A = A' AND B > B' AND C <> C'

    Il est aussi possible de jouer avec des opérateurs ou des fonctions. Exemple en SQL :
    • NOM LIKE PRENOM +'_%'
    • CODE_SEXE = SUBSTRING(NUMERO_SECU, 1, 1)
    Pour cette dernière, bien que l'opérateur = figure dans le prédicat de jointure il ne s'agit pas d'une égalité d'attributs

    Une théta jointure peut être faite avec une inégalité (inéqui jointure : >, >=, <, <=) voir une différence (non équi-jointure : <>, NOT... ), voire même avec un critère de filtrage en sus d'une pure jointure.
    Exemple :
    • A = A' AND B = 12345


    Une semi-jointure est une jointure d'un type quelconque dans laquelle n'est retenue que les colonnes d'une seule des deux tables jointes.

    Une jointure externe est une jointure qui ne supprime pas les lignes orphelines du fait du prédicat de jointure. La jointure externe peut être "gauche" (on conserve toutes les lignes de la tables de gauche), "droite" (on conserve toutes les lignes de la tables de droite) ou bilatérale (on conserve toutes les lignes des deux tables.

    Une anti jointure est une jointure que ne retient que les lignes orpheline d'une jointure externe. Généralement c'est une semi-anti-join car les attribut de la table en défaut sont toujours vide, donc il n'y a pas d'intérêt de les retenir !

    Une jointure nécessite un prédicat, c'est à dire une expression évaluable à vrai ou faux (voir inconnu) et qui retiendra (ou non) la ligne considérée en fonction de l'évaluation du prédicat à vrai (ou faux ou inconnu).

    Vous ne pouvez pas faire une hiérarchie, car ces différentes techniques de jointures peuvent se superposer...

    PS : nous n'avons pas encore parlé de l'auto jointure, ni de la jointure récursive !

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

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 31
    Par défaut
    Bonjour SQLpro et merci pour votre réponse.

    Lorsqu'une jointure n'est pas par égalité (donc non équi) on parle de theta jointure (θ-join).
    Donc la définition d'une theta-jointure est identique à celle d'une jointure en général.
    Toute equi-jointure est une theta-jointure mais l'inverse est faux.

    Lorsque les jointures sont faites en rapport des liens d'intégrité on les appellent jointures naturelle
    C'est-à-dire liens clé primaire / étrangère ?

    La plupart des définitions sur Internet sont fausses et disent que les attributs doivent porter le même nom. C'est une stupidité ! Vous pouvez avoir une jointure naturelle sur des attributs ayant un nom non identique...
    Mais qui sont liées par un lien d'intégrité comme vous venez de dire.

    Une semi-jointure est une jointure d'un type quelconque dans laquelle n'est retenue que les colonnes d'une seule des deux tables jointes.
    Donc on ne garde que les tuples de l'une des deux relation pour lesquels le prédicat est vraie. Alors que dans la jointure externe on garde les tuples (composés) des deux relations.

    Pouvez-vous me conseiller des livres avancés qui traitent ces notions (l'algèbre relationnelle) en détails surtout du point de vue mathématique.

    Merci et bonne soirée.

  4. #4
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 161
    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 161
    Billets dans le blog
    16
    Par défaut Théorie relationnelle et jointure
    Bonsoir,


    Citation Envoyé par SQLpro Voir le message
    les attributs doivent porter le même nom. C'est une stupidité ! Vous pouvez avoir une jointure naturelle sur des attributs ayant un nom non identique.
    Excuse-moi Frédéric, mais ça n’est pas une stupidité, puisqu’il s’agit de la théorie relationnelle : si les attributs sur lesquels portent la jointure n’ont pas le même nom (mais sont du même type !), on les renomme à l’aide de l’opérateur RENAME avant d’effectuer la jointure. Maintenant, que SQL permette de noter l’opération différemment, pourquoi pas (notamment à cause du typage), mais la norme SQL n’est pas une théorie.

    Je rappelle ici la définition de la jointure dans le cadre de la théorie relationnelle (je fais référence à The Relational Database Dictionary).

    Jointure naturelle

    1. (Cas dyadique) Soit les relations r1 er r2 où les attributs qui ont le même nom sont du même type. La jointure naturelle de r1 et r2 :
    r1 JOIN r2
    est une relation dont l’en-tête est l’union (au sens de la théorie des ensembles) des en-têtes de r1 et r2, et dont le corps est l’ensemble des tuples t tels que t est l’union (au sens de la théorie des ensembles) d’un tuple de r1 et d’un tuple de r2.

    2. (Cas N-adique) Soit les relations r1, r2, ..., rn (n ≥ 0) où les attributs ayant le même nom sont du même type. La jointure naturelle {r1, r2, ..., rn} est ainsi définie : Si n = 0 le résultat est TABLE_DEE ; si n = 1, le résultat est r1 ; sinon on choisit deux relations distinctes parmi l’ensemble r1, r2, ..., rn et on les remplace par leur jointure naturelle (dyadique) puis on répète le procédé jusqu’à ce que l’ensemble soit constitué d’une seule relation r qui représente le résultat final.

    Considérons par exemple les relvars (variables relationnelles) décrivant les fournisseurs (S) et les livraisons de pièces (SP) :
    S {S#, SNAME, STATUS, CITY}

    SP {S#, P#, QTY}
    Où S# représente le numéro d'un fournisseur, SNAME son nom, STATUS son score, CITY sa ville de résidence, P# un numéro de pièce et QTY le nombre de pièces livrées par le fournisseur.

    L’expression S JOIN SP représente la jointure naturelle des relations qui sont les valeurs actuelles des relvars S et SP. Cette jointure est une relation de type
    RELATION {S#, SNAME, STATUS, CITY, P#, QTY}
    Qui plus est, si les valeurs des relvars S et SP sont respectivement s et sp, le corps de cette relation est constitué de tous les tuples de la forme <s#,sn,st,sc,p#,q> tels que le tuple <s#,sn,st,sc> est présent dans s et le tuple <s#,p#,q> présent dans sp.

    Thêta-jointure : c'est une opération relationnelle équivalant à une expression de la forme :
    (r1 TIMES r2) WHERE A1 thêta A2
    Où TIMES représente le produit cartésien, WHERE A1 thêta A2 représente une condition prenant la valeur vrai ou faux, A1 et A2 sont respectivement des attributs (du même type T) de r1 et r2 et thêta est un opérateur de comparaison (« = », « > », « ≥ », etc.) utilisable pour les valeurs du type T.

    Équi-jointure : une thêta-jointure où thêta est « = ».

    Semi-jointure : Soit les relations r1 et r2. La semi-jointure de r1 et r2 (dans cet ordre) est notée :
    r1 MATCHING r2
    Et représente un raccourci pour (r1 JOIN r2){X}, où {X} représente l’en-tête de r1 (c’est donc la projection sur X de r1 JOIN r2).
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  5. #5
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 161
    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 161
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    La jointure est l'une des 8 opérations de l'algèbre relationnelle.
    Lorsque les jointures sont faites en rapport des liens d'intégrité on les appellent jointures naturelle
    Plaît-il ? L’intégrité des données est orthogonale à l’algèbre relationnelle que je sache !


    Pour mémoire, la jointure externe (outer join) ne fait pas partie des opérations de l’algèbre relationnelle puisque Null est banni de la théorie relationnelle.


    Citation Envoyé par Age_of_Aquarius Voir le message
    Pouvez-vous me conseiller des livres avancés qui traitent ces notions (l'algèbre relationnelle) en détails surtout du point de vue mathématique.
    Je vous engage à vous lancer dans la lecture de An Introduction to Relational Database Theory de Hugh Darwen. C’est excellent, rigoureux et en plus c'est gratuit !
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 31
    Par défaut
    Bonjour fsmrel et merci pour votre participation.

    Revenons d'abord à la définition d'une jointure dans le cas le plus général.

    Voici deux définitions qui, pour moi, n'ont pas la même signification mathématique :

    1. Celle de Hugh Darwen dans son ouvrage "An Introduction to Relational Database Theory" :



    2. Celle de Laurent Audibert dans son cours Bases de données : de la modélisation au SQL :



    1. Pour Hugh Darwen la relation issue d'une jointure de deux relations ne peut avoir deux attributs du même nom, même s'ils sont de types différents.
    Je trouve que cette définition est proche de la version naturelle de la jointure qui n'autorise pas la répétition d'attributs.
    Donc il faut passer d'abord par l'opérateur rename pour que la jointure soit possible dans ce cas-ci.

    2. La définition de Laurent Audibert je la trouve plus globale et plus générale. Je la préfère aussi parce qu'elle formalise la jointure à partir des opérateurs fondamentaux de l'algèbre relationnelle ; ici le produit cartésien et la sélection (restriction). Le prédicat de la sélection devient celui de la condition de jointure.
    Raghu Ramakrishnan et Johannes Gehrke la définissent de la même façon dans leur ouvrage Database Management Systems.

    3. Jeffrey D. Ullman la définit comme une theta-jointure dans Principles of Database Systems.

    Merci et bonne soirée.

  7. #7
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 161
    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 161
    Billets dans le blog
    16
    Par défaut Vous avez dit Θ-jointure ?
    Bonsoir,


    Citation Envoyé par Age_of_Aquarius Voir le message
    Voici deux définitions qui, pour moi, n'ont pas la même signification mathématique.
    Bien entendu, car conformément à la théorie relationnelle, Darwen ne propose pas la définition de la thêta-jointure mais celle de la jointure naturelle, équivalente à celle que j’ai extraite de The Relational Database Dictionary. Un point important pour mieux comprendre sa position quand il se focalise sur la jointure naturelle et n’attache aucune importance particulière à la thêta-jointure : au début des années soixante-dix, comme tout un chacun il a utilisé la définition de la thêta-jointure inventée et enseignée par le génial inventeur du Modèle Relationnel de Données, Ted Codd (vous trouverez cette définition dans Relational Completeness of Data Base Sublanguages) : On commence par définir la thêta-jointure, puis on passe à l’équi-jointure (comme cas particulier de la thêta-jointure) puis à la jointure naturelle (comme cas particulier de l’équi-jointure). Très tôt, Chris Date, le héraut du modèle relationnel a commencé lui aussi par enseigner consciencieusement dans l’ordre, thêta-jointure, équi-jointure, puis jointure naturelle, tout en faisant invariablement remarquer, à l’instar de Codd, que la thêta-jointure n’est jamais qu’une restriction d’un produit cartésien, et dans la foulée, c’est ce que nous avons tous appris et fidèlement enseigné à notre tour. Mais plus de vingt ans après la parution de l'article de Codd, en 1995, on a pu observer un glissement bien perceptible dans la 6e édition de l’ouvrage de référence An Introduction to Database Systems (pas loin de 800 000 exemplaires vendus...), car Date y présente d’abord la jointure naturelle (qu’il appelle désormais formellement jointure), la thêta-jointure ne venant que comme appendice, cantonnée dans un rôle secondaire, avec le statut de restriction d’un produit cartésien. Dans les ouvrages théoriques commis ensuite par Date et Darwen (qu'affectueusement j'appelle les Dupontd), tels que Databases, Types and the Relational Model, The Third Manifesto, la thêta-jointure a totalement disparu. Que vous ne l’ayez pas trouvée chez Darwen est on ne peu plus normal, puisqu’elle est — oserai-je dire —pieusement rangée au musée des curiosités historiques.

    Pour mieux comprendre l’insistance de Darwen sur le rôle fondamental de la jointure naturelle, voici ce qu’il a écrit en 1987 et repris en tant que contribution darwenienne (signée du pseudonyme anagrammique Andrew Warden) dans l’ouvrage de Chris Date Relational Database, Writings 1985-1989, paru en 1990, je traduis :

    « Étudions maintenant l’opérateur Jointure naturelle et voyons comment il nous change la vie. Je le représente selon la syntaxe suivante :
    MARRIAGE (table-expression-1, table-expression-2)
    On peut voir ainsi la merveilleuse union accomplie par cet opérateur :

    Dans un premier temps, il y a les tendres préliminaires à l’occasion desquels les colonnes des deux opérandes sont examinées, afin de voir lesquelles portent le même nom. Celles-ci sont appelées « colonnes communes » quand, outre le même nom, elles sont du même domaine.

    Dans un deuxième temps a lieu l’accouplement : à cette occasion les lignes compatibles des deux opérandes sont jointes (à savoir les lignes qui ont la même valeur pour les colonnes communes).

    Il y a enfin, l’orgasme grandiose quand un ensemble de colonnes communes est éjaculé.
    Le fruit de cette union est un individu aussi parfait qu’on peut le souhaiter, ayant hérité des caractéristiques de ses parents. »

    Ainsi, vous comprendrez pourquoi Darwen, ne porte qu’un intérêt fort mineur à la thêta-jointure et se démarque donc de la définition coddienne, scrupuleusement respectée par les auteurs que vous citez...


    Dans un petit ouvrage paru en 2001, The Database Relational Model, a Retrospective Review and Analysis, Date commente l’article de Codd dont j’ai fait mention ci-dessus, Relational Completeness of Data Base Sublanguages (je traduis) :

    Θ-jointure et jointure naturelle
    [A l’époque, les définitions de] ces opérations sont à peu de choses près celles d’aujourd’hui. Il est cependant intéressant de noter que Codd définit la jointure naturelle — comme une simple touche finale pourrait-on dire — en termes de Θ-jointure (plus précisément comme la projection d’une équi-jointure). Aujourd’hui nous tendons à considérer la jointure naturelle comme étant l’opération la plus fondamentale (au point que le terme « jointure » sans qualificatif est habituellement considéré comme désignant plus spécifiquement la jointure naturelle). On aura remarqué que la Θ-jointure en tant que telle ne figurait même pas dans les deux premiers articles de Codd (1969 et 1970). Codd fait observer que la Θ-jointure peut être définie en termes de Θ-restriction, en conséquence de quoi ça n’est pas une opération primitive. (En fait, l’inverse est vrai aussi, c'est-à-dire que la Θ-restriction peut être définie en termes de Θ-jointure ; considérer quelle collection d’opérations est primitive a donc quelque chose d’arbitraire, tout dépend du point de vue selon lequel on se place. Il est communément admis qu’une collection primitive est constituée de la restriction, de la projection, du produit, de l’union et de la différence).
    Note : Comme les opérations d’union, intersection et produit (étendu), la jointure naturelle est commutative et associative.

    Clairement la jointure naturelle désormais baptisée JOIN joue bien le rôle essentiel qu'on lui connaît et nos deux compères ont passé la thêta-jointure au rasoir d’Ockham...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  8. #8
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 31
    Par défaut
    Bonsoir,

    Merci infiniment fsmrel. Les choses sont maintenant claires et mieux organisées dans ma tête .

    Après avoir lu votre dernier post, j'ai cherché dans quelque ouvrages de référence concernant l'algèbre relationnelle et j'ai trouvé que C. J. Date a répéter dans un autre ouvrage la même constatation.

    "Join comes in several different varieties. Easily the most important however, is the so-called natural join so much so, in fact, that the unqualified term join is almost always taken to mean the natural join specifically, and we adopt that usage in this book."
    C. J. Date, An Introduction to Database Systems, 8th Edition, 2004

    Merci encore et à la prochaine.

    Problème résolu.

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

Discussions similaires

  1. Différences entre les algorithmes de jointure
    Par kochfet dans le forum Optimisations
    Réponses: 0
    Dernier message: 11/06/2013, 10h18
  2. Quelles sont les différences entre les types char et int ?
    Par RayBradbury dans le forum Débuter
    Réponses: 3
    Dernier message: 27/03/2011, 16h10
  3. Différence entre les types des acteurs
    Par mimosa803 dans le forum Cas d'utilisation
    Réponses: 1
    Dernier message: 22/11/2009, 19h08
  4. Différences entre les types de fichiers
    Par bh.medali dans le forum Langage
    Réponses: 1
    Dernier message: 05/11/2007, 18h05
  5. fopen -> différences entres les types d'ouvertur
    Par Patrick PETIT dans le forum C
    Réponses: 10
    Dernier message: 01/06/2003, 18h19

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