mysql では、サブクエリとは、別のクエリ ステートメント内にクエリ ステートメントをネストすることを指します。サブクエリは、SELECT、UPDATE、および DELETE ステートメントの WHERE 句で実装できます。WHERE 句の構文形式は次のとおりです: "WHERE 41256fb142f22f4bfc3f76fe922f5535 58e54c714943fe066fedb49a29758a9d (別のクエリ ステートメント)」。
(推奨チュートリアル: mysql ビデオ チュートリアル )
サブクエリは MySQL における比較です。一般的に使用されるクエリ方法である複数テーブル クエリは、サブクエリを通じて実装できます。サブクエリとは、あるクエリ ステートメントを別のクエリ ステートメント内にネストすることを指します。サブクエリは SELECT、UPDATE、および DELETE ステートメントで使用でき、複数のレベルでネストできます。実際の開発では、サブクエリが WHERE 句に出現することがよくあります。
WHERE のサブクエリの構文形式は次のとおりです。
WHERE <表达式> <操作符> (子查询语句)
このうち、演算子には比較演算子と、IN、NOT IN、EXISTS、NOT EXISTS などのキーワードを使用できます。
1) IN | NOT IN
式がサブクエリによって返された結果セットの値と等しい場合は TRUE が返され、それ以外の場合は FALSE が返されます。キーワード NOT を使用した場合、戻り値はまったく逆になります。
2) EXISTS | NOT EXISTS
は、サブクエリの結果セットが空かどうかを判断するために使用されます。サブクエリの結果セットが空でない場合は、TRUEが返され、それ以外の場合は FALSE が返され、キーワード NOT が使用された場合、戻り値はまったく逆になります。
例 1
サブクエリを使用して、tb_students_info テーブルと tb_course テーブルで Java コースを受講している学生の名前をクエリします。SQL ステートメントと実行結果は次のとおりです。
mysql> SELECT name FROM tb_students_info -> WHERE course_id IN (SELECT id FROM tb_course WHERE course_name = 'Java'); +-------+ | name | +-------+ | Dany | | Henry | +-------+ 2 rows in set (0.01 sec)
結果は、Dany と Henry だけが Java コースを受講していることを示しています。上記のクエリ プロセスを次の 2 つのステップに分割して、同じ効果を達成することもできます。
1) まず内部クエリを別途実行して、tb_course テーブル内のコース Java の ID を確認します SQL ステートメントと実行結果は次のとおりです。
mysql> SELECT id FROM tb_course -> WHERE course_name = 'Java'; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec)
条件を満たすidフィールドの値が1であることがわかります。
2) 次に、外側のクエリを実行して、tb_students_info テーブル内の course_id が 1 に等しい学生の名前をクエリします。 SQL文と実行結果は以下のとおりです。
mysql> SELECT name FROM tb_students_info -> WHERE course_id IN (1); +-------+ | name | +-------+ | Dany | | Henry | +-------+ 2 rows in set (0.00 sec)
従来、外側の SELECT クエリは親クエリと呼ばれ、括弧内に埋め込まれたクエリはサブクエリと呼ばれます (サブクエリは括弧内に配置する必要があります)。上記の例で MySQL が SELECT ステートメントを処理するときの実行フローは、最初にサブクエリを実行し、次に親クエリを実行します。
例 2
例 1 と同様に、SELECT ステートメントで NOT IN キーワードを使用して、Java コースを受講していない学生の名前をクエリします。実行結果は以下の通りです。
mysql> SELECT name FROM tb_students_info -> WHERE course_id NOT IN (SELECT id FROM tb_course WHERE course_name = 'Java'); +--------+ | name | +--------+ | Green | | Jane | | Jim | | John | | Lily | | Susan | | Thomas | | Tom | | LiMing | +--------+ 9 rows in set (0.01 sec)
実行結果は例 1 とまったく逆であることがわかります。Java コースを学習していない学生は、Dany と Henry 以外の学生です。
例 3
= 演算子を使用して、tb_course テーブルと tb_students_info テーブルで Python コースを学習しているすべての学生の名前をクエリします。SQL ステートメントと実行結果は次のとおりです。が続きます。
mysql> SELECT name FROM tb_students_info -> WHERE course_id = (SELECT id FROM tb_course WHERE course_name = 'Python'); +------+ | name | +------+ | Jane | +------+ 1 row in set (0.00 sec)
結果は、Python コースを勉強している唯一の学生が Jane であることを示しています。
例 4
a8093152e673feb7aba1828c43532094 演算子を使用して、tb_course テーブル内の Python コースを受講していない学生の名前、SQL ステートメント、および実行結果をクエリします。 tb_students_info テーブルは次のようになります。
mysql> SELECT name FROM tb_students_info -> WHERE course_id <> (SELECT id FROM tb_course WHERE course_name = 'Python'); +--------+ | name | +--------+ | Dany | | Green | | Henry | | Jim | | John | | Lily | | Susan | | Thomas | | Tom | | LiMing | +--------+ 10 rows in set (0.00 sec)
実行結果は例 3 とまったく逆であることがわかります。Python コースを学習していない学生は、Jane 以外の学生です。
例 5
tb_course テーブルに id=1 のコースがあるかどうかをクエリします。存在する場合は、tb_students_info テーブルのレコードをクエリします。SQL ステートメント実行結果は以下の通りです。
mysql> SELECT * FROM tb_students_info -> WHERE EXISTS(SELECT course_name FROM tb_course WHERE id=1); +----+--------+------+------+--------+-----------+ | id | name | age | sex | height | course_id | +----+--------+------+------+--------+-----------+ | 1 | Dany | 25 | 男 | 160 | 1 | | 2 | Green | 23 | 男 | 158 | 2 | | 3 | Henry | 23 | 女 | 185 | 1 | | 4 | Jane | 22 | 男 | 162 | 3 | | 5 | Jim | 24 | 女 | 175 | 2 | | 6 | John | 21 | 女 | 172 | 4 | | 7 | Lily | 22 | 男 | 165 | 4 | | 8 | Susan | 23 | 男 | 170 | 5 | | 9 | Thomas | 22 | 女 | 178 | 5 | | 10 | Tom | 23 | 女 | 165 | 5 | | 11 | LiMing | 22 | 男 | 180 | 7 | +----+--------+------+------+--------+-----------+ 11 rows in set (0.01 sec)
結果からわかるように、tb_course テーブルには id=1 のレコードがあるため、EXISTS 式は TRUE を返します。TRUE を受け取った後、外側のクエリ ステートメントはテーブル tb_students_info をクエリし、すべての値を返します。記録。
EXISTS キーワードは、他のクエリ条件と併用することができ、条件式と EXISTS キーワードは AND または OR で接続されます。
例 6
tb_course テーブルに id=1 のコースがあるかどうかをクエリします。存在する場合は、年齢フィールドが 24 を超えるレコードをクエリします。 tb_students_info テーブル SQL ステートメント そして、実行結果は次のようになります。
mysql> SELECT * FROM tb_students_info -> WHERE age>24 AND EXISTS(SELECT course_name FROM tb_course WHERE id=1); +----+------+------+------+--------+-----------+ | id | name | age | sex | height | course_id | +----+------+------+------+--------+-----------+ | 1 | Dany | 25 | 男 | 160 | 1 | +----+------+------+------+--------+-----------+ 1 row in set (0.01 sec)
結果は、レコードが tb_students_info テーブルからクエリされたことと、このレコードの age フィールド値が 25 であることを示しています。内部クエリ ステートメントは tb_course テーブルからレコードを取得し、TRUE を返します。外側のクエリ ステートメントはクエリを開始します。クエリ条件に従って、tb_students_info テーブルから年齢が 24 歳以上のレコードをクエリします。
展開
サブクエリの機能はテーブル結合によっても実現できますが、サブクエリを使用すると SQL ステートメントの読み書きが容易になります。
一般に、テーブル結合 (内部結合や外部結合など) はサブクエリで置き換えることができますが、その逆は必ずしも当てはまらず、一部のサブクエリはテーブル結合で置き換えることができません。サブクエリはより柔軟で便利で、形式が多様であり、クエリのフィルター条件として適しています。一方、テーブル結合は、接続されたテーブル内のデータを表示するのに適しています。
以上がmysqlでサブクエリを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。