츄르사려고 코딩하는 코집사입니다.
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;
'IT > DB' 카테고리의 다른 글
엑셀(Excel)에서 2개 이상의 열을 기준으로 중복값 찾기 (0) | 2022.04.07 |
---|---|
SQL WHERE 1=1과 1=2 사용하는 이유 (0) | 2022.02.10 |
데이터베이스(DB) JOIN(INNER JOIN / LEFT JOIN / RIGHT JOIN / OUTER JOIN) 정리 (0) | 2021.10.25 |
데이터베이스(DB) 서브쿼리(SubQuery) 정리 (1) | 2021.04.06 |
MySQL 데이터베이스 정리 (0) | 2021.04.06 |
JDBC(Java DataBase Connectivity) INSERT 기초 예제 (0) | 2021.03.11 |
JDBC(Java DataBase Connectivity) 기초 맛보기 (0) | 2021.03.11 |
데이터베이스(DB) 기초 간략하게 맛보기 (0) | 2021.03.11 |
최근댓글