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)
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)
[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)
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)
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)
mysql> select * from fruits -> where not exists -> (select s_name from suppliers where s_id = 107);Empty set (0.00 sec)
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“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)
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)
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)
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)
【例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!