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:
|
<<: Tutorial zur Installation und Konfiguration der Centos7-MySQL-Datenbank
>>: Der eigentliche Prozess der Einbindung von Axios in das Projekt
Hintergrund Bei der Replikation handelt es sich u...
Seien Sie vorsichtig, wenn Sie auf Ereignisse ach...
Inhaltsverzeichnis Installieren und Einführen von...
Beim Verwenden von Animation.css habe ich festges...
Canal ist ein Open-Source-Projekt von Alibaba, da...
Einführung in die Verwendung des MySQL-Schlüsselw...
Vorwort Js ist heutzutage die am häufigsten verwe...
Wenn ein Thread eine DELAYED-Anweisung für eine T...
Inhaltsverzeichnis Kurze Analyse des MySQL Master...
Code kopieren Der Code lautet wie folgt: <div ...
Wenn wir die webpackjs-Datei verpacken, führen wi...
1. Der Unterschied zwischen den Befehlen > und...
Dieser Artikel listet einige Tipps und Codes zu F...
Hier sind zwei Terminal-Split-Screen-Tools: scree...
Das <label>-Tag definiert eine Bezeichnung (...