[오라클] 조인 INNER JOIN(EQUI JOIN과 NON-EQUI JOIN)에 대해 알아보자
관계형 데이터베이스란 데이터베이스에 있는 각각의 테이블, 스키마 등이 서로 관계를 가지고 있는 것 인데요,
데이터베이스에서 데이터를 관리하고 분석하는 데에는 여러 테이블에 저장된 데이터를 효율적으로 결합해야 하는 경우가 있습니다.
SQL에서는 이러한 데이터 결합을 위해 여러 조인(Join) 방법을 사용합니다.
JOIN은 크게 INNER JOIN, OUTER JOIN으로 구분할 수 있고, INNER JOIN은 EQUI JOIN과 NON-EQUI JOIN으로 나눌 수 있습니다.
이번 글에서는 INNER JOIN의 두 가지 조인 방법인 EQUI JOIN과 NON-EQUI JOIN에 대해 이해하기 쉽게 알아보도록 하겠습니다.
1. EQUI JOIN
EQUI JOIN은 두 개 이상의 테이블에서 공통 칼럼 값을 기준으로 데이터를 결합하는 방법으로 (‘=’ 조건)양쪽 테이블에 둘다 존재하는 경우의 값을 가져옵니다.
EQUI JOIN조인의 3가지 종류
1-1.WHERE절을 이용한 EQUI JOIN (ON절 사용방법 추가)
WHERE절을 이용하여 공통 칼럼을 기준으로 데이터를 조회하는 방법.
학생테이블과 부서테이블을 (where절을 활용한)EQUI JOIN하여 학번, 이름, 학과번호, 소속학과 이름, 학과 위치를 출력해보자
학생테이블 (student) 데이터
| studno | name | deptno |
|--------|------|--------|
| 101 | Alice| 1 |
| 102 | Bob | 2 |
| 103 | Carol| 2 |
| 104 | David| 3 |
부서테이블 (department) 데이터
| deptno | dname | loc |
|--------|----------|----------|
| 1 | Physics | BuildingA|
| 2 | Biology | BuildingB|
| 3 | Chemistry| BuildingC|
학생테이블과 부서테이블을 deptno를 기준으로 EQUI JOIN하여 학번, 이름, 학과번호, 소속학과 이름, 학과 위치를 출력
SELECT s.studno, s.name, s.deptno, d.dname, d.loc
FROM student s, department d
WHERE s.deptno = d.deptno;
다음과 같이 사용할 수 도 있다
SELECT s.studno, s.name, s.deptno, d.dname, d.loc
FROM student s INNER JOIN department d
ON s.deptno = d.deptno;
결과
| studno | name | deptno | dname | loc |
|--------|------|--------|----------|----------|
| 101 | Alice| 1 | Physics | BuildingA|
| 102 | Bob | 2 | Biology | BuildingB|
| 103 | Carol| 2 | Biology | BuildingB|
| 104 | David| 3 | Chemistry| BuildingC|
student 테이블과 department 테이블을 deptno를 기준으로 EQUI JOIN한 결과로 학생의 학번, 이름, 학과번호와 학과의 이름과 위치가 결합되어 출력됨.
이렇게 EQUI JOIN은 WHERE절에서 두 테이블의 공통 칼럼을 비교하여 일치하는 데이터를 조회하는 방식은, 데이터베이스에서 가장 많이 활용되는 조인 방법 중 하나입니다.
1-2.자연조인(natural join)을 이용한 EQUI JOIN
자연조인은 WHERE절을 사용하지 않고 NATURAL JOIN이라는 키워드를 사용하여 두 테이블을 조인합니다.
(NATURAL JOIN 절에서는 조인 애트리뷰트(join attribute)에 테이블 별명을 사용하면 오류가 발생할 수 있으니 주의가 필요)
학생테이블과 부서테이블을 where절과, 자연조인(natural join)을 활용한 EQUI JOIN을 통해 학생의 이름, 학과번호와 학과이름을 출력해보고 비교해보자.
학생테이블 (student)
| studno | name | deptno | grade |
|--------|------|--------|-------|
| 101 | Alice| 1 | 4 |
| 102 | Bob | 2 | 3 |
| 103 | Carol| 2 | 4 |
| 104 | David| 3 | 4 |
부서테이블 (department)
| deptno | dname | loc |
|--------|----------|----------|
| 1 | Physics | BuildingA|
| 2 | Biology | BuildingB|
| 3 | Chemistry| BuildingC|
1-2-1. WHERE절을 이용한 EQUI JOIN
SELECT s.name, s.grade, s.deptno, d.dname
FROM student s, department d
WHERE s.deptno = d.deptno AND s.grade = '4';
1-2-2. NATURAL JOIN을 이용한 자연조인
SELECT s.name, s.grade, deptno, d.dname
FROM student s NATURAL JOIN department d
WHERE grade = '4';
결과는 두 방법 모두 4학년 학생의 이름, 학과번호와 학과이름을 출력됨.
자연조인은 JOIN 조건을 WHERE절이 아닌 NATURAL JOIN 키워드로 표현하여 두 테이블의 공통 칼럼을 자동으로 찾아 조인하는 방식,
(위에서 언급한대로, NATURAL JOIN 절에서는 조인 애트리뷰트에 테이블 별명을 사용하면 오류가 발생할 수 있으므로, 별명을 사용하지 않도록 주의가 필요)
1-3. JOIN~USING을 이용한 EQUI JOIN
EQUI JOIN의 또 다른 방법인 JOIN~USING은 USING절에 조인 대상 칼럼을 지정하여 자연조인을 수행하는 방법입니다.
이때, 칼럼 이름은 조인 대상 테이블에서 동일한 이름으로 정의되어 있어야 합니다.
(JOIN~USING은 명시적으로 지정하여 EQUI JOIN을 실행하는 방법으로 자연조인과 같은 결과를 얻을 수 있음)
SELECT table1.column, table2.column
FROM table1
JOIN table2
USING (column);
학번, 이름, 학과 번호, 학과 이름, 학과 위치를 출력
SELECT s.studno, s.name, s.deptno, d.dname, d.loc
FROM student s
JOIN department d USING (deptno);
(마찬가지로, 조인 애트리뷰트에 테이블 별명을 사용하면 오류가 발생할 수 있으므로, 별명을 사용하지 않도록 주의가 필요)
JOIN~USING절을 이용하면 조인 대상 칼럼을 명시적으로 지정하여 EQUI JOIN을 실행할 수 있습니다. 이를 통해 자연조인과 같은 결과를 얻을 수 있고, 코드의 가독성 또한 높일 수 있습니다.
EQUI JOIN 3가지 방법 비교
성이 ‘김’씨인 학생들의 이름, 학과, 학과 위치를 출력하는 EQUI JOIN 3가지 방법 비교
1. WHERE절을 이용한 EQUI JOIN
SELECT name, dname, loc
FROM student s, department d
WHERE s.deptno = d.deptno
AND name like '김%';
다음과 같이 사용할 수 도 있다
SELECT name, dname, loc
FROM student s INNER JOIN department d
ON s.deptno = d.deptno
AND name like '김%';
학생 테이블과 부서 테이블을 학과 번호(deptno)를 기준으로 조인
2. NATURAL JOIN을 이용한 EQUI JOIN
SELECT s.name, d.dname, d.loc
FROM student s NATURAL JOIN department d
WHERE name like '김%';
학생 테이블과 부서 테이블을 학과 번호(deptno)를 기준으로 자동으로 조인
3. JOIN~USING절을 이용한 EQUI JOIN
SELECT name, dname, loc
FROM student JOIN department
USING (deptno)
WHERE name like '김%';
학생 테이블과 부서 테이블을 학과 번호(deptno)를 기준으로 명시적으로 지정하여 조인
모든 방법은 동일한 결과를 출력하며, 성이 ‘김’씨인 학생들의 이름, 학과, 학과 위치를 조회함.
(각각의 방법은 개발자 각각의 상황에 따라 성향에 맞게 선택하여 사용)
NON-EQUI JOIN
NON-EQUI JOIN은 ‘=’ 조건이 아닌 다른 종류의 연산자를 사용하여 두 개 이상의 테이블을 결합하는 방법으로, 주로 BETWEEN, <, > 등의 연산자가 자주 사용됩니다.
교수 테이블과 급여등급 테이블을 이용하여 교수별로 등급을 출력해보자(BETWEEN 연산자를 사용한, NON-EQUI JOIN 적용)
SELECT p.profno, p.name, p.sal, s.grade
FROM professor p, salgrade s
WHERE p.sal BETWEEN s.losal AND s.hisal;
교수 테이블(professor p)과 급여등급 테이블(salgrade s)을 조인.
교수의 급여(p.sal)와 급여등급 테이블의 최소 급여(s.losal)와 최대 급여(s.hisal) 사이의 범위를 비교하여 조회 (조건 : p.sal => s.losal AND =<p.sal s.hisal)
NON-EQUI JOIN은 ‘=’ 조건이 아닌 다양한 비교 연산자를 사용하여 유연하게 조인이 가능함으로써, 이를 통해 더 복잡한 데이터 관계를 처리할 수 있습니다.
이번글 에서는 SQL 조인중 INNER JOIN의 두 가지 방법인 EQUI JOIN과 NON-EQUI JOIN에 대해 알아보았는데요,
데이터베이스를 사용하는데 있어서 이러한 조인 방법들을 잘 이해하고 활용한다면 데이터 분석과 관리에서 더욱 효율적인 작업을 수행할 수 있을 것입니다.
위 내용들을 통하여, 각 방법의 특징과 사용법을 익히고 데이터베이스 활용에 도움이 되셨으면 좋겠습니다.
이전 글 – 오라클 데이터 조작어 DML(INSERT, UPDATE, DELETE) 활용 방법
이전 글 – 오라클 데이터 무결성 제약조건 정리 (기본키,외래키,참조키, 제약조건 생성, 추가, 삭제, 비활성화)
이전 글 – 오라클 인덱스에 대해 알아보자 (데이터베이스 실무에서 효율적으로 사용 할 수 있는 Oracle Index)
이전 글 – 오라클 뷰(VIEW) 조회 및 사용방법 (개념과 특징,종류, 장단점, 인라인뷰)
이전 글 – 오라클 사용자 권한 제어 (4가지 – 시스템 권한, 객체 권한, 롤, 동의어)
이전 글 – 오라클(데이터 웨어하우스) 분석 함수(효과적인 데이터 다차원 분석을 위한 강력한 도구)
이전 글 – 오라클 스케줄러와 JOB 관리 방법
이전 글 – 오라클 테이블 복구(테이블 데이터 복원하기)