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 연결
'데이터베이스, SQL' 카테고리의 다른 글
데이터베이스 / Pagila 웹앱 작성하기 (1) (1) | 2025.05.23 |
---|---|
데이터베이스 / ORM, Prisma, 3Tier (0) | 2025.05.22 |
데이터베이스 / 데이터 모델링 (0) | 2025.05.20 |
데이터베이스 / SQL 구문 문법 (0) | 2025.05.20 |
데이터베이스 / 개요 (5) | 2025.05.19 |