요즘IT에서 데이터리안의 윤선미님의 글 'SQL 가독성을 높이는 다섯 가지 사소한 습관'을 정리한 내용입니다.
예약어는 대문자로 작성하자
SELECT, FROM, GROUP BY, HAVING, AS, AND와 같은 SQL 예약어를 대문자로 쓰면 훨씬 잘 읽힌다.
에디터가 예약어를 하이라이팅해주기는 하지만 에디터마다 규칙이 다르기 때문에 대문자로 작성해서 가독성을 높이는 것이 좋다.
SELECT tip, total_bill
FROM tips
select tip, total_bill
from tips
행갈이를 자주 하자
쭉 작성한 코드는 작성하기에는 편하지만, 의미를 파악하기 위해서 모든 코드를 다 읽어봐야 한다.
적절히 행갈이를 해준 코드는 에약어만 확인하더라도 작성자의 의도와 코드 구조를 쉽게 파악할 수 있다.
SELECT day
, time
, SUM(total_bill)
FROM tips
GROUP BY day, time
SELECT day, time, SUM(total_bill) FROM tips GROUP BY day, time
행갈이를 더! 자주 하자
행갈이를 더! 자주하는 습관을 들이자.
SELECT day
, time
, SUM(total_bill)
FROM tips
WHERE sex = 'Femail'
AND smoker = 'Yes'
GROUP BY day
, time
SELECT day, time, SUM(total_bill)
FROM tips
WHERE sex = 'Femail' AND smoker = 'Yes'
GROUP BY day, time
위 첫 번째 예시처럼 코드를 작성하게 되면 주석처리를 할 때 진가를 발휜한다.
만약 위 코드에서 time 컬럼을 로직에서 제외하고 싶다고 해보자
SELECT day
-- , time
, SUM(total_bill)
FROM tips
WHERE sex = 'Femail'
AND smoker = 'Yes'
GROUP BY day
-- , time
이렇게 가끔 쿼리를 작성할 때 어떤 로직을 제외했다가 다시 포함해야 하는 일이 생길 수 있다.
WHERE절에서도 AND, OR이 붙을 때마다 행갈이를 해주면 아래와 같이 활용할 수 있다.
SELECT day
, time
, SUM(total_bill)
FROM tips
WHERE 1 = 1
-- AND sex = 'Femail'
AND smoker = 'Yes'
GROUP BY day
, time
가끔 SQL을 잘하는 분들을 보면 위와 같이 WHERE 절이 시작하자마자 1=1이라는 의미 없는 조건을 넣어주고 행가리을 한 다음 AND로 진짜 필터링 조건을 쓰는 경우가 있다.
주석을 쓰자
코드를 쓴 의도를 짧게 적어 놓는 습관을 들이는 것이 좋다.
특히 서브쿼리가 많아지고 코드가 길어질수록 각 코드 단락이 어떤 의도로 작성되었는지 적어 놓아야 다음에 그 코드를 읽었을 때 이해할 수 있다.
SELECT AVG(sales) avg_sales
FROM (
-- 요일별 매출액 합계 계산
SELECT day -- 일별 X 요일별 O
, SUM(total_bill) sales
FROM tips
WHERE sex = 'Female' -- 결제자의 성별이 여성인 경우
GROUP BY day
) daily_sales
주석은 서브쿼리 단위로 쓸 수도 있고, CASE, IF, 조건문 또는 WHERE절 필터링 조건을 쓸 때도 적어주는 것이 좋다.
- 서브쿼리의 단위로 의미를 작성
- 조건에 적는 주석의 경우, 단순히 '이 조건은 이거다'(What)라고 서술하는 건 별로 의미가 없다. 그러나 컬럼 이름만 보고 해석에 오해가 있을 수 있거나, 추가 설명이 필요한 경우에는 적어주는 것이 좋다.
- 조건이 왜 필요한지(Why), 어떻게 동작하는지(How) 같은 내용을 자세하게 적어 놓으면 다음에 코드를 이해하는 데 반드시 도움을 준다.
Alias를 잘 쓰자
주석을 잘 적는 것도 중요하지만, 결국 코드를 잘 써야 전체를 빠르게 이해할 수 있다.
혹시 서브쿼리, 컬럼 Alias를 x, y, t, df, a 등으로 대충 쓰고 있지는 않은가?
FROM절 서브쿼리 이름을 t1이라고 지었다가 아우터 쿼리 어디에서 t1.x + t2.y라는 코드를 발견했다고 가정해보자.
그 코드가 어떤 동작을 하는지 알려면 저 Alias를 쓴 서브쿼리까지 결국 다시 찾아가야 한다.
가장 중요한 건 합의된 규칙
가장 중요한 것은 내가 같이 일하는 사람들과 합의된 규칙이다.
아무리 좋은 방법이라도 팀에서 사용하고 있는 컨벤션에 위배된다면, 기존 구성원들을 설득하고 레거시 코드들을 죄다 바꾸는 수고를 하지 않는 한 일단 기존 제도를 따라야 한다.
무엇보다 이 코드를 나 말고 누군가가 볼거로 생각하면서 작성하고 정리하는 것이 중요하다.
마무리
항상 클린 코드를 비즈니스 로직 단에서의 코드에서만 고려했었는데, 앞으로 SQL을 작성할 때도 클린 코드의 개념을 고려하면서 작성해야겠다.
참조
SQL 가독성을 높이는 다섯 가지 사소한 습관 | 요즘IT
지독하게 읽기 힘든 SQL 문을 해석해 본 적 있으신가요? 마치 암호를 읽는 것처럼 어렵습니다. 파이선처럼 들여쓰기와 띄어쓰기를 문법적으로 강제하는 언어를 사용해 봤다면 SQL의 자유로움에
yozm.wishket.com
'SQL' 카테고리의 다른 글
Oracle - LISTAGG (특정 컬럼의 데이터들을 하나의 로우에 출력) (0) | 2023.07.24 |
---|---|
SQL - Oracle과 MySQL 문법 차이 (0) | 2023.06.28 |
SQL - MySQL 워크밴치에서 Foreign key 삭제하기 (0) | 2023.06.20 |
MySQL - 프로그래머스 164670. 조건에 맞는 사용자 정보 조회하기 (0) | 2023.05.29 |
Querydsl - Querydsl 프로젝션으로 DTO 조회 (0) | 2023.05.08 |