{ SQL } Queries_해석
SQL 쿼리 해석 순서
- SELECT: 쿼리의 목적 확인 (조회하고자 하는 데이터).
- 예:
SUM,COUNT,AVG같은 집계 함수가 있으면 데이터를 요약하려는 목적.
- 예:
- FROM: 주요 테이블과 열 확인 (데이터의 출처).
- WHERE: 조건문 해석 (필터링 조건).
- 예:
WHERE SALE_DATE BETWEEN→ 특정 범위 내 데이터 조회.
- 예:
- JOIN: 테이블 간 관계 확인 (데이터 연결 방식).
- INNER JOIN: 두 테이블에 모두 존재하는 데이터.
- OUTER JOIN: 한쪽에만 존재해도 포함.
- GROUP BY / HAVING: 데이터 그룹화와 필터링 이해.
- GROUP BY: 데이터 그룹화 기준.
- HAVING: 그룹화된 데이터에 추가 필터링.
- ORDER BY / LIMIT: 데이터 정렬 및 출력 제한.
예시 해석
예시 1: 고객별 총 주문 금액 조회
SELECT C.CUSTOMER_NAME, SUM(O.AMOUNT) AS TOTAL_AMOUNT
FROM CUSTOMERS C
INNER JOIN ORDERS O ON C.CUSTOMER_ID = O.CUSTOMER_ID
WHERE C.COUNTRY = 'SOUTH KOREA' AND O.ORDER_DATE >= '2023-01-01'
GROUP BY C.CUSTOMER_NAME
HAVING SUM(O.AMOUNT) > 5000
ORDER BY TOTAL_AMOUNT DESC
LIMIT 10;
해석:
- 목적: 한국 고객 중 2023년 이후 주문 금액이 5000 초과한 고객의 상위 10명.
- FROM & JOIN: 고객 테이블과 주문 테이블 연결 (CUSTOMER_ID 기준).
- WHERE: 한국 거주, 2023년 이후 주문 필터링.
- GROUP BY / HAVING: 고객 이름별로 그룹화, 총금액 5000 초과 필터링.
- ORDER BY / LIMIT: 총금액 기준 내림차순 정렬, 상위 10명 출력.
예시 2: 부서별 직원 판매 순위
SELECT E.EMPLOYEE_NAME, E.DEPARTMENT_ID, S.SALE_AMOUNT,
RANK() OVER(PARTITION BY E.DEPARTMENT_ID ORDER BY S.SALE_AMOUNT DESC) AS SALE_RANK
FROM EMPLOYEES E
INNER JOIN SALES S ON E.EMPLOYEE_ID = S.EMPLOYEE_ID
WHERE S.SALE_DATE BETWEEN '2023-01-01' AND '2023-12-31';
해석:
- 목적: 부서별로 2023년 판매 금액에 따른 직원 순위 계산.
- FROM & JOIN: 직원 테이블과 판매 테이블 연결 (EMPLOYEE_ID 기준).
- WHERE: 2023년 내 판매 데이터 필터링.
- RANK(): 부서별로 직원의 판매 금액 순위 산출 (
PARTITION BY DEPARTMENT_ID).
조건 조합 쿼리 해석
- AND: 두 조건 모두 만족 (
&&). - OR: 두 조건 중 하나만 만족 (
||). - NOT: 조건의 부정 (
!).
예시 1: 복합 조건
SELECT * FROM employees
WHERE (department = 'Sales' OR department = 'Marketing')
AND salary > 5000
AND NOT (job_title = 'Intern' OR job_title = 'Contractor');
해석:
- 조건:
- 부서가 Sales 또는 Marketing.
- 연봉이 5000 초과.
- 직업이 Intern 또는 Contractor가 아님.
- 목적: 부서, 연봉, 직업 조건을 모두 만족하는 직원 조회.
예시 2: 복합 조건과 괄호 사용
SELECT *
FROM EMP
WHERE (DEPTNO = 10 AND JOB = 'CLERK')
OR (DEPTNO = 20 AND JOB = 'CLERK')
OR SAL > 3000;
해석:
- 조건:
- 부서번호 10에서 직업이 CLERK.
- 부서번호 20에서 직업이 CLERK.
- 연봉이 3000 초과.
- 목적: 위 조건 중 하나라도 만족하는 직원 조회.
GROUP BY, ROLLUP, CUBE
GROUP BY
- 데이터를 그룹화하여 집계 연산 수행.
- SELECT 절에 사용된 열은 GROUP BY에 반드시 포함되어야 함.
ROLLUP
- 계층적 요약 데이터 생성 (A별, A+B별, 전체 합계).
- 순서 중요.
CUBE
- 가능한 모든 조합에 대해 요약 데이터 생성 (A별, B별, A+B별, 전체 합계).
- 순서 중요하지 않음.
JOIN 종류
- INNER JOIN: 두 테이블 모두 조건에 만족하는 데이터만 출력.
- LEFT OUTER JOIN: 왼쪽 테이블 기준, 오른쪽에 없는 데이터는 NULL로 표시.
- RIGHT OUTER JOIN: 오른쪽 테이블 기준, 왼쪽에 없는 데이터는 NULL로 표시.
- FULL OUTER JOIN: 양쪽 테이블의 모든 데이터를 출력, NULL 포함.
- CROSS JOIN: 두 테이블의 모든 조합(카테시안 곱).
- SELF JOIN: 하나의 테이블을 두 번 참조하여 JOIN.
집계 함수와 NULL 처리
- COUNT:
COUNT(*): NULL 포함 행의 개수.COUNT(열): 열 값이 NULL이 아닌 행만 개수.
- SUM / AVG: NULL은 연산에서 제외.
- NVL: NULL 값 치환.
- 예:
NVL(열, 0)→ NULL 값을 0으로 치환.
- 예:
서브쿼리
- 단일 행 서브쿼리:
- 하나의 값만 반환 (e.g.,
=).
- 하나의 값만 반환 (e.g.,
- 다중 행 서브쿼리:
- 여러 값 반환 (e.g.,
IN,ANY,ALL).
- 여러 값 반환 (e.g.,
- 스칼라 서브쿼리:
- SELECT 절에서 하나의 값 반환.
PIVOT / UNPIVOT
PIVOT
- 행 데이터를 열로 변환.
SELECT *
FROM EMP
PIVOT (
COUNT(EMPNO) FOR DEPTNO IN (10, 20, 30)
);
UNPIVOT
- 열 데이터를 행으로 변환.
SELECT *
FROM EMP
UNPIVOT (
VALUE FOR DEPT IN (DEPT10, DEPT20, DEPT30)
);
날짜 함수
- SYSDATE: 현재 날짜와 시간 반환.
- ADD_MONTHS: 지정한 월 수 더하기.
SELECT ADD_MONTHS(SYSDATE, 3) FROM DUAL; - TRUNC: 날짜 특정 단위로 버림.
SELECT TRUNC(SYSDATE, 'MONTH') FROM DUAL; - ROUND: 날짜 반올림.
SELECT ROUND(SYSDATE, 'MONTH') FROM DUAL;
NULL 처리 함수
- NVL(값, 대체값): NULL을 대체값으로 치환.
- NVL2(값, 값1, 값2): 값이 NULL이 아니면 값1, NULL이면 값2 반환.
- COALESCE(값1, 값2, …): NULL이 아닌 첫 번째 값을 반환.