Datenbank-Tabellen
Um zu demonstrieren, wie die USING- und ON-Klauseln funktionieren, nehmen wir an, dass wir Folgendes haben post
y post_comment
Datenbanktabellen, die eine eins-zu-viele-Tabellenbeziehung über die post_id
Fremdschlüsselspalte in der post_comment
Tabelle mit Verweis auf die post_id
Primärschlüsselspalte in der post
Tisch:
Der Elternteil post
Tabelle hat 3 Zeilen:
| post_id | title |
|---------|-----------|
| 1 | Java |
| 2 | Hibernate |
| 3 | JPA |
und die post_comment
Die untergeordnete Tabelle enthält die 3 Datensätze:
| post_comment_id | review | post_id |
|-----------------|-----------|---------|
| 1 | Good | 1 |
| 2 | Excellent | 1 |
| 3 | Awesome | 2 |
Die JOIN ON-Klausel unter Verwendung einer benutzerdefinierten Projektion
Traditionell wird beim Schreiben einer INNER JOIN
ou LEFT JOIN
Abfrage verwenden wir zufällig die ON-Klausel, um die Join-Bedingung zu definieren.
Um beispielsweise die Kommentare zusammen mit dem zugehörigen Beitragstitel und -bezeichner zu erhalten, können wir die folgende SQL-Projektionsabfrage verwenden:
SELECT
post.post_id,
title,
review
FROM post
INNER JOIN post_comment ON post.post_id = post_comment.post_id
ORDER BY post.post_id, post_comment_id
Und wir erhalten die folgende Ergebnismenge zurück:
| post_id | title | review |
|---------|-----------|-----------|
| 1 | Java | Good |
| 1 | Java | Excellent |
| 2 | Hibernate | Awesome |
Die JOIN USING-Klausel unter Verwendung einer benutzerdefinierten Projektion
Wenn die Fremdschlüsselspalte und die Spalte, auf die sie verweist, denselben Namen haben, können wir die USING-Klausel verwenden, wie im folgenden Beispiel:
SELECT
post_id,
title,
review
FROM post
INNER JOIN post_comment USING(post_id)
ORDER BY post_id, post_comment_id
Und die Ergebnismenge für diese spezielle Abfrage ist identisch mit der vorherigen SQL-Abfrage, die die ON-Klausel verwendet hat:
| post_id | title | review |
|---------|-----------|-----------|
| 1 | Java | Good |
| 1 | Java | Excellent |
| 2 | Hibernate | Awesome |
Die USING-Klausel funktioniert für Oracle, PostgreSQL, MySQL und MariaDB. SQL Server unterstützt die USING-Klausel nicht, so dass Sie stattdessen die ON-Klausel verwenden müssen.
Die USING-Klausel kann mit INNER-, LEFT-, RIGHT- und FULL JOIN-Anweisungen verwendet werden.
SQL JOIN ON-Klausel mit SELECT *
Wenn wir nun die vorherige ON-Klausel-Abfrage ändern, um alle Spalten auszuwählen, indem wir SELECT *
:
SELECT *
FROM post
INNER JOIN post_comment ON post.post_id = post_comment.post_id
ORDER BY post.post_id, post_comment_id
Wir werden die folgende Ergebnismenge erhalten:
| post_id | title | post_comment_id | review | post_id |
|---------|-----------|-----------------|-----------|---------|
| 1 | Java | 1 | Good | 1 |
| 1 | Java | 2 | Excellent | 1 |
| 2 | Hibernate | 3 | Awesome | 2 |
Wie Sie sehen können, ist die post_id
es vervielfältigt weil sowohl die post
y post_comment
Tabellen enthalten eine post_id
Spalte.
SQL JOIN USING-Klausel mit SELECT *
Andererseits, wenn wir eine SELECT *
Abfrage, die die USING-Klausel für die JOIN-Bedingung enthält:
SELECT *
FROM post
INNER JOIN post_comment USING(post_id)
ORDER BY post_id, post_comment_id
Wir erhalten die folgende Ergebnismenge:
| post_id | title | post_comment_id | review |
|---------|-----------|-----------------|-----------|
| 1 | Java | 1 | Good |
| 1 | Java | 2 | Excellent |
| 2 | Hibernate | 3 | Awesome |
Sie können sehen, dass dieses Mal die post_id
Spalte wird dedupliziert, so dass es eine einzige post_id
Spalte, die in der Ergebnismenge enthalten ist.
Schlussfolgerung
Wenn das Datenbankschema so gestaltet ist, dass die Namen der Fremdschlüsselspalten mit den Spalten übereinstimmen, auf die sie verweisen, und die JOIN-Bedingungen nur prüfen, ob der Wert der Fremdschlüsselspalte gleich dem Wert der Spiegelungsspalte in der anderen Tabelle ist, dann können Sie die USING-Klausel verwenden.
Wenn sich der Name der Fremdschlüsselspalte von der referenzierenden Spalte unterscheidet oder Sie eine komplexere Join-Bedingung einfügen möchten, sollten Sie stattdessen die ON-Klausel verwenden.