자기계발 Diary

오늘의 공부 day_4(SQL 가독성을 높이는 다섯가지 습관, SQL공부)

siron94 2024. 11. 5. 19:25

이번 글에서는 SQL 문법에서는 강제하지 않지만 가독성 있는 SQL 코드를 쓸 수 있는 다섯 가지 습관들을 알려드리겠습니다.

 

  • 예약어는 대문자로

SELECT, FROM, GROUP BY, HAVING, AS, AND와 같은 SQL 예약어를 대문자로 쓰는 습관입니다.

에디터마다 규칙이 다르고 DB 종류마다 함수 이름들도 약간씩 다르기 때문에  제대로 강조되지 않는 경우가 많습니다 특히 DATE_ADD() 같은 날짜 함수는 DB마다 차이가 크게 납니다, 그래서 예약어, 함수 이름 등은 대문자로 써주는 습관을 들이면 자신이 쓴 코드를 쉽게 구분할 수 있습니다.

 

 

  • 행갈이를 자주 하자

하나의 라인에 코드를 쭉 쓰면 작성할 때만 편하고 나중에 그 의미를 파악하기 위해 모든 코드를 다시 읽어 봐야 합니다.

행갈이를 자주 한다면 코드 중 각 라인의 예약어만 확인해도 작성자의 의도와 구조를 쉽게 파악할 수 있습니다.

 

 

  • 행갈이를 더 자주 하자

행갈이를 더 자주 한다면 코드를 작성 시 주석처리를 할 때 진가를 발휘합니다.

주로 예약어에 따라 행갈이를 하기 때문에 무엇이 문제인지 쉽게 파악하고 해결할 수 있습니다.

예를 들어 지금은 day, time 두 컬럼을 집계의 기준으로 사용하고 있는데 이 중에 day만 남기고 싶다고 가정해 보겠습니다 그럴 때 라인을 주석처리하는 방식으로 time 컬럼을 로직에서 제외할 수 있습니다.

 

SELECT day
   -- , time
    , SUM(total_bill)
FROM tips
WHERE sex = 'Female'
AND smoker = 'Yes'
GROUP BY day
     -- , time

이처럼 가끔 쿼리를 쓸 때 어떤 로직을 제외했다가 다시 포함해야 하는 일이 생길 수 있습니다.

 

SELECT day,
               time,
               SUM(total_bill)
FROM tips
WHERE 1 = 1
-- AND sex = 'Female'
AND smoker = 'Yes'
GROUP BY day
      , time

위와 같이 WHERE절이 시작하자마자 1 = 1이라는 아무 의미 없는 조건을 넣고 행갈이를 한 다음 AND로 진짜 필터링 조건을 쓰는 응용하는 법이 있습니다.

 

  • 주석을 쓰자

코드를 쓴 의도를 짧게 적어 놓는 습관을 들이는 게 좋습니다.

서브 쿼리가 많아지고 코드가 실어질수록 단락이 어떤 의도로 작성되었는지 주석을 적어 놓아야 다음번에 확인할 때 금방 이해할 수 있습니다.

 

주석은 서브쿼리 단위로 쓸 수도 있고, CASE, IF 조건문 또는 WHERE 절 필터링 조건을 쓸 때도 적어주는 것이 좋습니다.

  • 서브쿼리의 단위로 의미를 적어주세요.
  • 조건에 적는 경우, 단순히 '이 조건은 이거다'라고 적는 건 의미가 없습니다. 그러나 컬럼 이름만 보고 해석에 오해가 있을 수 있거나, 추가 설명이 필요한 경우에는 적어주는 것이 좋습니다
  • 조건이 왜 필요한지, 어떻게 동작하는지 같은 내용을 자세하게 적으면 다음에 코드를 이해하는 데 도움이 됩니다.

 

 

  • Alias를 잘 쓰자

주석을 잘 적는 것도 중요하지만, 결국 코드를 잘 써야 전체를 빠르게 이해할 수 있습니다.

무분별하게 별명 짓는다면 "데이터 분석용 쿼리는 재활용할 일도 많지 않은데, 굳이 많은 Alias작명을 해야 하냐?"라는 소리를 들을 수 있습니다. 그리고 다음에 그 코드를 다시 볼 일이 생기면 고통을 받는 수밖에 없습니다.

별명을 잘 짓는 법은 구글에 여러 개발자들의 변수명을 잘 짓기 위한 팁에 대한 글들이 있으니 잘 보고 연습하면 갈수록 쉽게 작성할 수 있게 됩니다.

 

 

  • 합의된 규칙

가장 중요한 것은 내가 같이 일하는 사람들과 합의된 규칙입니다.

아무리 좋은 방법이라도 팀에서 사용하고 있는 컨벤션에 위배된다면, 기존 구성원들을 설득하고 레거시 코드들을 모두 바꾸는 수고를 하지 않는 한 일단 기존 제도를 따라야 합니다.

 

 

마지막으로 이 코드를 나 말고 누군가가 볼 수 있다고 생각하면서 작성하고 정리하는 것이 중요합니다.

 


 

SQL

 

  • 필요한 문자 포맷이 다를 때, SQL로 가공하기

 

  • REPLACE

REPLACE 함수는 특정 문자를 다른 문자로 바꾸는 역할을 합니다.

 

 

사용 방법

replace(바꿀 컬럼, 현재 값, 바꿀 값)

 

예시

주소의 '문곡리'를 '문가리'로 바꾸기

select addr "원래 주소",
           replace(addr, '문곡리', '문가리') "바뀐 주소"
from food_orders
where addr like '%문곡리%'

 

 

  • SUBSTRING

SUBSTRING함수는 전체 데이터가 아닌 특정 문자만 필요할 때 필요한 부분만 조회할 수 있습니다

substr로 줄여 쓸 수 있습니다

 

 

사용 방법

substr(조회 할 컬럼, 시작 위치, 글자 수)

 

예시

서울 음식점들의 주소를 전체가 아닌 '시도'만 나오도록 수정해 보자

 

select addr "원래 주소",
           substr(addr, 1, 2) "시도"
from food_orders
where addr like '%서울특별시%'

 

 

 

  • CONCAT

CONCAT함수는 원하는 문자가 여러 컬럼에 있을 때 하나로 합칠 수 있습니다

컬럼에서 원하는 문자와 특수문자 데이터를 붙이기 위해서는 CONCAT 함수와 괄호를 사용하여 적어주어야 합니다.

데이터를 붙일 때는 기본적으로 작은따옴표 안에 데이터를 적어주어야 하며, 특수문자 데이터(하이픈 등)의 경우 보기 쉽게 가운데 하이픈을 적어주는 것이 좋습니다.

  • 붙일 수 있는 문자의 종류
    • 컬럼
    • 한글
    • 영어
    • 숫자
    • 기타 특수문자

 

사용 방법

concat(붙이고 싶은 값1, 붙이고 싶은 값2, 붙이고 싶은 값3, .....)

 

예시

서울시에 있는 음식점은 '[서울] 음식점명'이라고 수정하기

select restaurant_name "원래 이름",   
           addr "원래 주소",
           concat('[', substring(addr, 1, 2), '] ', restaurant_name) "바뀐 이름"
from food_orders
where addr like '%서울%'

 

 

 

  • GROUP BY

 

GROUP BY절에는 컬럼 위치를 나타내는 숫자로 범주를 묶을 수 있으며, 첫 번째 컬럼과 두 번째 컬럼을 모두 묶는 방법은 1, 2로 표기할 수 있습니다.
컬럼 위치 표기보다는 컬럼명을 사용하는 것이 더 명확합니다

특정하기 쉽지 않을 때 시작 위치는 특정하고  마지막 글자수를 생략하거나 임의의 큰 숫자를 사용하면 시작 위치에서 마지막 위치까지 모두 불러옵니다

 

예시

‘[지역(시도)] 음식점이름 (음식종류)’ 컬럼을 만들고, 총 주문건수 구하기

select concat('[', substring(addr, 1, 2), '] ', restaurant_name, ' (', cuisine_type, ')') "바뀐이름",
           count(1) "주문건수"
from food_orders
group by 1

 

 

 

  • 조건문(IF, CASE)

 

  • IF문

IF 문은 기초적인 조건문으로 조건을 지정하여 코드를 실행하는 문법입니다.

원하는 조건에 충족할 때 적용할 방법과 아닌 방법을 지정해 줄 수 있습니다.

IF 문으로 조건을 선언하고, 조건에 따라 값이나 수식을 지정하여 처리할 수 있습니다.

조건이 충족될 때 나타날 결과를 적어주고, 조건이 충족되지 않을 시 대체해서 사용할 값을 지정할 수 있습니다.

 

 

사용 방법

if(조건, 조건을 충족할 때, 조건을 충족하지 못할 때)

 

 

예시

잘못된 이메일 주소 (gmail)만 수정을 해서 사용하기

select substring(if(email like '%gmail%', replace(email, 'gmail', '@gmail'), email), 10) "이메일 도메인",
           count(customer_id) "고객 수",
           avg(age) "평균 연령"
from customers
group by 1

 

 

 

  • CASE문

CASE문은 각 조건별로 적용할 값을 지정해 줄 수 있습니다.

CASE문을 사용할 경우, 여러 조건에 부합할 때 각각 기능을 부여할 수 있습니다.

CASE문은 WHEN으로 각각의 조건을 주고 그 조건을 만족했을 때 줄 수 있는 값을 THEN으로 정의합니다.

모든 경우에 부합하지 않으면 else 사용해 나머지들을 지정한다.

조건문을 종료할 때는 END문을 사용한다.

또한 CASE문 내에는 SUBSTR이나 CONCAT과 같은 어려운 구문을 사용하거나, 이러한 구문 내에 조건문을 포함할 수 있습니다.

 

 

사용 방법

case when 조건1 then 값(수식)1
         when 조건2 then 값(수식)2
         else 값(수식)3
end

 

 

예시

주소의 시도를 ‘경기도’ 일 때는 ‘경기도’, ‘특별시’ 혹은 ‘광역시’ 일 때는 붙여서, 아닐 때는 앞의 두 글자만 사용

 

select restaurant_name,
           addr,
           case when addr like '%경기도%' then '경기도'
                    when addr like '%특별%' or addr like '%광역%' then substring(addr, 1, 5)
                    else substring(addr, 1, 2) end "변경된 주소"
from food_orders

 

 

 

  • 조건을 사용할 수 있는 경우 알아보기
    • 새로운 카테고리 만들 수 있다
    • 연산식을 적용할 조건 지정할 수 있다
    • 다은 문법 안에서 적용할 수 있다

 


 

SQL 가독성을 높이는 다섯 가지 습관에 대해 공부하고 느낀 점은 가독성 높이는 방향으로 잘 정리해 SQL을 작성하면 나 이외에 팀원들까지 이해하기 쉽고 파악하기 수월해진다는 말에 매우 공감을 하였고 블로그 글쓰기처럼 누군가가 볼 수도 있다는 생각을 가지고 정리를 잘하는 습관을 들이는 것이 중요할 거 같다.

SQL 공부에 대해서는 CASE문 안에 다른 조건문을 여러 포함할 수 있다는 점을 새로 배웠고 점점 복잡해지는 기분이다