이것은 매우 좋은 질문 이므로이 주제에 대한 자세한 기사 를 블로그에 작성하기로 결정했습니다 .
데이터베이스 테이블 모델
데이터베이스에 일대 다 테이블 관계를 형성하는 다음 두 테이블이 있다고 가정 해 보겠습니다.

student테이블은 부모이며,student_grade 이 학생 테이블의 ID를 기본 키 열을 참조하는 student_id 외래 키 열이 있기 때문에 자식 테이블입니다.
는 student table다음과 같은 두 개의 레코드를 포함 :
| 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 점을받은 모든 학생을 모집한다고 가정 해 보겠습니다.
학생 식별자에만 관심이 있다면 다음과 같은 쿼리를 실행할 수 있습니다.
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 인 레코드 를 필터링하기 위해 다음과 같이 EXISTS SQL 연산자를 사용할 수 있습니다.
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 연산자는 하위 쿼리가 하나 이상의 레코드를 반환하면 true를 반환하고 행을 선택하지 않으면 false를 반환합니다. 데이터베이스 엔진은 하위 쿼리를 완전히 실행할 필요가 없습니다. 단일 레코드가 일치하면 EXISTS 연산자가 true를 반환하고 연결된 다른 쿼리 행이 선택됩니다.
내부 하위 쿼리는 student_grade테이블 의 student_id 열 이 외부 학생 테이블의 id 열과 일치 하기 때문에 상관 관계 가 있습니다.