これは非常に良い質問なので、このトピックに関する非常に詳細な記事をブログに書くことにしました。
データベーステーブルモデル
データベースに次の2つのテーブルがあり、1対多のテーブル関係を形成していると仮定します。

studentテーブルには、親である、そしてstudent_gradeそれは学生のテーブルのid主キー列を参照STUDENT_ID外部キー列を持っているので、子テーブルです。
にstudent tableは、次の2つのレコードが含まれています。
| id | first_name | last_name | admission_score |
|
| 1 | Alice | Smith | 8.95 |
| 2 | Bob | Johnson | 8.75 |
また、student_gradeテーブルには、学生が受け取った成績が保存されています。
| id | class_name | grade | student_id |
|
| 1 | Math | 10 | 1 |
| 2 | Math | 9.5 | 1 |
| 3 | Math | 9.75 | 1 |
| 4 | Science | 9.5 | 1 |
| 5 | Science | 9 | 1 |
| 6 | Science | 9.25 | 1 |
| 7 | Math | 8.5 | 2 |
| 8 | Math | 9.5 | 2 |
| 9 | Math | 9 | 2 |
| 10 | Science | 10 | 2 |
| 11 | Science | 9.4 | 2 |
SQLが存在します
数学のクラスで10年生を取得したすべての生徒を取得したいとします。
学生IDのみに関心がある場合は、次のようなクエリを実行できます。
SELECT
student_grade.student_id
FROM
student_grade
WHERE
student_grade.grade = 10 AND
student_grade.class_name = 'Math'
ORDER BY
student_grade.student_id
ただし、アプリケーションはstudent識別子だけでなく、のフルネームを表示することに関心があるため、studentテーブルからの情報も必要です。
student数学で10グレードのレコードをフィルタリングするために、次のようにEXISTSSQL演算子を使用できます。
SELECT
id, first_name, last_name
FROM
student
WHERE EXISTS (
SELECT 1
FROM
student_grade
WHERE
student_grade.student_id = student.id AND
student_grade.grade = 10 AND
student_grade.class_name = 'Math'
)
ORDER BY id
上記のクエリを実行すると、Alice行のみが選択されていることがわかります。
| id | first_name | last_name |
|
| 1 | Alice | Smith |
外側のクエリstudentは、クライアントに返すことに関心のある行列を選択します。ただし、WHERE句は、関連する内部サブクエリでEXISTS演算子を使用しています。
EXISTS演算子は、サブクエリが少なくとも1つのレコードを返す場合はtrueを返し、行が選択されていない場合はfalseを返します。データベースエンジンは、サブクエリを完全に実行する必要はありません。単一のレコードが一致した場合、EXISTS演算子はtrueを返し、関連する他のクエリ行が選択されます。
student_gradeテーブルのstudent_id列が外側のstudentテーブルのid列と一致するため、内側のサブクエリは相関しています。