JOIN에서 사용할 테이블에 데이터 추가
- 사원 테이블(tbl_employee)에 데이터 추가
-- 1. 사원 테이블에 데이터 추가 (1 ~ 5번 자료)
INSERT INTO tbl_employee
( emp_id, emp_name, gender, age, hire_date, dept_id, address_id)
VALUES
( 1, '김유신', '남성', 56, TO_DATE('2023-07-01', 'YYYY-MM-DD'), 1, 2);
INSERT INTO tbl_employee
( emp_id, emp_name, gender, age, hire_date, dept_id, address_id)
VALUES
( 2, '신사임당', '여성', 34, TO_DATE('2023-07-01', 'YYYY-MM-DD'), 1, 1);
INSERT INTO tbl_employee
( emp_id, emp_name, gender, age, hire_date, dept_id, address_id)
VALUES
( 3, '홍길동', '남성', 45, TO_DATE('2023-07-01', 'YYYY-MM-DD'), 3, 2);
INSERT INTO tbl_employee
( emp_id, emp_name, gender, age, hire_date, dept_id, address_id)
VALUES
( 4, '강감찬', '남성', 23, TO_DATE('2023-07-01', 'YYYY-MM-DD'), 2, 3);
INSERT INTO tbl_employee
( emp_id, emp_name,gender, age, hire_date, dept_id, address_id)
VALUES
( 5, '세종대왕', '남성', 45, TO_DATE('2023-07-01', 'YYYY-MM-DD'), 4, 4);
- 부서 테이블(tbl_dept)에 데이터 추가
-- 2. 부서 테이블에 데이터 추가 ( 1 ~ 4번 자료 추가 )
-- 1) 회계팀
INSERT INTO tbl_dept ( dept_id, dept_name )
VALUES ( 1, '회계팀');
-- 2) 경영팀
INSERT INTO tbl_dept ( dept_id, dept_name )
VALUES ( 2, '경영팀');
-- 3) 전산팀
INSERT INTO tbl_dept ( dept_id, dept_name )
VALUES ( 3, '전산팀');
-- 4) 마케팅팀
INSERT INTO tbl_dept ( dept_id, dept_name )
VALUES ( 4, '마케팅팀');
- 주소 테이블(tbl_address)에 데이터 추가
-- 3. 주소 테이블에 데이터 추가
INSERT INTO TBL_ADDRESS
(address_id, city, gu, address_name )
VALUES
(1, '서울특별시', '중구', '새문안로 12');
INSERT INTO TBL_ADDRESS
(address_id, city, gu, address_name )
VALUES
(2, '서울특별시', '서대문구', '연희로 15길');
INSERT INTO TBL_ADDRESS
(address_id, city, gu, address_name )
VALUES
(3, '서울특별시', '영등포구', '여의대로 99');
INSERT INTO TBL_ADDRESS
(address_id, city, gu, address_name )
VALUES
(4, '서울특별시', '강남구', '테헤란로 33');
JOIN
- 중복된 데이터가 많이 들어있는 테이블의 경우, 관리의 어려움이 있음
- 불필요한 중복 데이터에 의해 하드디스크(저장공간)의 낭비가 심함
- 불필요한 정보로 인한 데이터의 오류 발생 가능성 있음
→ 이러한 문제를 해결하기 위해 관계형 데이터베이스는 중복된 테이블 데이터를 별도의 테이블로 분리하고, 각각의 테이블을 연결하는 기본키를 사용하여 필요할 때 데이블끼리 연결하여 테이블을 확장하게 되는데, 이것을 'JOIN'이라고 함
- 사용하기 전 준비
• 먼저 두 테이블로 한정하여 각 테이블을 연결하기( = 관계 설정 ) 위해서는 사용할 컬럼이 필요
→ 즉, 두 테이블의 연결고리 역할을 하는 컬럼이 필요
• 이 컬럼을 이용해 SELECT문에서 WHERE 조건절에서 연결을 위한 각종 조건연산을 사용해 조인을 수행함
• 연결고리 역할을 하는 컬럼의 특징
❶ 보통 동일한 이름의 동일한 데이터형을 가짐
❷ 한 테이블에서는 기본키로, 다른 테이블에서는 참조키로 사용
1. JOIN
- 2개의 릴레이션에서 연관된 튜플들을 결합하여, 하나의 새로운 릴레이션을 반환
- 일반적으로 FROM절에 기술하지만, 릴레이션이 사용되는 곳 어디에나 사용 가능
- INNER JOIN | OUTER JOIN으로 구분
2. INNER JOIN
- EQUI JOIN | NON-EQUI JOIN으로 구분
- 조건이 없는 INNER JOIN 수행 시, CROSS JOIN과 동일한 결과 얻음
• CROSS JOIN(교차 조인) : 조인하는 두 테이블에 있는 튜플들의 순서쌍을 결과로 반환함
→ 교차 조인의 결과로 반환되는 테이블의 행의 수 = 두 테이블의 행 수를 곱한 값
① EQUI JOIN
- JOIN 대상 테이블에서 공통 속성을 기준으로 ‘=‘(equal) 비교에 의해 같은 값을 가지는 행을 연결하여 결과를 생성하는 JOIN방법
- NATURAL JOIN
•중복된 속성을 제거하여 같은 속성을 한 번만 표기하는 방법
•조인할 속성을 지정하지 않으므로, 조인하려는 두 테이블에는 이름과 도메인이 같은 속성이
반드시 존재해야 함
- WHERE절을 이용한 EQUI JOIN의 표기 형식
SELECT [테이블명1].속성명, [테이블명2].속성명, …
FROM 테이블명1, 테이블명2
WHERE 테이블명1.속성명 = 테이블명2.속성명2 ;
- NATURAL JOIN을 이용한 EQUI JOIN의 표기 형식
SELECT [테이블명1].속성명, [테이블명2].속성명, …
FROM 테이블명1 NATURAL JOIN 테이블명2 ;
- JOIN ~ USING 이용한 EQUI JOIN의 표기 형식
SELECT [테이블명1].속성명, [테이블명2].속성명, …
FROM 테이블명1 JOIN 테이블명2 USING(속성명) ;
▸ CROSS JOIN의 예시
-- 아래의 SQL문의 경우, CROSS JOIN에 해당
SELECT te.EMP_ID , te.EMP_NAME , te.GENDER , te.AGE , te.HIRE_DATE ,
td.DEPT_ID , td.DEPT_NAME , td.USER_YN
FROM TBL_EMPLOYEE te , TBL_DEPT td ;
▸ INNER JOIN의 예시
-- 아래의 SQL문의 경우, INNER JOIN에 해당
-- ① WHERE절을 이용한 JOIN의 표기 형식
SELECT te.EMP_ID , te.EMP_NAME , te.GENDER , te.AGE , te.HIRE_DATE ,
td.DEPT_ID , td.DEPT_NAME , td.USER_YN
FROM TBL_EMPLOYEE te , TBL_DEPT td
WHERE te.DEPT_ID = td.DEPT_ID ;
-- ② NATURAL JOIN을 이용한 JOIN의 표기 형식
SELECT te.EMP_ID , te.EMP_NAME , te.GENDER , te.AGE , te.HIRE_DATE ,
td.DEPT_NAME , td.USER_YN
FROM TBL_EMPLOYEE te NATURAL JOIN TBL_DEPT td;
-- ③ JOIN ~ USING 이용한 JOIN의 표기 형식
SELECT te.EMP_ID , te.EMP_NAME , te.GENDER , te.AGE , te.HIRE_DATE ,
td.DEPT_NAME , td.USER_YN
FROM TBL_EMPLOYEE te JOIN TBL_DEPT td USING (DEPT_ID);
※ ②, ③의 경우, SELECT문으로 조회할 컬럼에 NATURAL 조인에 사용된 열 포함 시 에러 발생
SQL Error [25155] [99999]: ORA-25155: NATURAL 조인에 사용된 열은 식별자를 가질 수 없음
( td.DEPT_ID의 경우, 식별자가 될 수 없음 )
② NON-EQUI JOIN
- JOIN 조건에 ‘=‘조건이 아닌 나머지 비교 연산자, 즉 >, <, <>, >=, <= 연산자를 사용
- 형식
SELECT [테이블명1].속성명, [테이블명2].속성명, …
FROM 테이블명1, 테이블명2
WHERE ( NON-EQUI JOIN 조건 ) ;
'백엔드 > Oracle' 카테고리의 다른 글
57 -Oracle : SQL ( 로또 실습 예제 ) (0) | 2023.07.18 |
---|---|
Oracle : SQL ( OUTER JOIN / SUBQUERY ) (0) | 2023.07.17 |
Oracle : SQL ( INSERT / DELETE / UPDATE 확장 / COMMENT ) (0) | 2023.07.13 |
SQL ( GROUP BY ~ HAVING / 집합연산자 ) (0) | 2023.07.12 |
Oracle : SQL ( CASE WHEN THEN / GROUP BY ) (0) | 2023.07.11 |