JOIN/UNION

JiyN·2023년 9월 9일
0
post-custom-banner

데이터의 무결성

데이터를 잘라 DB에서 참조, 메모리 절약, 성능에 도움
원래대로 합치는 과정 : JOIN


JOIN

종류

INNER JOIN, OUTER JOIN, SELF JOIN, CORSS JOIN


JOIN의 예

부모테이블 (L)

STUDENT_IDNAME
20230909김00
20220921이00
20200102박00

자식테이블(R)

IDCLASSSTUDENT_ID(참조키)
1영문법이해20230909
2일본어감상20230909
3한국근현대사이해20230909
4세계문화음식20210202

테이블 결합(JOIN)

STUDENT_IDNAMEIDCLASSSTUDENT_ID
20230909김001영문법이해20230909
20230909김002일본어감상20230909
20230909김003한국근현대사이해20230909

20220921|이00
20200102|박00 > OUTER

4|세계문화음식|20210202: OUTER


INNER JOIN

관계가 있는 레코드들만 합치는 조인

작성

SELECT *
FROM <테이블1> A (INNER) JOIN <테이블2> B 
ON A.컬럼1 = B.컬럼c; --서로 일치하는 컬럼 작성

결과

STUDENT_IDNAMEIDCLASSSTUDENT_ID
20230909김001영문법이해20230909
20230909김002일본어감상20230909
20230909김003한국근현대사이해20230909

OUTER JOIN

참조키를 기준으로 일치하지 않는 행도 포함시키는 조인
INNER JOIN 보다 더 자주 사용

<테이블1> A LEFT/RIGHT/FULL OUTER JOIN <테이블2> B
ON A.칼럼 = B.컬럼

LEFT OUTER JOIN

왼쪽을 기준으로 합체(오른쪽에 없는 값은 NULL)

SELECT *
FROM <테이블1> A LEFT (OUTER) JOIN <테이블2> B 
ON A.컬럼1 = B.컬럼c; --서로 일치하는 컬럼 작성
STUDENT_IDNAMEIDCLASSSTUDENT_ID
20230909김001영문법이해20230909
20230909김002일본어감상20230909
20230909김003한국근현대사이해20230909
20220921이00NULLNULLNULL
20200102박00NULLNULLNULL

RIGHT OUTER JOIN

SELECT *
FROM <테이블1> A RIGHT (OUTER) JOIN <테이블2> B 
ON A.컬럼1 = B.컬럼c; --서로 일치하는 컬럼 작성
STUDENT_IDNAMEIDCLASSSTUDENT_ID
20230909김001영문법이해20230909
20230909김002일본어감상20230909
20230909김003한국근현대사이해20230909
NULLNULL4세계문화음식20210202

FULL OUTER JOIN

SELECT *
FROM <테이블1> A FULL (OUTER) JOIN <테이블2> B 
ON A.컬럼1 = B.컬럼c; --서로 일치하는 컬럼 작성
STUDENT_IDNAMEIDCLASSSTUDENT_ID
20230909김001영문법이해20230909
20230909김002일본어감상20230909
20230909김003한국근현대사이해20230909
20220921이00NULLNULLNULL
20200102박00NULLNULLNULL
NULLNULL4세계문화음식20210202

OUTER JOIN 응용

게시글 목록 조회

  • MEMBER INNER JOIN NOTICE
    INNER JOIN 사용시 : 글을 등록하지 않은 사람을 볼 수 없음.
    주 테이블이 무엇인지 파악 후 OUTER JOIN을 사용해야함
SELECT M.ID ID, M.NAME NAME, COUNT(N.WRITER_ID) COUNT_ID
FROM MEMBERS M LEFT JOIN NOTICE N
ON M.ID = N.WRITER_ID
GROUP BY M.ID, M.NAME;

SELF JOIN

데이터가 서로 포함 관계를 가지는 경우 : 담당, 구성, 연락
참조테이블 추가, JOIN

  • PK와 데이터 크기 맞추기

사원의 보스 정보 출력

SELECT M.*, B.NAME BOSS_NAME (원래 컬럼명과 차이를 주는 새 별칭)
FROM MEMBER MEM LEFT OUTER JOIN BOSS ON B.ID = M.BOSS_ID; 
(본인 참조, SELF JOIN)

ORACLE JOIN

ANSI INNER JOIN

SELECT N.ID, N.TITLE, N.NAME
FROM MEMBER N INNER JOIN NOTICE N 
ON M.ID = N.WRITER_ID
WHERE M.ID = 'apple';

ORACLE INNER JOIN

SELECT N.ID, N.TITLE, N.NAME
FROM MEMBER M, NOTICE N
WHERE M.ID = N.WRITER_ID AND M.ID = 'apple';

ANSI OUTER JOIN

SELECT N.*, M.NAME WRITER_NAME
FROM NOTICE N LEFT OUTER JOIN MEMBER M
ON M.ID = N.WRITER_ID

ORACLE OUTER JOIN

SELECT N.*, M.NAME WRITER_NAME
FROM NOTICE N, MEMBER M 
WHERE M.ID(+) = N.WRITER_ID;

ORACLE FULL OUTER JOIN

지원 X

ANSI CROSS JOIN

자주 사용 X
관계에 상관 없이 두개의 테이블을 곱해 JOIN

SELECT *
FROM NOTICE N CROSS JOIN MEMBER M;

ORACLE CROSS JOIN

SELECT *
FROM NOTICE N, MEMBER M;

UNION

컬럼이 늘어나지 않으면서 레코드를 합치는 과정
관련성에 따라 합치지 않음
컬럼의 갯수와 자료형에 맞게 합쳐짐
합쳤을 때 같은 내용의 경우는 하나로 합침

SELECT ID, NAME FROM MEMBER
    UNION
SELECT WRITER_ID, CONTENT FROM NOTICE;

테이블 1

STUDENT_IDNAME
20230909김00
20220921이00
20200102박00

테이블2

IDNAME
20241212이00
20221122이00
20200102박00

UNION

STUDENT_IDNAME
20230909김00
20220921이00
20200102박00
20241212이00
20221122이00

UNION 연산자

연산자역할
MINUS공통분모 빼기
INTERSECT공통분모 남기기
UNION ALL전부 다 나옴

예시

SELECT ID, NAME FROM MEMBER WHERE NAME LIKE '이%'
    MINUS
SELECT ID, NAME FROM MEMBER WHERE ID LIKE '2022'

결과

IDNAME
20241212이00
profile
공부블로거
post-custom-banner

0개의 댓글