쿼리 안에 쿼리를 넣어서 사용함으로서 타이핑이 줄어든다.
SELECT B.first_name, B.last_name, A.day
FROM my_table AS A
NATURAL JOIN sub_table AS B
WHERE A.day IN ('MON', 'TUE' , 'WEDN', 'SUN');
SELECT day FROM my_day
GROUP BY day
ORDER BY day;
위의 두 문장을 하나로 합칠 수 있다.
SELECT B.first_name, B.last_name, A.day
FROM my_table AS A
NATURAL JOIN sub_table AS B
WHERE A.day IN ( SELECT day FROM my_day );
// 빨간글씨를 감싸는 문장은 외부 쿼리라 하고 빨간 글씨는 내부 쿼리 혹은 서브 쿼리라고 한다.
// 다른 테이블의 열 정보를 가져와서 간편히 사용 가능하다.
하나의 예를 더 들어보자.
SELECT last_name, first_name
FROM my_table
WHERE zip_code =
(SELECT zip_code FROM zip_table
WHERE city = 'SEOUL');
// 내부 쿼리로 원하는 값을 구하고 그에 맞는 zip_code를 출력할 수 있다.
이것을 조인으로도 바꿀 수 있다.
SELECT A.last_name, A.first_name
FROM my_table A
NATURAL JOIN sub_table B
WHERE B.city = 'SEOUL';
서브 쿼리의 또 다른 사용방법
SELECT A.first_name, (SELECT pro FROM profession WHERE id = 1) AS pro
FROM my_table A;
비상관 쿼리
- 단지 값만 이용하는 방법
....(생략)....
WHERE B.data > (SELECT B.data FROM my_table A
NATURAL JOIN beta_table B
WHERE email = 'jjj@ss.com')
// 값만을 비교하고 있다
// 이외에도 IN, NOT IN 등이 있다
상관쿼리
NOT EXISTS, EXISTS
SELECT A.first_name
FROM my_table A
WHERE NOT EXISTS (SELECT * FROM sub_table B
WHERE A.id = B.id );
//my_table에는 있지만 sub_table에는 없는 사람들의 목록 출력
SELECT A.first_name
FROM my_table A
WHERE EXISTS (SELECT * FROM sub_table B
WHERE A.id = B.id );