# サブクエリとは、別のクエリ ステートメント内にネストされたクエリを指します。サブクエリは最初に select 句で計算され、サブクエリの結果は別の外部クエリのフィルタ条件として使用されます。クエリは 1 つのテーブルまたは複数のテーブルに基づくことができます。
サブクエリで一般的に使用される演算子には、any (some)、all、in、exists などがあります。サブクエリはステートメントの選択、更新、削除に追加でき、複数のレベルでネストできます。 「<」、「<=」、「>」、「>=」、「!=」などの比較演算子はサブクエリでも使用できます。
(2) すべてのキーワードを含むサブクエリ
(3) キーワードが存在するサブクエリ
(4) in を含むサブクエリキーワード
(5) 比較演算子を使用したサブクエリ
(無料学習の推奨事項: mysql ビデオ チュートリアル)
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
mysql> select num1 from tbl1 where num1 > any(select num2 from tbl2);+------+| num1 |+------+| 13 || 27 |+------+2 rows in set (0.00 sec)
[例 2]suppliers テーブルに s_id=107 のサプライヤーが存在するかどうかをクエリします。存在する場合は、fruits テーブルの f_price が 10.20 より大きいレコードをクエリします。SQL ステートメントは次のとおりです。 ##
mysql> select num1 from tbl1 where num1 > all(select num2 from tbl2);+------+| num1 |+------+| 27 |+------+1 row in set (0.00 sec)
not selected は、exist と同じように使用されますが、逆の結果を返します。サブクエリが少なくとも 1 行を返す場合、notexists の結果は false となり、外側のクエリ ステートメントはクエリを実行しません。サブクエリが行を返さない場合、notexistent によって返される結果は true になり、外側のクエリはクエリを実行しません。ステートメントが実行されます。お問い合わせください。
[例 3] s_id =107 のサプライヤーがサプライヤー テーブルに存在するかどうかをクエリします。存在しない場合は、フルーツ テーブルのレコードをクエリします。SQL 文は次のとおりです。 #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)
(4)、in キーワードを使用したサブクエリ
in キーワードを使用してサブクエリを実行すると、内部クエリ ステートメントは 1 つのデータ列のみを返します。内部の値は、比較操作のために外部のクエリ ステートメントに提供されます。
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)
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)
【例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教程(视频)
以上がMySQL データクエリの子クエリの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。