일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- SSO
- 선형회귀
- map차트
- 하드웨어
- SSL
- AWS
- HTTP
- 테이블만들기
- 맵차트
- tableau
- 색상코드
- SQL
- SQL 테이블 삭제
- SAML
- SSO인증
- Data Analysis
- 파이썬
- dns
- 클라우드
- >>
- 방화벽
- 배치파일
- Linear models
- 날짜 함수
- MySQL
- https
- batch
- Network
- 태블로
- Today
- Total
SeaForest
SQL 쿼리 가독성 높이기 본문
업무를 하면서 쿼리를 작성해야 하는 일이 많은데, 쿼리 길이가 점점 길어지고 복잡해지는 경우가 많아지고 있다. 심지어 내가 작성한 쿼리도 알아보기 힘들어 쿼리를 다시 이해하는데 시간을 쓰게 되어 비효율적으로 업무를 했던 경험도 있다. 그러다 보니 이전에는 가독성을 고려하지 않은 쿼리를 작성했다면 최근에는 누가 봐도 알아보기 쉬운, 유지보수에 어려움이 없는 쿼리를 작성하기 위해 고민하는 시간이 많아진 것 같다.
이미 쿼리 가독성을 높이는 방법에 대해 정리한 글은 꽤 있지만, 업무를 하면서 느낀 점들도 함께 정리해보았다.
1. 행갈이를 자주 하기
간단한 쿼리를 작성할 경우에는 행갈이를 많이 하지 않았고, 행갈이의 필요성을 알지 못했다.
/* 행갈이를 많이 하지 않은 경우 */
SELECT col1, col2, col3
FROM table1
WHERE col2 = 'Y'
물론 간단한 쿼리의 경우는 불필요하게 무조건 행갈이를 할 필요는 없지만 불러와야 하는 컬럼 수도 많아지거나, 원하는 값을 찾기 위해 WHERE 조건절에 조건을 넣었다가 뺐다가 반복해야 하는 경우도 생기면서 행갈이는 선택이 아닌 필수가 되어버렸다. 한 줄에 하나의 컬럼만 있으면 나중에 어떤 컬럼이 들어가 있는지 확인도 쉽고 컬럼을 넣거나 뺄 때도 보다 명시적이기 때문이다.
/* 콤마를 바로 뒤에 넣는 경우 */
SELECT
col1,
col2,
col3
FROM table1
/* 콤마를 앞에 넣는 경우 */
SELECT
col1
,col2
-- ,col3
FROM table1
그리고 가독성 높은 쿼리 작성을 위해 여러 참고 자료들을 찾아보니 컬럼 앞에 콤마를 넣어서 사용하는 경우도 많았다. 처음에는 컬럼 바로 뒤에 콤마를 사용했던 습관 때문에 오히려 앞에 넣는게 매우 불편하여 이해가 가지 않았는데, 컬럼을 넣었다 빼었다를 반복해서 테스트하는 경우가 많아지면서는 컬럼 앞에 콤마를 넣었을 때 훨씬 편했다. 컬럼 뒤에 붙어 있는 콤마를 지우는 작업 없이 해당 컬럼이 있는 줄만 주석 처리를 하면 되기 때문이다.
2. 예약어는 대문자로
예약어는 대/소문자를 구분하지는 않지만 예약어는 대문자로 표기하고 데이터베이스의 객체명은 소문자로 표기하면 알아보기 쉽다. 이 내용은 SQL 쿼리를 작성할 때 뿐만 아니라 태블로에서 함수를 사용할 때도 동일하게 해당되는 내용이다. 예약어를 대문자로 표기하면 가독성이 더 높아진다.
/* 예약어는 대문자로 쓴 경우 */
SELECT
col1
,col2
FROM table1
/* 예약어를 소문자로 쓴 경우 */
select
col1
,col2
from table1
3. WITH문 사용하기
서브쿼리는 가독성과 성능 측면에서 떨어질 수 있기 때문에 WITH문을 사용하는게 좋다고 한다. WITH문은 CTE(Common Table Expression)을 표현하기 위한 구문으로, 서브쿼리를 '미리 정의' 하여 복잡한 쿼리를 간단하게 만드는 방법이다. 이전에는 낯설어서 WITH절을 사용하는데 거부감이 들었는데, 서브쿼리에 들어가는 쿼리가 길어지다보니 WITH문을 사용했을 때가 서브쿼리를 사용했을 때보다 가독성이 훨씬 높았다. WITH절로 가상의 테이블을 만들어 쿼리의 가독성도 높이고 쿼리를 간결하게 만들 수 있다. 그리고 WITH 절은 코드의 재사용성을 높여주는 역할도 한다.
/* WITH문을 사용한 경우 */
WITH IT_Staff AS (
SELECT *
FROM Employee
WHERE Title = 'IT Staff' )
SELECT *
FROM IT_Staff ;
/* 서브쿼리를 사용한 경우 */
SELECT *
FROM (
SELECT *
FROM Employee
WHERE Title = 'IT Staff') ;
예시가 너무 간단해서 WITH문을 쓰는 경우와 서브쿼리를 썼을 때의 가독성 차이가 크게 느껴지지 않지만 서브쿼리에 들어가야 하는 쿼리가 길어진다면 가독성의 차이는 크게 느껴진다.
4. 주석 활용하기
쿼리가 간단하면 주석 없이도 이해하는데 어려움이 없겠지만, 쿼리가 길어지면 주석을 활용하는게 좋다. 예를 들어 WITH구문을 사용했다면 WITH 구문의 역할이 무엇인지 주석으로 한번 더 추가한다면 가독성이 높은 쿼리를 작성할 수 있다. 불필요하게 긴 주석은 오히려 가독성을 낮추기 때문에 간단하게 작성하는게 좋다.
WITH IT_Staff AS(
SELECT *
FROM Employee
WHERE Title = 'IT Staff'),
-- IT Staff에 해당하는 직원
Sales_Support_Agent AS (
SELECT *
FROM Employee
WHERE Title = 'Sales Support Agent')
-- Sales Support Agent에 해당하는 직원
SELECT *
FROM Sales_Support_Agent;
'좋은 쿼리는 좋은 성능을 가져온다'라는 말처럼 앞으로는 쿼리 작성을 할 때, 항상 가독성이 좋은 쿼리 작성을 지향하고 성능까지 좋은 쿼리를 작성하는 방법까지 고민하고 정리해 봐야겠다.
'SQL' 카테고리의 다른 글
[프로그래머스] 입양 시각 구하기(2) (1) | 2024.08.13 |
---|---|
Oracle 날짜 함수 (0) | 2024.08.11 |
[SQL] 정규화, 반정규화 (0) | 2023.04.09 |
[SQL] DELETE vs TRUNCATE vs DROP (0) | 2022.10.13 |
[SQL] MySQL 기본 명령어 (0) | 2022.10.05 |