Heim  >  Artikel  >  Datenbank  >  Untergeordnete MySQL-Datenabfrage

Untergeordnete MySQL-Datenabfrage

coldplay.xixi
coldplay.xixinach vorne
2021-03-16 09:10:273137Durchsuche

Untergeordnete MySQL-Datenabfrage

Eine Unterabfrage bezieht sich auf eine Abfrage, bei der eine Abfrageanweisung in einer anderen Abfrageanweisung verschachtelt ist. Die Unterabfrage wird zuerst in der SELECT-Klausel berechnet und das Ergebnis der Unterabfrage wird als Filterbedingung für eine andere äußere Abfrage verwendet. Die Abfrage kann auf einer Tabelle oder mehreren Tabellen basieren.

Zu den häufig verwendeten Operatoren in Unterabfragen gehören „any(some), all, in, exist“. Unterabfragen können zum Auswählen, Aktualisieren und Löschen von Anweisungen hinzugefügt und auf mehreren Ebenen verschachtelt werden. Vergleichsoperatoren können auch in Unterabfragen verwendet werden, z. B. „<“, „<=“, „>“, „>=“ und „!=“.


(1) Unterabfrage mit beliebigen und einigen Schlüsselwörtern
(2) Unterabfrage mit dem Schlüsselwort „all“
(3) Unterabfrage mit dem Schlüsselwort „exists“
(4) Unterabfrage mit dem Schlüsselwort „in“
(5) Unterabfrage mit Vergleichsoperator

(kostenlos Lernempfehlung: MySQL-Video-Tutorial)


(1), Unterabfrage mit beliebigen, einigen Schlüsselwörtern

beliebige und einige Schlüsselwörter sind Synonyme, was darauf hinweist, dass eine der Bedingungen erfüllt ist und die Erstellung von ermöglicht ein Ausdruck zum Vergleichen der Rückgabewertliste der Unterabfrage. Solange eine Vergleichsbedingung in der inneren Unterabfrage erfüllt ist, wird ein Ergebnis als Bedingung der äußeren Abfrage zurückgegeben.

Im Folgenden werden zwei Tabellen tbl1 und tbl2 definiert und Daten in die beiden Tabellen eingefügt:

mysql> create table tbl1( num1 int not null);Query OK, 0 rows affected (0.13 sec)mysql> create table tbl2(num2 int not null);Query OK, 0 rows affected (0.10 sec)mysql> insert into tbl1 values(1),(5),(13),(27);Query OK, 4 rows affected (0.05 sec)Records: 4  Duplicates: 0  Warnings: 0mysql> insert into tbl2 values(6),(14),(11),(20);Query OK, 4 rows affected (0.06 sec)Records: 4  Duplicates: 0  Warnings: 0

Auf jedes Schlüsselwort folgt ein Vergleichsoperator, der angibt, dass es wahr ist, wenn es im Vergleich mit einer von der Unterabfrage zurückgegebenen Position wahr ist zurückgegeben.

[Beispiel] Geben Sie alle num2-Spalten der Tabelle tbl2 zurück und vergleichen Sie dann den Wert von num1 in tbl1 damit. Solange er größer als jeder Wert von num2 ist, handelt es sich um ein qualifiziertes Ergebnis.

mysql> select num1 from tbl1 where num1 > any(select num2 from tbl2);+------+| num1 |+------+|   13 ||   27 |+------+2 rows in set (0.00 sec)
(2), Unterabfrage mit allen Schlüsselwörtern
  • Alle Schlüsselwörter müssen die Bedingungen aller inneren Abfragen gleichzeitig erfüllen. Auf das Schlüsselwort
  • all folgt ein Vergleichsoperator, was bedeutet, dass beim Vergleich mit allen von der Unterabfrage zurückgegebenen Werten true zurückgegeben wird.

[Beispiel] Gibt den Wert in der Tabelle tbl1 zurück, der größer ist als alle Werte in der Spalte num2 der Tabelle tbl2. Die SQL-Anweisung lautet wie folgt:

mysql> select num1 from tbl1 where num1 > all(select num2 from tbl2);+------+| num1 |+------+|   27 |+------+1 row in set (0.00 sec)
(3), Unterabfrage mit Schlüsselwort „exists“.
    Die Parameter nach dem Schlüsselwort „exists“ sind eine beliebige Unterabfrage, um zu bestimmen, ob mindestens eine Zeile zurückgegeben wird, und die äußere Abfrageanweisung fragt ab Die Unterabfrage gibt dann keine Zeilen zurück. Das von exist zurückgegebene Ergebnis ist falsch, und die äußere Anweisung führt zu diesem Zeitpunkt keine Abfrage durch.
[Beispiel 1] Fragen Sie ab, ob der Lieferant mit s_id=107 in der Lieferantentabelle vorhanden ist. Wenn er vorhanden ist, fragen Sie die Datensätze in der Obsttabelle ab. Die SQL-Anweisung lautet wie folgt:

mysql> select * from fruits    -> where exists
    -> (select s_name from suppliers where s_id = 107);+------+------+------------+---------+| f_id | s_id | f_name     | f_price |+------+------+------------+---------+| 12   |  104 | lemon      |    6.40 || a1   |  101 | apple      |    5.20 || a2   |  103 | apricot    |    2.20 || b1   |  101 | blackberry |   10.20 || b2   |  104 | berry      |    7.60 || b5   |  107 | xxxx       |    3.60 || bs1  |  102 | orange     |   11.20 || bs2  |  105 | melon      |    8.20 || c0   |  101 | cherry     |    3.20 || m1   |  106 | mango      |   15.70 || m2   |  105 | xbabay     |    2.60 || m3   |  105 | xxtt       |   11.60 || o2   |  103 | coconut    |    9.20 || t1   |  102 | banana     |   10.30 || t2   |  102 | grape      |    5.30 || t4   |  107 | xbabay     |    3.60 |+------+------+------------+---------+16 rows in set (0.00 sec)
Es ist aus den Ergebnissen ersichtlich Dass die inneren Abfrageergebnisse darauf hinweisen, dass in der Lieferantentabelle ein Datensatz von s_id=107 vorhanden ist, gibt der Exist-Ausdruck „true“ zurück, nachdem die äußere Abfrageanweisung „true“ erhalten hat, die Tabellenfrüchte abfragt und alle Datensätze zurückgibt.

[Beispiel 2] Fragen Sie ab, ob es einen Lieferanten mit s_id=107 in der Lieferantentabelle gibt. Fragen Sie die Datensätze mit f_price größer als 10,20 in der Obsttabelle ab. Die SQL-Anweisung lautet wie folgt:

mysql> select * from fruits    -> where f_price > 10.20 and exists
    -> (select s_name from suppliers where s_id = 107);+------+------+--------+---------+| f_id | s_id | f_name | f_price |+------+------+--------+---------+| bs1  |  102 | orange |   11.20 || m1   |  106 | mango  |   15.70 || m3   |  105 | xxtt   |   11.60 || t1   |  102 | banana |   10.30 |+------+------+--------+---------+4 rows in set (0.00 sec)
Sie können Siehe den Namen der inneren Abfragetabelle. Es gibt einen Datensatz von s_id=107 in der Lieferantentabelle, daher gibt der Ausdruck „exists“ nach dem Empfang „true“ zurück, die äußere Abfrageanweisung fragt die Früchtetabelle gemäß der Abfragebedingung f_price>10.20 ab und gibt Folgendes zurück Das Ergebnis sind 4 Datensätze mit f_price größer als 10,20.

    not exist wird auf die gleiche Weise verwendet wie exist, liefert aber das gegenteilige Ergebnis. Wenn die Unterabfrage mindestens eine Zeile zurückgibt, ist das Ergebnis von „not exist“ falsch, und die äußere Abfrageanweisung führt keine Abfrage durch. Wenn die Unterabfrage keine Zeilen zurückgibt, ist das von „not exist“ zurückgegebene Ergebnis „true“ und die äußere Abfrage Anweisung wird ausgeführt.
[Beispiel 3] Fragen Sie ab, ob der Lieferant mit s_id =107 in der Lieferantentabelle vorhanden ist. Wenn er nicht vorhanden ist, fragen Sie die Datensätze in der Obsttabelle ab:

mysql> select * from fruits    -> where not exists
    -> (select s_name from suppliers where s_id = 107);Empty set (0.00 sec)
Sie können sehen, dass der Die innere Abfrage gibt „false“ zurück. Wenn der äußere Ausdruck „false“ erhält, werden die Datensätze in der Fruchttabelle nicht mehr abgefragt.

Hinweis: Die Ergebnisse für „existiert“ und „nicht existiert“ hängen nur davon ab, ob Zeilen zurückgegeben werden, nicht vom Inhalt dieser Zeilen, daher ist diese Unterabfrage-Eingabeliste normalerweise irrelevant.

(4), Unterabfrage mit dem Schlüsselwort „in“
    Wenn das Schlüsselwort „in“ für eine Unterabfrage verwendet wird, gibt die innere Abfrageanweisung nur eine Datenspalte zurück und der Wert in dieser Datenspalte wird der äußeren Abfrageanweisung zum Vergleich bereitgestellt . operieren.
[Beispiel 1] Fragen Sie die Bestellnummer mit f_id c0 in der orderitems-Tabelle ab und fragen Sie die Kunden-c_id mit der Bestellnummer basierend auf der Bestellnummer ab. Die SQL-Anweisung lautet wie folgt:

mysql> select c_id from orders where o_num in
    -> (select o_num from orderitems where f_id = 'c0');+-------+| c_id  |+-------+| 10004 || 10001 |+-------+2 rows in set (0.00 sec)
Die obige Anweisung ist die Abkürzung der folgenden Abfragemethode:

mysql> select o_num from orderitems where f_id = 'c0';+-------+| o_num |+-------+| 30003 || 30005 |+-------+2 rows in set (0.00 sec)mysql> select c_id from orders where o_num in (30003,30005);+-------+| c_id  |+-------+| 10004 || 10001 |+-------+2 rows in set (0.00 sec)
Das Folgende ist das Schlüsselwort not in, das das Gegenteil von in ist:

[Beispiel 2] ähnelt Beispiel 1, aber das Schlüsselwort not in wird in der Select-Anweisung verwendet. Die SQL-Anweisung lautet wie folgt:

mysql> select c_id from orders where o_num not in
    -> (select o_num from orderitems where f_id ='c0');+-------+| c_id  |+-------+| 10001 || 10003 || 10005 |+-------+3 rows in set (0.00 sec)
Sie können sehen, dass drei Tabellen zurückgegeben werden. Wenn wir uns die Datensätze in Bestellungen ansehen, können wir sehen, dass der Kunde mit c_id gleich 10001 mehr als eine Bestellung hat:

mysql> select * from orders;+-------+---------------------+-------+| o_num | o_date              | c_id  |+-------+---------------------+-------+| 30001 | 2008-09-01 00:00:00 | 10001 || 30002 | 2008-09-12 00:00:00 | 10003 || 30003 | 2008-09-30 00:00:00 | 10004 || 30004 | 2008-10-03 00:00:00 | 10005 || 30005 | 2008-10-08 00:00:00 | 10001 |+-------+---------------------+-------+5 rows in set (0.00 sec)
Das Ergebnis schließt nur aus die Bestellnummer, es ist jedoch weiterhin möglich, denselben Kunden auszuwählen.

Die Funktionalität von Unterabfragen kann auch über Join-Abfragen erreicht werden, aber Unterabfragen erleichtern das Lesen und Schreiben von MySQL-Code.

(5)、带比较运算符的子查询

【例1】在suppliers表中查询s_city等于"Tianjin"的供应商s_id,然后在fruits表中查询所有该供应商提供的水果的种类,SQL语句如下:

mysql> select s_id,f_name from fruits    -> where s_id =
    -> (select s1.s_id from suppliers as s1 where s1.s_city = 'Tianjin');+------+------------+| s_id | f_name     |+------+------------+|  101 | apple      ||  101 | blackberry ||  101 | cherry     |+------+------------+3 rows in set (0.00 sec)

【例2】在suppliers表中查询s_city等于"Tianjin"的供应商,s_id,然后在fruits表中查询所有非该供应商提供的水果的种类,SQL语句如下:

mysql> select s_id , f_name from fruits    -> where s_id <>
    -> (select s1.s_id from suppliers as s1 where s1.s_city ='Tianjin');+------+---------+| s_id | f_name  |+------+---------+|  104 | lemon   ||  103 | apricot ||  104 | berry   ||  107 | xxxx    ||  102 | orange  ||  105 | melon   ||  106 | mango   ||  105 | xbabay  ||  105 | xxtt    ||  103 | coconut ||  102 | banana  ||  102 | grape   ||  107 | xbabay  |+------+---------+13 rows in set (0.00 sec)

更多相关免费学习推荐:mysql教程(视频)

Das obige ist der detaillierte Inhalt vonUntergeordnete MySQL-Datenabfrage. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen