일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- socket
- 메소드
- 클래스
- SwingCalendar
- 백준
- 자바
- 멀티쓰레드
- 서버
- Swing
- 인스턴스
- springDataJPA
- Oracle
- 컬렉션프레임워크
- 상속
- Spring
- 깃허브
- 클라이언트
- mavenCentral
- jcenter
- 생성자
- HTML모드
- java
- 사용자관리프로그램
- 코딩
- 카카오코딩테스트
- springboot
- 바인드변수
- 템플릿엔진
- JavaScript
- JPA Auditing
- Today
- Total
프리 정보 컨텐츠
오라클 SQL - INNER, OUTER, FULL JOIN 개념정리 본문
두 개 이상의 테이블을 하나 이상의 조건을 걸어서 해당되는 조건을 가진 값들을 하나의 ROW로 가져오는 것을 JOIN이라고 한다. JOIN을 자주 쓰이는 INNTER, OUTER, FULL 세 개의 명령어에 대한 개념 정리를 해보자.
INNTER JOIN
조건이 일치하는 값이 두 테이블에 모두 존재할 때 조회된다. 일종의 교집합이라고 생각하자.
사용하는 방법은 간단하다.
SELECT *
FROM TABLE1 T1
INNER JOIN TABLE2 T2
ON (T1.KEY = T2.KEY)
개념은 위와 같으며 아래의 예시들을 통해서 자세하게 알아보자.
CREATE TABLE depart (
deptno number NOT NULL , -- 부서번호(학과번호)
dname varchar2(30) NOT NULL , -- 부서명(학과명)
loc varchar2(20) DEFAULT NULL -- 위치 DEFAULT NULL : 입력값이 없으면 NULL 저장
);
INSERT INTO depart VALUES (101, '컴퓨터공학과', '1호관');
INSERT INTO depart VALUES (102, '멀티미디어학과', '2호관');
INSERT INTO depart VALUES (201, '전자공학과', '3호관');
INSERT INTO depart VALUES (202, '기계공학과', '4호관');
create table emp (
empno number not null, -- 직원 번호
name varchar2(30) not null, -- 이름
position varchar2(20) not null, -- 직급
tel varchar2(25) not null, -- 전화 번호
deptno number not null, -- 학과 번호
primary key(empno) -- 기본키
);
insert into emp values (10101, '홍길동', '사원', '031)781-2158', 101);
insert into emp values (10102, '김철수', '과장', '031)781-2159', 101);
insert into emp values (10103, '이영희', '대리', '031)781-2151', 102);
insert into emp values (10104, '고길동', '사원', '031)781-2152', 102);
insert into emp values (10105, '강호동', '사원', '031)781-2153', 102);
insert into emp values (10106, '아이유', '사원', '031)781-2154', 105);
depart, emp 두 테이블을 생성하고 데이터를 조회한다.
SELECT *
FROM emp
JOIN depart
ON emp.deptno = depart.deptno;
매칭되는 데이터의 값이 일치하는 것들만 가져와서 보여준다.
depart 테이블의 deptno 201,202는 emp 테이블에서 가지고 있는 데이터가 없으므로 출력되지 않았다.
emp 테이블에서도 depno 105는 데이터가 없으므로 출력되지 않았다.
위의 예시를 통해서 비교할 칼럼의 데이터가 매칭이 되면 매칭 되는 데이터의 값이 일치하는 것들만 보여준다는 것을 알 수가 있다. INNTER JOIN의 경우에는 이와 같은 경우에 사용하며, INNER는 생략이 가능하다.
SELECT empno, name, deptno, dname
FROM emp
JOIN depart
USING(deptno);
위와 같이 Ansi 표준으로 형식 칼럼을 선택해서 나타낼 수도 있다.
OUTER JOIN
INNER는 공통된 데이터의 교집합을 보여주지만 OUTER는 값이 빈 경우에도 나타내고 싶을 때 사용한다.
SELECT *
FROM emp
LEFT JOIN depart
ON emp.deptno = depart.deptno;
사용 방식은 INNTER JOIN과 동일하지만 LEFT JOIN을 사용하면 왼쪽 테이블이 모두 포함된 모습을 확인할 수 있고
SELECT *
FROM emp
RIGHT JOIN depart
ON emp.deptno = depart.deptno;
RIGHT JOIN을 사용하면 오른쪽테이블이 모두 포함된 모습을 확인할 수 있다.
이를 통해서 INNER JOIN은 공통된 데이터만 보여주고 싶을 때 사용하고 OUTER JOIN은 모든 데이터를 보여주되 데이터가 비어있는 null값도 같이 보여주는 것을 확인할 수가 있다.
SELECT name, deptno, dname
FROM emp
LEFT JOIN depart
USING (deptno);
USING 명령어를 통해 두 테이블이 동일하게 갖고 있는 칼럼명을 조건으로 명시해서 나타낼 수도 있다.
FULL JOIN
SELECT name, deptno, dname
FROM emp
FULL JOIN depart
USING (deptno);
FULL JOIN은 INNER, LEFT, RIGHT가 합쳐진 데이터를 확인할 수 있다.