SQL 이것저것

[SQL] JOIN

agingcurve 2022. 8. 30. 19:56
반응형

JOIN(교집합)

두 개 이상의 테이블들을 연결 또는 결합하여 데이터를 출력하는 것

 

EQUI JOIN(등가 교집합)

두 개의 테이블 간에 서로 정확하게 일치하는 경우를 활용하는 조인

간단히 말해, 등가 연산자를 사용한 조인을 의미

대부분 기본키-외래키 관계를 기반으로 발생하나, 모든 조인이 그런 것은 아니다

 - 기본적으로 A테이블과 B테이블이 개발자나 관리자에 의해 만들어 지지만, 꼭 이런 형태이진 않다,.

 

Non EQUI JOIN(비등가 교집합)

두 개의 테이블 간에 서로 정확하게 일치하지 않는 경우를 활용하는 조인

등가 연산자 이외의 연산자들을 사용한 조인을 의미

 - 일반적으로 많이 사용되진 않음

 

INNER JOIN

내부 JOIN 이라고 하며 JOIN 조건에서 동일한 값이 있는 행만 반환 INNER JOIN은 JOIN의 기본값으로 ‘INNER’ 생략 가능

SELECT * FROM 테이블1 [INNER] JOIN 테이블2 # (INNER JOIN구로 테이블 정의)
ON 테이블1.컬럼명 = 테이블2.컬럼명; # (ON구를 사용해 조인 조건 지정)

 

JOIN을 사용하는데 별칭을 작성하고, ON절에 두개의 테이블ㅇ이 어떤 조건을 가지고 JOIN을 하는지 두개의 컬럼을 기준으로 JOIN을 해주는 것임

SELECT * FROM USER a JOIN CLASS b
ON a.CALSS_ID = b.ID; # ON 조건절을 활용하면 칼럼명이 다르더라도 JOIN 조건을 사용 가능

 

 

USING 조건절

같은 이름을 가진 칼럼들 중 원하는 칼럼에 USING(기준칼럼); 대해서만 선택적으로 등가 조인 가능 SQL Server에서는 지원X

테이블 1과 테이블 2의 컬럼이 동일하다면, USING을 사용하여 JOIN이 가능함, INNERJOIN 보다 간편하게 사용가능

SELECT * FROM 테이블1 JOIN 테이블2 USING(기준칼럼);
# USNIG 조건절 사용시에는 칼럼이나 테이블에 별칭을 붙일 수 없음

 

두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 등가 조인을 수행

SELECT * FROM 테이블1 NATURAL JOIN 테이블2;
# 추가로 ON 조건절이나 USING 조건절, WHERE절에서 JOIN 조건 정의 불가

 

NATURAL JOIN

 - 동일한 컬럼을 가지고 있는 CLASS_ID 에 해당하는 클래스들이 결과로 나오게 됨

SELECT * FROM USER NATURAL JOIN CLASS;
# INNER JOIN과 달리 별칭 지정 불가

 

 

CROSS JOIN

JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합을 조회

USER 테이블의 모든 테이블과 CLASS 테이블의 모든 테이블을 조합함 

 

 

SELECT * FROM PERSON (CROSS) JOIN PUBLIC_TRANSPORT; #INNER JOIN의 INNER 처럼 생략가능하다
# INNER JOIN과 구별법은 어떤 조건절과 구분할지는 ON조건절에서 NATURAL 등을 넣어줘야함
# ON 조건절을 사용하지 않으면 CROSS JOIN 형태가 진행이 된다.
# 해당 구문에서는 ON, USING이 없어서 CORSS JOIN으로 사용된다.

OUTER JOIN

두 개의 테이블 간에 교집합을 조회하고 한쪽 테이블에만 있는 데이터도 포함시켜서 조회 빈 곳은 NULL 값으로 출력 WEHRE 조건절에서 한쪽에만 있는 데이터를 포함시킬 테이블 쪽으로 (+)를 위치

 

SELECT * FROM USER, CLASS WHERE USER.CLASS_ID (+) = CLASS.CLASS_ID;
# USER 테이블의 모든 데이터는 출력이 되고, 
# CLASS가 003인 데이터는 NULL 값으로 들어오게 된다. 클래스 아이디를 JOIN으로 나타내준다면
# LEFT OUTTER JOIN은 비어있는곳은 NULL로 조인이 된다.

표준 OUTER JOIN (LEFT JOIN)

SELECT * FROM USER LEFT [OUTER] JOIN CLASS ON USER.CLASS_ID = CLASS.CLASS_ID;
# LEFT OUTER JOIN 은 일반적이지 않고, 똑같이 JOIN이기 때문에
# CLASS 아이디가 001, 002 인것 등이 출력이 된것이고 003이 아니라도 출력이 됨
# LEFT OUTER JOIN이 아닌 그냥 JOIN이였다면, USER 테이블의 모든 데이터가 출력되고
# 나머지는 NULL로 출력됨

 

표준 OUTER JOIN (RIGHT JOIN)

SELECT * FROM USER RIGHT [OUTER] JOIN CLASS ON USER.CLASS_ID = CLASS.CLASS_ID;
# USER테이블과 CLASS 테이블의 모든데이터는 출력이 되야하고 이에 해당하는
# USER테이블의 데이터가 없더라도 NULL로 출력을 해주게 된다.
# USER 테이블을 기준으로 RIGHT OUTER JOIN 하게 됬을 때, 같은 LEFT OUTER JOIN을하려면
# 테이블의 이름만 변경해주면됨

 

표준 OUTER JOIN (FULL OUTER JOIN)

SELECT * FROM CLASS FULL OUTER JOIN USER ON USER.CLASS_ID = CLASS.CLASS_ID;
# USER 테이블에 있는 데이터는 그 데이터만 출력이 되고 나머지는 NULL로 출력이됨
# 반대로 CLASS 테이블에 있는 데이터는 그 데이터만 출력 되고 나머지는 NULL로 출력됨

 

표준 OUTER JOIN (FULL OUTER JOIN) in MySQL

 

FULL OUTERJOIN은 ORCLE 데이터베이스에서 사용되고, MARIA , MYSQL DB 등은 UNION을 사용하여 다시 만들어줘야 한다.

SELECT * FROM CLASS LEFT OUTER JOIN USER
ON USER.CLASS_ID = CLASS.CLASS_ID
UNION
SELECT * FROM CLASS RIGHT OUTER JOIN USER
ON USER.CLASS_ID = CLASS.CLASS_ID;
# USER 테이블과 CLASS 테이블에 모든 데이터가 출력이되고,
# LEFT OUTER JOIN이 된 상태에서 나머지는 NULL이 출력이 되고, USER 테이블의 모든데이터가 출력되고
# 위에 있는 데이터가 도출된 값이 들어가게 된다. 두개에 대해서 결과를 합치게 된다면
# UNION을 통해 중복 값은 제거가 되서 나타남

 

 

 

INNER JOIN

JOIN을 활용한 쿼리에서도 WHERE문을 이용하여 조건을 걸 수 있음

해당하는 테이블의 조건을 가공해서 최종 결과물을 만들게 됨

CLASS_ID를 통해서 USER_ID와 NAME이있고, CLASS_ID 값과 

SELECT * FROM 테이블1 [INNER]JOIN 테이블2 ON 테이블1.컬럼명   = 테이블2.컬럼명;
WHERE [조건];
# 기존과 같이 WHERE문을 이용

 

 

 

SELECT * FROM USER a JOIN CLASS b ON a.CALSS_ID = b.ID;
WHERE NAME = ‘모자장수’;
# USER 테이블의 USER_ID와 CLASS의 ID 값이 동일하게 
# 하여 001, 002 체셔, 001,003, 도도새 동일한 값을 JOIN을 한다면 값이 나오게 됨
# WHERE을 이용하여 '모자장수만 나오게 함'

 

셀프 조인

동일 테이블 사이의 조인

동일 테이블 사이의 조인을 수행하면 테이블과 칼럼 이름이 모두 동일하기 때문에 식별을 위해 별칭 필수

스스로 테이블1이 테이블2에 조인하겠다는 것이며, 각각의 테이블의 명이 같아서 별칭을 필수적으로 붙여줘야 함

구분을 해주지 않으면 쿼리 동작시에 에러가 발생하게 된다.

SELECT ALPHA.칼럼명, BETA.칼럼명, …
FROM 테이블1 ALPHA, 테이블1 BETA # 동일 테이블 조인 시 별칭을 지정해줘야 구분 가능
WHERE ALPHA.컬럼명2 = BETA.컬럼명;

셀프 조인 예시 ‒ 계층형 질의

 - 직원테이블을 기준으로 ALHPHA의 관리자, BETA의 사원번호를 기준으로 SELF JOIN을 진행한다면, 관리자 값이 NULL이기 때문에 BETA의 관리자 값은 NULL이 되게 된다.

 - BETA의 관리자 값이 차상위라는 값으로 들어가므로 해당 차상위 값도 NULL로 들어가게 된다

SELECT ALPHA.사원번호, ALPHA.관리자, BETA.관리자 차상위; 
FROM 직원 ALPHA, 직원 BETA  WHERE ALPHA.관리자 = BETA.사원번호;

 

'SQL 이것저것' 카테고리의 다른 글

[SQL] View(뷰)  (0) 2022.09.10
[SQL] 서브쿼리  (0) 2022.09.10
[SQL] 계층형 질의  (0) 2022.08.30
[SQL] Standard SQL  (2) 2022.08.30
[SQL] 서브쿼리  (0) 2022.08.14