Back-End/Oracle

Oracle ■ DML SELECT(3)-집합 연산자,조인

SIKIDA 2024. 7. 17. 18:41
728x90

 

 

 DML 

 

• 집합 연산자(SET OPERATOR)

하나의 쿼리문 안에 여러개의 쿼리가 들어가는 형태를 가지는 연산자로써

테이블의 데이터를 하나로 합칠 때 주로 사용됨

* 참고 : 데이터가 조회된 결과물을 RESULT SET 이라고 부름

 

 

• UNION

1. EMPLOYEES 테이블에서 DEPARTMENT_ID가 80이면서 SALARY가 10000 이상인 직원 조회

 

2. EMPLOYEES 테이블에서 급여가 5000이상 10000 이하거나 이름이 A로 시작하는 직원 조회

 

 

3. 아래와 같이 서로 다른 테이블에 대한 결과를 합쳐서 조회할 수 있음

 

 

4. EMPLOYEES 테이블과 DEPARTMENTS 테이블의 데이터 결과를 합치고 중복 제거

 

• 위 예시 설명 

1. 데이터 조회에 대한 컬럼명은 선행 쿼리문에 의해 결정됨

2. DEPARTMENT_NAME은 FIRST_NAME 컬럼의 결과값으로 더해짐

3. TO_CHAR를 사용한 이유 : LOCATION_ID가 LAST_NAME 컬럼이 있는 공간으로

데이터를 합쳐야하기 때문에 데이터 타입을 맞춰줘야 함

4. MANAGER_ID를 선행 쿼리문의 MANAGER_ID의 결과값에 더함

 

 

• UNION ALL

UNION과 동작은 똑같지만 중복을 제거하지 않음

 

 

• INTERSECT

두 개의 쿼리문에서 결과값만을 더하여 데이터를 조회함

 

 

• MINUS

선행된 쿼리문의 수행 결과에서 후행 쿼리문의 결과값을 모두 제외함

• 아래의 쿼리는 월급 5000이상, 10000 이하이고 FIRST_NAME이 A로 시작하는 직원을 제외하는 쿼리가 됨

 

 DML (JOIN)

 

• JOIN

두 개 이상의 테이블의 데이터를 모두 조회할 때 사용하는 구문으로 써 관계형 데이터베이스의 경우 테이블끼리 서로 중복되는 데이터를 보관하는 경우가 많음

(* 서로 연관성을 주어 데이터에 접근하기 위해서)

 

이러한 관계형 데이터베이스의 특징으로 인해 JOIN을 사용하여 서로 연관된 데이터를 조회하기 위해서 많이 쓰임

 

• 참고

JOIN 문법은 오라클 조인과 ANSI(미국 국립 표준 협회) 조인으로 나눠짐

 

• JOIN 종류

 

 

• INNER JOIN

두 테이블의 공통된 컬럼 값을 기준으로 집합을 반환

 

 

• 오라클 조인(INNER JOIN)

EMPLOYEES 테이블과 DEPARTMENT 테이블의 데이터를 연결시켜 사용

 

• ANSI 조인(INNER JOIN)

EMPLOYEES 테이블과 DEPARTMENT 테이블의 데이터를 연결시켜 사용

 

 

• LEFT OUTER JOIN

왼쪽 테이블의 모든 행과, 오른쪽 테이블에서 일치하는 행들을 반환

 

• 오라클 조인(LEFT OUTER JOIN)

왼쪽의 모든 행과 오른쪽의 테이블에서 일치하는 행들을 반환

 

 

• ANSI 조인(LEFT OUTER JOIN)

왼쪽의 모든 행과 오른쪽의 테이블에서 일치하는 행들을 반환

 

 

• RIGHT OUTER JOIN

오른쪽 테이블의 모든 행과, 왼쪽쪽 테이블에서 일치하는 행들을 반환

 

 

• 오라클 조인(RIGHT OUTER JOIN)

오른쪽의 모든 행과 왼쪽의 테이블에서 일치하는 행들을 반환

 

• ANSI 조인(RIGHT OUTER JOIN)

오른쪽의 모든 행과 왼쪽의 테이블에서 일치하는 행들을 반환

 

• FULL OUTER JOIN

양쪽 행들의 모든 결과를 반환

 

• ANSI 조인(FULL OUTER JOIN)

양쪽 행들의 모든 결과를 반환

 

 

 

• JOIN 쿼리 작성해보기 (1)

INNER JOIN을 사용하여 직원들의 이름과 속한 부서의 이름 조회하기

 

 

• JOIN 쿼리 작성해보기 (2)

INNER JOIN을 사용하여 직원들의 이름과 해당 직무에서 근무 기간 조회하기

 

 

• JOIN 쿼리 작성해보기 (3)

DEPARTMENT_ID가 100인 직원의 이름과 부서 이름 조회

 

• JOIN 쿼리 작성해보기 (4)

DEPARTMENT_ID가 80이고, 급여가 12000 이상인 직원의 이름과 부서 이름 조회

 

 

• JOIN 쿼리 작성해보기 (5)

DEPARTMENT 테이블에서 LOCATION_ID를 기준으로 조인하여 각각의 부서

위치가 어디인지(STREET_ADDRESS, CITY) 확인하기

• JOIN 쿼리 작성해보기 (6)

EMPLOYEES 테이블에서 각각의 직원이 작업한 이력 확인하기

 

 

• EMPLOYEE_ID에만 별칭으로 테이블을 정의한 이유

EMPLOYEES 테이블과 JOB_HISTORY 테이블 모두 EMPLOYEE_ID를 가지고 있기 때문에 어떤 테이블의 EMPLOYEE_ID 컬럼을 가지고 올건지 명확하게 작성해 주어야 함.

그 외 다른 컬럼(FIRST_NAME, START_DATE, END_DATE)은 각각의 테이블에 따로 존재하기 때문에 별칭을 지어주지 않아도 사용 가능함

 

• JOIN + GROUPBY 쿼리 작성해보기 (1)

각 부서별로 직원 수 검색하여 결과 출력

 

• JOIN + GROUPBY 쿼리 작성해보기 (2)

각 부서별로 직원 수 검색하여 결과 출력하되 직원 수가 5명 이상인 부서

 

• JOIN + GROUPBY 쿼리 작성해보기 (3)

각 직무별로 평균 급여를 검색하고, 평균 급여가 가장 높은 직무의 이름과 평균 급여 출력하기