💡내부 조인
내부 조인(INNER JOIN)은 단순 조인에서 유효한 레코드만을 추출하는 조인이다.
쓸모없는 것은 버리고 쓸모 있는 쪽만 남긴다.
내부 조인의 사용
select 컬럼리스트 from 테이블A inner join 테이블B on 테이블A.PK = 테이블B.FK;
select 컬럼리스트
from 테이블A
inner join 테이블B
on 테이블A.PK = 테이블B.FK;
내부 조인을 작성할 때에는 on 조건을 걸어주어야 한다.
이때 테이블 A의 기본키와 테이블 B의 외래키를 찾아달라는 구문을 작성한다.
명확한 컬럼 이름 명시
SELECT
*
FROM TBLSTAFF
INNER JOIN TBLPROJECT
ON TBLSTAFF.seq = TBLPROJECT.staff_seq;
경우에 따라 테이블 이름을 생략해도 된다. 하지만 조인을 하면 두 테이블을 합치기 때문에 이름을 생략하면 모호한 컬럼 이름이 되어 에러를 출력한다.
따라서 조건을 설정할 때에는 어떤 컬럼인지를 명확하게 밝히도록 한다.☝️
ORDER BY절의 활용
SELECT
*
FROM TBLSTAFF
INNER JOIN TBLPROJECT
ON TBLSTAFF.seq = TBLPROJECT.staff_seq
ORDER BY TBLSTAFF.seq;
ORDER BY절로 정렬을 할 때도 마찬가지로 컬럼 이름을 명시하도록 한다.
SELECT
TBLSTAFF.seq,
name,
TBLPROJECT.staff_seq,
project
FROM TBLSTAFF
INNER JOIN TBLPROJECT
ON TBLSTAFF.seq = TBLPROJECT.staff_seq
ORDER BY TBLSTAFF.seq;
조인은 컬럼을 가로로 합치기 때문에 all(*)을 사용하면 너무 길어지게 된다.
때문에 SELECT절에서 필요한 것만 빼고 버리는 게 일반적이다.
⭐테이블의 별칭
SELECT --2.SELECT절: 컬럼 리스트
s.seq,
s.name,
p_seq,
p.project
FROM TBLSTAFF s
INNER JOIN TBLPROJECT p
ON s.seq = p.staff_seq --1.FROM절
ORDER BY p.seq; --3.ORDER BY절
별칭은 FROM절에만 붙일 수 있다. FROM절 뒤에 있는 TBLSTAFF에는 s, TBLPROJECT에는 p라고 한다.
ORA-00904: "TBLPROJECT"."STAFF_SEQ": invalid identifier
그런데 이를 그냥 실행하면 오류가 발생한다.
오류가 발생하는 이유는 SQL에서의 별칭(Alias)이 '개명'을 의미하는 것이기 때문이다.
별칭을 붙인 이후부터는 원래 이름을 사용하지 못한다.
따라서 위의 경우에는 FROM절에서 개명을 한 이후부터 이 문장에 한하여 TBLSTAFF는 s, TBLPROJECT는 p라고 불러야 한다.
테이블 이름을 Alias로 개명한 이름으로 수정한 결과 정상적으로 작동한다.
고객 테이블, 판매 테이블
SELECT
c.name AS 고객명,
s.item AS 제품명,
s.qty AS 개수
FROM tblCustomer c
INNER JOIN tblSales s
ON c.seq = s.cseq;
여자 테이블, 남자 테이블
SELECT
*
FROM tblMen m
INNER JOIN tblWomen w
ON m.NAME = w.COUPLE;
서로 관계 있는 테이블끼리 묶인 것을 확인할 수 있다.
on이 서로 짝꿍인 데이터를 연결해 준다.
서로 관계가 없는 조인
SELECT
*
FROM tblStaff st
INNER JOIN tblSales sa
ON st.seq = sa.cseq;
직원의 번호와 고객의 번호는 모양은 같아도 서로 전혀 관계되어 있지 않다.
서로 관계를 맺지 않은 엉뚱한 조인을 하고 있지는 않은지 유의해야 한다.
고객명(tblCustomer), 판매물품명(tblSales)
--조인
SELECT
c.name AS 고객명,
s.item AS 물품명
FROM tblCustomer c
INNER JOIN tblSales s
ON c.seq = s.cseq;
--서브 쿼리
SELECT
item AS 물품명,
(SELECT name FROM tblCustomer WHERE seq = tblSales.cseq) AS 고객명
FROM tblSales;
서브 쿼리를 사용하려면 메인 쿼리가 자식 테이블이 되어야 하고, 상관 서브 쿼리는 부모 테이블이 되어야 한다.
위와 같이 조인을 이용할 수도, 서브 쿼리를 이용할 수도 있다.
회원, 대여, 비디오, 장르
SELECT
m.name,
v.name,
g.price,
r.rentdate
FROM tblGenre g
INNER JOIN tblVideo v
ON g.seq = v.genre
INNER JOIN tblRent r
ON v.seq = r.video
INNER JOIN tblMember M
ON m.seq = r.member;
회원, 대여, 비디오, 장르 4개의 테이블을 합쳐서 시스템을 구축하였다. ERD는 예시이다.
어떤 회원이 어떤 영화를 어떤 가격에 언제 빌려갔는지 참조 관계를 생성하여 확인할 수 있다.
샘플 데이터 조인
employees 테이블
departments 테이블
locations 테이블
countries 테이블
regions 테이블
jobs 테이블
위의 샘플 데이터를 가지고 조인 실습을 해보도록 하자.
SELECT
e.first_name || ' ' || e.last_name AS 직원명,
d.department_name AS 부서명,
l.city AS 도시명,
c.country_name AS 국가명,
r.region_name AS 대륙명,
j.job_title AS 직업
FROM employees e
INNER JOIN departments d
ON d.department_id = e.department_id
INNER JOIN locations l
ON l.location_id = d.location_id
INNER JOIN countries c
ON c.country_id = l.country_id
INNER JOIN regions r
ON r.region_id = c.region_id
INNER JOIN jobs j
ON j.job_id = e.job_id;
직원 정보, 부서 정보, 지역 정보 등의 테이블이 있다. 이 테이블의 컬럼을 먼저 확인한 뒤에 조인 관계를 설정해 준다.
기본키와 외래키를 _ID로 통일하여서 사용하였다는 점이 특이하다. 이러한 사용 방식을 통해 좀 더 용이하게 키를 관리할 수 있다.
많은 테이블을 조인하면 계산량이 늘어나게 된다. 그러므로 필요한 테이블만 조인할 수 있도록 한다. 물론 이 정도는 짧은 쿼리에 해당한다.