JOIN
JOIN 이란 데이터베이스에서 '두 개 이상의 테이블을 연결하여 하나의 결과의 테이블로 만드는 것'을 의미한다.
▶ 이를 통해 데이터를 효율적으로 검색하고 처리하는데 도움을 준다.
JOIN을 사용하는 이유
데이터베이스에서 테이블을 분리하여 '데이터 중복을 최소화'하고 '데이터의 일괄성'을 유지하기 위해서 이다.
JOIN의 종류
INNER JOIN
OUTER JOIN (LEFT, RIGHT, FULL)
CLOSE JOIN
SELF JOIN
"Database는 ANSI JOIN과 ORACLE JOIN으로 나뉜다."
ANSI JOIN 방식
ANSI JOIN은 ANSI SQL 표준(미국 국립표준협회 SQL)에 따라 작성된 코드이다.
데이터베이스 테이블 간의 관계를 맺는 방법 중 하나로 다양한 데이터베이스 관리 시스템(DBMS)에서 동일하게 작동한다.
▶ 코드의 이식성이 높다.
ANSI JOIN 의 종류
1. INNER JOIN
2. LEFT JOIN
3. RIGHT JOIN
4. FULL OUTER JOIN 등
INNER JOIN
두 테이블의 공통된 값을 가지고 있는 행만 반환한다.
INNER JOIN 구문
SELECT * FROM COURSE INNER JOIN USER ON COURSE.강의하는사람 = USER 번호
아래 표를 보면 'COURSE' 테이블과 'USER' 테이블이 있다.
연결 값이 없으면, NULL이 아닌 값자체가 나오질 않는다.
▶ INNER JOIN에서 INNER는 생략이 가능하다.
OUTER JOIN
OUTER JOIN은 두 테이블에서 '공통된 값을 가지지 않는 행'도 반환한다.
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN
기존 표기에서 ANSI 방식으로 변경된 이유
지금까지 오라클에서 제공한 OUTER 조인 표기는 ( + ) 문자를 사용했지만, 오라클 OUTER 조인은 이해가 어렵고 실수 유발이 쉽다는 단점이 있다.
▶ ANSI SQL-3 의 기준을 오라클 9I 에서 수용하면서 LEFT/RIGHT OUTER 조인뿐만 아니라
그 동안 UNION이나 UNION ALL을 이용해서 처리하면 양쪽 OUTER 조인도 FULL OUTER JOIN문법이
새로 추가되었다.
LEFT (OUTER) JOIN
왼쪽 테이블의 모든 행과 오른쪽 테이블에서 왼쪽 테이블과 공통된 값을 가지고 있는 행들을 반환한다.
▶ 만약 오른쪽 테이블에서 공통괸 값을 가진 행이 없다면 'NULL'로 반환한다.
LEFT (OUTER) JOIN 구문
SELECT * FROM COURSE LEFT(OUTER) JOIN USER ON COURSE.강의하는사람 = USER 번호
왼쪽 테이블은 전부 다 나오지만, 오른쪽 테이블에 공통된 값이 없다면 모두 NULL로 반환한다.
RIGHT (OUTER) JOIN
LEFT JOIN과 반대이다.
'오른쪽 테이블의 모든 행과 왼쪽 테이블에서 오른쪽 테이블과 공통된 값을 가지고 있는 행들을 반환한다.
▶ 왼쪽 테이블에서 공통된 값을 가지고 있는 행이 없다면 NULL 값을 반환한다.
RIGHT (OUTER) JOIN 구문
SELECT * FROM COURSE RIGHT(OUTER) JOIN USER ON COURSE.강의하는사람 = USER 번호
위와 같이 오른쪽 테이블은 모두 나오고 왼쪽 테이블에서 공통된 값이 없다면 모두 NULL로 반환한다.
FULL (OUTER) JOIN
두 테이블에서 모든 값을 반환한다.
▶ 만약 공통된 값을 가지고 있지 않는 행이 있다면 NULL 값을 반환한다.'
FULL (OUTER) JOIN 구문
SELECT * FROM COURSE FULL(OUTER) JOIN USER ON COURSE.강의하는사람 = USER 번호
왼쪽 테이블, 오른쪽 테이블이 모두 검색되지만 공통된 값이 없는 것들은 모두 NULL 로 반환한다.
CROSS JOIN
두 개 이상의 테이블에서 '모든 가능한 조합'을 만들어 결과를 반환하는 조인 방법이다.
이를 통해 두 개 이상의 테이블을 조합하여 새로운 테이블을 생성할 수 있는데,
CROSS JOIN을 사용하게되면 매우 큰 테이블이 출력될 우려가 있어 사용을 권장하진 않는다.
CROSS JOIN 구문
SELECT * FROM COURSE CROSS JOIN USER ON COURSE.강의하는사람 = USER 번호
왼쪽을 기준으로 한 행마다 오른쪽행이 반복하게 된다.
SELF JOIN
자신의 테이블에 자신의 테이블을 조인. ( 전제조건 - 상, 하위를 나타내는 키가 있어야한다.)
SELECT * FROM EMPLOYEES E
LEFT JOIN EMPLOYEES E2
ON E.MANAGER_ID = E2.MANAGER_ID;
USING 절
양쪽 테이블에 동일한 키 이름으로 연결 할 때 사용이 가능하다.
SELECT * FROM COURSE C
JOIN MEMBER M
USING(ID);
COURSE TABLE
COURSE TABLE 데이터 삽입
INSERT INTO "HR"."COURSE" (NUM, SUBJECT, CONTENT, ID) VALUES ('1', '자바', '...', '1')
INSERT INTO "HR"."COURSE" (NUM, SUBJECT, CONTENT, ID) VALUES ('2', '데이터베이스', '...', '1')
INSERT INTO "HR"."COURSE" (NUM, SUBJECT, CONTENT, ID) VALUES ('3', '깃', '...', '2')
INSERT INTO "HR"."COURSE" (NUM, SUBJECT, CONTENT, ID) VALUES ('4', 'C', '...', '3')
INSERT INTO "HR"."COURSE" (NUM, SUBJECT, CONTENT, ID) VALUES ('5', 'SPRING', '...', '4')
INSERT INTO "HR"."COURSE" (NUM, SUBJECT, CONTENT) VALUES ('6', 'C++', '...')
MEMBER TABLE
MEMBER TABLE 데이터 삽입
INSERT INTO "HR"."MEMBER" (ID, NAME, JOB) VALUES ('1', 'CODING404', '프로그래머스')
INSERT INTO "HR"."MEMBER" (ID, NAME, JOB) VALUES ('2', '홍길동', '강사')
INSERT INTO "HR"."MEMBER" (ID, NAME, JOB) VALUES ('3', '이순신', 'DBA')
INSERT INTO "HR"."MEMBER" (ID, NAME, JOB) VALUES ('4', '홍길동', '개발자')
INSERT INTO "HR"."MEMBER" (ID, NAME, JOB) VALUES ('5', '피카츄', '디자이너')
INNER JOIN
INNER JOIN 구문
SELECT * FROM COURSE INNER JOIN MEMBER ON COURSE.ID = MEMBER.ID;
Table alisa 사용
SELECT * FROM COURSE C
INNER JOIN MEMBER M
ON C.ID = M.ID;
INNER 는 생략이 가능하다.
SELECT * FROM COURSE C JOIN MEMBER M ON C.ID = M.ID;
LEFT JOIN
SELECT * FROM COURSE C LEFT OUTER JOIN MEMBER M ON C.ID = M.ID
OUTER은 생략이 가능하다.
SELECT * FROM COURSE C LEFT JOIN MEMBER M ON C.ID = M.ID;
RIGHT JOIN
SELECT * FROM COURSE C RIGHT JOIN MEMBER M ON C.ID = M.ID;
FULL JOIN
SELECT * FROM COURSE C FULL JOIN MEMBER M ON C.ID = M.ID;
CROSS JOIN
SELECT * FROM COURSE C CROSS JOIN MEMBER M;
'Programming > Database' 카테고리의 다른 글
[Database] 서브 쿼리 (0) | 2023.12.07 |
---|---|
[Database] JOIN 문제풀이 (0) | 2023.12.06 |
[Database] 기초 문제풀이 (0) | 2023.12.05 |
[Database] - Group 함수 (그룹함수) (1) | 2023.12.05 |
[Database] 함수 - 집합연산자와 분석함수 (1) | 2023.12.05 |