Heim  >  Artikel  >  Datenbank  >  Was bedeutet die untergeordnete MySQL-Abfrageanweisung?

Was bedeutet die untergeordnete MySQL-Abfrageanweisung?

青灯夜游
青灯夜游Original
2020-10-07 12:52:042773Durchsuche

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 .

Was bedeutet die untergeordnete MySQL-Abfrageanweisung?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.

  • 2. Entsprechend der aufrufenden Methode des zurückgegebenen Ergebnisses

  • Unterabfrage kann in Unterabfrage vom Typ „Where“, „Unterabfrage vom Typ“ und „Unterabfrage vom Typ „Existenz“ entsprechend der Aufrufmethode des zurückgegebenen Ergebnissatzes unterteilt werden.
  • Where-Typ-Unterabfrage: (Verwenden Sie das innere Abfrageergebnis als Vergleichsbedingung der äußeren Abfrage)

  • Definition: Wobei-Typ-Unterabfrage verwendet das innere Abfrageergebnis als äußere Abfragebedingung.
  • vom Typ Unterabfrage: (Das Ergebnis der inneren Abfrage wird erneut für die äußere Abfrage bereitgestellt)

  • Definition: Von der Unterabfrage wird das Ergebnis der Unterabfrage (eine Tabelle im Speicher) als temporäre Tabelle behandelt und dann verarbeitet.

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));

Hinweis: Die Spielertabelle ist die grundlegende Tabelle mit Spielerinformationen und die Strafentabelle ist die Liste mit Spielerinformationen mit feinen Aufzeichnungen.

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);
3. Beispiel für eine Tabellenunterabfrage
Zum Beispiel: Ermitteln Sie die Anzahl der männlichen Spieler, deren Anzahl weniger als 10 beträgt

Zum Beispiel: Ermitteln Sie die Nummer des Spielers, der das gleiche Geschlecht wie Spieler Nr. 100 hat und in derselben Stadt lebt.

mysql> select playerno from (  
    select playerno, sex   
    from players   
    where playerno < 10)   
as players10 where sex=&#39;M&#39;;

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 = &#39;F&#39;);

Was bedeutet die untergeordnete MySQL-Abfrageanweisung?

实例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);

Was bedeutet die untergeordnete MySQL-Abfrageanweisung?

  实例3(all):获取最老球员的号码,名字及生日。(即出生日期数值小于或等于所有其它球员的球员)

mysql> select playerno, name, birth_date   
from players   
where birth_date <= all   
    (select birth_date   
    from players);

Was bedeutet die untergeordnete MySQL-Abfrageanweisung?

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);

Was bedeutet die untergeordnete MySQL-Abfrageanweisung?

 实例2(not exists):获取那些从来没有罚款的球员的名字和首字母。

mysql> select name, initials   
from players   
where not exists   
    (select * from penalties   
    where playerno = players.playerno);

Was bedeutet die untergeordnete MySQL-Abfrageanweisung?

推荐教程: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!

Stellungnahme:
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