본문 바로가기
SQL/기초

SQL 정리 6일차 JOIN

by 유서담 2023. 8. 16.

6.1 JOIN

 

JOIN은 하나 이상의 테이블로부터 연관된 데이터를 검색해오는 방법.

일반적인 경우에 행들은 Primary Key(PK)와 Foreign Key(FK) 값의 연관에 의해 JOIN이 성립된다. 그러나 어떤 경우에는 이러한 PK, FK 관계가 없어도 논리적인 값들의 연관만으로 JOIN이 성립되기도 한다.

 

JOIN의 종류

JOIN 방법 의 미
EQUIJOIN 칼럼 간의 값들이 서로 정확하게 일치하는 경우에 사용
일반적으로 PK, FK 관계에 의함
NON - EQUIJOIN 한 칼럼의 값이 다른 칼럼의 값과 정확히 일치하지 않는 경우에
사용
OUTER JOIN JOIN조건을 만족하지 않는 경우에도 모든 행들을 다 보려는
경우에 사용
SELF JOIN 같은 테이블에 있는 행들을 JOIN하고자 하는 경우에 사용

 

JOIN에 대한 조건이 생략되거나 잘못 기술되면, 한 테이블에 있는모든 행들이 다른 테이블에 있는 모든 행들과 JOIN 된다.

이런 결과를 Cartesian product라고 하는데, 이런 결과를 얻지 않기 위해서 반드시 JOIN시에 WHERE를 기술해야 한다.

 

 

6.2 EQUIJOIN

 

EQUIJOIN이란 컬럼이 있는 값들이 =연산자를 사용하여 정확하게 일치하는 경우에 JOIN 하는 방법

 

일반적으로 PK, FK 관계에 의하여 JOIN이 성립

 

WHERE절에서 JOIN조건을 기술하도록 한다

 

액세스 효율을 향상시키고, 좀 더 명확하게 하기 위해 컬럼이름 앞에 테이블이름을 적어준다

 

만약 하나 이상의 테이블에서 같은 이름의 컬럼이 나타나면 반드시 컬럼이름 앞에 테이블 이름을 밝혀줘야 한다

 

JOIN을 위한 테이블이 N개라면, JOIN에 대한 조건은 최소한 N-1개의 JOIN조건이 필요.

복합 키의 경우, 모든 키가 JOIN조건에 포함되어야 한다

 

EQUIJOIN 사용방법

SELECT 테이블명.칼럼명, 테이블명.칼럼명, ...
FROM 테이블1, 테이블2
WHERE 테이블1.칼럼1 = 테이블2.칼럼2; -- 연결고리가 있어야한다

테이블명,칼럼명 : 검색해올 데이터가 어디에서 오는지 테이블과 칼럼을 밝혀준다

 

테이블1.칼럼1 = 테이블2.칼럼2 : 두 테이블 간에 논리적으로 값을 연결시키는 칼럼 간의 조건을 기술한다.

 

EQUIJOIN 예시

 

SELECT s_emp.name, s_emp.dept_id, s_dept.name
FROM s_emp, s_dept
WHERE s_emp.dept_id = s_dept.id

 

6.3 NON-EQUIJOIN

 

NON-EQUIJOIN이란 한 컬럼의 값이 다른 컬럼의 값과 정확히 일치하지 않는 경우 =연산자 외의 다른 연산자를 사용하여

JOIN하는 방법

 

자주 사용되지는 않지만 등급만들때 사용된다 ( 급여등급, 회원등급 등등 // 아래 예시참조) 

 

NON-EQUIJOIN 예시

SELECT e.name, e.salary, g.grade 급여동급
FROM s_emp e, salgrade g
WHERE e.salary BETWEEN g.losal AND g.hisal;

각 사원에 대하여 급여와 급여 등급이 무엇인지 알고 싶다면, 이런 경우는 사원의 급여와 급여등급의 값이 서로 일치하는 데이터가 아니므로 =연산자로 JOIN할 수 없다. 이럴때 NON-EQUIJOIN한다.

 

 

6.4 OUTER JOIN

 

OUTER JOIN을 하는 경우에는 (+) 연산자를 사용한다

 

(+)를 사용하는 위치는 JOIN할 데이터가 부족한 쪽에 위치시킨다.

 

(+)는 WHERE절에서 비교연산자 기준으로 좌변 또는 우변의 어느 한쪽에 위치시킨다.

 

OUTER JOIN에서 IN이나 OR을 사용할 수 없다

 

OUTER JOIN의 예시

SELECT e.name 사원명, e.id, c.name 고객명
FROM s_emp, s_customer c
WHERE e.id (+) = c.sales_rep_id
ORDER BY 2;

 

6.5 SELF JOIN

 

SELF JOIN으로 하나의 테이블을 마치 여러개인 것처럼 사용가능

 

반드시 테이블에 대한 ALIAS를 각기 다르게 지정해야 한다

 

컬럼의 이름 앞에 반드시 테이블의 ALIAS를 붙여야 한다

 

SELF JOIN의 횟수는 제한되어 있지 않다.

 

대분류 / 중분류 / 소분류 / 계층구조 표현할 때 많이 사용

 

 

SELF JOIN의 예시

 

SELECT w.id 사번, w.name 사원명, m.id 부사장사번, m.name 부서장명
FROM s_emp w, s_emp m
WHERE w.manager_id = m.id;

 

6.6 칼럼과 테이블의 ALIAS사용

 

ALIAS : 테이블의 별명

SELECT e.name 사원명, e.dept_id, d.name 부서명
FROM s_emp e, s_dept d
WHERE e.dept_id = d.id;

 

테이블명.컬럼명으로 기술할 때, 테이블명이 긴 경우는 많은 시간이 소요되므로 테이블에 대한

ALIAS를 지정하는 것이 좋다.

일단 테이블에 ALIAS를 지정했으면, 테이블명 대신에 반드시 ALIAS를 써야 한다. 또한 컬럼에 대한 ALIAS를

지정함으로써 출력시 컬럼 표기를 명확하게 할 수 있다.

 

6.7 SET 연산자

 

SET 연산자의 종류

- UNION : 각 QUERY결과의 합집합 / 중복제거 

- INTERSECT : 각 QUERY결과의 교집합

- UNION ALL : 각 QUERY결과의 합집합 / 중복제거를 하지 않음 ( 제일 많이 사용 )

- MINUS : 첫번째 QUERY결과와 두번째 QUERY결과의 차집합

 

첫번째 SELECT구문에서 기술된 칼럼들과 두번째 SELECT 구문에서 기술된 칼럼들은 그 개수와 타입이 일치해야 한다

 

FROM절 뒤에 기술된 테이블은 서로 다를 수도, 같을 수도 있다

 

칼럼의 HEADING는 첫번째 SELECT 구문의 컬럼명이 출력된다

 

ORDER BY절은 마지막에 하넌만 기술한다

 

SET 연산자의 문형

SELECT 칼럼1, 칼럼2 ...
FROM 테이블1 ...
SET 연산자
SELECT 칼럼1`, 칼럼2` ...
FROM 테이블2 ...
ORDER BY ;

 

SET 연산자 - 예시

SELECT name, dept_id, title
FROM s_emp
WHERE dept_id = 110
UNION
SELECT name, dept_id, title
FROM s_emp
WHERE dept_id = 113
ORDER BY 1;