본문 바로가기

프로그래밍/mySQL

[mySQL] 외부 쿼리와 내부 쿼리의 결합

쿼리 안에 쿼리를 넣어서 사용함으로서 타이핑이 줄어든다.


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 );

//한 번이라도 나온 사람 목록 출력