목차
주의사항:
- 아래에서 '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 |