[MySQL] select문(3) - Join

seonjeong·2023년 1월 4일

MySQL

목록 보기
3/9
post-thumbnail

두 개 이상의 테이블을 연결해서 (연결된 테이블의) 데이터를 검색하는 방법
목적 : 현재 테이블에서 취득할 수 없는 컬럼의 데이터를 상대 데이터에서 취득하기 위함

종류 : **inner join full outer join cross join left / right outer join *self join

  • 기본기( Primary key ) - ex) departments테이블에서 department_id
  • 외래키( Forign key ) - ex) employees테이블에서 department_id

💖 inner Join : 교집합

🔥 형식

  • 2개 테이블 Join
-- ansi
SELECT <열 목록>
FROM <A테이블>
    INNER JOIN<B테이블>
    ON <조인 조건>
[WHERE 검색조건]

-- mysql
SELECT <열 목록>
FROM <A테이블>, <B테이블>
WHERE <조인 조건>
  • 3개 테이블 Join
-- ansi
SELECT <열 목록>
FROM <A테이블>
    INNER JOIN<B테이블>
    ON <조인 조건>
    INNER JOIN<C테이블>
    ON <조인 조건>
[WHERE 검색조건]

-- mysql
SELECT <열 목록>
FROM <기준 테이블>, <참조할 테이블>, <참조할 테이블>
WHERE <조인 조건1> AND <조인 조건2>

🔥 예시

-- 2table join
-- ansi
select employee_id, first_name,
	e.department_id, d.department_id,
    d.department_name, d.location_id
from employees e inner join department d
	on e.department_id = d.department_id;
    
-- mysql
select employee_id, first_name,
	e.department_id, d.department_id,
    d.department_name, d.location_id
from employees e, department d
where e.department_id = d.department_id;

-- 3table join
-- ansi
select e.employee_id, e.first_name,
	e.department_id, d.department_id,
    e.job_id, j.job_id,
    d.department_name, j.job_title
from employees e inner join department d
	on e.department_id = d.department_id
    inner join jobs j
    on e.job_id = j.job_id;  
    
-- mysql
select e.employee_id, e.first_name,
	e.department_id, d.department_id,
    e.job_id, j.job_id,
    d.department_name, j.job_title
from employees e, departments d, jobs j
where e.department_id = d.department_id
	and e.job_id = j.job_id;

💖 cross join : 곱집합

모든 경우의 수, 즉 A테이블 row 개수 X B테이블 row 개수 만큼의 row를 가진 테이블이 출력됨.

🔥 형식

SELECT <열 목록>
FROM <A테이블>
    CROSS JOIN<B테이블>
    ON <조인 조건>

🔥 예시

select employee_id, first_name,
	e.department_id, d.department_id,
    d.department_name
from employees e corss join departments d;	-- 1000 row(s) returned

💖 left / right outer join

왼쪽 / 오른쪽 테이블

🔥 형식

  • left outer join
SELECT <열 목록>
FROM <A테이블>
    LEFT OUTER JOIN<B테이블>
    ON <조인 조건>
  • right outer join
SELECT <열 목록>
FROM <A테이블>
    RIGHT OUTER JOIN<B테이블>
    ON <조인 조건>

🔥 예시

-- left outer join
select employee_id, first_name,
	e.department_id, d.department_id,
    d.department_name
from employees e left outer join departments d
	on e.department_id = d.department_id;
-- where e.department_id is null;	-- 차집합

-- right outer join
select employee_id, first_name,
	e.department_id, d.department_id,
    d.department_name
from employees e right outer join departments d
	on e.department_id = d.department_id;

💖 full outer join : 합집합

🔥 형식

SELECT <열 목록>
FROM <A테이블>
    LEFT OUTER JOIN<B테이블>
    ON <조인 조건>
UNION						-- 사이에 'union'을 붙여주면 됨
SELECT <열 목록>
FROM <A테이블>
    RIGHT OUTER JOIN<B테이블>
    ON <조인 조건>

🔥 예시

select employee_id, first_name,
	e.department_id, d.department_id,
    d.department_name
from employees e left outer join departments d
	on e.department_id = d.department_id;
union
select employee_id, first_name,
	e.department_id, d.department_id,
    d.department_name
from employees e right outer join departments d
	on e.department_id = d.department_id;

💖 self join

동일한 테이블을 조인

🔥 형식

-- ansi
SELECT <열 목록>
FROM <A테이블> JOIN <A테이블>
	ON <조인 조건>

-- mysql
SELECT <열 목록>
FROM <A테이블>, <A테이블>
WHERE <조인 조건>

🔥 예시

select emp.first_name as 사원, 
	emp.manager_id, mgr.employee_id,
    mgr.first_name as 상사
from employees emp, employees mgr	-- emp: 사원  mrg: 상사
where emp.manager_id = mgr.employee_id;
profile
🦋개발 공부 기록🦋

0개의 댓글