본문 바로가기
SQL, Database

SQL 컨벤션 공부하기

by yj-data 2025. 12. 5.

목차


    주의사항:

    • 아래에서 '20자' 같은 글자수 세기가 나온 경우: 기준은 모두 영문 기준임

    1. 공부계획짜기

    일단 GPT한테 'SQL 컨벤션을 공부하기에 제일 좋은 사이트' 물어봐서 주요 사이트 몇개를 확인한다. 그리고 각 사이트 별로 적혀있는 설명을 보고 사이트를 정해본다.

    최종적으로 참고한 사이트는 다음과 같다. 제일 대중적일 것 같은 사이트로 선정했다.

    • SQLStyle.guide : SQL의 네이밍, 들여쓰기, 형식(format) 등 전반적인 스타일 가이드를 정리한 대표 문서.
    • GitLab의 SQL Style Guide : 실제 엔지니어 조직에서 사용하는 SQL 컨벤션. 팀 단위로 코드 스타일을 통일하고 싶을 때 참고하기 좋음

    2. SQLStyle.guide

    • time, date 정보는 ISO 8601 기준에 맞게 저장 (YYYY-MM-DDTHH:MM:SS.SSSSS)
    • DBMS가 제한되는 함수 대신, 널리 사용할 수 있는 함수 사용
    • camelCase 쓰지 않기
    • 일반명사에 s 붙이는 것 대신 일반 명사 사용(예, employees 대신 staff, individuals 대신 people)
    • 큰따옴표 사용: 꼭 필요할때만
      • 컬럼명/테이블명에 공백이 있을때
      • 대소문자를 그대로 유지하려고 할때
      • 예약어를 컬럼명으로 썼을 때
      • 특수문자가 포함된 경우
    • 이름만들기
      • 문자로 시작, 언더스코어로 끝나지 않게하기
      • 이름에 문자,숫자,언더스코어만 쓰기
      • 여러 언더스코어 쓰지 않기
      • 두 관계를 엮은 관계 테이블 이름을 만들때, 두 테이블의 이름과는 상관없는 새 이름을 부여하기
      • 테이블 이름과 변수명을 동일하게 하지 않기
      • 컬럼명은 대문자를 써야할 이유가 있는게 아니면 소문자를 쓰기
    • 스토어드 프로시저
      • 이름에 동사가 들어가야함
      • sp_ 로 시작하지 말기
    • 공통적인 접미사(컬럼 명)
      • _id - primary key인 고유 식별자
      • _status - 상태를 뜻하거나, flag값 표시 (0/1, true/false, 'pending' 'approved' 'published' 'calcelled' 등 상태도 포함시킬 수 있음) (예, order_status -> 주문 상태)
      • _total - 총합값 표시
      • _num - 숫자들어간
      • _name - 이름 표시
      • _seq - 연속적인 순번 값을 저장하는
      • _date
      • _tally - 개수를 세어놓은 값(count)
      • _size - file size 나 clothing 등 사이즈
      • _addr
    • 대소문자
      • 예약어(SELECT 등)는 대문자
      • 예약어를 줄인 축약어를 쓰지 X
    • 가능할때 AND 대신 BETWEEN 사용
    • 가능할때 OR 대신 IN 사용

    3. GitLab의 SQL Style Guide

    • 코드 줄 개수를 줄이겠다고 최적화에 너무 고민하지 말라. 최적화의 결과로 줄어드는 컴퓨팅파워 비용보다는, 그 시간동안 쓰일 사고능력(brain power)이 더 비싸다.
    • DRY 원칙을 따르고, WET 하지말자: Don't Repeat Yourself    VS    Write Everything Twice
      • 문서에 문제없을 만큼만 DRY 코드를 따르자
    • TAB 대신 SPACE를 쓰자. (추가로 서치한 결과, SQL의 경우 2 Space를 많이 씀)
    • 한 줄에 80에서 100자가 넘어가면 줄을 바꾸자.(for 가독성)
    • 스노우플레이크에서 부정확한 결과가 나올 수 있으므로, USING 을 사용해서 조인하지 말자.
    • 각주달기
      • 한 줄 짜리 각주는 -- 를 사용해서 달고
      • 두줄 이상으로 가면, /* */ 를 사용해서 달자.
      • SQL에서 계산할때는, 무슨 계산을 한건지랑 지표설명에 대해 각주를 달아야한다.
      • 코드 안에 todo 코멘트를 달아놓지 말고, 수정이 필요하면 새로운 이슈를 만들어라(Jira 같은 곳에)
    • 이름달기
      • id, name 처럼 헷갈리기 쉬운 이름은 앞에 꼭 부가설명이 달리게 만들어야한다. (예, id x => account_id)
      • 모든 변수명은 snake_case로 만들어야 한다.
      • 불리언 타입 변수들은 has_, is_, does_ 로 시작하자
      • 타임스탬프 타입은 변수명 끝을 _at으로 처리하고, 항상 UTC 포맷을 따라야한다. 날짜(date) 타입은 _date 로 마무리.
      • 변수명을 date, month 처럼 흔한 이름으로 짓지 말자
    • 조인 할때 테이블 명 처리
      • 테이블이름이 20자 이하라면, 테이블 이름을 alias로 처리하지 않고 그대로 사용
      • 예, SELECT date_details.fiscal_year 처럼 쓴다(SELECT a.fiscal_year 말고)
      • CTE도 왠만하면 이름 변경하기
      • 이름/별명 지을때는 포함되는 내용이 잘 드러나는 이름으로 짓기
    • 따옴표 사용: 큰따옴표는 필요할때만 사용해야 함.(예, 변수명이 특수문자를 담고있거나, 대소문자 구분을 하거나)
    • json 접근 시 중괄호 사용: 예, SELECT data_by_row['id']::bigint as id_value  (not preferred: SELECT data_by_row:"id"::bigint as id_value)
    • CTE 사용법
      • 서브쿼리보다 CTE를 사용하자. (for 가독성)
    • 계산된 변수
      • SELECT 이후에 변수를 쓸때, 집계함수 쓴 변수보다, 나머지 변수를 앞에, 집계변수 쓰인 변수는 뒤에
    • 데이터타입 (스노우플레이크 한정??)
      • DECIMAL, NUMERIC, INTEGER, BIGINT 대신 NUMBER
      • DOUBLE, REAL 대신 FLOAT
      • STRING, TEXT 대신 VARCHAR
      • DATETIME 대신 TIMESTAMP
        • timestamps 일때는 TIME대신 TIMESTAMP 사용. TIMESTAMP의 디폴트값은 TIMESTAMP_NTZ(타임존 포함안하는 값)
      • 논리값에는 1,0 대신 TRUE/FALSE 값으로
    • 기능
      • NVL대신 IFNULL
      • 한줄짜리 CASE 대신 IFF
        • SELECT IFF(column_1 = 'foo', column_2,column_3) AS logic_switch, ...
        • SELECT CASE WHEN column_1 = 'foo' THEN column_2 ELSE column_3 END AS logic_switch, ...
      • 불리언 조건 대신 IFF
        • SELECT IFF(amount < 10,TRUE,FALSE) AS is_less_than_ten, ...
        • SELECT (amount < 10) AS is_less_than_ten, ...
      • CASE는 최대한 간단히 사용 (예, CASE 뒤에 필드명을 넣을 수 있으면 그렇게 하기)
      • EXTRACT 대신 DATE_PART, DATE_PART 대신 정확한 날짜 함수 사용
        • 예, EXTRACT(dow FROM created_at)  >  DATE_PART(dayofweek, 'created_at')  > DAYOFWEEK(created_at)

    'SQL, Database' 카테고리의 다른 글

    SQL: 테이블 복제하기  (0) 2025.10.08
    Polars  (1) 2025.08.20
    데이터프레임 최적화  (3) 2025.08.19
    데이터 파일 크기가 클 때 sql로 불러오기(feat. python)  (0) 2025.08.19
    MYSQL: 용량 큰 .sql파일 불러오기  (0) 2025.08.19