SQLD: SQL 기본(3)

SeongGyun Hong·2024년 11월 2일

SQL

목록 보기
6/51

1. SQL 실행 순서와 특징

  1. FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY 순으로 실행됨
  2. SELECT는 GROUP BY/HAVING 뒤, ORDER BY 전에 실행 (별칭 사용 가능한 이유)
  3. ORDER BY는 항상 마지막에 실행되어 최종 결과 정렬함
  4. GROUP BY로 집계 시 SELECT절에는 집계함수나 GROUP BY에 사용된 컬럼만 사용 가능함
-- 실행 순서 예시 (주석으로 실행 순서 표시)
SELECT 이름, SUM(금액) AS 총액    -- (5)
FROM 거래                        -- (1)
WHERE 날짜 >= '2024-01-01'      -- (2)
GROUP BY 이름                    -- (3)
HAVING SUM(금액) > 5000         -- (4)
ORDER BY 총액 DESC;             -- (6)

2. JOIN의 모든 것

LEFT OUTER JOIN 상세

  • 왼쪽 테이블 모든 데이터 + 오른쪽 테이블 매칭 데이터 출력
  • 매칭 없으면 NULL로 표시 (데이터 손실 방지)
  • 주로 기준 데이터는 모두 보여주되, 매칭 정보는 선택적으로 필요할 때 사용함
-- ANSI 표준 (권장)
FROM A LEFT OUTER JOIN B ON A.id = B.id

-- Oracle 문법 (레거시 시스템에서 사용)
FROM A, B WHERE A.id = B.id(+)

-- LEFT JOIN 활용 예시
SELECT c.고객명, o.주문번호, o.주문금액
FROM 고객 c LEFT OUTER JOIN 주문 o 
ON c.고객ID = o.고객ID;

JOIN 세부 종류

  1. NATURAL JOIN

    • 같은 이름 컬럼 자동 매칭
    • 컬럼명 변경 시 주의 필요함
    • 실무에서는 명시적 조인 조건 사용 권장
  2. OUTER JOIN 종류

    • LEFT: 왼쪽 테이블 기준
    • RIGHT: 오른쪽 테이블 기준
    • FULL: 양쪽 테이블 모든 데이터 표시
  3. INNER JOIN

    • 양쪽 매칭 데이터만 표시
    • 일반적으로 가장 많이 사용됨
    • NULL 데이터는 자동 제외됨

3. 데이터 타입 상세 설명

숫자형 특징

  • NUMBER(7,2)
    • 전체 7자리, 소수점 2자리
    • 예: 12345.67 (가능)
    • 예: 123456.78 (불가능: 전체 자릿수 초과)
    • 소수점 자리 초과 시 반올림 처리됨

문자형 상세

  • VARCHAR2(10)
    • 최대 10바이트 저장
    • 실제 사용한 만큼만 공간 차지
    • UTF-8에서 한글은 3바이트 차지함
  • CHAR(10)
    • 항상 10바이트 고정
    • 남은 공간은 공백으로 채움
    • 고정 길이 데이터(예: 주민번호)에 적합함

NULL 처리 심화

  • IS NULL, IS NOT NULL로 비교
  • NULL 연산 결과는 항상 UNKNOWN
  • NVL(컬럼, 대체값) 함수로 NULL 대체 가능함
  • COUNT 시 NULL은 자동 제외됨

4. 주요 연산자 활용

비교 연산 상세

  • BETWEEN: 범위 포함 비교 (이상, 이하)
  • IN: 목록 중 일치 항목 찾기 (OR 조건의 간편한 표현)
  • LIKE
    • %: 0개 이상 문자 매칭
    • _: 단일 문자 매칭
    • ESCAPE로 특수문자 처리 가능

조건식 활용

-- CASE 활용 예시
SELECT 
    이름,
    급여,
    CASE 
        WHEN 급여 >= 8000000 THEN '상위'
        WHEN 급여 >= 5000000 THEN '중위'
        ELSE '하위' 
    END AS 급여등급
FROM 직원;

5. 서브쿼리 상세 활용

유형별 특징과 활용

  1. 스칼라 서브쿼리

    • 단일값 반환
    • SELECT절에서 활용
    • 성능 주의 필요함
  2. 인라인 뷰

    • FROM절에서 임시 테이블처럼 사용
    • 복잡한 쿼리의 분할 처리 가능
  3. 중첩 서브쿼리

    • WHERE절에서 조건으로 활용
    • 데이터 필터링에 유용함
-- 다양한 서브쿼리 활용 예시
SELECT 
    이름,
    (SELECT 부서명 
     FROM 부서 
     WHERE 부서.코드 = 직원.부서코드) AS 부서,
    급여
FROM 직원
WHERE 급여 > (SELECT AVG(급여) FROM 직원);

6. 고급 SQL 기능

분석 함수 상세

-- 다양한 분석 함수 활용
SELECT 
    이름, 
    부서,
    급여,
    RANK() OVER (PARTITION BY 부서 ORDER BY 급여 DESC) AS 부서내순위,
    DENSE_RANK() OVER (ORDER BY 급여 DESC) AS 전체순위,
    ROW_NUMBER() OVER (ORDER BY 급여 DESC) AS 일련번호
FROM 직원;

EXISTS 활용 상세

  • 서브쿼리 결과 존재 여부 체크
  • COUNT보다 성능이 좋음 (존재 여부만 확인하고 멈춤)
  • NOT EXISTS로 미존재 데이터 확인 가능
-- EXISTS 활용 예시
SELECT 고객명
FROM 고객 c
WHERE EXISTS (
    SELECT 1 
    FROM 주문 o
    WHERE o.고객ID = c.고객ID
    AND o.주문금액 >= 1000000
);
profile
헤매는 만큼 자기 땅이다.

0개의 댓글