ホームページ >データベース >mysql チュートリアル >MySQL データクエリの子クエリ

MySQL データクエリの子クエリ

coldplay.xixi
coldplay.xixi転載
2021-03-16 09:10:273226ブラウズ

MySQL データクエリの子クエリ

# サブクエリとは、別のクエリ ステートメント内にネストされたクエリを指します。サブクエリは最初に select 句で計算され、サブクエリの結果は別の外部クエリのフィルタ条件として使用されます。クエリは 1 つのテーブルまたは複数のテーブルに基づくことができます。

サブクエリで一般的に使用される演算子には、any (some)、all、in、exists などがあります。サブクエリはステートメントの選択、更新、削除に追加でき、複数のレベルでネストできます。 「<」、「<=」、「>」、「>=」、「!=」などの比較演算子はサブクエリでも使用できます。


(1) 任意のキーワードを含むサブクエリ

(2) すべてのキーワードを含むサブクエリ
(3) キーワードが存在するサブクエリ
(4) in を含むサブクエリキーワード
(5) 比較演算子を使用したサブクエリ

(無料学習の推奨事項: mysql ビデオ チュートリアル)


(1)、任意のキーワードといくつかのキーワードを含むサブクエリ
任意のキーワードといくつかのキーワードは同義語であり、条件のいずれか 1 つが満たされていることを示し、比較する式を作成できます。サブクエリの戻り値リスト 内側のサブクエリの比較条件が満たされていれば、結果が外側のクエリの条件として返されます。

次の例では、2 つのテーブル tbl1 と tbl2 を定義し、その 2 つのテーブルにデータを挿入します。

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
any キーワードの後に​​比較演算子が続き、それが、によって返された any と比較されるかどうかを示します。サブクエリ ジョブの比較が true の場合、true を返します。

[例] tbl2 テーブルの num2 列をすべて返し、それと tbl1 の num1 の値を比較し、それが num2 の値より大きい限り、修飾された結果となります。

mysql> select num1 from tbl1 where num1 > any(select num2 from tbl2);+------+| num1 |+------+|   13 ||   27 |+------+2 rows in set (0.00 sec)
(2)、すべてのキーワードを含むサブクエリ
    すべてのキーワードは、すべての内部クエリの条件を同時に満たす必要があります。
  • all キーワードの後に​​は比較演算子が続きます。これは、サブクエリによって返されるすべての値と比較すると true が返されることを意味します。
[例] tbl2 テーブルの num2 列のすべての値より大きい tbl1 テーブルの値を返す SQL 文は次のとおりです。 #(3)、exists キーワードを含むサブクエリ

exists キーワードの後のパラメータは、任意のサブクエリです。システムはサブクエリを操作して、行を返すかどうかを判断します。少なくとも 1 つの行が返された場合、この時点で、外部のレイヤー クエリ ステートメントがクエリを実行しますが、サブクエリが行を返さない場合、exists によって返される結果は false になり、この時点では外側のレイヤー ステートメントはクエリを実行しません。
  • [例 1] s_id=107 のサプライヤーがサプライヤー テーブルに存在するかどうかをクエリします。存在する場合は、フルーツ テーブルのレコードをクエリします。SQL ステートメントは次のとおりです。
  • By 結果は、内部クエリの結果がサプライヤー テーブルに s_id=107 のレコードがあることを示しているため、exists 式は true を返します。true を受け取った後、外部クエリ ステートメントは果物テーブルにクエリを実行し、すべてのレコードを返します。 。

[例 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)
Yes 内部クエリ テーブル名サプライヤー テーブルに s_id=107 のレコードがあることがわかります。そのため、exists 式は true を返します。外部クエリ ステートメントが true を受け取った後、フルーツ テーブルは以下に従ってクエリされます。クエリ条件 f_price>10.20 に対して、返される結果は 10.20 より大きい 4 つの f_price レコードです。

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)
    内部クエリが false を返したときに、外部式が false を受け取った場合、フルーツ テーブル内のレコードをクエリしなくなることがわかります。
注: 存在する場合と存在しない場合の結果は、行の内容ではなく、行が返されるかどうかのみに依存するため、このサブクエリ入力リストは通常​​は無関係です。

(4)、in キーワードを使用したサブクエリ

in キーワードを使用してサブクエリを実行すると、内部クエリ ステートメントは 1 つのデータ列のみを返します。内部の値は、比較操作のために外部のクエリ ステートメントに提供されます。

[例 1] orderitems テーブルの f_id c0 で注文番号をクエリし、その注文番号に基づいて注文番号で顧客の c_id をクエリする SQL ステートメントは次のとおりです。
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)
  • 次は、in の反対の not in キーワードです:
  • [例 2] は次のようになります。例 1 ですが、select ステートメントで not in キーワードが使用されています。 SQL ステートメントは次のとおりです:

    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)
    3 つのテーブルが返されたことがわかります。注文のレコードを見ると、c_id が 10001 の顧客に複数の注文があることがわかります:

    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 コードの読み書きが容易になります。

    (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教程(视频)

    以上がMySQL データクエリの子クエリの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。