본문 바로가기

데이터베이스, SQL

데이터베이스 / JOIN

JOIN

테이블을 연결하여 데이터를 조회하는 기법

join의 종류

-- 기본 쿼리문
select *
from A
____ join B on A.pk = B.fk

 

 

 

INNER JOIN

두 테이블 공통의 row를 조인 (교집합)

 

SQL문으로 보면 다음과 같다.

inner join의 경우 inner를 생략해도 된다

select * from book b
join loan l on b.call_number = l.call_number
order by b.call_number

 

 

 

LEFT JOIN

왼쪽 테이블을 기준으로 로우를 조인. left outer join이라고도 한다.


inner join에서는 A의 pk와 B의 fk의 교집합 부분이 선택됐다면,

left join에서는 A를 기준으로 조인하기 때문에 B의 fk에 없더라도 A의 pk에 있다면 포함해서 출력한다

 

select * from book b -- 왼쪽 테이블이 book임 
left outer join loan l on b.call_number = l.call_number
order by b.call_number

 

 

 

RIGHT JOIN

오른쪽 테이블을 기준으로 로우를 조인. right outer join이라고도 한다.

left join의 반대라고 보면 된다.

 

select * from book b
right outer join book b on b.call_number = l.call_number
order b.call_number

right join이 헷갈리면 그냥 무조건 주축이 되는 테이블을 왼쪽으로 두고 left outer join만 하면 된다...

 

 

 

FULL JOIN

두 테이블의 모든 로우를 조인 (합집합)

 

select * from student
full join course on student.course_id = course.course_id;

-- 위 쿼리와 아래 쿼리 다 같은 결과를 리턴함 (순서는 달라질수도..) 
select * from course
full join student on student.course_id = course.course_id;

 

 

 

CROSS JOIN 

PK, FK 연결과 관계 없이 두 테이블의 가능한 모든 집합 (곱집합)

아무래도 쿼리 양이 방대하게 나오기 때문에 필요한 경우 아니면 굳이 안사용하는 것이 ... 

select * from course cross join student;

 

 

 

SELF JOIN

테이블 자신을 join.

self join이라는 키워드는 따로 없고 그냥 자기 자신의 테이블을 조인시키면 된다

 

 

다음과 같이 직원이라는 테이블이 있다. id가 pk고, manager_id는 해당 직원의 manager의 Id를 참조 (Pk를 참조)하고 있다.

 

모든 회사 직원의 매니저가 누군지 확인하고 싶다

라고 했을 때,

이 매니저의 이름을 알고 싶다면 manager_id가 가리키는 다른 직원의 name을 찾아야함

=> 같은 테이블에서 조회해야 한다.

=> 셀프 조인 사용

 

SELECT
  e1.id AS ID,                -- 직원의 ID
  e1.name AS employee,        -- 직원의 이름
  e2.id AS Manager_ID,        -- 매니저 ID
  e2.name AS manager          -- 매니저 이름
FROM
  employees e1
LEFT JOIN
  employees e2
ON
  e1.manager_id = e2.id;      -- 직원의 매니저 ID와 매니저의 실제 ID 연결

 

 

결과