오라클 조인과 서브쿼리에 대해서 알아보도록 하겠습니다. 조인은 테이블과 테이블 간의 관계를 가지고 두 개 이상의 테이블의 데이터를 조합하는 것을 말하며 조인의 종류에는 INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이 있습니다. 서브쿼리는 쿼리 안에 쿼리를 중첩해서 사용하는 것으로 조인과 함께 좀 더 복잡한 데이터를 조회할 때 많이 사용이 됩니다.
조인이란?
조인이란 두 개 이상의 테이블을 합쳐 원하는 하나의 데이터로 만드는 집합체입니다. 보통 두세 개 정도를 조인해서 원하는 데이터를 출력하는 게 이상적이지만 사용하는 환경에 따라 관계형 DB에서는 수많은 테이블을 조인해서 사용하는 경우도 있습니다. 두 개 이상의 테이블을 합치고 각각의 테이블의 성격에 맞춰 조건을 걸고 원하는 데이터를 손쉽게 추출할 수 있습니다.
조인의 종류
오라클 조인의 종류에 대해 설명드리겠습니다. 첫 번째로 INNER JOIN은 두 개의 테이블을 연결할 때 일치하는 데이터만 표시하는 조인방식입니다. 두 개의 테이블 사이에 공통된 칼럼이 존재해야 하고 이 칼럼으로 결합이 됩니다. 만약 일치하지 않는 행은 조회 조건에서 제외가 됩니다. INNER JOIN이라 선언해서 사용할 수도 있고 두 개의 테이블만 선언 후 공통된 칼럼을 조회조건으로만 선언해도 INNER JOIN으로 지정이 됩니다. OUTER JOIN을 설명에 앞서 ORACLE 9i 이전 버전에서는(+) 기호를 사용해서 OUTER JOIN을 표기하는 방식이 있었지만 이는 ORACLE에서만 특화된 SQL 작성 방식이므로 다른 데이터베이스에서는 문제가 발생할 수 있습니다. 이에 따라(+) 기호에 대한 설명은 하지 않을 것이며 ANSI SQL 표준을 따르는 OUTER JOIN을 설명드리겠습니다. 두 번째로 LEFT OUTER JOIN은 왼쪽 테이블을 기준으로 공통된 칼럼을 가지고 오른쪽 테이블의 일치하는 행을 나열하는 방식입니다. LEFT OUTER JOIN은 왼쪽 테이블을 기준으로 하기 때문에 공통된 칼럼이 오른쪽에 데이터가 일치하지 않더라도 왼쪽 테이블의 데이터는 100% 조회됩니다. 왼쪽 테이블에 매치가 되지 않은 오른쪽 테이블의 칼럼들은 NULL로 표기가 됩니다. 왼쪽 테이블을 기준으로 존재하는 데이터를 덧붙일 때 사용하는 방식입니다. 세 번째로 RIGHT OUTER JOIN은 LEFT OUTER JOIN과는 반대의 개념으로 오른쪽 테이블을 기준으로 공통된 칼럼을 가지고 왼쪽 테이블의 일치하는 행을 나열하는 방식입니다. RIGHT OUTER JOIN은 오른쪽 테이블의 데이터는 100% 조회되고 특정 칼럼 기준으로 칼럼 매칭이 되는 열은 데이터가 표시되며 매칭이 되지 않는 열은 NULL로 표시가 됩니다. 네 번째로 FULL OUTER JOIN은 LEFT OUTER JOIN과 RIGHT OUTER JOIN을 합친 개념입니다. 왼쪽 테이블을 기준으로 매칭되지 않는 행은 NULL로 표시되며 오른쪽 테이블을 기준으로 매칭되지 않는 행도 NULL로 표시됩니다. 즉, 왼쪽, 오른쪽 테이블 데이터 전체가 보이는 조인입니다. 조인을 할 때 테이블만 나열하고 조건을 지정하지 않으면 카타시안의 곱(Cartesian product)이 발생합니다. 이 카타시안의 곱은 두 개 이상의 테이블에서 모든 행의 조합한 결과의 집합을 나타냅니다. 언뜻 보기에 모든 데이터가 다 표시되기에 FULL OUTER JOIN과 비슷해 보이지만 FULL OUTER JOIN은 테이블과 테이블 행의 수를 더하는 개념이고 카타시안의 곱은 곱하는 개념입니다. 예를 들어, A테이블의 행이 10개이고 B테이블의 행이 20개일 때 FULL OUTER JOIN의 경우 행의 수는 30개가 됩니다. 카타시안의 곱은 200개가 됩니다. 이처럼 실수로 조건을 지정하지 않으면 비정상적으로 데이터가 많이 조회가 되므로 성능상에 큰 영향을 끼치게 됩니다. 필요에 의해 조건을 지정하지 않고 곱으로 행을 만들어내는 경우가 있을 수도 있지만 가급적 WHERE절에 조인 조건을 꼭 사용하길 권장합니다.
서브쿼리
서브쿼리는 여러 개의 SQL문을 같이 사용하는 것을 말하며 SQL문 안에 SQL문을 작성할 수 있습니다. 서브쿼리는 거의 모든 SQL문에 사용이 가능하며 특정 데이터를 가공하거나 원하는 데이터를 만들어낼 때 사용할 수 있습니다. 테이블로 데이터를 구조화해서 담아두긴 했지만 모든 경우의 수를 다 고려해서 칼럼으로 데이터를 만들어둔 것이 아니기 때문에 기본 원천 데이터를 테이블로 만들어두고 필요에 따라 서브쿼리로 데이터를 가공해서 사용을 합니다. SELECT절에서 서브쿼리로 조회된 결과를 가상의 칼럼으로 사용이 가능하며 FROM절에서 서브쿼리로 조회된 결과를 가지고 가상의 테이블처럼 사용이 가능합니다. WHERE절 조건에서 서브쿼리로 조회할 대상인지 판별할 때도 사용이 가능합니다. EXISTS, NOT EXISTS는 논리 연산자로 검색결과가 존재할 경우 참(TRUE)으로 판단하는데 서브쿼리와 함께 자주 사용이 됩니다. EXISTS는 검색결과가 존재하는 경우, NOT EXISTS는 검색결과가 존재하지 않는 경우라고 보시면 됩니다. 서브쿼리는 그룹조건을 지정하는 HAVING절에서도 사용이 가능합니다.
마무리
지금까지 조인과 서브쿼리에 대해 알아봤습니다. 이번 포스팅은 다른 포스팅과 다르게 눈으로 보기에 이해가 쉽게 되지 않을 수도 있으나 이론적으로 쉽게 풀어보기 위해 설명하는 방식으로 글을 작성해 보았습니다. 예제가 필요하거나 궁금하신 점이 있으면 고민하지 말고 문의 남겨주시면 성심성의껏 답변드리겠습니다.
'IT정보' 카테고리의 다른 글
오라클에 관하여 (0) | 2023.04.30 |
---|---|
오라클 데이터 정규화 (0) | 2023.04.29 |
ORACLE 내부함수(문자열, 날짜, 변환, 숫자) (0) | 2023.04.27 |
오라클 GROUP BY, HAVING, 그룹함수 (0) | 2023.04.26 |
ORACLE DATA insert/update/delete (0) | 2023.04.25 |
댓글