Dies ist eine sehr häufige Frage, daher basiert diese Antwort auf diesem Artikel, den ich geschrieben habe.
Tabellenbeziehung
In Anbetracht dessen haben wir Folgendes post
und post_comment
Tabellen:
Das post
hat folgende Aufzeichnungen:
| id | title |
|----|-----------|
| 1 | Java |
| 2 | Hibernate |
| 3 | JPA |
und das post_comment
hat die folgenden drei Zeilen:
| id | review | post_id |
|----|-----------|---------|
| 1 | Good | 1 |
| 2 | Excellent | 1 |
| 3 | Awesome | 2 |
SQL INNER JOIN
Mit der SQL JOIN-Klausel können Sie Zeilen zuordnen, die zu verschiedenen Tabellen gehören. Ein CROSS JOIN erstellt beispielsweise ein kartesisches Produkt, das alle möglichen Kombinationen von Zeilen zwischen den beiden Verknüpfungstabellen enthält.
Während CROSS JOIN in bestimmten Szenarien nützlich ist, möchten Sie meistens Tabellen basierend auf einer bestimmten Bedingung verknüpfen. Und hier kommt INNER JOIN ins Spiel.
Mit SQL INNER JOIN können wir das kartesische Produkt des Verbindens zweier Tabellen basierend auf einer Bedingung filtern, die über die ON-Klausel angegeben wird.
SQL INNER JOIN - ON "immer wahr" Bedingung
Wenn Sie eine "immer wahre" Bedingung angeben, filtert INNER JOIN die verknüpften Datensätze nicht und die Ergebnismenge enthält das kartesische Produkt der beiden Verknüpfungstabellen.
Zum Beispiel, wenn wir die folgende SQL INNER JOIN-Abfrage ausführen:
SELECT
p.id AS "p.id",
pc.id AS "pc.id"
FROM post p
INNER JOIN post_comment pc ON 1 = 1
Wir erhalten alle Kombinationen post
und post_comment
Aufzeichnungen:
| p.id | pc.id |
|---------|------------|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
Wenn die Bedingung der ON-Klausel "immer wahr" ist, entspricht INNER JOIN einfach einer CROSS JOIN-Abfrage:
SELECT
p.id AS "p.id",
pc.id AS "pc.id"
FROM post p
CROSS JOIN post_comment
WHERE 1 = 1
ORDER BY p.id, pc.id
SQL INNER JOIN - ON "immer falsch" Bedingung
Wenn andererseits die ON-Klauselbedingung "immer falsch" ist, werden alle verknüpften Datensätze herausgefiltert und die Ergebnismenge ist leer.
Wenn wir also die folgende SQL INNER JOIN-Abfrage ausführen:
SELECT
p.id AS "p.id",
pc.id AS "pc.id"
FROM post p
INNER JOIN post_comment pc ON 1 = 0
ORDER BY p.id, pc.id
Wir werden kein Ergebnis zurückbekommen:
| p.id | pc.id |
|---------|------------|
Dies liegt daran, dass die obige Abfrage der folgenden CROSS JOIN-Abfrage entspricht:
SELECT
p.id AS "p.id",
pc.id AS "pc.id"
FROM post p
CROSS JOIN post_comment
WHERE 1 = 0
ORDER BY p.id, pc.id
SQL INNER JOIN - ON-Klausel unter Verwendung der Spalten Fremdschlüssel und Primärschlüssel
Die häufigste ON-Klauselbedingung ist diejenige, die die Fremdschlüsselspalte in der untergeordneten Tabelle mit der Primärschlüsselspalte in der übergeordneten Tabelle übereinstimmt, wie in der folgenden Abfrage dargestellt:
SELECT
p.id AS "p.id",
pc.post_id AS "pc.post_id",
pc.id AS "pc.id",
p.title AS "p.title",
pc.review AS "pc.review"
FROM post p
INNER JOIN post_comment pc ON pc.post_id = p.id
ORDER BY p.id, pc.id
Bei der Ausführung der obigen SQL INNER JOIN-Abfrage erhalten wir die folgende Ergebnismenge:
| p.id | pc.post_id | pc.id | p.title | pc.review |
|---------|------------|------------|------------|-----------|
| 1 | 1 | 1 | Java | Good |
| 1 | 1 | 2 | Java | Excellent |
| 2 | 2 | 3 | Hibernate | Awesome |
Daher werden nur die Datensätze, die der ON-Klauselbedingung entsprechen, in die Abfrageergebnismenge aufgenommen. In unserem Fall enthält die Ergebnismenge alle post
zusammen mit ihren post_comment
Datensätzen. Die nicht zugeordneten post
Zeilen post_comment
werden ausgeschlossen, da sie die ON-Klauselbedingung nicht erfüllen können.
Auch hier entspricht die obige SQL INNER JOIN-Abfrage der folgenden CROSS JOIN-Abfrage:
SELECT
p.id AS "p.id",
pc.post_id AS "pc.post_id",
pc.id AS "pc.id",
p.title AS "p.title",
pc.review AS "pc.review"
FROM post p, post_comment pc
WHERE pc.post_id = p.id
Die nicht angeschlagenen Zeilen erfüllen die WHERE-Klausel, und nur diese Datensätze werden in die Ergebnismenge aufgenommen. Auf diese Weise können Sie am besten visualisieren, wie die INNER JOIN-Klausel funktioniert.
| p.id | pc.post_id | pc.id | p.title | pc.review |
| ------ | ------------ | ------- | ----------- | --------- - |
| 1 | 1 | 1 | Java | Gut |
| 1 | 1 | 2 | Java | Ausgezeichnet |
| 1 | 2 | 3 | Java | Genial |
| 2 | 1 | 1 | Ruhezustand | Gut |
| 2 | 1 | 2 | Ruhezustand | Ausgezeichnet |
| 2 | 2 | 3 | Ruhezustand | Genial |
| 3 | 1 | 1 | JPA | Gut |
| 3 | 1 | 2 | JPA | Ausgezeichnet |
| 3 | 2 | 3 | JPA | Genial |
Fazit
Eine INNER JOIN-Anweisung kann als CROSS JOIN mit einer WHERE-Klausel umgeschrieben werden, die der gleichen Bedingung entspricht, die Sie in der ON-Klausel der INNER JOIN-Abfrage verwendet haben.
Nicht, dass dies nur für INNER JOIN gilt, nicht für OUTER JOIN.