basic/sql

SQL[07] - JOIN절

못지(Motji) 2021. 5. 31. 21:27

JOIN 절

# EQUI join 등가 조인

∙ 테이블과 테이블을 연결하여 필요한 정보를 반환한다.

∙ A테이블 B테이블을 JOIN할시 두 테이블을 이을 수 있는 컬럼이 각 테이블에 있어야 한다.

 

A에서 이름 칼럼을, B에서는 주소 칼럼을 가져와 새로운 정보를 반환하고 싶을때 JOIN을 사용하면 된다.

A,B TABLE에는 공통적인 ID 칼럼을 가지고 있다.

이 ID칼럼을 통해 두 테이블을 JOIN하여 원하는 값을 추출하면 된다.

✔  Oracle JOIN

SELECT a.col1, b.col1 FROM table1 a, table2 b WHERE a.co2 = b.coq2;

SELECT a.이름, b.주소 FROM A a, B b WHERE a.id = b.id;

✔ ANSI JOIN

SELECT a.col1, b.col1 FROM table a [INNER] JOIN table2 b ON a.co2 = b.col2;

SELECT a.이름, b.주소 FROM A a [INNER] JOIN B b ON a.id = b.id;

* INNER : NULL값이 안나옴 (default값이며, 생략가능)

* OUTER : NULL값이 나옴


⌨ emp, dept 테이블을 조회하여 emptno, ename, dname 출력해보자

emp TABLE과 dept TABLE에서 공통된 컬럼 "DEPTNO"이 있으므로 이 컬럼을 통해 join하여 원하는 값을 조합할 수 있다.

SELECT e.empno, e.ename, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno; --#1
-- 컬럼 별칭을 주지않고 컬럼명을 써줘도 됨, BUT 길어서 번거로울 수 있음
SELECT emp.empno, emp.ename, dept.dname FROM emp, dept WHERE emp.deptno = dept.deptno; --#2
SELECT e.empno, e.ename, d.dname FROM emp e JOIN dept d ON e.deptno = d.deptno; -- ANSI --#3
-- #1,2,3 모두 동일한 값 조회됨

⌨ ANSI JOIN의 inner outer 차이

∙ inner은 null값 안나오고, outer null값 포함하여 전체의 값이 나온다. 아래의 예제를 통해 알아보자

-- 서로 연결되는 값중 null값은 제외하고 출력
SELECT s.name, p.name
FROM student s JOIN PROFESSOR p
ON s.PROFNO = p.PROFNO;	--#1

-- 서로 연결되지 않는 null값도 전부 출력
--RIGHT : 테이블 쓴 순서 기준 오른쪽의 값은 전부 출력하고 연결되지 않는 왼쪽값을 NULL로 반환
SELECT s.name "학생이름", p.name "선생이름"
FROM student s RIGHT OUTER JOIN PROFESSOR p
ON s.PROFNO = p.PROFNO;	--#2
--LEFR : 테이블 쓴 순서 기준 왼쪽 값은 전부 출력하고 연결되지 않는 오른쪽값을 NULL로 반환
SELECT s.name "학생이름", p.name "선생이름"
FROM student s LEFT OUTER JOIN PROFESSOR p
ON s.PROFNO = p.PROFNO;	--#3 

⌨ 조건에 해당하는 두 테이블의 값을 JOIN하여 출력하기

∙ studetn 테이블과 department, professor 테이블을 조인하여 학생의 이름, 학생의 학과명(1전공 deptno1), 학생의 지도 교수이름 출력

SELECT s.name "학생이름", d.dname "1전공 학과명", p.name "지도교수이름"
FROM student s, DEPARTMENT d, professor p
WHERE s.deptno1 = d.deptno
AND s.PROFNO = p.PROFNO;

∙ student 테이블을 조회하여 1전공이 101번인 학생들의 이름과 각 학생들의 지도교수이름을 출력

SELECT s.NAME "학생이름", p.name "교수이름"
FROM student s, professor p
WHERE s.profno = p.profno
AND s.deptno1 = 101;