백엔드/Oracle

Oracle : SQL ( INNER JOIN )

두개의 문 2023. 7. 14. 15:26
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 조건 ) ;