Detailliertes Beispiel einer MySQL-Unterabfrage

Detailliertes Beispiel einer MySQL-Unterabfrage

Unterabfrageklassifizierung

Klassifizierung nach zurückgegebenem Ergebnissatz

Unterabfragen werden entsprechend den zurückgegebenen Ergebnismengen in vier Typen unterteilt: Tabellenunterabfragen, Zeilenunterabfragen, Spaltenunterabfragen und skalare Unterabfragen. Tabellenunterabfrage: Der zurückgegebene Ergebnissatz ist ein Satz von Zeilen, N Zeilen und N Spalten (N>=1). Tabellenunterabfragen werden häufig in der FROM-Klausel einer übergeordneten Abfrage verwendet. Zeilenunterabfrage: Der zurückgegebene Ergebnissatz ist ein Satz von Spalten, eine Zeile mit N Spalten (N>=1). Zeilenunterabfragen können in der FROM-Klausel und der WHERE-Klausel einer Abfrage verwendet werden. Spaltenunterabfrage: Der zurückgegebene Ergebnissatz ist ein Satz von Zeilen mit N Zeilen und einer Spalte (N>=1). Skalare Unterabfrage: Der zurückgegebene Ergebnissatz ist ein Skalarsatz, eine Zeile und eine Spalte, also ein Skalarwert. Eine skalare Unterabfrage kann überall dort verwendet werden, wo ein skalarer Ausdruck angegeben werden kann.

Per Definition ist jede skalare Unterabfrage auch eine Zeilenunterabfrage und eine Spaltenunterabfrage, aber nicht umgekehrt; und jede Zeilenunterabfrage und Spaltenunterabfrage ist auch eine Tabellenunterabfrage, aber nicht umgekehrt.

Entsprechend der aufrufenden Methode zur Rückgabe des Ergebnisses

Unterabfragen können entsprechend der aufrufenden Methode zum Zurückgeben von Ergebnismengen in Unterabfragen vom Typ „Where“, „From“ und „Exists“ unterteilt werden.

Unterabfrage vom Typ „Where“: (Verwenden des inneren Abfrageergebnisses als Vergleichsbedingung der äußeren Abfrage) Definition: Unterabfragen vom Typ „Where“ verwenden das innere Abfrageergebnis als Bedingung der äußeren Abfrage. From-Subabfrage: (das innere Abfrageergebnis wird wieder für die äußere Abfrage verwendet) Definition: From-Subabfrage behandelt das Ergebnis der Unterabfrage (eine Tabelle im Speicher) als temporäre Tabelle und verarbeitet es dann. Exists-Unterabfrage: (bringt das Ergebnis der äußeren Abfrage in die innere Ebene, um zu sehen, ob die innere Abfrage erfolgreich war) Definition: Die Exists-Unterabfrage durchläuft die äußere Tabelle und führt dann eine innere Abfrage für die innere Tabelle aus. Ähnlich wie in(), aber es gibt einige Unterschiede. Es hängt hauptsächlich vom Größenunterschied zwischen den beiden Tabellen ab. Wenn die Unterabfragetabelle groß ist, verwenden Sie „exists“ (innerer Index); wenn die Unterabfragetabelle klein ist, verwenden Sie „in“ (äußerer Index);

Verwenden von Unterabfrageprinzipien

1. Eine Unterabfrage muss in Klammern eingeschlossen werden.

2. Platzieren Sie die Unterabfrage rechts neben der Vergleichsbedingung, um die Lesbarkeit zu verbessern. Die Unterabfrage enthält keine ORDER BY-Klausel. Für eine SELECT-Anweisung kann nur eine ORDER BY-Klausel verwendet werden. Wenn sie angegeben wird, muss sie ans Ende der Haupt-SELECT-Anweisung gestellt werden.

3. In Unterabfragen können zwei Arten von Vergleichsbedingungen verwendet werden: Einzelzeilenoperatoren (>, =, >=, <, <>, <=) und Mehrzeilenoperatoren (IN, ANY, ALL).

Beispielanalyse

Erstellen einer Testtabelle

TISCHSPIELER ERSTELLEN
  (PLAYERNO INTEGER NICHT NULL,
  NAME CHAR(15) NICHT NULL,
  INITIALEN CHAR(3) NICHT NULL,
  GEBURTSDATUM DATUM ,
  SEX CHAR(1) NICHT NULL,
  JOINED SMALLINT NICHT NULL,
  STRASSE VARCHAR (30) NICHT NULL,
  HAUSNR. CHAR(4) ,
  POSTLEITZAHL CHAR(6) ,
  TOWN VARCHAR(30) NICHT NULL,
  TELEFONNR.-ANZEIGE(13) ,
  LEAGUENO CHAR(4) ,
  PRIMÄRSCHLÜSSEL (SPIELERNR.));
 
TABELLENSTRAFEN ERSTELLEN
    (ZAHLUNGSNR. INTEGER NICHT NULL,
     PLAYERNO INTEGER NICHT NULL,
     PAYMENT_DATE DATUM NICHT NULL,
     BETRAG DEZIMAL(7,2) NICHT NULL,
     PRIMÄRSCHLÜSSEL (ZAHLUNGSNR.));

Hinweis: „Tischspieler“ ist die grundlegende Tabelle mit Spielerinformationen, und „Tischstrafen“ ist eine Liste mit Spielerinformationen, die eine Aufzeichnung der Geldstrafen enthält.

Testdaten einfügen

IN SPIELERWERTE EINFÜGEN (2, ‚Everett‘, ‚R‘, ‚1948-09-01‘, ‚M‘, 1975, ‚Stoney Road‘, ‚43‘, ‚3575NH‘, ‚Stratford‘, ‚070-237893‘, ‚2411‘);
IN SPIELERWERTE EINFÜGEN (6, ‚Parmenter‘, ‚R‘, ‚1964-06-25‘, ‚M‘, 1977, ‚Haseltine Lane‘, ‚80‘, ‚1234KK‘, ‚Stratford‘, ‚070-476537‘, ‚8467‘);
IN SPIELERWERTE EINFÜGEN (7, ‚Wise‘, ‚GWS‘, ‚1963-05-11‘, ‚M‘, 1981, ‚Edgecombe Way‘, ‚39‘, ‚9758VB‘, ‚Stratford‘, ‚070-347689‘, NULL);
IN SPIELERWERTE EINFÜGEN (8, ‚Newcastle‘, ‚B‘, ‚1962-07-08‘, ‚F‘, 1980, ‚Station Road‘, ‚4‘, ‚6584WO‘, ‚Inglewood‘, ‚070-458458‘, ‚2983‘);
IN SPIELERWERTE EINFÜGEN (27, ‚Collins‘, ‚DD‘, ‚1964-12-28‘, ‚F‘, 1983, ‚Long Drive‘, ‚804‘, ‚8457DK‘, ‚Eltham‘, ‚079-234857‘, ‚2513‘);
IN SPIELERWERTE EINFÜGEN (28, ‚Collins‘, ‚C‘, ‚1963-06-22‘, ‚F‘, 1983, ‚Old Main Road‘, ‚10‘, ‚1294QK‘, ‚Midhurst‘, ‚010-659599‘, NULL);
IN SPIELERWERTE EINFÜGEN (39, ‚Bishop‘, ‚D‘, ‚1956-10-29‘, ‚M‘, 1980, ‚Eaton Square‘, ‚78‘, ‚9629CD‘, ‚Stratford‘, ‚070-393435‘, NULL);
IN SPIELERWERTE EINFÜGEN (44, ‚Baker‘, ‚E‘, ‚1963-01-09‘, ‚M‘, 1980, ‚Lewis Street‘, ‚23‘, ‚4444LJ‘, ‚Inglewood‘, ‚070-368753‘, ‚1124‘);
IN SPIELERWERTE EINFÜGEN (57, ‚Brown‘, ‚M‘, ‚1971-08-17‘, ‚M‘, 1985, ‚Edgecombe Way‘, ‚16‘, ‚4377CB‘, ‚Stratford‘, ‚070-473458‘, ‚6409‘);
IN SPIELERWERTE EINFÜGEN (83, ‚Hope‘, ‚PK‘, ‚1956-11-11‘, ‚M‘, 1982, ‚Magdalene Road‘, ‚16A‘, ‚1812UP‘, ‚Stratford‘, ‚070-353548‘, ‚1608‘);
IN SPIELERWERTE EINFÜGEN (95, ‚Miller‘, ‚P‘, ‚14.05.1963‘, ‚M‘, 1972, ‚High Street‘, ‚33A‘, ‚5746OP‘, ‚Douglas‘, ‚070-867564‘, NULL);
IN SPIELERWERTE EINFÜGEN (100, ‚Parmenter‘, ‚P‘, ‚1963-02-28‘, ‚M‘, 1979, ‚Haseltine Lane‘, ‚80‘, ‚6494SG‘, ‚Stratford‘, ‚070-494593‘, ‚6524‘);
IN SPIELERWERTE EINFÜGEN (104, ‚Moorman‘, ‚D‘, ‚10.05.1970‘, ‚F‘, 1984, ‚Stout Street‘, ‚65‘, ‚9437AO‘, ‚Eltham‘, ‚079-987571‘, ‚7060‘);
IN SPIELERWERTE EINFÜGEN (112, ‚Bailey‘, ‚IP‘, ‚1963-10-01‘, ‚F‘, 1984, ‚Vixen Road‘, ‚8‘, ‚6392LK‘, ‚Plymouth‘, ‚010-548745‘, ‚1319‘);
 
IN STRAFSÄTZE EINFÜGEN: WERTE (1, 6, '1980-12-08',100);
IN STRAFSTRAFE EINFÜGEN WERTE (2, 44, '1981-05-05', 75);
IN STRAFSÄTZE EINFÜGEN (3, 27, '1983-09-10',100);
IN STRAFSTRAFE WERTE EINFÜGEN (4,104, '1984-12-08', 50);
IN STRAFENWERTE EINFÜGEN (5, 44, '1980-12-08', 25);
IN STRAFSÄTZE EINFÜGEN (6, 8, '1980-12-08', 25);
IN STRAFENWERTE EINFÜGEN (7, 44, '1982-12-30', 30);
IN STRAFSÄTZE EINFÜGEN (8, 27, '1984-11-12', 75);

Beispiel für eine Tabellenunterabfrage

Beispiel: Ermitteln Sie die Anzahl der männlichen Spieler, deren Anzahl kleiner als 10 ist

mysql> wähle playerno aus (
  Spieler auswählenNr., Geschlecht 
  von Spielern 
  wobei Spielernummer < 10) 
als Spieler10, wobei Geschlecht = „M“;

Beispiel für eine Zeilenunterabfrage

Beispiel: Holen Sie sich die Spielernummer von Spieler Nr. 100, der das gleiche Geschlecht hat und in der gleichen Stadt lebt.

mysql> Spielernummer auswählen 
von Spielern 
wobei (Geschlecht, Stadt) = (
  Wählen Sie Geschlecht, Stadt 
  von Spielern 
  wobei Spielernummer = 100);

Erklärung: Das Ergebnis der Unterabfrage ist eine Zeile mit zwei Werten: ('M', 'stratford'). Dieser Wert wird mit einem Zeilenausdruck (Geschlecht, Stadt) verglichen.

Beispiel für eine skalare Unterabfrage

Fast überall, wo Sie einen Skalarausdruck angeben können, können Sie eine skalare Unterabfrage verwenden. Beispiel: Holen Sie sich die Nummer des Spielers, der im selben Jahr wie Spieler Nr. 27 geboren wurde

mysql> Spielernummer auswählen 
von Spielern 
wobei Jahr(Geburtsdatum) = 
  (Jahr(Geburtsdatum) auswählen) 
  von Spielern 
  wobei Spielernummer = 27) 
und Spielernummer <> 27;

Die obige Anweisung ist gleichbedeutend mit:

mysql> wähle Spielernummer aus den Spielern, wobei Jahr(Geburtsdatum) = 1964 und Spielernummer <> 27 ist;

Unterabfragebeispiel

Da der von der Spaltenunterabfrage zurückgegebene Ergebnissatz eine Spalte mit N Zeilen ist, können Operatoren wie = > < >= <= <>, die skalare Ergebnisse vergleichen, nicht direkt verwendet werden. Die Operatoren IN, ANY (SOME) und ALL können in Spaltenunterabfragen verwendet werden: IN: innerhalb der angegebenen Elemente, dasselbe wie IN (Element 1, Element 2, ...). ANY: Wird in Verbindung mit einem Vergleichsoperator verwendet. Auf das Schlüsselwort ANY muss ein Vergleichsoperator folgen, der angibt, dass TRUE zurückgegeben wird, wenn der Vergleich mit einem beliebigen von der Unterabfrage zurückgegebenen Wert TRUE ergibt. SOME: Ein Alias ​​für ANY, weniger gebräuchlich. ALL: Wird in Verbindung mit einem Vergleichsoperator verwendet. Das Schlüsselwort ALL muss nach einem Vergleichsoperator platziert werden, um anzugeben, dass TRUE zurückgegeben wird, wenn alle von der Unterabfrage zurückgegebenen Werte mit TRUE verglichen werden.

Beispiel 1 (in): Holen Sie sich die Spielernummer, den Namen und die Stadt aller Spieler, deren Geschlecht weiblich ist.

mysql> wähle Spielernummer, Name, Stadt 
von Spielern 
wo Spieler keine in 
  (Spieler auswählenNr 
  von Spielern 
  wobei Geschlecht = „W“);

Beispiel 2 (beliebig): Ermitteln Sie die Nummer, das Datum und die Wohnstadt aller Spieler, die mindestens einen Spieler jünger sind als die gleiche Stadt.

mysql> wähle Spielernummer, Geburtsdatum, Stadt 
von Spielern als p1 
wobei Geburtsdatum > beliebig ist 
  (Geburtsdatum auswählen 
  von Spielern als p2 
  wobei p1.Stadt = p2.Stadt);

Beispiel 3 (alle): Holen Sie sich die Nummer, den Namen und das Geburtsdatum des ältesten Spielers. (d. h. Spieler, deren Geburtsdatumswerte kleiner oder gleich denen aller anderen Spieler sind)

mysql> wähle Spielernummer, Name, Geburtsdatum 
von Spielern 
wobei Geburtsdatum <= alle 
  (Geburtsdatum auswählen 
  von Spielern);

Das Schlüsselwort XISTS zeigt die Existenz an. Wenn das Schlüsselwort EXISTS verwendet wird, gibt die innere Abfrageanweisung nicht die abgefragten Datensätze zurück, sondern einen wahren oder falschen Wert. Wenn die innere Abfrageanweisung Datensätze findet, die die Bedingungen erfüllen, ist der Wert der EXISTS-Anweisung True, solange die Unterabfrage mindestens einen Wert zurückgibt. Gibt „true“ zurück, andernfalls „false“. Wenn der zurückgegebene Wert wahr ist, führt die äußere Abfrageanweisung eine Abfrage aus, andernfalls wird keine Abfrage ausgeführt. NOT EXISTS ist genau das Gegenteil. Die Verwendung von exists ähnelt der von in (), es bestehen jedoch dennoch Unterschiede. Es hängt hauptsächlich vom Größenunterschied zwischen den beiden Tabellen ab. Wenn die Unterabfragetabelle groß ist, verwenden Sie „exists“ (innerer Index); wenn die Unterabfragetabelle klein ist, verwenden Sie „in“ (äußerer Index);

Beispiel 1 (vorhanden): Holen Sie sich die Namen und Initialen von Spielern, die mindestens eine Geldstrafe bezahlt haben.

mysql> Name, Initialen auswählen 
von Spielern 
wo existiert 
  (wählen Sie * aus Strafen 
  wobei Spielernummer = Spieler.Spielernummer);

Beispiel 2 (existiert nicht): Holen Sie sich die Namen und Initialen von Spielern, die noch nie eine Geldstrafe erhalten haben.

mysql> Name, Initialen auswählen 
von Spielern 
wo nicht existiert 
  (wählen Sie * aus Strafen 
  wobei Spielernummer = Spieler.Spielernummer);

Das Obige ist ein ausführliches Beispiel einer MySQL-Unterabfrage. Weitere Informationen zu MySQL-Unterabfragen finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Beispielcode für mehrschichtige MySQL-Unterabfragen (Fall Favoriten)
  • Detaillierte Analyse des MySQL-Unterabfrageprinzips
  • Lösen Sie die Verwendung von Mysql-Mehrzeilen-Unterabfragen und Nullwertproblemen
  • MySQL-Tutorial: Ausführliche Erklärung zum Unterabfragebeispiel
  • MySQL-Unterabfrage und Details zur Verknüpfungstabelle
  • Probleme mit Join-Abfragen und Unterabfragen in MySQL
  • Grundlegende Verwendung von Unterabfragen in MySQL
  • MySQL-Unterabfragen und gruppierte Abfragen
  • MySQL Detaillierte Analyse der Verwendung von Unterabfragen

<<:  Tutorial zur Installation und Konfiguration der Centos7-MySQL-Datenbank

>>:  Der eigentliche Prozess der Einbindung von Axios in das Projekt

Artikel empfehlen

Erläuterung des Prinzips des MySQL-Replikationsmechanismus

Hintergrund Bei der Replikation handelt es sich u...

Mehrere gängige Methoden zum Senden von Anfragen mit Axios in React

Inhaltsverzeichnis Installieren und Einführen von...

Verwenden von CSS3 zum Implementieren eines Schriftfarbverlaufs

Beim Verwenden von Animation.css habe ich festges...

Detaillierte Einführung in das MySQL-Schlüsselwort Distinct

Einführung in die Verwendung des MySQL-Schlüsselw...

Detaillierte Erklärung der Rolle des neuen Operators in Js

Vorwort Js ist heutzutage die am häufigsten verwe...

MySQL-Dateneinfügungsoptimierungsmethode concurrent_insert

Wenn ein Thread eine DELAYED-Anweisung für eine T...

Dieser Artikel zeigt Ihnen das Prinzip der MySQL Master-Slave-Synchronisation

Inhaltsverzeichnis Kurze Analyse des MySQL Master...

Verwenden Sie js in html, um die lokale Systemzeit abzurufen

Code kopieren Der Code lautet wie folgt: <div ...

Webdesign-Tipps für Formular-Eingabefelder

Dieser Artikel listet einige Tipps und Codes zu F...

Zwei Tools zum Teilen des Bildschirms im Linux-Befehlszeilenterminal

Hier sind zwei Terminal-Split-Screen-Tools: scree...