본문 바로가기

Study/Database

[DB:Oracle]SQL - 조인(Join)과 서브쿼리(SubQuery)

조인(Join)

조인은 서로 다른 테이블의 값들을 가져와서 하나의 테이블로 출력하기 위한 작업이다. 하지만 같은 테이블 안에 존재하는 컬럼들 간 연관성이 있는 경우에도 조인을 사용할 수는 있다. 조인의 sql구문은 좀 길기 때문에 GUI 환경인 SQL Developer에서 작성해보려고 한다.

조인의 기본적인 문법은 alias와 on절을 이용하는 것이다. 아래와 같이 e, d라는 alias명을 두 테이블에 주고, 조인의 조건이 되는 컬럼을 on절에 적는다.

 

alias가 필수는 아니지만 테이블명을 그대로 쓰면 쿼리문이 정말 길어지기 때문에 편의성을 위한 작업이다. 그래서 alias명은 작성자가 임의로 지정하며, 보통 테이블명의 앞 스펠링을 따서 짓는다. 사실 여러 테이블을 조인할 경우, select 하는 컬럼이 해당 테이블들에 공통으로 존재하지 않으면 테이블명을 쓰지 않아도 된다. 그러나 DBMS가 어떤 테이블의 컬럼인지 찾아와야 하기 때문에 조회 속도가 현저히 느려질 수 있다.

 

그리고 조인과 함께 where절, order by절 등을 사용할 때는 on절 아래에 이어서 적으면 된다. 이 때도 당연히 alias를 해 주는 것이 성능상으로 좋다.

 

셀프 조인(Self Join)

셀프 조인은 말 그대로 같은 테이블끼리 조인하는 것이다. 위에 말했듯이 같은 테이블 내 컬럼끼리 서로 연관이 있을 경우 사용하는데, 예를 들면 이렇다. 어떤 사원에게 매니저가 있고, 그 매니저도 사원일 때 사원 번호가 매니저 번호에 사용된다. 사원번호가 101번인 사원에게 100번 매니저가 있다는 뜻이다. 이것을 쿼리로 작성하면 아래처럼 된다.

이러한 셀프 조인을 할 때는 on절의 쿼리가 매우 매우 중요하다. 위의 쿼리에서 만약 on절이 e2.manager_id = e1.employee_id로 바뀌면 틀린 결과가 나온다. 올바르게 작성한 쿼리는 e1 사원의 manager_id를 보고 e2 테이블에서 그 manager_id를 employee_id로 가지는 사원의 이름을 출력하는 쿼리다. 그렇기 때문에 e1.manager_id가 e2.employee_id와 같아야 하는 것이다. 이것이 바뀌어서는 안 된다.

 

혹시 둘 이상의 n개 테이블을 조인하고 싶다면 join과 on절을 반복해서 추가하면 된다.

 

서브 쿼리(SubQuery)

이름을 보면 알 수 있듯이 서브 쿼리는 메인 쿼리 안에 들어가는 또 다른 쿼리를 말한다. 서브 쿼리는 group by절을 제외한 모든 절에 사용할 수 있으며, 주로 대상의 정확한 데이터를 모를 경우 사용한다. 서브 쿼리가 들어간 쿼리문을 해석할 때, 서브 쿼리를 먼저 풀고 그 결과를 메인 쿼리에 적용시켜 풀면 빠르게 해석을 할 수 있다.

서브 쿼리의 종류에는 3가지가 있다. select절에 주로 사용하는 스칼라 서브쿼리(Scalar Subquery), from절에 사용하는 인라인 뷰(Inline View), 마지막으로 중첩 서브쿼리(Nested Subquery)가 있는데, 일반적으로 서브 쿼리라고 하면 중첩 서브쿼리를 말한다.

 

스칼라 서브쿼리는 단일 행, 또는 단일 값을 반환하기 때문에, select절 외에도 컬럼이나 단일 값이 들어가는 자리에 모두 사용 가능하다. 컬럼 자리에 대신 들어간다고 보면 된다. 그리고 인라인 뷰는 임시 테이블과 비슷한 역할을 해서, 테이블이 들어가야 하는 자리에 사용된다.

 

조인과 서브 쿼리는 정말 중요하고 수많은 곳에 사용되는 작업이다. 서브 쿼리를 사용하면 특히나 쿼리문이 길어지는데, 쿼리를 해석할 때 논리적으로 실행되는 순서에 따라 읽는 것이 나름의 방법이다.

<SQL select문의 논리적 순서>

from절 - join절 - where절 - group by절 - having절 - select절 - order by절

이렇게 select절을 빼고 물리적인 작성 순서대로 가다가 order by절 앞에 select절이 나오는 것을 볼 수 있다. 더불어 위에도 말했지만 메인 쿼리보다 서브 쿼리를 먼저 읽는 것도 하나의 방법이다.