다른 쿼리의 결과를 사용한 쿼리를 만드는 등, 쿼리 속의 쿼리
SELECT student, grade
FROM test_scores
WHERE grade > (SELECT AVG(grade) FROM test_scores)
엑셀과 유사하게 쿼리를 쿼리 내의 값으로 활용하려면 서브쿼리 (쿼리 내의 쿼리)에 괄호를 쳐줘야 한다.
괄호처리한 쿼리가 먼저 실행된 후 전체 쿼리가 실행된다.
EXISTS 오퍼레이터를 활용해서 서브 쿼리에서 행의 존재를 확인할 수 있다.
=> 말이 어려운데, EXIST 오퍼레이터로 서브쿼리 전체를 WHERE의 대상 조건값으로 삼을 수 있어서, 특정 열 중에 있는지 확인하는 IN 과는 달리 서브쿼리로 뽑힌 데이터 어딘가에 있다면 EXIST 하다고 판단하는 오퍼레이터이다.
SELECT 행이름
FROM 테이블이름
WHERE EXIST (SELECT 행이름 FROM 테이블이름 WHERE 조건값)
SELECT first_name,last_name FROM customer AS c
WHERE EXISTS
(SELECT customer_id FROM payment AS p
WHERE p.customer_id=c.customer_id AND amount>11)
SELECT first_name,last_name FROM customer AS c
WHERE customer_id IN
(SELECT customer_id FROM payment AS p
WHERE p.customer_id=c.customer_id AND amount>11)
2/3번 모두 결과값은 동일하나, IN을 사용한 3번의 경우 추출값이 정확히 서브쿼리의 어떤 열에 있을지를 확인하여 추출하지만,
EXISTS를 사용한 2번의 경우 추출값이 서브쿼리 어딘가에 있다면 추출되는 듯 하다.
IN은 열 대상값을 로 가지지 못한다 (3번에서 customer_id를 으로 바꾸면 추출이 실패함)