반응형

@notepad_jj2

츄르사려고 코딩하는 코집사입니다.


1. DB JOIN

- 여러 개의 테이블에서 데이터가 필요한 경우 테이블을 조인하여 테이블을 합치는 것

- WHERE절을 사용하여 조인 조건을 포함시킨다.

- 조인 조건은 각 테이블의 Primary Key와 Foreign Key로 구성

 

2. JOIN의 종류

1) INNER JOIN

2) OUTER JOIN

- left outer join

- right outer join

 

3. join 조건의 명시에 따른 구분

- Natural Join

- Cross Join(Full Join, Cartesian Join)

 

4. Join시 주의해야 할 점

1) 조인의 처리는 어느 테이블을 먼저 읽을지 결정(작업량이 줄어든다)

 

2) Inner Join

- 어느 테이블을 먼저 읽어도 결과가 달라지지 않아 MySQL 옵티마이저가 조인의 순서를 조절해서 다양한 방법으로 최적화를 수행

 

3) Outer Join

- 반드시 Outer가 되는 테이블을 먼저 읽어야 하고, MySQL 옵티마이저가 조인 순서를 선택할 수 없다.

 

5. Inner Join

- INNER JOIN은 가장 일반적인 JOIN의 종류이며 교집합이다.

- 동등 조인(Equi-Join)이라고도 하며, N개의 테이블 조인 시 N-1개의 조인 조건이 필요함.

 

- Company 테이블과 Company2 테이블에서 c1과 c2라는 컬럼에서 id가 같은 것들을 출력

SELECT *
FROM Company, Company2
where Company.id = Company2.id;

 

1) alias

- 아래와 같이, 테이블에도 alias를 줄 수 있다.

- Company는 c1, Company2에는 c2로 줄 수 있다.

SELECT *
FROM Company c1, Company2 c2
where c1.id = c2.id;

 

2) inner join 명시적

- 위의 코드 결과와 아래의 코드의 결과는 같다.

- 명시적으로 inner join을 써도 되고, 생략을 하고 ,를 사용하여 inner join을 할 수 있다.

SELECT *
FROM Company c1 inner join Company2 c2
where c1.id = c2.id;

 

3) ON

- Inner Join에서 ON을 이용하여 두 테이블의 조인 조건을 명시할 수 있다.

SELECT *
FROM Company c1 inner join Company2 c2
on c1.id = c2.id;

 

4) using

- using을 사용할 때 c1 테이블과 c2 테이블이 공통적으로 가지고 있는 컬럼 이름을 쓰면 되는데, c1.id나 c2.id가 아닌 id를 사용해야 한다.

- using은 꼭 괄호를 사용해야 한다.

- on id = id를 표현하기 위해 (id)로 사용한다.

SELECT *
FROM Company c1 inner join Company2 c2
using (id);

 

6. Natural Join

- c1 테이블과 c2 테이블의 공통 컬럼을 자동적으로 Join을 해준다.

- Natural Join 사용의 주의할 점은 공통 컬럼이 여러 개일 경우를 주의해야 한다.

- 공통 컬럼이 1개인 경우에는 유용하다.

SELECT *
FROM Company c1 natural join Company2 c2
where c1.id = 100;

 

7. OUTER JOIN

- LEFR OUTER, RIGHT OUTER, FULL OUTER JOIN으로 구분

- A 테이블에는 데이터가 존재하는데 B 테이블에는 데이터가 존재하지 않을 경우 데이터가 검색되지 않는 문제점을 해결하기 위해 사용하는 JOIN 방법

 

-- 'seattle'에 근무하는 사원의 정보
-- 사번, 이름, 급여, 직급이름, 부서이름
select e.employee_id, e.first_name, e.salary, j.job_title, d.department_name
from   employees e join jobs j
on     e.job_id = j.job_id
join   departments d
on     e.department_id = d.department_id
join   locations l
on     d.location_id = l.location_id
where lcase(city) = lcase('seattle');

--lcase는 소문자로, ucase는 대문자로

 

1) outer join

- employees 테이블이 on 조건을 만족하지 않으니 e 테이블의 데이터를 모두 가져온다.

- 근데, d 테이블의 부서이름이 null이 있으면 대기발령으로 표시(ifnull() 사용)

select e.employee_id, e.first_name, d.department_name, ifnull(d.department_name, "대기발령")
from employees e left outer join departments d
on e.department_id = d.department_id;

 

2) full join

- MySQL은 full join을 지원하지 않음

 

8. 부서테이블의 부서번호를 기준으로 직원 테이블의 부서번호 데이터가 없더라도 출력하고자 한다.

select d.deptno, d.dname, e.ename
from emp e right outer join dept d
on d.deptno = e.deptno;

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기