티스토리 뷰

데이터베이스/MySQL

서브쿼리

토마's 2017. 11. 22. 21:29

안녕하세요. 실무에서 개발을 진행하면서 쿼리문을 짜다 보면, 서브 쿼리문을 짤 때가 있는데, 오늘은 서브쿼리에 대해서 알아보고 간단한 예제를 통해 포스팅해보려고 합니다.


서브쿼리 ?


서브쿼리는 SELECT 명령에 의한 데이터 질의로, 상부가 아닌 하부의 부수적인 질의를 의미하며 상황에 따라서 다양하게 사용할 수 있습니다.


// 간단한 서브쿼리 예

SELECT * FROM 테이블 WHERE ( SELECT * FROM 테이블2 )

SELECT * FROM ( SELECT * FROM 테이블 )

SELECT * FROM 테이블1 INNER JOIN ( SELECT * FROM 테이블2 ) ON 테이블1.a = 테이블2.a


이와 같이 많은 곳에서 이용할 수 있습니다.

그럼 간단한 예제를 통해 살펴보도록 하겠습니다.


위의 예제를 살펴보면 SELECT 구문에서 서브쿼리를 사용해, 각각의 테이블(sample51, sample54)의 개수를 가져와서 화면에 출력해주는 것을 확인할 수 있습니다.



이번에는 FROM 절에 서브쿼리를 사용해서 sample54의 데이터를 가지고 와서 다시 한번 SELECT를 해줘서 위와 같은 결과를 가져오는 것을 확인할 수 있습니다.

이러한 서브쿼리문은 단순히 조회(SELECT) 뿐만 아니라 데이터 삽입(INSERT), 갱신(UPDATE), 삭제(DELETE)에서 사용할 수 있습니다.


상관 서브쿼리?


상관 서브쿼리란 서브쿼리의 일종인 EXISTS, NOT EXISTS, IN, NOT IN 등을 나타내며, 일반 서브쿼리의 경우에는 서브쿼리만 따로 떼어내서 실행하더라도 단독 쿼리로 실행이 되는 반면, 상관 서브쿼리의 경우에는 부모 명령과 연관되어 처리되기 때문에 서브쿼리 부분만 따로 떼어내서 실행할 수 없습니다.


그럼 간단한 예제를 통해 상관 서브쿼리에 대해 알아보도록 하겠습니다.

위의 예제 및 결과를 살펴보면, sample551 테이블의 a 값을 업데이트하는데 sample552 테이블의 a 값이 sample551 테이블의 a 값과 일치하는 것이 있으면 sample551 테이블의 a 값을 "있습니다."로 업데이트 하는 쿼리문 입니다. 상관 서브쿼리문의 EXISTS는 단지 반환된 행이 있는지를 살펴보고 값이 있으면 참(업데이트 수행), 없으면 거짓(업데이트 수행 X)을 반환합니다. 이와 반대 결과를 얻기 위해서는 NOT EXISTS를 사용하면 됩니다.


또 다른 예제를 살펴보겠습니다. 


예제를 살펴보면, IN을 사용해서 집합을 비교할 수 있습니다. 즉, IN 오른쪽에 집합을 지정합니다. 왼쪽에 지정된 값과 같은 값이 집합 안에 존재하면 참을 반환합니다. 집합은 상수 리스트를 괄호로 묶어 기술하며, 여러 개의 OR 조건을 IN을 통해 한번에 표시할 수 있는 장점이 있습니다. 결과를 확인해보면, sample552 테이블의 no2 중에서 sample551의 테이블의 no에 일치하는 값이 하나라도 존재하면 존재하는 값들을 가져와 화면에 출력해준 것을 볼 수 있습니다. IN의 반대 값을 얻기 위해서는 NOT IN을 사용하면 됩니다.


※ 주의 사항


집계함수에서는 집합 안의 NULL 값을 무시하고 처리했습니다. IN에서는 집합 안에 NULL 값이 있어도 무시하지는 않습니다. 다만 NULL = NULL 을 제대로 계산할 수 없으므로 IN을 사용해도 NULL 값은 비교할 수 없습니다. 또한, NOT IN의 경우, 집합 안에 NULL 값이 있으면 설령 왼쪽 값이 집합 안에 포함되어 있지 않아도 참을 반환하지 않습니다. 그 결과는 UNKOWN(알져지지 않은 값)이 됩니다.


이상으로 서브쿼리에 관한 포스팅을 마치도록 하겠습니다.