등가 조인

EQUI JOIN

EQUI JOIN(등가 조인)은 두 개의 테이블에 겹치는 항목이 있을 경우에 사용하는 조인 방법이다. 종류는 크게 다음과 같이 구분할 수 있다.

  • NATURAL JOIN

  • INNER JOIN

샘플 테이블

CREATE TABLE teacher(
teacher_no NUMBER PRIMARY KEY,
teacher_name VARCHAR2(21) NOT NULL,
teacher_subject VARCHAR2(15) NOT NULL
);

CREATE TABLE pupil(
pupil_no NUMBER PRIMARY KEY,
pupil_name VARCHAR2(21) NOT NULL,
teacher_no REFERENCES teacher(teacher_no) ON DELETE CASCADE
);

INSERT INTO teacher VALUES(1, '피카츄', '전기학');
INSERT INTO teacher VALUES(2, '손오공', '에너지학');
INSERT INTO teacher VALUES(3, '홍길동', '전통학');

INSERT INTO pupil VALUES(1, '라이츄', 1);
INSERT INTO pupil VALUES(2, '파이리', 1);
INSERT INTO pupil VALUES(3, '꼬부기', 1);
INSERT INTO pupil VALUES(4, '야무차', 2);
INSERT INTO pupil VALUES(5, '부르마', 2);

구조

위에서 생성한 테이블의 구조는 다음과 같다고 볼 수 있다.

파란 부분의 연결선은 실제로 존재하는 것이 아니며, pupilteacher_no 값과 teacherteacher_no 를 비교하여 같으면 연결되어 있다고 판단할 수 있는 것다. 따라서 이 내용을 기반으로 테이블을 결합하여 조회할 수 있도록 하는 것이 등가 조인이다.

조인 없이 테이블 결합

SELECT * FROM teacher, pupil WHERE teacher.teacher_no = pupil.teacher_no;

과거에 사용하던 방식이며, 조회할 대상 테이블 두 개를 콤마로 연결하고 조건절을 추가하여 각각의 값이 같은 경우만 조회할 수 있도록 표현하였다.

NATURAL JOIN

SELECT * FROM teacher NATURAL JOIN pupil;

다음의 전제조건이 성립할 경우 제한적으로 사용할 수 있는 형태의 조인이다.

  • 반드시 동일한 이름과 타입을 가진 컬럼이 두 테이블에 존재하여야 한다.

NATURAL JOIN은 컬럼을 명시하지 않아도 자동으로 탐색하여 동일한 이름의 컬럼을 대상으로 조인을 하기 때문에 이름과 형태가 서로 같아야 다. 만약 같지 않을 경우 CROSS JOIN이 발생한다.

INNER JOIN

SELECT * FROM teacher INNER JOIN pupil ON teacher.teacher_no = pupil.teacher_no;

가장 일반적인 형태의 조인이며 조건을 통해 조인 상태를 정하여 조인 조건에 부합하는 데이터만 결합한다.

형식

SELECT 항목 FROM 
    테이블1 
        INNER JOIN 테이블2 ON 조인조건
        INNER JOIN 테이블3 ON 조인조건
        ...

별칭 사용

조인 시 별칭을 사용하여 구문을 간소화할 수 있다. INNER JOIN을 예로 들면

SELECT * FROM teacher INNER JOIN pupil ON teacher.teacher_no = pupil.teacher.no;

위의 구문에서 테이블에 별칭을 부여하면 다음과 같이 사용할 수 있다.

SELECT * FROM teacher T INNER JOIN pupil P ON T.teacher_no = P.teacher_no;

해석 순서에 의해 FROM이 먼저 해석되므로 T와 P라는 별칭을 ON 절에서도 사용할 수 있다.

충돌 해결

테이블 조인을 사용하다 보면 문제가 발생하는 경우가 있다.

ORA-00918: column ambiguously defined
ORA-00918: 열의 정의가 모호합니다

위와 같은 오류가 발생하는 경우인데, 원인은 다음과 같다.

teacher 테이블과 pupil 테이블을 INNER JOIN 하게 되면 teacher_no 컬럼이 중복되어 모호하게 되는 현상이 발생한다.

이를 해결하기 위해서는 두 가지 방법이 있다.

  1. 컬럼의 이름을 서로 다르게 짓는다

  2. 컬럼이 모호하지 않도록 명확하게 지정하여 선택한다.

모호성을 해결한 INNER JOIN 구문

SELECT 
    T.teacher_no, T.teacher_name, T.teacher_subject, P.pupil_no, P.pupil_name
FROM 
    teacher T 
        INNER JOIN pupil P ON T.teacher_no = P.teacher_no;

합치면 6개 항목이지만 teacher_no가 중복이기 때문에 제외하고 5개를 조회하도록 명시하면 모호성을 해결할 수 있다.

Last updated