일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 직장인일기
- 빅데이터
- ROWNUM
- 일기
- 책리뷰
- null
- 데이터모델링
- 인덱스
- Update
- SQLD
- SQL
- where절
- 보울룸
- ERD
- 회사생활
- 30일글쓰기
- 넷플릭스
- 홈트
- Drop
- 전생
- 회사싫어
- constraint
- 직장생활
- 30일챌린지
- 도전
- 환생
- rename
- 테이블삭제
- INSERT
- data
- Today
- Total
최보름달
[SQL] JOIN, EQUI JOIN, Non EQUI JOIN, 3개 이상 테이블 조인 본문
JOIN
두 개 이상의 테이블들을 연결, 결합하여 데이터를 출력하는 것
예를들어 선수 테이블과 팀 테이블을 연결해서 데이터를 볼 수 있다.
PRIMARY KEY(PK)나 FOREIGN KEY(FK)값의 연관에 의해 JOIN이 성립된다.
FROM 절에 A, B, C 테이블이 나열되었더라도 2개 테이블만 먼저 조인 처리되고,2개 테이블이 조인되어 처리된 새로운 데이터 집합과 남은 한 개의 테이블이 다음 차례로 조인 처리된다.
EQUI JOIN
EQUI(등가) JOIN은 두 테이블 간에 컬럼 ㄱ밧이 서로 정확하게 일치하는 경우 사용되는 방법이다.
WHERE절에 = 연산자를 사용해서 표현한다.
SELECT 테이블1.컬럼명, 테이블2.컬럼명
FROM 테이블1, 테이블2
WHERE 테이블1.컬럼명1 = 테이블2.컬럼명2 ;
-- ANSI/ISO SQL표준 방식으로 표현하면 이렇게도 할 수 있다.
SELECT 테이블1.컬럼명, 테이블2.컬럼명
FROM 테이블1 INNER JOIN 테이블2 -- JOIN 이라고 명시했다.
ON 테이블1.컬럼명1 = 테이블2.컬럼명2 ; -- on을 사용했다.
예시
SELECT PLAYER.PLAYER_NAME 선수명, TEAM.TEAM_NAME 소속팀명
FROM PLAYER, TEAM
WHERE PLAYER.TEAM_ID = TEAM.TEAM_ID ;
-- 이렇게 할 수도 있다.
SELECT PLAYER.PLAYER_NAME 선수명, TEAM.TEAM_NAME 소속팀명
FROM PLAYER INNER JOIN TEAM
ON PLAYER.TEAM_ID = TEAM.TEAM_ID ;
SELECT 구문에 단순히 컬럼명이 오지 않고, "테이블.컬럼명" 처럼 테이블명과 컬럼명을 같이 기재해준다.
어느 테이블에 존재하는 컬럼인지 명시해야 하는 이유는
모든 테이블에 컬럼들이 유일한 이름이면 상관없지만, JOIN에 사용되는 두 개 테이블에 같은 컬럼이 존재하는 경우 DBMS의 옵티마이저는 어떤 컬럼을 사용해야 할지 모르기 때문에 파싱 단계에서 에러가 발생하기 때문이다.
또, 개발자나 사용자가 조회할 데이터가 테이블에 있는 컬럼을 말하는 것인지 쉽게 알 수 있게되므로 가독성 & 유지보수에 효과적이다.
FROM 절에서 ALIAS를 사용해서 가독성을 더 높일 수도 있다.
SELECT P.PLAYER_NAME 선수명, T.TEAM_NAME 소속팀명
FROM PLAYER P, TEAM T
WHERE P.TEAM_ID = T.TEAM_ID ;
-- 이렇게 할 수도 있다.
SELECT P.PLAYER_NAME 선수명, T.TEAM_NAME 소속팀명
FROM PLAYER P INNER JOIN TEAM T
ON P.TEAM_ID = T.TEAM_ID ;
테이블에 ALIAS를 적용해서 SQL문장을 작성한 경우, WHERE절과 SELECT 절에도 똑같이 ALIAS를 적어줘야 한다.
NON EQUI JOIN
NON EQUI (비 등가) JOIN은 두 테이블 간에 컬럼 값이 정확하게 일치하지 않는 경우 사용된다.
= 연산자가 아닌 BETWEEN, > <, >=, <= 연산자를 이용하여 JOIN을 수행하는 것이다.
SELECT 테이블1.컬럼명, 테이블2.컬럼명
FROM 테이블1, 테이블2
WHERE 테이블1.컬럼명1 BETWEEN 테이블2.컬럼명1 AND 테이블2.컬럼명2 ;
사원 이 받고 있는 급여 등급을 조회하는 예시
SELECT E.ENAME, E.JOB, E.SAL, S.GRADE
FORM EMP P, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL ;
데이터 모델에 따라서 Non EQUI JOIN이 불가한 경우도 있다.
3개 이상 테이블 조인
예시
SELECT P.PLAYER_NAME 선수명, T.TEAM_ID 팀명, S.STATIUM_NAME 구장명
FROM PLAYER P, TEAM T, STADIUM S
WHERE P.TEAM_ID = T.TEAM_ID
AND T.STADIUM_ID = S.STADIUM_ID
ORDER BY 선수명 ;
세 개 테이블에 대한 JOIN이므로 WHERE 절에 2개 이상의 JOIN 조건이 필요하다.
이렇게도 작성할 수 있다.
SELECT P.PLAYER_NAME 선수명, T.TEAM_ID 팀명, S.STATIUM_NAME 구장명
FROM PLAYER P INNER JOIN TEAM T
ON P.TEAM_ID = T.TEAM_ID
INNER JOIN STADIUM S
ON T.STADIUM_ID = S.STADIUM_ID
ORDER BY 선수명 ;
JOIN을 잘못 기술하게 되면 시스템 자원 부족이나 과다한 응답시간 지연을 발생시키는 중요 원인이 되므로 JOIN 조건은 신중하게 작성해야 한다.
kdata 한국데이터진흥원에서 출간한 SQL 전문가 가이드 2013 Edition을 요약했습니다.
'문송한 회사생활 > SQL 공부' 카테고리의 다른 글
[SQL] FROM절의 JOIN (0) | 2020.08.15 |
---|---|
[SQL] STANDARD SQL, 집합 연산자 (0) | 2020.08.15 |
[SQL] ROWNUM, TOP() (0) | 2020.08.14 |
[SQL] SELECT 문장 실행 순서 (0) | 2020.08.14 |
[SQL] ORDER BY (0) | 2020.08.14 |