[SQL] SQL 작성 전 체크리스트

SQL 작성 전 체크리스트

  • 문제 정의 (문제 분석)  ⇒ 한국어가 가장 어려웠어요 ⇒ 화자의 의도는 무엇일까???
    • 무엇을 구하고 싶은가 문장으로 적기
    • 요청사항을 정확히 아는 것이 중요하다.
    • SQL 작성 전 문제의 요지 분석
    • 문제를 보며 예상 쿼리를 구성해보자
      • 예시: 월별로 매출 합계를 구하고 싶다
        • ⇒ SELECT 써?
        • ⇒ GROUP BY 써?
        • ⇒ SUM 써?

데이터 구조 확인 (EDA 실시)

  • 쿼리 쓰기 전 반드시 테이블의 컬럼명, 자료형, 제약조건 확인
  • 아래의 내용은 MYSQL에 국한 되어있으니 다른 DBMS는 별도 검색 필요
 
# MYSQL 메타데이터 활용, 테이블의 컬럼 별 정보 확인 

## 컬럼의 제약조건, 외래키, 기본키, 글자 수 제한 
SELECT * 
FROM information_schema.columns 
WHERE table_name = 'table_name' -- 테이블 이름만 바꾸어 사용 

# 컬럼명, 자료형, 제약조건 간단 확인 
DESCRIBE table_name; -- 테이블 이름만 바꾸어 사용 

## 위와 같음 
SHOW COLUMNS 
FROM table_name; -- 테이블 이름만 바꾸어 사용 

# DB안의 테이블 별 행 수, 크기 확인 
SELECT * 
from information_schema.tables 
where table_name = 'USED_GOODS_BOARD'; 

## 대체 가능 => 
select count(*) 
from table_name; 

# 중복 값 찾기 
SELECT column_name
		, COUNT(*) 
FROM table_name 
GROUP BY column_name 
HAVING COUNT(*) > 1; 

# 중복된 값 개수 확인 
SELECT COUNT(*)
		,COUNT(DISTINCT column_name) 
FROM table_name; 

# 중복된 행 전체 확인 
SELECT * 
FROM table_name t1 
WHERE EXISTS ( SELECT 1 
				FROM table_name t2 
                WHERE t1.column_name = t2.column_name 
                GROUP BY t2.column_name 
                HAVING COUNT(*) > 1 
                ); 

# 1 초과 면 중복 값 
SELECT column_name 
		, COUNT(*) OVER (PARTITION BY column_name) AS dup_count FROM table_name;
 

쿼리 작성에 도움되는 것

  • SQL 쿼리 실행순서에 따라 작성하고 해석하라
  • FROM
  • JOIN
    • 항상 작은 범위부터 테스트하라
    • 여러 테이블 JOIN 시 먼저 두 개만 조인하여 결과를 확인하라
      • ⇒ 조인 조건이 잘못되면 데이터가 폭발적으로 늘어나거나 없어지기 때문이다.
    • JOIN 시 NULL 값이 필요한 경우가 있으니 고려하여 사용하기
  • ON
  • WHERE
    • WHERE은 행을 필터링 함을 기억하라
    • WHERE 필터링을 적용할 때 NULL도 제외되는 것을 기억하라
    • 인덱스에 설정되어있는 컬럼 사용
    • 인덱스의 선두 컬럼에 해당하는 조건을 사용하라
  • GROUP BY
  • 집계함수
  • HAVING
    • HAVING은 집계된 결과를 필터링 함을 기억하라
  • DISTINCT
  • SELECT
    • * 보다는 필요한 컬럼만 사용하라
  • ORDER BY
  • LIMIT

쿼리 작성에 도움되는 것 (번외)

  • 불필요한 서브쿼리보다는 JOIN, CTE, 윈도우함수를 사용하라
    • CTE: 공통 테이블 표현식, 가상 테이블
  • 기본키가 아닐 경우 중복값을 고려해야 함
    • 기본키의 특징 ⇒ NULL 값 X, 유일성, 최소성
  • 날짜 문제의 경우 애매한 경우가 많기에 여러 번 해독해야 함
    • 날짜 계산은 무조건 함수로 하는 것이 좋다.
    • 한국어 및 도메인의 특징에 따라 다르기 때문
      • 대여의 개념
      • 숙박의 개념
      • D-DAY 개념
    • 문자 계산, 날짜끼리의 계산
  • WITH (가상 테이블)
    • 가독성 향상을 위해 사용을 고려할 수 있다.
    • N회 반복 사용 할 때 사용을 고려할 수 있다.
  • WITH RECURSIVE (가상 테이블 재귀)
    • 인위적인 컬럼을 만들 때 유용하게 사용된다.
      • ⇒ 24시간의 시간표를 만들 때