Join은 두 테이블의 행을 결합하여 데이터를 조회하기위해 사용한다. 자신의 테이블의 고유 값(외래키) 와 상대테이블의 고유값(기본키) 를 이용해 상대방이 가지고있는 데이터를 참조 할 수 있다. FROM에서 사용하기 때문에 테이블을 합친다는 의미로 생각하는 경우 가 많은데 행과 행을 합친다는 의미가 더 적절하다.
먼저 기본키와 외래키에 대해 알아보자.
기본키는 테이블에 저장된 각 행을 고유하게 식별 할 수 있는 사용자데이터 또는 데이터의 조합이다. 고유한 성질을 띄기 때문에 Null값이 와서도 안되고 중복이 되서도 안된다.
외래키는 기본키를 참조하는 제약조건이 있다. 즉, 외래키의 구성은 기본키의 구성 값중 하나여야한다. 기본키와 외래키의 관계는 1:다 의 관계로 매칭 될 수 있다. 때문에 외래키는 중복된 값이 들어가도 허용이 된다. 하지만 기본키에 없는 값이 들어가면 에러가 발생한다.
JOIN의 종류
EQUI-INNER-JOIN
: on 절을 이용하요 조인 조건을 기술할 때 "=(equal)"연산자 사용
두 테이블의 행을 합치기 위해 조건에 "="연산자를 사용하기 때문에 조건을 만족하지 않는 행들은 합쳐지지 않으며 결과에도 표시되지 않습니다.
※ 주의 ! 컬럼명에 테이블의 이름을 접두어로 표시하는것이 좋다. ON절에서 비교하는 대상의 컬럼이름이 같을 경우 어떤 컬럼의 내용을 사용해야 할 지 혼란이 오기 때문에 SELECT에서 컬럼명을 지정해 줄때 테이블 이름을 접두어로 사용해주어야 한다.
from 에서 약어를 지정해주고 사용 할 수 있다. 숫자로 시작되면 안되면 가급적 간단한 약어로 하는것이 좋다.
hr.emploees → e 를 사용햇는데 바꿔놓고 hr.을 사용하면 에러남
※ 3-way join
조인 구문 작성시 JOIN 키워드 다음에 선언된 테이블은 항상 앞에 선언된 테이블하고만 조인 될 수 있다. (앞 ← 뒤 조인)
뒤에 선언된 테이블과는 조인될 수 없음을 주의 (앞 → 뒤 조인에러)
※ 컬럼의 이름과 데이터 유형이 일치할 경우 USING 절을 이용해도 되는데 걍 ON절 쓰는게 깔끔하고 확실함.
NON-EQUI-INNER-JOIN
: INNER JOIN 구문에서 조인 조건을 기술 할 때, 조건에 "="가 아닌 다른 연산자가 사용된경우. 기본키 외래키 같은 연결고리가 없어도 테이블을 참조해서 사용하는 경우이다.
두 테이블의 데이터를 살펴보면 서로 연관성이없다. 어떻게 조인을 해서 가져오느냐.
salary 의 레코드 값을 오른쪽 테이블에 적용시켜 결과값을 변형 시킬 수 있다.
테이블의 salary 값을 grade 테이블에 매칭시켜 원하는 등급 값을 가져왓다.
OUTER JOIN
: INNER 조인조건을 만족시키지 못해서 표시되지않는 레코드들을 추가적으로 더 표시해주는 방법으로 기본적으로 INNER JOIN의 값이 표시된 후에 조건을 만족하지 못한 레코드들이 출력된다. 3가지 방식이 있다.
1. RIGHT OUTER JOIN : JOIN 키워드의 오른편에 있는 테이블에서 조건을 만족시키지 못해 제외된 레코드들을 더 표시해준다.
2. LEFT OUTER JOIN : JOIN 키워드의 왼편에 있는 테이블에서 조건을 만족시키지 못해 제외된 레코드들을 더 표시해준다.
3. FULL OUTER JOIN : 모든 테이블에서 조건을 만족시키지 못해 제외된 레코드들을 더 표시해준다.
CROSS JOIN
: 조인조건이 누락되거나 조인 조건이 유효하지않은 경우에 Cartesia Product문제가 발생할 수 있는데 이 경우 다대다 매칭으로 결과 레코드의 값이 불필요하게 많아져 과부하를 주게된다. WHERE - AND 절을 사용해서 두 값을 강제로 조인하는 것이 특징이다.
'Kitri_NCS3기 보안과정 > DB보안 ' 카테고리의 다른 글
170531 테이블의 생성과 제약조건 (DDL) (0) | 2017.05.31 |
---|---|
170531 SET 연산자 활용 (0) | 2017.05.31 |
170530 서브쿼리(SUBQUERY)를 사용한 데이터 조회 (0) | 2017.05.30 |
170530 단일 행 함수, 다중 행 함수 (0) | 2017.05.30 |
170529 데이터베이스 개요, Select문 (0) | 2017.05.29 |