SQL에서 중요한 것은 무엇일까요?
가장 중요한 것은 유지보수가 좋게 작성해야 하며 누구나 알아볼 수 있어야 한다는 겁니다.
같이 개발하는 사람들이 중구난방 개발을 하면 나중에 보기 힘들기 때문에 표준 SQL 작성 규칙을 정해야합니다.
SQL 작성 규칙에 대해 알아보겠습니다.
SQL의 기초는 어느 순서로 SQL이 작동하는지 알아야하는 것에 있습니다.
SELECT 5
FROM 1
WHERE 2
GROUP BY 3
HAVING 4
ORDER BY 6
LIMIT 7
OFFSET 8
SQL은 위 순서로 작성하며 숫자 순서대로 작동합니다.
1) FROM
절에서 어느 테이블에서 가져오는지 확인, JOIN처리를 합니다.
2) WHERE
절에서 조건에 맞게 설정을 합니다.
3) GROUP BY
절에서 어느 항목으로 묶을 것인지 설정합니다.
4) HAVING
절은 GROUP BY를 사용시 조건을 거는 것으로 GROUP BY로 묶인 뒤에 조건을 설정할 수 있습니다.
5) SELECT
절은 조건에 맞게 가져올 필요한 칼럼들을 적어줍니다.
6) ORDER BY
절은 조건에 맞게 가져온 SELECT문을 정렬하여 줍니다.
7) LIMIT
는 처리된 SQL문에서 몇개만 가져올 것인지 설정합니다.
8) OFFSET
은 어디서부터 가져올 것인지 설정합니다.
이제 SQL의 작성 규칙에 대해 알아보겠습니다.
SELECT
USER_ID
FROM
TB_USER
WHERE
USER_ID = 1;
예시처럼 SQL문은 대문자를 기본으로 하며 알아보기 쉽게 각 단을 내려 작성합니다.
유지 보수를 위해서는 어떤 사람이 작성하였고 어느 용도로 SQL문이 작성 되었는지 알아야 빠르게 유지보수를 할 수 있습니다.
/*사용자, 사용자 정보 조회, 홍길동*/
/*SELECT.TB_USER.USER_INFO.001*/
예시처럼 2가지를 같이 작성하여 넣어주는데 상단엔 업무 정보에 대한 주석, 하단엔 SQL문에 대한 설명을 넣습니다.
업무 파트 | 서비스하고자 하는 로직 | 작성한 개발자 명 |
---|---|---|
업무 영억을 식별할 수 있는 구체적 용어 | 얻고자 하는 결과를 입력 | 작성한 개발자 |
예시 : 사용자, 주문, 지불, 배송 | 예시 : 사용자 정보 조회 | 예시 : 홍길동 |
X : 지불사용자 | X : 주문구매자공통조회 |
SQL 명렁어 | 사용하는 테이블 | SQL 용도 |
---|---|---|
SQL 명령어 | 사용하는 주 테이블 | SQL의 용도 |
예시 : SELECT | 예시 : TB_USER | 예시 : USER_INFO |
SQL문은 작성할 때 지켜야할 규칙들이 있습니다.
다른 사용자가 알아보기 쉽게 하는 것도 있지만 Optimizer 가 실수 하지 않도록 하는 규칙이기도 합니다.
옵티마이저(Optimizer)란?
SQL 개발자가 SQL을 작성하여 실행할 때, 옵티마이저는 SQL을 어떻게 실행할 것인지를 계획하게 됩니다.
SQL 실행 계획(Execution Plan)을 수립하고 SQL을 실행합니다.
옵티마이저는 SQL의 실행 계획을 수립하고 SQL을 실행하는 데이터베이스 관리 시스템의 소프트웨어입니다.
동일한 결과가 나오는 SQL도 어떻게 실행하느냐에 따라서 성능이 달라지기에,
SQL 성능에 옵티마이저는 아주 중요한 역할을 하고 있습니다.
문자는 대문자로 사용
TAB 사용 지양
Alias 항상 작성
유지보수가 용이하게 , 를 앞에 붙여서 작성
SELECT
A.USER_ID
, A.USER_EMAIL
FROM
TB_USER A
WHERE
A.USER_ID = 1;
예시처럼 FROM
절에서는 AS
를 생략해서 작성합니다.
칼럼 앞에는 어느 테이블에서 가져온 것인지 알아보기 쉽게 Alias
를 붙여서 작성합니다.
Alias
는 FROM
절에서 기술한 테이블에 알파벳 순서대로 부여합니다.
SELECT
절에 사용된 스칼라 서브쿼리의 경우 L,M,N,..... 순서대로 부여합니다.
WHERE
절에 사용된 상관 서브쿼리의 경우 X,Y,Z 순서대로 부여합니다.
FROM
절에 사용한 인라인 뷰의 경우도 알파벳 순서대로 부여합니다.
서브쿼리는 사용된 위치에 따라 명칭이 달라집니다.
SELECT
절의 경우 스칼라 서브쿼리,FROM
절의 경우 인라인 뷰,WHERE
절에 경우 상관 서브쿼리 로 불리웁니다.
위의 규칙들을 다 적용한 예시를 보겠습니다.
/*사용자, 사용자 구매정보 조회, 홍길동*/
/*SELECT.TB_USER.USER_INFO.001*/
SELECT
A.USER_ID
, A.USER_EMAIL
, (
SELECT
L.IMG_URL
FROM
TB_IMG L
WHERE
L.USER_ID = A.USER_ID
) AS USER_IMG
, CASE
WHEN B.PAID_YN = 'Y' THEN '지불'
ELSE '미납'
END AS PAID
FROM
TB_USER A /* 회원 */
INNER JOIN TB_ORDER B /* 구매 */
WHERE
A.DEL_YN = 'N'
AND A.USER_ID = 1
AND NOT EXISTS (
SELECT
1
FROM
TB_REFUND X /* 환불 */
WHERE
A.USER_ID = X.USER_ID
) /* 환불 여부 체크 */;
예시처럼 깔끔하게 알아볼 수 있는 SQL문이 완성됩니다.
, 을 앞에 작성하여 필요없을 시 삭제도 용이하며 Alias
가 다 붙어 있어 어느 테이블에서 가져왔는지 한눈에 보입니다.
명시적으로 어떤 용도로 사용했는지에 대해서도 알아볼 수 있고 에러가 날시 주석을 통해 빠르게 처리가 가능합니다.