본문 바로가기

MariaDB

나만의 가독성 높은 SQL 작성가이드

 

SELECT 쿼리문을 작성할 때 개인적으로 가장 먼저 중요시하는 것은 당연히 수행 성능이겠지만,
그다음으로 꼽자면 가독성이라고 생각합니다.

가독성을 좋게 하기 위한 나만의 쿼리 작성 방법을 공유해보고자 합니다.

개요

웹개발자라면 당연히 쿼리문을 자주 작성할 수밖에 없는데요.

혼자 프로젝트에 참여하면 상관이 없겠으나, 다양한 개발자들과 개발을 할 때는 개발 표준 가이드가 있을 것입니다.

하지만, 지금까지 SM 하는 회사만 다녀서 그런지, 인수인계가 안돼서 그런지, 개발되어 있는 소스를 보면  다들 각자의 스타일로 개발되어 있었던 것 같습니다.

 

그래서 나만의 SQL 쿼리 작성 가이드를 정립하였고, 당연히 정답은 아니지만 그 내용을 공유해볼려고 블로그 첫 글을 작성해 봅니다.

 

쿼리문 작성 규칙

1. 테이블 및 칼럼명을 작성할 때는 DB에서 생성된 규칙(대/소문자)대로 작성한다.

  • 각 프로젝트의 DB에서 테이블을 생성할 때 대문자 또는 소문자로 생성한다.
  • 만약 해당 DB 테이블의 테이블이 대문자로 생성이 되었다면 쿼리문에서도 테이블명은 대문자로, 반대로 소문자로 생성이 되었다면 쿼리문에서도 소문자로 작성한다.
  • 칼럼명도 마찬가지이다.
  • 개인적으로는 테이블명은 소문자, 칼럼명은 대문자로 작성한다.

개인적으로 운영하는 사이트의 데이터베이스인데 테이블명과 칼럼명이 모두 대문자로 생성되어 있다.

테이블 목록

SELECT
    CLAN_SEQ, USER_ID, TIER, REG_DATE
FROM SC_MEMBER;

 

만약에 테이블은 소문자로 되어 있고, 칼럼명이 대문자로만 작성되어 있다면 아래와 같이 쿼리문을 작성하도록 합니다.

SELECT
    CLAN_SEQ, USER_ID, TIER, REG_DATE
FROM sc_member;

 

반대로 칼럼명이 소문자로 구성되어 있고, 테이블명이 대문자라면 아래와 같이 작성할 것입니다.

SELECT
    clan_seq, user_id, tier, reg_date
FROM SC_MEMBER;

 

2. 데이터베이스 키워드는 대문자로 작성한다.

  • 데이터베이스 키워드들은 데이터 정의 언어(DDL), 데이터 조작 언어(DML), 쿼리 언어 등에서 사용합니다.
  • 쿼리를 작성 시 이 키워드들은 모두 대문자로 작성을 합니다.
  • 키워드 : CREATE, ALTER, DROP, SELECT, INSERT, UPDATE, DELETE, WHERE, FROM, JOIN, WHERE, AND, OR, IN, NOT, ORDER BY, GROUP BY 등등
SELECT 
    USER_ID, USER_NM, AGE 
FROM user
WHERE SEX = 'M' AND USE_YN = 'Y'
ORDER BY USER_ID ASC

 

 

3. SELECT, FROM, JOIN, WHERE, GROUP, ORDER 구문별로 개행처리를 한다.

  • 저는 쿼리를 작성할 때, 들여 쓰기나 개행처리를 잘해야 가독성이 좋다고 생각을 합니다. 짧은 쿼리문이야 한눈에 문장이 들어오기에 이해하기 편하나 긴 쿼리문을 작성할 때는 가독성이 좋지 못하면 이해하기 힘들 것입니다.
  • 그러기에 주요 키워드는 SELECT, FROM, JOIN, WHERE, GROUP, ORDER , LIMIT의 키워드를 작성할 때는 개행처리를 하고, 그 안에 들어오는 필드나, 조회조건 등은 들여 쓰기를 합니다.
  • 이렇게 개행처리를 할 경우 JOIN 문 안에 SELECT 절을 손쉽게 찾아볼 수 있고, 바로 그 블록만 별도로 실행할 수 있습니다.
SELECT
    a.USER_ID, b.POINT, a.REG_DATE
FROM SC_MEMBER a
INNER JOIN
(
    SELECT USER_ID, SUM(POINT) AS POINT FROM SC_MEMBER_POINT
    GROUP BY USER_ID
) b ON a.USER_ID = b.USER_ID
WHERE
    a.CLAN_SEQ = '1'
    AND a.STATUS = '1'
ORDER BY a.USER_ID ASC

 

  • 조금 더 긴 쿼리를 작성할 때도, 각 주요 키워드별로 개행처리를 잘해두면 훨씬 더 이해하기 편할 것입니다.
SELECT
    RANK() OVER (ORDER BY ELO DESC) AS RNK,
    a.*, b.USER_ID, b.KIND_CD,
    ISNULL(w.CNT_WIN, 0) AS CNT_WIN,
    ISNULL(l.CNT_LOSE, 0) AS CNT_LOSE
FROM TB_RANK_GAME_ELO a
INNER JOIN
(
    SELECT USER_SEQ, USER_ID, KIND_CD FROM TB_MEMBER
    WHERE CLAN_SEQ = 1
) b ON a.USER_SEQ = b.USER_SEQ
LEFT OUTER JOIN
(
    SELECT WIN_USER_SEQ, COUNT(*) AS CNT_WIN FROM TB_RANK_GAME a
    WHERE CLAN_SEQ = 1 AND SEASON = 2 AND STATUS = '1'
    GROUP BY WIN_USER_SEQ
) w ON a.USER_SEQ = w.WIN_USER_SEQ
LEFT OUTER JOIN
(
    SELECT LOSE_USER_SEQ, COUNT(*) AS CNT_LOSE FROM TB_RANK_GAME a
    WHERE CLAN_SEQ = 1 AND SEASON = 2 AND STATUS = '1'
    GROUP BY LOSE_USER_SEQ
) l ON a.USER_SEQ = l.LOSE_USER_SEQ
WHERE a.CLAN_SEQ = 1 AND a.SEASON = 2 AND a.TIER = 1
ORDER BY a.ELO DESC

 

4. 별칭은 소문자로 간략히 작성한다.

  • 칼럼명과 키워드를 대문자로 작성하기에 별칭은 가급적이면 소문자로 작성해서 키워드와 칼럼명과 확실하게 구분 짓게 한다.
  • 별칭은 짧게 작성하는 걸 좋아하는 편인데, 가장 위 테이블에서부터 a~z 순서대로 작성하거나, 또는 의미 있게 작성하되 너무 길지 않게 작성하도록 한다.

 

사실, 쿼리 작성 시 들여 쓰기나 개행처리 등 어떻게 작성해도 수행 성능과는 무관하지만, 코드나 쿼리문은 다른 개발자가 보더라도 보기 좋고, 이해하기 편해야 좋다는 생각에 한번 작성해 봤습니다.

 

많이 부족하지만, 다음엔 다른 글로 공유드리도록 하겠습니다. :-)