Heim > Datenbank > MySQL-Tutorial > Hauptteil

Was ist eine MySQL-Unterabfrage? Wie filtere ich mithilfe einer Unterabfrage?

巴扎黑
Freigeben: 2017-05-10 13:25:13
Original
2716 Leute haben es durchsucht

Unterabfrage

MySQL 4.1 führte Unterstützung für Unterabfragen ein. Um das in diesem Kapitel beschriebene SQL verwenden zu können, müssen Sie MySQL 4.1 oder höher verwenden.

SELECT-Anweisung ist eine SQL-Abfrage. Alle SELECT-Anweisungen, die wir bisher gesehen haben, waren einfache Abfragen, also einzelne Anweisungen, die Daten aus einer einzelnen Datenbanktabelle abrufen.

Abfrage Jede SQL-Anweisung ist eine Abfrage. Allerdings bezieht sich dieser Begriff im Allgemeinen auf die SELECT-Anweisung.

SQL ermöglicht auch die Erstellung von Unterabfragen, d. h. Abfragen , die in anderen Abfragen verschachtelt sind. Warum machen wir das? Der beste Weg, dieses Konzept zu verstehen, besteht darin, einige Beispiele zu untersuchen.

Verwenden Sie Unterabfragen zum Filtern

Die in allen Kapiteln dieses Buches verwendeten Datenbanktabellen sind relationale Tabellen (eine Beschreibung der einzelnen Tabellen und Beziehungen finden Sie in Anhang B). . Bestellungen werden in zwei Tabellen gespeichert. In der Bestelltabelle wird für jede Bestellung eine Zeile gespeichert, die die Bestellnummer, die Kunden-ID und das Bestelldatum enthält. Artikel für jede Bestellung werden in der zugehörigen Orderitems-Tabelle gespeichert. In der Bestelltabelle werden keine Kundeninformationen gespeichert. Es speichert lediglich die ID des Kunden. Die tatsächlichen Kundeninformationen werden in der Kundentabelle gespeichert. Wenn Sie nun alle Kunden auflisten müssen, die Artikel TNT2 bestellt haben, wie sollten Sie ihn dann abrufen? Spezifische Schritte sind unten aufgeführt.

(1) Rufen Sie die Nummern aller Bestellungen ab, die Artikel TNT2 enthalten.

(2) Rufen Sie die IDs aller Kunden mit der im vorherigen Schritt aufgeführten Bestellnummer ab.

(3) Rufen Sie die Kundeninformationen aller im vorherigen Schritt zurückgegebenen Kunden-IDs ab.

Jeder der oben genannten Schritte kann als separate Abfrage ausgeführt werden. Die von einer SELECT-Anweisung zurückgegebenen Ergebnisse können in der WHERE-Klausel einer anderen SELECT-Anweisung verwendet werden.

Sie können Unterabfragen auch verwenden, um drei Abfragen in einer Anweisung zu kombinieren.

Die erste SELECT-Anweisung ist klar, sie ruft für alle Bestellartikel mit der prod_id TNT2 deren Spalte „order_num“ ab. Die Ausgabe listet zwei Bestellungen auf, die diesen Artikel enthalten:

Eingabe:

select order_num from orderitems where prod_id = 'TNT2';
Nach dem Login kopieren

Ausgabe:

Was ist eine MySQL-Unterabfrage? Wie filtere ich mithilfe einer Unterabfrage?

Als Nächstes enthält die Abfrage die Kunden-ID für Bestellungen 20005 und 20007. Schreiben Sie unter Verwendung der IN-Klausel die folgende SELECT-Anweisung:

Eingabe:

select cust_id from orders where order_num in (20005,20007);
Nach dem Login kopieren
Nach dem Login kopieren

Ausgabe:

Was ist eine MySQL-Unterabfrage? Wie filtere ich mithilfe einer Unterabfrage?

Geben Sie nun die erste ein Die Abfrage (diejenige, die die Bestellnummer zurückgibt) wird zu einer Unterabfrage, die die beiden Abfragen kombiniert. Bitte schauen Sie sich die folgende SELECT-Anweisung an:

Eingabe:

select cust_id from orders where order_num in (select order_num from orderitems where prod_id = 'TNT2');
Nach dem Login kopieren

Ausgabe:

Was ist eine MySQL-Unterabfrage? Wie filtere ich mithilfe einer Unterabfrage?

Analyse: In der SELECT-Anweisung wird die Unterabfrage Gehen Sie immer von innen nach außen vor. Bei der Verarbeitung der obigen SELECT-Anweisung führt MySQL tatsächlich zwei Vorgänge aus.

Zuerst wird die folgende Abfrage ausgeführt:

select order_num from orderitems where prod_id = 'TNT2';
Nach dem Login kopieren

Diese Abfrage gibt zwei Bestellnummern zurück: 20005 und 20007. Diese beiden Werte werden dann in dem vom IN-Operator geforderten kommagetrennten Format an die WHERE-Klausel der äußeren Abfrage übergeben. Die äußere Abfrage lautet:

select cust_id from orders where order_num in (20005,20007);
Nach dem Login kopieren
Nach dem Login kopieren

Wie Sie sehen können, ist die Ausgabe korrekt und mit dem von der vorherigen hartcodierten WHERE-Klausel zurückgegebenen Wert identisch.

Formatierte SQL-SELECT-Anweisungen, die Unterabfragen enthalten, können schwierig zu lesen und zu debuggen sein, insbesondere wenn sie komplex sind. Das Aufteilen der Unterabfrage in mehrere Zeilen und das entsprechende Einrücken wie oben gezeigt kann die Verwendung von Unterabfragen erheblich vereinfachen.

Jetzt wurden die IDs aller Kunden angezeigt, die Artikel TNT2 bestellt haben. Der nächste Schritt besteht darin, die Kundeninformationen für diese Kunden-IDs abzurufen. Die SQL-Anweisung zum Abrufen von zwei Spalten lautet:

Eingabe:

select cust_name,cust_contact from customers where cust_id in (10001,10004);
Nach dem Login kopieren

Sie können die WHERE-Klausel in eine Unterabfrage konvertieren, anstatt diese Kunden-IDs fest zu codieren:

Eingabe:

select cust_name,cust_contact from customers where cust_id in(select cust_id from orders where order_num in(select order_num from orderitems where prod_id = 'TNT2'));
Nach dem Login kopieren

Ausgabe:

Was ist eine MySQL-Unterabfrage? Wie filtere ich mithilfe einer Unterabfrage?

Analyse: Um die obige SELECT-Anweisung auszuführen, muss MySQL tatsächlich 3 SELECT-Anweisungen ausführen. Die innerste Unterabfrage gibt eine Liste von Bestellnummern zurück, die in der WHERE-Klausel ihrer äußeren Unterabfrage verwendet wird. Die äußere Unterabfrage gibt die Liste der Kunden-IDs zurück, die in der WHERE-Klausel der äußersten Abfrage verwendet werden. Die äußerste Abfrage gibt die erforderlichen Daten zurück.

Es ist ersichtlich, dass durch die Verwendung von Unterabfragen in der WHERE-Klausel leistungsstarke und flexible SQL-Anweisungen geschrieben werden können. Es gibt keine Begrenzung für die Anzahl der verschachtelten Unterabfragen. Bei der tatsächlichen Verwendung können jedoch aufgrund von Leistungseinschränkungen nicht zu viele Unterabfragen verschachtelt werden.

Spalten müssen übereinstimmen. Wenn Sie eine Unterabfrage in einer WHERE-Klausel verwenden (wie hier gezeigt), sollten Sie sicherstellen, dass die SELECT-Anweisung die gleiche Anzahl von Spalten wie in der WHERE-Klausel hat. Normalerweise gibt eine Unterabfrage eine einzelne Spalte zurück und stimmt sie überein, bei Bedarf können jedoch auch mehrere Spalten verwendet werden.

Obwohl Unterabfragen normalerweise in Verbindung mit dem IN-Operator verwendet werden, können sie auch zum Testen auf Gleichheit ( = ), Ungleichheit ( ) usw. verwendet werden.

Unterabfrage und Leistung Der hier angegebene Code funktioniert und liefert die gewünschten Ergebnisse. Die Verwendung von Unterabfragen ist jedoch nicht immer die effizienteste Methode zur Durchführung dieser Art des Datenabrufs. Weitere Informationen finden Sie in Kapitel 15, wo dieses Beispiel noch einmal aufgeführt wird.

[Verwandte Empfehlungen]

  1. MySQL erstellt berechnete Felder und verwendet Unterabfragen

  2. Was sind Joins und relationale Tabellen in MySQL?

  3. Warum Joins verwenden und wie man Joins erstellt

  4. Die Bedeutung der WHERE-Klausel in MySQL und wie man mehrere Tabellen verknüpft

Das obige ist der detaillierte Inhalt vonWas ist eine MySQL-Unterabfrage? Wie filtere ich mithilfe einer Unterabfrage?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!