In MySQL kann ein anderer Tabellenausdruck innerhalb eines Tabellenausdrucks aufgerufen werden. Der aufgerufene Tabellenausdruck wird als Unterabfrageanweisung bezeichnet, auch Subselect oder Inner Select genannt. Die Ergebnisse der Unterabfrage werden zur weiteren Verarbeitung an den Tabellenausdruck übergeben, der sie aufgerufen hat. Klassifikation von Unterabfragen .
Tabellenunterabfrage: Die zurückgegebene Ergebnismenge ist eine Menge von Zeilen, N Zeilen und N Spalten (N>=1). Tabellenunterabfragen werden häufig in der FROM-Klausel einer übergeordneten Abfrage verwendet.
Zeilen-Unterabfrage: Die zurückgegebene Ergebnismenge ist eine Reihe 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: Die zurückgegebene Ergebnismenge besteht aus einer Menge von Zeilen, N Zeilen und einer Spalte (N>=1).
Skalare Unterabfrage: Die zurückgegebene Ergebnismenge ist eine skalare Menge, eine Zeile und eine Spalte, also ein Skalarwert. Überall dort, wo Sie einen Skalarausdruck angeben können, können Sie eine Skalarunterabfrage verwenden.
Per Definition ist jede Skalarunterabfrage auch eine Zeilenunterabfrage und eine Spaltenunterabfrage, und umgekehrt ist jede Zeilenunterabfrage und Spaltenunterabfrage auch eine Tabellenunterabfrage und umgekehrt.
Where-Typ-Unterabfrage: (Verwenden Sie das innere Abfrageergebnis als Vergleichsbedingung der äußeren Abfrage)
vom Typ Unterabfrage: (Das Ergebnis der inneren Abfrage wird erneut für die äußere Abfrage bereitgestellt)
Unterabfrage vom Typ „Exists“: (Übertragen Sie das Ergebnis der äußeren Abfrage auf die innere Ebene, um zu sehen, ob die innere Abfrage wahr ist.)
Definition: Die Unterabfrage „exists“ dient dazu, die äußere Tabelle zu durchlaufen und dann eine innere Abfrage für die innere Tabelle durchzuführen. Ähnlich wie in (), aber sie sind immer noch unterschiedlich. Dies hängt hauptsächlich vom Größenunterschied zwischen den beiden Tabellen ab. Wenn die Unterabfragetabelle groß ist, verwenden Sie „existent“ (innerer Index), und wenn die Unterabfragetabelle klein ist, verwenden Sie „in“ (äußerer Index);
Verwenden Sie das Unterabfrageprinzip
1. Eine Unterabfrage muss in Klammern gesetzt werden .
2. Platzieren Sie die Unterabfrage rechts neben der Vergleichsbedingung, um die Lesbarkeit zu erhöhen.
Die Unterabfrage enthält keine ORDER BY-Klausel. Mit einer SELECT-Anweisung kann nur eine ORDER BY-Klausel verwendet werden. Falls angegeben, muss sie am Ende der Haupt-SELECT-Anweisung platziert werden.
3. In Unterabfragen können zwei Vergleichsbedingungen verwendet werden: einzeilige Operatoren (>, =, >=, ,
Beispielanalyse
1. Erstellen Sie eine Testtabelle
CREATE TABLE PLAYERS (PLAYERNO INTEGER NOT NULL, NAME CHAR(15) NOT NULL, INITIALS CHAR(3) NOT NULL, BIRTH_DATE DATE , SEX CHAR(1) NOT NULL, JOINED SMALLINT NOT NULL, STREET VARCHAR(30) NOT NULL, HOUSENO CHAR(4) , POSTCODE CHAR(6) , TOWN VARCHAR(30) NOT NULL, PHONENO CHAR(13) , LEAGUENO CHAR(4) , PRIMARY KEY (PLAYERNO)); CREATE TABLE PENALTIES (PAYMENTNO INTEGER NOT NULL, PLAYERNO INTEGER NOT NULL, PAYMENT_DATE DATE NOT NULL, AMOUNT DECIMAL(7,2) NOT NULL, PRIMARY KEY (PAYMENTNO));
2. Testdaten einfügen
INSERT INTO PLAYERS VALUES (2, 'Everett', 'R', '1948-09-01', 'M', 1975, 'Stoney Road','43', '3575NH', 'Stratford', '070-237893', '2411'); INSERT INTO PLAYERS VALUES (6, 'Parmenter', 'R', '1964-06-25', 'M', 1977, 'Haseltine Lane','80', '1234KK', 'Stratford', '070-476537', '8467'); INSERT INTO PLAYERS VALUES (7, 'Wise', 'GWS', '1963-05-11', 'M', 1981, 'Edgecombe Way','39', '9758VB', 'Stratford', '070-347689', NULL); INSERT INTO PLAYERS VALUES (8, 'Newcastle', 'B', '1962-07-08', 'F', 1980, 'Station Road','4', '6584WO', 'Inglewood', '070-458458', '2983'); INSERT INTO PLAYERS VALUES (27, 'Collins', 'DD', '1964-12-28', 'F', 1983, 'Long Drive','804', '8457DK', 'Eltham', '079-234857', '2513'); INSERT INTO PLAYERS VALUES (28, 'Collins', 'C', '1963-06-22', 'F', 1983, 'Old Main Road','10', '1294QK', 'Midhurst', '010-659599', NULL); INSERT INTO PLAYERS VALUES (39, 'Bishop', 'D', '1956-10-29', 'M', 1980, 'Eaton Square','78', '9629CD', 'Stratford', '070-393435', NULL); INSERT INTO PLAYERS VALUES (44, 'Baker', 'E', '1963-01-09', 'M', 1980, 'Lewis Street','23', '4444LJ', 'Inglewood', '070-368753', '1124'); INSERT INTO PLAYERS VALUES (57, 'Brown', 'M', '1971-08-17', 'M', 1985, 'Edgecombe Way','16', '4377CB', 'Stratford', '070-473458', '6409'); INSERT INTO PLAYERS VALUES (83, 'Hope', 'PK', '1956-11-11', 'M', 1982, 'Magdalene Road','16A', '1812UP', 'Stratford', '070-353548', '1608'); INSERT INTO PLAYERS VALUES (95, 'Miller', 'P', '1963-05-14', 'M', 1972, 'High Street','33A', '5746OP', 'Douglas', '070-867564', NULL); INSERT INTO PLAYERS VALUES (100, 'Parmenter', 'P', '1963-02-28', 'M', 1979, 'Haseltine Lane','80', '6494SG', 'Stratford', '070-494593', '6524'); INSERT INTO PLAYERS VALUES (104, 'Moorman', 'D', '1970-05-10', 'F', 1984, 'Stout Street','65', '9437AO', 'Eltham', '079-987571', '7060'); INSERT INTO PLAYERS VALUES (112, 'Bailey', 'IP', '1963-10-01', 'F', 1984, 'Vixen Road','8', '6392LK', 'Plymouth', '010-548745', '1319'); INSERT INTO PENALTIES VALUES (1, 6, '1980-12-08',100); INSERT INTO PENALTIES VALUES (2, 44, '1981-05-05', 75); INSERT INTO PENALTIES VALUES (3, 27, '1983-09-10',100); INSERT INTO PENALTIES VALUES (4,104, '1984-12-08', 50); INSERT INTO PENALTIES VALUES (5, 44, '1980-12-08', 25); INSERT INTO PENALTIES VALUES (6, 8, '1980-12-08', 25); INSERT INTO PENALTIES VALUES (7, 44, '1982-12-30', 30); INSERT INTO PENALTIES VALUES (8, 27, '1984-11-12', 75);
mysql> select playerno from ( select playerno, sex from players where playerno < 10) as players10 where sex='M';
Erklärung: Das Ergebnis der Unterabfrage ist eine Zeile mit zwei Werten: ('M','stratford'). Dieser Wert wird mit einem Zeilenausdruck (Geschlecht, Stadt) verglichen.
5 Beispiele für skalare Unterabfragen
Fast überall, wo Sie einen skalaren Ausdruck angeben können, können Sie eine skalare Unterabfrage verwenden. Zum Beispiel: Ermitteln Sie die Nummer des Spielers, der im selben Jahr wie Spieler Nr. 27 geboren wurde Die von der Spaltenunterabfrage zurückgegebene Menge besteht aus N Zeilen und einer Spalte, daher können Sie nicht direkt Operatoren verwenden, die Skalarergebnisse vergleichen. Die Operatoren IN, ANY (SOME) und ALL können in Spaltenunterabfragen verwendet werden:
IN: Innerhalb des angegebenen Elements, dasselbe wie IN (Element 1, Element 2,...).
ANY:与比较操作符联合使用,ANY关键字必须接在一个比较操作符的后面,表示与子查询返回的任何值比较为 TRUE ,则返回 TRUE 。
SOME:ANY 的别名,较少使用。
ALL:与比较操作符联合使用,ALL关键字必须接在一个比较操作符的后面,表示与子查询返回的所有值比较都为 TRUE ,则返回 TRUE 。
实例1(in):获取球员性别为女的所有球员的球员号,名字及所在城市。
mysql> select playerno, name, town from players where playerno in (select playerno from players where sex = 'F');
实例2(any):获取至少比同城的另一球员年轻的所有球员的号码,日期和居住城市。
mysql> select playerno, birth_date, town from players as p1 where birth_date > any (select birth_date from players as p2 where p1.town = p2.town);
实例3(all):获取最老球员的号码,名字及生日。(即出生日期数值小于或等于所有其它球员的球员)
mysql> select playerno, name, birth_date from players where birth_date <= all (select birth_date from players);
7、exists型子查询
EXISTS关键字表示存在。使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值,如果内层查询语句查询到满足条件的记录,只要子查询中至少返回一个值,则EXISTS语句的值就为True。就返回true,否则返回false。当返回的值为true时,外层查询语句将进行查询,否则不进行查询。NOT EXISTS刚好与之相反。exists的用法和in ()差不多,但是它们还是有区别的。主要是看两个张表大小差的程度。若子查询表大则用exists(内层索引),子查询表小则用in(外层索引);
实例1(exists):获取那些至少支付了一次罚款的球员的名字和首字母。
mysql> select name, initials from players where exists (select * from penalties where playerno = players.playerno);
实例2(not exists):获取那些从来没有罚款的球员的名字和首字母。
mysql> select name, initials from players where not exists (select * from penalties where playerno = players.playerno);
推荐教程:mysql视频教程
Das obige ist der detaillierte Inhalt vonWas bedeutet die untergeordnete MySQL-Abfrageanweisung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!