2025-08-20 01:04
Tags:SQL
조인
- 데이터베이스를 나누어 저장, 관리 : 정규화
- 흩어진 데이터 조각을 다시 연결 → 의미있는 정보: 관계, 조인
- 기본키와 외래키를 사용해 관계를 통해 데이터들을 논리적으로 연결
- 관계를 이용해 실제 데이터 합쳐서 조회 → 조인
- FROM 절에 조인할 테이블 나열
- 조인이 연속되어도 2개의 집합에만 조인일어남 → FROM A,B,C 면 A JOIN B의 결과 와 C 의 조인이 일어남
- 여러 테이블 조인 시 SELECT 절에 해당 컬럼의 테이블 이름 명시, 당장 중복 안되도 장기적으로 명시하는게 컨벤션
- N 개의 테이블 조인 시 최소 N-1 개의 조인 조건 필요
조인의 종류
1. 조건의 형태에 따른 구분
1. EQUI JOIN: 조인 조건이 동등 인 경우
- 2개의 테이블 간에 컬럼 값들이 서로 정확하게 일치할 때
[ORACLE] [ANSI/ISO SQL]
조인 조건을 WHERE 절에 조인 조건을 ON절에
-- ORACLE
SELECT P.PLAYER_NAME 선수명, P.BACK_NO 등번호, P.TEAM_ID 팀코드,
T.TEAM_NAME 팀명, T.REGION_NAME 연고지
FROM PLAYER P, TEAM T
WHERE P.TEAM_ID = T.TEAM_ID
SELECT P.PLAYER_NAME 선수명, P.BACK_NO 등번호,
T.TEAM_NAME 팀명
FROM PLAYER P, TEAM T
WHERE P.TEAM_ID = T.TEAM_ID AND P.POSITION = 'GK'
ORDER BY P.BACK_NO;
-- ANSI/ISO SQL
SELECT P.PLAYER_NAME 선수명, P.BACK_NO 등번호, P.TEAM_ID 팀코드,
T.TEAM_NAME 팀명, T.REGION_NAME 연고지
FROM PLAYER P
INNER JOIN TEAM T
ON P.TEAM_ID = T.TEAM_ID;
SELECT P.PLAYER_NAME 선수명, P.BACK_NO 등번호,
T.TEAM_NAME 팀명
FROM PLAYER P
INNER JOIN TEAM T
ON P.TEAM_ID = T.TEAM_ID
WHERE P.POSITION = 'GK'
ORDER BY P.BACK_NO;
2. NOT EQUI JOIN: 조인 조건이 동등이 아닌 경우
- 2개의 테이블 간에 컬럼 값들이 서로 정확하게 일치하지 않는 경우에 사용
- ”=” 연산자가 아닌 다른(BETWEEN, <, ⇐, >, >= 등) 연산자들을 사용하여 조인을 수행하는 것
사원(EMP) 테이블
ENAME | SAL |
---|
SMITH | 800 |
ALLEN | 1600 |
WARD | 1250 |
JONES | 2975 |
MARTIN | 1280 |
KING | 8000 |
급여 등급표(SALGRADE) 테이블
GRADE | LOSAL | HISAL |
---|
1 | 700 | 1200 |
2 | 1201 | 1400 |
3 | 1401 | 2000 |
4 | 2001 | 3000 |
5 | 3001 | 9999 |
-- 사원에 따른 급여 등급 출력
SELECT E.ENAME 사원명, E.SAL 급여, S.GRADE 급여등급
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
사원명 | 급여 | 급여등급 |
---|
SMITH | 800 | 1 |
ALLEN | 1600 | 3 |
WARD | 1250 | 2 |
JONES | 2975 | 4 |
MARTIN | 1280 | 2 |
KING | 8000 | 5 |
2. 조인 결과에 따른 구분
1. INNER 조인(내부 조인): 두 테이블 간 조인 조건이 일치하는 데이터만 출력
- 연결고리(FK)가 일치하는 데이터만 가져옴
- 두 테이블의 교집합
- 주문 내역이 있는 고객 정보와 그 주문 내역 함께 보고 싶을때
SELECT C.customer_name, O.order_date, O.order_id
FROM Customers AS C
INNER JOIN AS O ON C.customer_id = O.customer_id
2. OUTER JOIN(외부 조인): 두 테이블간 조건이 일치하지 않는 데이터도 출력
1. LEFT 조인(왼쪽 외부 조인)
- 왼쪽 테이블 전체 + 교집합
- 모든 고객 목록 보되, 주문 내역있으면 함게 표시, 없으면 비워두기
SELECT C.customer_name, O.order_date
FROM Customers AS C
LEFT JOIN Orders AS O ON C.customer_id = O.customer_id;
2. RIGHT 조인(오른족 외부 조인)
- 오른쪽 테이블 전체 + 교집합
- 모든 주문 내역을 보되, 해당 주문을 한 고객 정보가 있다면 함께 표시하고 싶을 때. (만약 고객 정보가 삭제되었지만 주문 기록은 남아있는 경우 등을 확인할 수 있음)
SELECT C.customer_name, O.order_date
FROM Customers AS C
RIGHT JOIN Orders AS O ON C.customer_id = O.customer_id;
3. NATURAL JOIN
- 두 테이블에서 같은 이름을 가진 컬럼 자동으로 찾아 조인
4. CROSS JOIN
- 두 테이블의 모든 조합을 생성하는 조인
- 오라클: FROM t1,t2 + WHERE 절에 조건 명시하지 않을때
- ANSI: t1 CROSS JOIN t2 + ON 으로 조인 조건 명시하지 않을때
5. SELF JOIN
- 같은 테이블을 두 번 이상 참조하는 조인
- 동일 테이블 사이의 조인
- FROM 절에 동일 테이블이 2번 이상 나타나게 되니 식별을 위해 반드시 테이블 ALIAS를 사용해야 한다.
같은 테이블 EMPLOYEES
EMP_ID | NAME | MGR_ID |
---|
100 | KING | |
101 | ALLEN | 100 |
102 | WARD | 100 |
103 | JONES | 100 |
104 | MARTIN | 101 |
105 | SMITH | 103 |
SELECT E1.EMP_ID, E1.NAME, E1.MGR_ID, E2.EMP_ID, E2.NAME
FROM EMPLOYEES E1, EMPLOYEES E2
WHERE E1.EMP_ID = E2.EMP_ID
EMP_ID | NAME | MGR_ID | EMP_ID | NAME |
---|
101 | ALLEN | 100 | 100 | KING |
102 | WARD | 100 | 100 | KING |
103 | JONES | 100 | 100 | KING |
104 | MARTIN | 101 | 101 | ALLEN |
105 | SMITH | 103 | 103 | JONES |
- 이너 조인(EQUI JOIN)이라 MGR_ID 가 NULL 인 KING 은 조건에 안맞아서 제외
- 조인 조건 안맞는 것도 출력하려면 OUTER 조인으로
언급한 노트 (Outgoing Links)
백링크 (Backlinks)