[DB]TIL(Today I Learned)_230809

Aspyn Choi·2023년 8월 9일
0

TIL

목록 보기
20/37

☝🏻오늘 배운 것

1. SUBQUERY

- SUBQUERY란?

: 하나의 SQL문 안에 포함된 또다른 SQL(SELECT)문
: 메인쿼리(기존쿼리)를 위해 보조 역할을 하는 쿼리문
: SELECT, FROM, WHERE, HAVGIN 절에서 사용가능

- 서브쿼리 맛보기1

-- 부서코드가 노옹철 사원과 같은 소속의 직원의
-- 이름, 부서코드 조회하기

- 서브쿼리 맛보기2

-- 전 직원의 평균 급여보다 많은 급여를 받고 있는 직원의
-- 사번, 이름, 직급코드, 급여 조회

- 서브쿼리 유형

  • 단일행 (단일열) 서브쿼리 : 서브쿼리의 조회 결과 값의 개수가 1개일 때
  • 다중행 (단일열) 서브쿼리 : 서브쿼리의 조회 결과 값의 개수가 여러개일 때
  • 다중열 서브쿼리 : 서브쿼리의 SELECT 절에 자열된 항목수가 여러개 일 때
  • 다중행 다중열 서브쿼리 : 조회 결과 행 수와 열 수가 여러개일 때
  • 상관 서브쿼리 : 서브쿼리가 만든 결과 값을 메인 쿼리가 비교 연산할 때 메인 쿼리 테이블의 값이 변경되면 서브쿼리의 결과값도 바뀌는 서브쿼리
  • 스칼라 서브쿼리 : 상관 쿼리이면서 결과 값이 하나인 서브쿼리
    ** 서브쿼리 유형에 따라 서브쿼리 앞에 붙은 연산자가 다름

2. 단일행 서브쿼리 (SINGLE ROW SUBQUERY)

- 단일행 서브쿼리

: 서브쿼리의 조회 결과 값의 개수가 1개인 서브쿼리
: *단일행 서브쿼리 앞에는 비교 연산자 사용 가능 (<, >, <=, >=, =, !=/^=/<> )

- 예제1 (WHERE절)

전 직원의 급여 평균보다 많은(초과) 급여를 받는 직원의 이름, 직급, 부서, 급여를 직급 순으로 정렬하여 조회

- 예제2 (WHERE절)

가장 적은 급여를 받는 직원의 사번, 이름, 직급, 부서코드, 급여, 입사일을 조회

- 예제3 (WHERE절)

노옹철 사원의 급여보다 많이 받는 직원의 사번, 이름, 부서, 직급, 급여를 조회

- 예제4 (HAVING절)

부서별(부서가 없는 사람 포함) 급여의 합계 중 가장 큰 부서의 부서명, 급여 합계를 조회

3. 다중행 서브쿼리 (MULTI ROW SUBQUERY)

- 다중행 서브쿼리

: 서브쿼리 앞에는 일반 비교연산자 사용 x
: 서브쿼리의 조회 결과 값의 개수가 여러행일 때
: 아래 함수와 사용 가능
-> IN / NOT IN : 여러 개의 결과값 중에서 한 개라도 일치하는 값이 있다면 혹은 없다면 이라는 의미(가장 많이 사용!)
-> ANY, < ANY : 여러개의 결과값 중에서 한개라도 큰 / 작은 경우, 가장 작은 값보다 큰가? / 가장 큰 값 보다 작은가?
-> ALL, < ALL : 여러개의 결과값의 모든 값보다 큰 / 작은 경우, 가장 큰 값 보다 큰가? / 가장 작은 값 보다 작은가?
-> EXISTS / NOT EXISTS : 값이 존재하는가? / 존재하지 않는가?

- 예제1

부서별 최고 급여를 받는 직원의 이름, 직급, 부서, 급여를 부서 순으로 정렬하여 조회

- 예제2

사수에 해당하는 직원에 대해 조회, 사번, 이름, 부서명, 직급명, 구분(사수 / 직원)

- 예제3

대리 직급의 직원들 중에서 과장 직급의 최소 급여보다 많이 받는 직원의 사번, 이름, 직급, 급여를 조회하세요. 단, > ANY 혹은 < ANY 연산자를 사용하세요

- 예제4

차장 직급의 급여의 가장 큰 값보다 많이 받는 과장 직급의 직원 사번, 이름, 직급, 급여를 조회하세요. 단, > ALL 혹은 < ALL 연산자를 사용하세요

- 예제5

LOCATION 테이블에서 NATIONAL_CODE가 KO인 경우의 LOCAL_CODE와 / DEPARTMENT 테이블의 LOCATION_ID와 동일한 DEPT_ID가 / EMPLOYEE테이블의 DEPT_CODE와 동일한 사원을 구하시오.

4. (단일행) 다중열 서브쿼리 (단일행 = 결과값은 한 행)

- 다중열 서브쿼리

: 서브쿼리 SELECT 절에 나열된 컬럼 수가 여러개 일 때

- 예제1

퇴사한 여직원과 같은 부서, 같은 직급에 해당하는 사원의 이름, 직급, 부서, 입사일을 조회

- 예제2

노옹철 사원과 같은 부서, 같은 직급인 사원을 조회하시오. (단, 노옹철 사원은 제외) 사번, 이름, 부서코드, 직급코드, 부서명, 직급명

- 예제3

2000년도에 입사한 사원의 부서와 직급이 같은 사원을 조회하시오. 사번, 이름, 부서코드, 직급코드, 고용일

- 예제4

77년생 여자 사원과 동일한 부서이면서 동일한 사수를 가지고 있는 사원을 조회하시오. 사번, 이름, 부서코드, 사수번호, 주민번호, 고용일

5. 다중행 다중열 서브쿼리

- 다중행 다중열 서브쿼리

: 서브쿼리 조회 결과 행 수와 열 수가 여러개 일 때

- 예제1

본인 직급의 평균 급여를 받고 있는 직원의 사번, 이름, 직급, 급여를 조회하세요. 단, 급여와 급여 평균은 만원단위로 계산하세요 TRUNC(컬럼명, -4)

6. 상[호연]관 서브쿼리

- 상[호연]관 서브쿼리

: 상관 쿼리는 메인쿼리가 사용하는 테이블값을 서브쿼리가 이용해서 결과를 만듦.
: 메인쿼리의 테이블값이 변경되면 서브쿼리의 결과값도 바뀌게 되는 구조임
: 상관쿼리는 먼저 메인쿼리 한 행을 조회하고, 해당 행이 서브쿼리의 조건을 충족하는지 확인하여 SELECT를 진행함
: [해석 순서]
메인쿼리 1행 -> 1행에 대한 서브쿼리
메인쿼리 2행 -> 2행에 대한 서브쿼리
...
메인쿼리의 행의 수 만큼 서브쿼리가 생성되어 진행됨

- 예제1

직급별 급여 평균보다 급여를 많이 받는 직원의 이름, 직급코드, 급여 조회

- 예제2

부서별 입사일이 가장 빠른 사원의 사번, 이름, 부서명(NULL이면 '소속없음'), 직급명, 입사일을 조회하고 입사일이 빠른 순으로 조회하세요. 단, 퇴사한 직원은 제외하고 조회하세요.

7. 스칼라 서브쿼리

: SELECT절에 사용되는 서브쿼리 결과로 1행만 반환
: SQL에서 단일 값을 가르켜 '스칼라'라고 함
-->SELECT절에 작성되는 단일행 서브쿼리

- 예제1

모든 직원의 이름, 직급, 급여, 전체 사원 중 가장 높은 급여와의 차

- 예제2

각 직원들이 속한 직급의 급여 평균 조회 (스칼라 + 상관 쿼리)

- 예제3

모든 사원의 사번, 이름, 관리자사번, 관리자명을 조회. 단, 관리자가 없는 경우 '없음'으로 표시 (스칼라 + 상관 쿼리)

8. 인라인 뷰(INLINE-VIEW)

- 예제1

인라인뷰를 활용한 TOP-N분석 전 직원 중 급여가 높은 상위 5명의 순위, 이름, 급여 조회

- 예제2

급여 평균이 3위 안에 드는 부서의 부서코드와 부서명, 평균급여를 조회

9. WITH

- WITH

: 서브쿼리에 이름을 붙여주고 사용시 이름을 사용하게 함
: 인라인뷰로 사용될 서브쿼리에 주로 사용됨
: 실행 속도도 빨라진다는 장점이 있다.

- 예제1

전 직원의 급여 순위 순위, 이름, 급여 조회

10. RANK() OVER / DENSE_RANK() OVER

- RANK() OVER

: 동일한 순위 이후의 등수를 동일한 인원 수 만큼 건너뛰고 순위 계산
EX) 공동 1위가 2명이면 다음 순위는 2위가 아니라 3위

- DENSE_RANK() OVER

: 동일한 순위 이후의 등수를 이후의 순위로 계산
EX) 공동 1위가 2명이어도 다음 순위는 2위

- 예제1

사원별 급여 순위 / ROWNUM

- 예제2

RANK() OVER(정렬순서)

- 예제3

DENSE_RANK() OVER

10. 서브쿼리 실습 문제

- 예제1

전지연 사원이 속해있는 부서원들을 조회하시오 (단, 전지연은 제외)
사번, 사원명, 전화번호, 고용일, 부서명

- 예제2

고용일이 2000년도 이후인 사원들 중 급여가 가장 높은 사원의
사번, 사원명, 전화번호, 급여, 직급명을 조회하시오.

- 예제3

노옹철 사원과 같은 부서, 같은 직급인 사원을 조회하시오. (단, 노옹철 사원은 제외)
사번, 이름, 부서코드, 직급코드, 부서명, 직급명

- 예제4

2000년도에 입사한 사원과 부서와 직급이 같은 사원을 조회하시오
사번, 이름, 부서코드, 직급코드, 고용일

- 예제5

77년생 여자 사원과 동일한 부서이면서 동일한 사수를 가지고 있는 사원을 조회하시오
사번, 이름, 부서코드, 사수번호, 주민번호, 고용일

- 예제6

부서별 입사일이 가장 빠른 사원의 사번, 이름, 부서명(NULL이면 '소속없음'), 직급명, 입사일을 조회하고 입사일이 빠른 순으로 조회하시오. 단, 퇴사한 직원은 제외하고 조회

- 예제7

직급별 나이가 가장 어린 직원의 사번, 이름, 직급명, 나이, 보너스 포함 연봉을 조회하고 나이순으로 내림차순 정렬하세요. 단, 연봉은 \124,800,000 으로 출력되게 하세요. (\ : 원 단위 기호)

0개의 댓글