Abfragen mehrerer Datenbanktabellen gleichzeitig mit SQL-Verknüpfungen
Einer der größten Vorteile der Verwendung relationaler Datenbanken wie MySQL besteht darin, dass Sie aufgrund der relationalen Struktur Informationen auf einfache Weise in mehreren Tabellen speichern und abfragen können.
Lassen Sie uns untersuchen, wie Sie genau die gewünschten Daten aus mehreren Datenbanktabellen abrufen und welche verschiedenen Verknüpfungen verfügbar sind, mit denen Sie genau die gewünschten Ergebnisse erzielen können.
Beispieldatenbank initialisieren
Dies ist nicht erforderlich. Wenn Sie jedoch den Beispielen in diesem Artikel folgen möchten, können Sie eine Beispieldatenbank lokal mit den folgenden Terminalbefehlen initialisieren:
git clone https://github.com/mdizak/sample-select-db.git
cd sample-select-db
sudo mysql < store.sql
sudo mysql sampledb
mysql> SELECT COUNT(*) FROM customers;
Sie sollten ein Ergebnis erhalten dort unter Angabe sind 2000 Zeilen innerhalb der Kunden – Tabelle.
Standard / INNER Join
Der in MySQL-Datenbanken verwendete Standard-Join wird als INNER-Join bezeichnet und ist der häufigste und einfachste. Dieser Join gibt alle Datensätze zurück, für die in beiden Tabellen übereinstimmende Datensätze vorhanden sind, und schließt alle anderen Datensätze ab.
Wenn Sie beispielsweise den Vor- und Nachnamen des Kunden sowie den Bestellbetrag und das Datum für alle Bestellungen über 1000 USD anzeigen möchten, können Sie die folgende SQL-Anweisung verwenden:
SELECT
c.id, c.first_name, c.last_name, o.amount, o.created_at
FROM
customers c, orders o
WHERE
o.customer_id = c.id AND o.amount >= 1000;
Einige Anmerkungen zur obigen Abfrage:
- Es werden fünf verschiedene Spalten ausgewählt, drei aus der Kundentabelle und zwei aus der Auftragstabelle.
- Innerhalb der FROM-Klausel werden die beiden Tabellen definiert, jedoch mit den Buchstaben "c" und "o" versehen. Diese geben einfach Aliase in SQL an, können beliebig sein und werden verwendet, um die SQL-Abfrage zu verkürzen.
- Die o.customer_id = c.id ist der Join-Aspekt der Abfrage und stellt die ordnungsgemäße Korrelation zwischen Kunden und Bestellungen sicher.
Im Folgenden finden Sie eine andere und technisch syntaktisch korrektere Methode zum Schreiben derselben Abfrage:
SELECT
c.id, c.first_name, c.last_name, o.amount, o.created_at
FROM
customers c INNER JOIN orders o
ON
customer_id = c.id
WHERE
o.amount >= 1000;
Die obige Abfrage ist in der Regel etwas einfacher zu lesen, da Sie die Verknüpfung zwischen der Kunden- und der Auftragstabelle leicht erkennen können. Diese beiden Abfragen sind jedoch in jeder Hinsicht gleich und erzeugen genau die gleichen Datensätze.
LINKS tritt bei
Linke Verknüpfungen geben alle Datensätze aus der linken Tabelle zurück, die auch mit Datensätzen aus der rechten Tabelle übereinstimmen, und schließen alle anderen Datensätze. Wenn Sie beispielsweise den Gesamtumsatz für jedes Produkt in der Datenbank anzeigen möchten, können Sie versuchen, eine Abfrage wie die folgende zu verwenden:
SELECT
p.name, sum(item.amount) AS tamount
FROM
orders_items item LEFT JOIN products p
ON
item.product_id = p.id
GROUP BY item.product_id ORDER BY tamount DESC
Dies führt zu einer schönen zweispaltigen Ansicht, in der der Produktname mit dem Gesamtumsatz angezeigt wird, und funktioniert wie erwartet. Die Abfrage durchlief alle Produkte in der Tabelle "orders_items", verband sie mit Datensätzen in der Tabelle "products" und gab den Gesamtumsatz jedes Produkts zurück.
RIGHT Joins
Beachten Sie anhand des obigen Beispiels, dass die obige Abfrage nur 19 Datensätze zurückgegeben hat, während sich insgesamt 22 Produkte in der Datenbank befinden. Dies liegt daran, dass die Abfrage mit der Tabelle "orders_items" begann und mit der Tabelle "products" verknüpft wurde. Da einige Produkte noch nie bestellt wurden, sind in der Tabelle "orders_items" keine Datensätze dieser Produkte vorhanden.
Was passiert, wenn Sie eine Liste aller Produkte mit Verkaufsmengen erhalten möchten, einschließlich der nicht bestellten Produkte? Versuchen Sie einen rechten Join mit der folgenden Abfrage:
SELECT
p.name, sum(item.amount) AS tamount
FROM
orders_items item RIGHT JOIN products p
ON
item.product_id = p.id
GROUP BY p.id ORDER BY tamount DESC
Das ist besser, und die Abfrage gibt jetzt die vollständigen 22 Produkte zurück, von denen drei den Wert null haben . Dies liegt daran, dass anstelle der Verwendung von orders_items als primäre Tabelle, die mit der Produkttabelle verknüpft wird, die rechte Verknüpfung die Bestellung umdreht und die Produkttabelle mit der Tabelle orders_items verknüpft.
Mehrere Verknüpfungen in einer Abfrage
Manchmal müssen Sie drei oder mehr Tabellen zusammenfügen, um bestimmte Ergebnisse zu erzielen.
Vielleicht möchten Sie eine Liste aller Kunden, die die Mikrowelle gekauft haben (Produkt-ID Nr. 1), einschließlich ihres Namens und Bestelldatums. Dies erfordert ein SELECT über drei Tabellen hinweg, das mithilfe von zwei Joins mit der folgenden Abfrage durchgeführt werden kann:
SELECT
c.first_name, c.last_name, o.amount, o.created_at
FROM
customers c INNER JOIN orders o
ON
c.id = o.customer_id INNER JOIN orders_items item
ON
item.order_id = o.id
WHERE
item.product_id = 1 ORDER BY o.created_at;
Diese Abfrage gibt alle 426 Bestellungen der Mikrowelle zurück und funktioniert wie erwartet. Zuerst werden alle Kunden mit ihren jeweiligen Bestellungen abgeglichen, dann weitere Abfragen, die sich ergeben, indem alle Bestellungen nur mit denen in der Tabelle orders_items abgeglichen werden, die das Mikrowellenprodukt enthalten (ID # 1).
Verwenden Sie niemals Unterabfragen mit IN-Klauseln
Als kurze Randnotiz sollten Sie unter allen Umständen immer vermeiden, Unterabfragen in Ihren SQL-Abfragen zu verwenden, wie z.
SELECT first_name,last_name FROM customers WHERE id IN (SELECT customer_id FROM orders WHERE status = 'approved' AND amount < 100);
Abfragen wie die oben genannten sind sehr ineffizient, verbrauchen eine große Anzahl von Ressourcen und sollten so weit wie möglich vermieden werden. Verwenden Sie stattdessen die richtigen Verknüpfungen, wie in den obigen Abschnitten beschrieben. Zum Beispiel sollte die obige Abfrage wie folgt umgeschrieben werden:
SELECT c.first_name, c.last_name FROM customers c LEFT JOIN orders o ON o.customer_id = c.id WHERE o.status = 'approved' AND o.amount < 100;
Sparen Sie Zeit mit SQL Joins
Dieser Artikel zeigt Ihnen hoffentlich die Leistungsfähigkeit relationaler Datenbanken wie MySQL und das Erstellen von SQL-Abfragen , mit denen Datensätze aus mehreren Tabellen innerhalb einer Abfrage mithilfe von Verknüpfungen abgerufen werden, sodass Sie genau die gewünschten Ergebnisse abrufen können.
Sie haben drei verschiedene Verknüpfungen in SQL kennengelernt, wie Sie Spalten- und Tabellennamen aliasisieren, mehrere Verknüpfungen in einer Abfrage verwenden und warum Sie Unterabfragen vermeiden sollten. Versuchen Sie nie wieder, verschiedene Datensätze manuell zu einem zusammenzustellen, und verwenden Sie Joins, um Ihre Arbeitskollegen zu beeindrucken und Zeit zu sparen.