쌓고 쌓다

[Oracle] EQUI JOIN, NON-EQUI JOIN 본문

프로그래밍/SQL

[Oracle] EQUI JOIN, NON-EQUI JOIN

승민아 2022. 11. 1. 20:38

EQUI JOIN

SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1=table2.column2;

공통 칼럼 있을 때 그 값을 비교하여 같은 값을 가지는 행을 연결하여 결과를 생성한다.

join attribute(속성) : 연결 고리가 되는 공통 칼럼

 

EX) 학생 테이블과 부서 테이블을 EQUI JOIN하여 학번, 이름, 학과번호, 소속학과이름, 학과 위치를 출력

SELECT s.studno, s.name, s.deptno, d.dname, d.loc
FROM student s, department d
WHERE s.deptno=d.deptno;

 

EQUI JOIN - NATURAL JOIN

WHERE절을 사용하지 않고 NATURAL JOIN 키워드 사용

자동적으로 공통 칼럼을 찾아 조인해줌.

SELECT table1.column, table2.column
FROM table1
     NATURAL JOIN table2

 

아래처럼 join attribute(공통 속성)에 테이블 별명을 사용하지 않거나 모든 칼럼에 별명을 사용하지 않아야 함.

-- deptno에 s.deptno나 d.deptno처럼 별명을 사용하지 않아야함.
SELECT s.studno, s.name, deptno, d.dname
FROM student s
     NATURAL JOIN department d;
     
     
-- 모든 칼럼에 별명을 사용하지 않음
SELECT studno, name, deptno, dname
FROM student
     NATURAL JOIN department;

 

EX) NATURAL JOIN으로 교수 번호, 이름, 학과 번호, 학과 이름 출력

SELECT p.profno, p.name, deptno, d.dname
FROM professor p
     NATURAL JOIN department d;

 

EX) NATURAL JOIN으로 4학년 학생의 이름, 학과 번호와 학과 이름을 출력

SELECT s.name, deptno, d.dname
FROM student s
     NATURAL JOIN department d
WHERE grade='4';

SELECT s.name, s.deptno, d.dname
FROM student s, department d
WHERE s.deptno=d.deptno AND grade='4';

 

EQUI JOIN - JOIN ~ USING

USING절에 조인 대상 칼럼을 지정

칼럼 이름은 두 테이블에서 동일한 이름으로 정의되어 있어야 함

SELECT table1.column, table2.column
FROM table1 JOIN table2
     USING (column);

+ join attribute(공통 속성)에 테이블 별명을 사용하면 오류 발생

 

EX) JOIN ~ USING 절을 이용하여 학번, 이름, 학과 번호, 학과 이름, 학과 위치를 출력

SELECT s.studno, s.name, deptno, d.dname, d.loc
FROM student s JOIN department d
     USING (deptno);
     
SELECT studno, name, deptno, dname, loc
FROM student s JOIN department
     USING (deptno);

 

EX) EQUI JOIN의 3가지 방법으로 성이 '김'씨인 학생의 이름, 학과 이름, 학과 위치 출력

-- WHERE 절
SELECT s.name, d.dname, d.loc
FROM student s, department d
WHERE s.deptno=d.deptno
AND name LIKE '김%';

-- NATURAL JOIN
SELECT s.name, d.dname, d.loc
FROM student s
     NATURAL JOIN department d
WHERE name LIKE '김%';

-- JOIN USING
SELECT name, dname, loc
FROM student JOIN department
     USING (deptno)
WHERE name LIKE '김%';

 

NON-EQUI JOIN

비교 연산자 '<', BETWEEN a AND b 등... '=' 조건이 아닌 연산자를 사용하여 조인

 

EX) 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;

salgrade 테이블

EX) 101번 학과 교수의 이름, 급여, 급여 등급을 출력

SELECT p.name, p.sal, s.grade
FROM professor p, salgrade s
WHERE p.sal BETWEEN s.losal AND s.hisal
AND p.deptno=101;

 

Comments