web-dev-qa-db-fra.com

Différence entre une jointure thêta, l'équijoin et la jointure naturelle

J'ai du mal à comprendre l'algèbre relationnelle en ce qui concerne les jointures thêta, les équijointes et les jointures naturelles. Quelqu'un pourrait-il m'aider s'il vous plaît à mieux comprendre? Si j'utilise le signe = sur une jointure thêta, est-ce exactement la même chose que d'utiliser une jointure naturelle?

89
maclunian

Un theta join permet des relations de comparaison arbitraires (telles que ≥).

Un equijoin est une jointure thêta utilisant l'opérateur d'égalité.

Un jointure naturelle est une équijointure d'attributs ayant le même nom dans chaque relation.

De plus, une jointure naturelle supprime les colonnes dupliquées impliquées dans la comparaison d'égalité, de sorte qu'il ne reste plus qu'une seule colonne comparée; en termes algébriques relationnels approximatifs: ⋈ = πR,S-as ○ ⋈aR=aS

131
outis

Alors que les réponses expliquant les différences exactes sont correctes, je voudrais montrer comment l'algèbre relationnelle est transformée en SQL et quelle est la valeur réelle des 3 concepts.

Le concept clé de votre question est l'idée d'une jointure. Pour comprendre une jointure, vous devez comprendre un produit cartésien (l'exemple est basé sur SQL où l'équivalent est appelé une jointure croisée, comme on l'a signalé précédemment);

Ce n'est pas très utile dans la pratique. Considérez cet exemple.

Product(PName, Price)
====================
Laptop,   1500
Car,      20000
Airplane, 3000000


Component(PName, CName, Cost)
=============================
Laptop, CPU,    500
Laptop, hdd,    300
Laptop, case,   700
Car,    wheels, 1000

Le produit cartésien Product x Component sera - ci-dessous ou sql fiddle . Vous pouvez voir qu'il y a 12 rangées = 3 x 4. Évidemment, les rangées comme "Ordinateur portable" avec "roues" n'ont pas de sens, c'est pourquoi, dans la pratique, le produit cartésien est rarement utilisé.

|    PNAME |   PRICE |  CNAME | COST |
--------------------------------------
|   Laptop |    1500 |    CPU |  500 |
|   Laptop |    1500 |    hdd |  300 |
|   Laptop |    1500 |   case |  700 |
|   Laptop |    1500 | wheels | 1000 |
|      Car |   20000 |    CPU |  500 |
|      Car |   20000 |    hdd |  300 |
|      Car |   20000 |   case |  700 |
|      Car |   20000 | wheels | 1000 |
| Airplane | 3000000 |    CPU |  500 |
| Airplane | 3000000 |    hdd |  300 |
| Airplane | 3000000 |   case |  700 |
| Airplane | 3000000 | wheels | 1000 |

Les JOIN sont là pour ajouter plus de valeur à ces produits. Ce que nous voulons vraiment, c'est "joindre" le produit avec ses composants associés, car chaque composant appartient à un produit. Pour ce faire, utilisez une jointure:

Produit JOIN Component ON Pname

La requête SQL associée serait comme ceci (vous pouvez jouer avec tous les exemples ici )

SELECT *
FROM Product
JOIN Component
  ON Product.Pname = Component.Pname

et le résultat:

|  PNAME | PRICE |  CNAME | COST |
----------------------------------
| Laptop |  1500 |    CPU |  500 |
| Laptop |  1500 |    hdd |  300 |
| Laptop |  1500 |   case |  700 |
|    Car | 20000 | wheels | 1000 |

Notez que le résultat n'a que 4 lignes, car l'ordinateur portable a 3 composants, la voiture en a 1 et l'avion aucun. Ceci est beaucoup plus utile.

Pour revenir à vos questions, toutes les jointures que vous demandez sont des variantes du JOIN que je viens de montrer:

Jointure naturelle = la jointure (la clause ON) est effectuée sur toutes les colonnes du même nom; il supprime les colonnes en double du résultat, par opposition à toutes les autres jointures; la plupart des SGBD (systèmes de base de données créés par divers éditeurs, tels que SQL Server de Microsoft, Oracle de MySQL, etc.) ne prennent même pas la peine de supporter cela, c'est juste une mauvaise pratique (ou délibérément de ne pas l'implémenter). Imaginez qu'un développeur arrive et change le nom de la deuxième colonne dans Product de Price à Cost. Ensuite, toutes les jointures naturelles seraient effectuées sur PName AND sur Cost, générant 0 ligne car aucun nombre ne correspond.

Theta Join = Il s'agit de la jointure générale utilisée par tout le monde, car elle vous permet de spécifier la condition (la clause ON dans SQL). Vous pouvez rejoindre à peu près toutes les conditions de votre choix, par exemple pour les produits dont les deux premières lettres sont similaires ou dont le prix est différent. En pratique, c'est rarement le cas - dans 95% des cas, vous vous joindrez à une condition d'égalité, ce qui nous conduit à:

Equi Join = la plus courante utilisée dans la pratique. L'exemple ci-dessus est une équi rejoindre. Les bases de données sont optimisées pour ce type de jointure! L’opposée d’une jointure equi est une jointure non-equi, c’est-à-dire lorsque vous vous joignez à une condition autre que "=". Les bases de données ne sont pas optimisées pour cela! Les deux d'entre eux sont des sous-ensembles de la thêta générale rejoindre. La jointure naturelle est également une jointure thêta mais la condition (la thêta) est implicite.

Source d'information: université + développeur SQL Server certifié + récemment terminé le MOO "Introduction aux bases de données" de Stanford, alors j'ose dire que j'ai une algèbre relationnelle en tête.

49

La réponse de @ outis est bonne: concise et correcte en ce qui concerne les relations.

Cependant, la situation est légèrement plus compliquée en ce qui concerne SQL.

Considérez l’habituel base de données de fournisseurs et de pièces mais implémenté dans SQL:

SELECT * FROM S NATURAL JOIN SP;

renverrait un resultet ** avec des colonnes

SNO, SNAME, STATUS, CITY, PNO, QTY

La jointure est effectuée sur la colonne portant le même nom dans les deux tables, SNO. Notez que le jeu de résultats comporte six colonnes et ne contient qu'une colonne pour SNO.

Considérons maintenant un thêta eqijoin, où les noms de colonne de la jointure doivent être explicitement spécifiés (plus les variables de plage S et SP sont obligatoires):

SELECT * FROM S JOIN SP ON S.SNO = SP.SNO;

Le résultat aura sept colonnes, dont deux pour SNO. Les noms de l'ensemble de résultats correspondent à ce que SQL Standard appelle "dépendant de l'implémentation", mais pourrait ressembler à ceci:

SNO, SNAME, STATUS, CITY, SNO, PNO, QTY

ou peut-être cela

S.SNO, SNAME, STATUS, CITY, SP.SNO, PNO, QTY

En d'autres termes, NATURAL JOIN _ en SQL peut être envisagé pour supprimer des résultats les colonnes avec les noms dupliqués (mais hélas ne supprimera pas les lignes en double - vous devez vous rappeler de changer SELECT en SELECT DISTINCT toi même).


** Je ne sais pas trop ce que le résultat de SELECT * FROM table_expression; est. Je sais que ce n'est pas une relation parce que, entre autres raisons, il peut avoir des colonnes avec des noms en double ou une colonne sans nom. Je sais que ce n'est pas un jeu parce que, entre autres raisons, l'ordre des colonnes est important. Ce n'est même pas une table SQL ou une expression de table SQL. Je l'appelle un jeu de résultats.

14
onedaywhen

Natural est un sous-ensemble d'Equi qui est un sous-ensemble de Theta.

Si j'utilise le signe = sur une jointure thêta, est-ce exactement la même chose que d'utiliser une jointure naturelle ???

Pas nécessairement, mais ce serait un Equi. Naturel signifie que vous correspondez sur toutes les colonnes portant le même nom, Equi signifie simplement que vous utilisez exclusivement '=' (et non pas moins que, comme, etc.)

Ceci est purement académique, vous pouvez travailler avec des bases de données relationnelles pendant des années sans jamais entendre quiconque utiliser ces termes.

9
heisenberg

Theta Join: Lorsque vous effectuez une requête de jointure à l'aide de n'importe quel opérateur (par exemple, =, <,>,> = etc.), cette requête de jointure se trouve sous Theta join.

Equi Join: Lorsque vous effectuez une requête pour une jointure à l'aide de l'opérateur d'égalité uniquement, cette requête se joint à Equi join.

Exemple:

> SELECT * FROM Emp JOIN Dept ON Emp.DeptID = Dept.DeptID; 
> SELECT * FROM Emp INNER JOIN Dept USING (DeptID) 
 Cela montrera: 
 _________________________________________________ 
 | Nom Emp | Emp.DeptID | Nom du service | Dept.DeptID | 
 | | | | | 

Remarque: Equi join est également un ajout thêta!

Natural Join: un type de jointure Equi qui se produit implicitement en comparant les mêmes colonnes de noms dans les deux tables.

Remarque: dans ce cas, le résultat de la jointure ne comporte qu'une colonne pour chaque paire de colonnes nommées identiques.

Exemple

 SELECT * FROM Emp NATURAL JOIN Dept
 Cela montrera: 
 _______________________________ 
 | DeptID | Nom Emp | Nom de département | 
 | | | | 
5
Palak Jain

Le produit cartésien de deux tables donne toutes les combinaisons possibles de n-uplets, comme dans l'exemple mathématique, le produit croisé de deux ensembles. étant donné qu’il existe souvent des valeurs indésirables qui occupent également un espace inutile dans la mémoire, nous nous joignons donc ici au secours, qui ne combinent que les valeurs d’attributs requises et ayant un sens.

joint interne donne deux fois le champ répété dans la table, alors que joint naturel résout le problème en filtrant les colonnes répétées et en ne l’affichant qu’une seule fois. Les deux fonctionnent de la même manière. La jointure naturelle est plus efficace car elle préserve la mémoire. De plus, les redondances sont supprimées dans la jointure naturelle.

les jointures equi de deux tables sont telles qu'elles affichent uniquement les tuples qui correspondent à la valeur de l'autre table. Par exemple: Soit new1 et new2 deux tables. si requête SQL, sélectionnez * de new1 rejoindre new2 sur new1.id = new.id (id est la même colonne dans deux tables) puis commencez à partir de la table new2 et joignez ce qui correspond à l'id de la seconde table. De plus, les non-adhérents n'ont pas d'opérateur d'égalité, ils ont <,> et entre les opérateurs.

la jointure thêta comprend l’ensemble des opérateurs de comparaison, y compris l’égalité et d’autres opérateurs <,> de comparaison. lorsqu'il utilise l'opérateur d'égalité (=), il est appelé équi join.

1
himani

Jointure naturelle: Une jointure naturelle peut être possible lorsqu'il existe au moins un attribut commun dans deux relations.

Participation thêta: La participation thêta peut être possible lorsque deux personnes agissent dans des conditions particulières.

Equi Join: Equi peut être possible lorsque deux personnes agissent à la condition d’équité. C'est un type de rejoindre thêta.

0
rashedcs