DB 공부는 항상 해야한다고 생각한다 시간날때 마다 하고 있지만 쉽지가 않다 ㅜ 오늘은 JOIN 에 대해서 정리를 해보고자 한다
기억보다 기록을 하자
Join은 여러 테이블에서 데이터를 가져 오는 구문이다
프로젝트를 하거나 연관성 있는 데이터를 한꺼번에 출력을 해야하거나 할때 꼭 사용한다 그러니 꼭 알아두자
JOI문을 조금더 성능 향상 시키기 위해서는 몇가지의 조건이 있다
- 테이블 접두어를 사용하여 여러 테이블에 있는 열 이름을 한정한다
- 테이블 접두어를 사용하여 성능을 향상 시킨다
- 전체 테이블 이름 접두어 대신 테이블 alias를 사용한다
- 테이블 alis로 테이블에 짧은 이름을 지정한다 - 이거는 메모리를 적게 사용한다
- 열 alis를 사용하여 이름은 같지만 서로 다른 테이블에 상주하는 열을 구분한다
SELECT TABLE.COLUM, TABKE2.COLUM
FROM TABLE
[NATURL JOIN TABLE2]
[JOIN TABLE2 USING(COLUM_NAME)]
[JOIN TABLE2
ON(TABLE.COLUM_NAME = TABLE2.COLUM_NAME)]
[LEFT|RIGHT|FULL OUTER JOIN TABLE2
ON(TABLE.COLUM_NAME = TABLE2.COLUM_NAME)]
CROSS JOIN TABLE2]
- TABLE.COLUM은 데이터가 검색되는 테이블과 열을 나타낸다
- NATURL JOIN 은 동일한 열 이름을 기반으로 두 테이블을 조인한다
- JOIN TABLE2 USIGN COLUM_NAME은 열 이름을 기반으로 EQUIJOIN 을 수행한다
- JOIN TABLE2 ON TAVLE.COLUM_NAME = TABLE2.COLUM_NAME은 ON 절의 조건을 기반으로 EQUIJOIN 을 수행한다
- LEFT/RIGHT/FULL OUTER 는 OUTER join을 수행하는 데 사용된다
- CROSS JOIN은 두 테이블에서 Cartesian product를 반환한다
자 이제 예시를 들어서 한번 보자 일렇게 말만 하면 이해가 안간다 블라블라블라 알았다구.. ㅋㅋ
Naturl Join
Naturl Join 절은 이름이 같은 두테이블의 모든 행을 기반으로 한다
이절은 두 테이블에서 대응되는 모든열의 값이 동일한 행을 선택한다
동일한 이름을 가진 열이 서로 다른 데이터 유형을 가지면 오류가 반환된다.
위 구문 에서 LOCATIONS 테이블은 두테이블에서 유일하게 이름이 같은 열인 LOCATION_ID열에 의해 DEPARTMENTS 테이블에 조인한다 공통되는 다른 열이 있을 경우 모두 조인에 사용된다. 자 테이블을 한번 보자
서로 다른 테이블에 동일한 컬럼값이 보인다 이럴경우에는 NATURL JOIN 으로 쉽게 처리 할수 있다
USING 절로 조인 생성
여러 열이 이름은 같지만 데이터 유형은 다를 경우 USING 절을 사용하여 Equijoin 에 대한 열을 지정할 수 있다.
USIN 즐을 사용하면 두 개 이상의 열이 일치하는 경우 하나의 열만 일치하도록 할수 있다
NATURL JOIN과USING 절은 상호 베타적이다.
위에 구무는USING 절로 데이터 출력이다
EMPLOYEES 태이블 과 DEPARTMENTS 테이블에서 DEPARTMENT_ID열이 조인되어서 사원이 근무하는 부서의 LOCATION_ID, DEPARTMENT_NAME 이 표시된다.
Naturl Join 에서 주의 해야할점이 있는데 나도 자주 보는데 오모한 접두어? 라고 해야하나? 일단 음 일단 보자
USING 절을 사용해서 조인을 수행할 때 USING절 자체에서 사용되는 열을 한정할 수 없다
또한 해당 열이 SQL 문의 임의 위치에서 사용되는 경우 alias를 지정할 수 없다 예를 들어 위에 쿼리 에서 location_id 열이 USING절에 사용되므로 where 절의 locatioin_id 열에 alias 지정하면 안된다.
즉 조금 쉽게 말하면 USING 결합을 할 때 쓰이는 열에 수식을 붙이면 보이는 에러이다 .
그럼 에러가 안나게 할려면 어떻게 해야하나 그냥 안붙이면 된다
ON 절로 조인 생성
가장 많이 쓰이는 join이 아닐까 싶다 일단 책에서 정의 하는 내용을 한번 봐야 겠다
- Naturl join의 조인 조건은 기본적으로 이름이 같은 모든 열의 equijoin이다.
- ON 절을 사용하여 임의 조건을 지정하거나 조인할 열을 지정한다
- 조인 조건은 다른 검색 조건과는 별개이다
- ON 절을 사용하면 코드를 이해하기 쉽다.
위에 구문에서 employees 테이블 과 departments 테이블의 department_id 열은 on 절을 사용하여 조인된다. employees 테이블 부서 id 가 department 테이블의 부서 id와 같은 경우 항상 행이 반환된다. 일치하는 column_name을 한정하려면 테이블 alias 가 필요하다
또한 on절을 사용해서 서로 다른 이름을 가진 열도 조인할수 있다. 그러면 테이블 구조를 한번 살펴보자
구조를 보면 departments 와 employees 연관관계를 알수 있다 이렇게 보면 잘 모르니 위에 구문에는 department_id 로 조인을 했다 그러department_id 앞에 보면 F가 확인된다 employees이 departments 테이블에 department_id를 참조하고 있다 외래키 속성을 보면 확인할수 있다.
JOIN은 관계형 DB 에서 가장 큰 장점이면서 대표적인 핵심 기능이다 일반적인 경우 PRIMARY KEY(PK)나 FOREIGN KEY(FK) 값의 연관에 의해 JOIN이 성립 되지만 PK, FK의 관계가 없어도 논리적인 값들의 연관만으로 JOIN이 성립 가능하다.
책에서보면 SQL:1999 호환 구문에서 조이은 왼쪽에서 오른쪽으로 수행된다고 한다. 따라서 가장 먼저 수행되는 조인은 employees join departments 다. 첫번째 조인 조건은 employees 및 departments 의 열을 참조할수 있지만 locations 의 열은 참조 할수 없다 두번째 조인 조건은 세개의 테이블에서 모두 열을 참조할 수 있다.
조인에 추가 조건 적용
AND 절 또는 WHERE 절을 사용하여 추가 조건을 적용한다
위에 구문은 employees 테이블 및 departments 테이블에서 조인을 수행하고 관리자 id가 149인 사원만 표시한다 on 절에 다른 조건을 추가하려면 AND 절을 사용하면 된다 또는 WHERE 절을 사용하여 조건을 적용할수 있다.
테이블 자체 조인
때때로 테이블 자체를 조인해야 할 경우가 있다 만약에 각사원의 관리자 이름을 찾으려면 EMPLOYEES 테이블 자체 조인하거나 selfJoin 을 수행해야한다 예를 들어 last_name 중에 Cambrault 을 가진 사원 중에 worker 테이블과 Manager 테이블을 조사하여 출력 해야하는 경우가 있다면 selfJoin 으로 해결할수 있다. 이과정에서 employees 테이블을 두번 조사하게 된다. 테이블을 조사하여 last_name 열에서 Cambrault 를 찾는다
아직 이제 조인 50 %정도 봤다 프로젝트 할때 가장 많이 썻던 join 문이다 쓰면서도 항상 햇갈렸다 기억하자!
아직 조인문이 끝나지 않았지만 다음에 조인문을 다시 포스팅 하겠다 OUTER JOIN , LEFT JOIN , CrossJoin 을 해보자 !
'DB' 카테고리의 다른 글
Oracle(프로시저) (0) | 2020.12.10 |
---|---|
Oracle(테이블 생성,제약조건,시퀀스) (0) | 2020.12.10 |
Oracle (변환 함수) (0) | 2020.11.20 |
Oracle 날짜 함수 (0) | 2020.11.20 |
Oracle 함수 (문자,숫자) (0) | 2020.11.20 |