일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 데이터베이스
- JPA
- javascript
- IOS
- DBMS
- 오라클
- 스프링부트 웹 소켓
- Xcode
- 소켓
- 다이어리
- CD
- 아이패드다이어리
- AI
- 리눅스
- Dining philosopher problem
- 프로그래밍언어론
- MySQL
- 인공지능
- CI
- springboot
- 42seoul
- 스프링부트
- Spring
- libasm
- swift
- jenkins
- 밥먹는 철학자
- 네트워크
- 스프링
- sql
- Today
- Total
Hi yoahn 개발블로그
#5 JOIN 본문
정규화
- 하나의 테이블을 더 작은 테이블로 분리하여 중복을 최소화한다.
- 다수의 컬럼으로 구성된 테이블을 논리 덩어리별로 작은 테이블로 분할
- 장점: 데이터베이스 변경시 이상 현상 제거
비정규화
- 정규화의 반대, 중복 허용
- 장점: 조회 성능 향상
-> 중복을 허용해서 자주쓰이는 결과물들을 미리 테이블에 만들어서 컬럼화 해둠
-> 조회 성능 극단적으로 좋아질 수 있다.
JOIN: 정규화 후 여러 테이블에 흩어진 데이터들을 조합해서 가져오는 기술
*** 선행, 후행 테이블
조인 수행 시 둘 중 하나의 테이블을 먼저 읽고 조인 조건절을 확인하여 첫번째 테이블을 먼저 읽고 각 행마다 조인 조건절을 확인하여 나머지 테이블에서 데이터를 가져옴
1. 카티션 곱
조인 대상 테이블들의 조건이 누락되었을 경우 발생하는 현상, 해당 조인에 참여하는 모든 대상 행을 다 출력
(선행, 후행 테이블의 모든 조합)
- join 조건절을 잘못 적었거나 join 조건이 없는 경우
사용하는 경우
1) 데이터를 복제해서 원본 테이블을 반복해서 읽는 것을 피하기 위함
2) 실수로 조인조건 컬럼 일부를 빠뜨린 경우
2. EQUI JOIN
등가 조인, 조건절에서 = 연산자 사용
ex)
select e.empno, e.ename, d.dname
from emp e, dept d
where e.deptno=d.deptno;
[ANSI JOIN]
SELECT e.empno, e.ename, d.dname
from emp e JOIN dept d
ON e.deptno = d.deptno;
*** 컬럼명이 양쪽 테이블에서 겹치는 경우 테이블 이름을 지정해준다
table이름.col이름
INNER JOIN은 양쪽 테이블에 모두 데이터가 존재해야 결과로 나옴
(한쪽에 없는 데이터까지 다 보려면 OUTER JOIN을 사용)
- SQL이 실행 되면 먼저 검색 조건이 실행되어 조인할 테이블의 크기를 줄여준다.(스캔할 테이블의 양 감소)
조인 조건: 두 컬럼을 등호로 연결 (s.profno=p.profno)
검색 조건: 테이블의 컬럼 값을 제약하는 조건 (deptno = 101)
3. NON-EQUI JOIN
비등가 조인
조인 조건이 = 가 아닌 것
EQUI JOIN과 사용법 같고 조건 연산자만 다름
3개 이상의 테이블 조인 방법
[ANSI JOIN]
SELECT s.name, o.total, h.grade
from student s JOIN score o
ON s.studno = o.studno
JOIN hakjum h
ON o.total >= h.min_point
AND o.total <= h.max_point;
4. OUTER JOIN
INNER JOIN은 모든 테이블에 데이터가 존재해야 결과로 나옴
OUTER JOIN은 데이터가 한쪽에만 있어도 됨
**OUTER JOIN 방식은 DB 성능에 아주 나쁜 영향을 줄 수 있다.
A, B 테이블을 OUTER JOIN 하는 경우 A 테이블에 인덱스가 있어도 인덱스를 쓰지 않고 FULL SCAN을 하기 때문이다.
4.1 LEFT OUTER JOIN
- 왼쪽 테이블에 있는 모든 행을 다 출력
(오른쪽 테이블에 매칭되는 것이 없어도 왼쪽 테이블에 모든 항목을 출력)
문법
SELECT s.name, p.name
FROM student s, professor p
WHERE s.profno = p.profno(+);
-> 매칭되는 데이터가 없으면 오른쪽 테이블 컬럼을 NULL값으로 왼쪽 테이블 항목을 다 가져옴
NULL로 가져올 테이블의 컬럼에 (+) 를 붙임
[ANSI OUTER JOIN]
SELECT s.name, p.name
FROM student s LEFT OUTER JOIN professor p
ON s.profno = p.profno;
4.2 RIGHT OUTER JOIN
문법
SELECT s.name, p.name
FROM student s, professor p
WHERE s.profno(+) = p.profno;
[ANSI OUTER JOIN]
SELECT s.name, p.name
FROM student s RIGHT OUTER JOIN professor p
ON s.profno = p.profno;
4.3 FULL OUTER JOIN
- FULL OUTER JOIN은 LEFT OUTER JOIN의 결과 + RIGHT OUTER JOIN의 결과를 합친것과 같다.
ORACLE 에서는 지원하지 않으므로 UNION으로 합쳐야 한다.
문법
SELECT s.name, p.name
from student s, professor p
where s.profno(+) = p.profno
UNION
select s.name, p.name
from student s, professor p
where s.profno=p.profno(+);
[ANSI FULL OUTER JOIN]
SELECT s.name, p.name
from student s FULL OUTER JOIN professor p
ON s.profno = p.profno;
5. ORACLE / ANSI OUTER JOIN
오라클 아우터 조인 주의사항
- WHERE 절의 아우터 조인이 되는 컬럼들에 대해서는 전부 아우터 조인 연산자(+)를 붙여야 함
- 하나라도 빠지면 일반 조인과 동일하게 됨
select d.deptno, d.dname, d.loc, e.empno, e.ename, e.sal
from dept d, emp e
where d.deptno = e.deptno(+)
and e.deptno(+) = 20
order by 1;
ANSI OUTER JOIN 주의사항
- WHERE 절에 기술한 조건은 기준 테이블의 집합 수를 결정 -> 출력되는 행 수에 영향
- ON 절에 기술한 조건은 아우터 조인 대상이 되는 집합을 말하는 것, 전체 결과 집합에는 아무런 영향을 주지 않음
6. SELF JOIN
- 하나의 테이블에 원하는 데이터가 다 들어있는 경우
- 자기 자신을 join
select e1.ename "ename", e2.ename "mgr_ename"
from emp e1, emp e2
where e1.mgr = e2.empno;
[ANSI SELF JOIN]
SELECT e1.ename, e2.ename "mgr_ename"
FROM emp e1 JOIN emp e2
ON e1.mgr = e2.empno;
'데이터베이스 > Oracle' 카테고리의 다른 글
#7 DML (insert, insert all, update, delete, update join, 트랜잭션) (0) | 2020.06.14 |
---|---|
#6 DDL 명령과 딕셔너리 (create, 임시 테이블, alter(컬럼 추가, 이름 변경, 크기조정, 삭제), truncate, delete (0) | 2020.06.11 |
#4 복수행 함수 (0) | 2020.04.22 |
#3 SQL 단일행 함수 (0) | 2020.04.21 |
#2 SELECT (1) 명령을 이용하여 데이터 조회하기 (0) | 2020.03.20 |