데이터를 잘라 DB에서 참조, 메모리 절약, 성능에 도움
원래대로 합치는 과정 : JOIN
INNER JOIN, OUTER JOIN, SELF JOIN, CORSS JOIN
STUDENT_ID | NAME |
---|---|
20230909 | 김00 |
20220921 | 이00 |
20200102 | 박00 |
ID | CLASS | STUDENT_ID(참조키) |
---|---|---|
1 | 영문법이해 | 20230909 |
2 | 일본어감상 | 20230909 |
3 | 한국근현대사이해 | 20230909 |
4 | 세계문화음식 | 20210202 |
STUDENT_ID | NAME | ID | CLASS | STUDENT_ID |
---|---|---|---|---|
20230909 | 김00 | 1 | 영문법이해 | 20230909 |
20230909 | 김00 | 2 | 일본어감상 | 20230909 |
20230909 | 김00 | 3 | 한국근현대사이해 | 20230909 |
20220921|이00
20200102|박00 > OUTER
4|세계문화음식|20210202: OUTER
관계가 있는 레코드들만 합치는 조인
SELECT *
FROM <테이블1> A (INNER) JOIN <테이블2> B
ON A.컬럼1 = B.컬럼c; --서로 일치하는 컬럼 작성
STUDENT_ID | NAME | ID | CLASS | STUDENT_ID |
---|---|---|---|---|
20230909 | 김00 | 1 | 영문법이해 | 20230909 |
20230909 | 김00 | 2 | 일본어감상 | 20230909 |
20230909 | 김00 | 3 | 한국근현대사이해 | 20230909 |
참조키를 기준으로 일치하지 않는 행도 포함시키는 조인
INNER JOIN 보다 더 자주 사용
<테이블1> A LEFT/RIGHT/FULL OUTER JOIN <테이블2> B
ON A.칼럼 = B.컬럼
왼쪽을 기준으로 합체(오른쪽에 없는 값은 NULL)
SELECT *
FROM <테이블1> A LEFT (OUTER) JOIN <테이블2> B
ON A.컬럼1 = B.컬럼c; --서로 일치하는 컬럼 작성
STUDENT_ID | NAME | ID | CLASS | STUDENT_ID |
---|---|---|---|---|
20230909 | 김00 | 1 | 영문법이해 | 20230909 |
20230909 | 김00 | 2 | 일본어감상 | 20230909 |
20230909 | 김00 | 3 | 한국근현대사이해 | 20230909 |
20220921 | 이00 | NULL | NULL | NULL |
20200102 | 박00 | NULL | NULL | NULL |
SELECT *
FROM <테이블1> A RIGHT (OUTER) JOIN <테이블2> B
ON A.컬럼1 = B.컬럼c; --서로 일치하는 컬럼 작성
STUDENT_ID | NAME | ID | CLASS | STUDENT_ID |
---|---|---|---|---|
20230909 | 김00 | 1 | 영문법이해 | 20230909 |
20230909 | 김00 | 2 | 일본어감상 | 20230909 |
20230909 | 김00 | 3 | 한국근현대사이해 | 20230909 |
NULL | NULL | 4 | 세계문화음식 | 20210202 |
SELECT *
FROM <테이블1> A FULL (OUTER) JOIN <테이블2> B
ON A.컬럼1 = B.컬럼c; --서로 일치하는 컬럼 작성
STUDENT_ID | NAME | ID | CLASS | STUDENT_ID |
---|---|---|---|---|
20230909 | 김00 | 1 | 영문법이해 | 20230909 |
20230909 | 김00 | 2 | 일본어감상 | 20230909 |
20230909 | 김00 | 3 | 한국근현대사이해 | 20230909 |
20220921 | 이00 | NULL | NULL | NULL |
20200102 | 박00 | NULL | NULL | NULL |
NULL | NULL | 4 | 세계문화음식 | 20210202 |
게시글 목록 조회
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;
데이터가 서로 포함 관계를 가지는 경우 : 담당, 구성, 연락
참조테이블 추가, JOIN
사원의 보스 정보 출력
SELECT M.*, B.NAME BOSS_NAME (원래 컬럼명과 차이를 주는 새 별칭)
FROM MEMBER MEM LEFT OUTER JOIN BOSS ON B.ID = M.BOSS_ID;
(본인 참조, SELF 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';
SELECT N.ID, N.TITLE, N.NAME
FROM MEMBER M, NOTICE N
WHERE M.ID = N.WRITER_ID AND M.ID = 'apple';
SELECT N.*, M.NAME WRITER_NAME
FROM NOTICE N LEFT OUTER JOIN MEMBER M
ON M.ID = N.WRITER_ID
SELECT N.*, M.NAME WRITER_NAME
FROM NOTICE N, MEMBER M
WHERE M.ID(+) = N.WRITER_ID;
지원 X
자주 사용 X
관계에 상관 없이 두개의 테이블을 곱해 JOIN
SELECT *
FROM NOTICE N CROSS JOIN MEMBER M;
SELECT *
FROM NOTICE N, MEMBER M;
컬럼이 늘어나지 않으면서 레코드를 합치는 과정
관련성에 따라 합치지 않음
컬럼의 갯수와 자료형에 맞게 합쳐짐
합쳤을 때 같은 내용의 경우는 하나로 합침
SELECT ID, NAME FROM MEMBER
UNION
SELECT WRITER_ID, CONTENT FROM NOTICE;
테이블 1
STUDENT_ID | NAME |
---|---|
20230909 | 김00 |
20220921 | 이00 |
20200102 | 박00 |
테이블2
ID | NAME |
---|---|
20241212 | 이00 |
20221122 | 이00 |
20200102 | 박00 |
UNION
STUDENT_ID | NAME |
---|---|
20230909 | 김00 |
20220921 | 이00 |
20200102 | 박00 |
20241212 | 이00 |
20221122 | 이00 |
연산자 | 역할 |
---|---|
MINUS | 공통분모 빼기 |
INTERSECT | 공통분모 남기기 |
UNION ALL | 전부 다 나옴 |
예시
SELECT ID, NAME FROM MEMBER WHERE NAME LIKE '이%'
MINUS
SELECT ID, NAME FROM MEMBER WHERE ID LIKE '2022'
결과
ID | NAME |
---|---|
20241212 | 이00 |