ORDER BY에서 별칭 사용할 때 쌍따옴표 vs 백틱 — MySQL에서 주의할 점

헨도·2025년 7월 9일
0

MySQL

목록 보기
8/8
post-thumbnail

SQL 코테 문제를 풀면서 쌍따옴표 문제가 발생해서 알아본 내용을 작성한다.
핵심은 컬럼 별칭에 쌍따옴표(")를 썼느냐, 그냥 썼느냐에 따른 DBMS 차이 떄문이다.

문제 내용

우선 내가 작성한 쿼리는 이러하다.

SELECT
    MCDP_CD AS "진료과코드", COUNT(PT_NO) AS "5월예약건수"
FROM APPOINTMENT
WHERE
    YEAR(APNT_YMD) = 2022
    AND MONTH(APNT_YMD) = 5
GROUP BY MCDP_CD
ORDER BY "5월예약건수", "진료과코드";

하지만 결과는 틀렸는데, 그럼 정답 쿼리는 무엇일까?

SELECT
    MCDP_CD AS 진료과코드, COUNT(PT_NO) AS 5월예약건수
FROM APPOINTMENT
WHERE
    YEAR(APNT_YMD) = 2022
    AND MONTH(APNT_YMD) = 5
GROUP BY MCDP_CD
ORDER BY 5월예약건수, 진료과코드;

위 내용처럼 쌍따옴표(")를 제외한 쿼리였다.

무슨 문제일까?

  1. AS 진료과코드, COUNT(PT_NO) AS 5월예약건수
    이 경우 Oracle, MySQL, PostgreSQL 등 대부분의 RDBMS에서 대소문자 구분없이 별칭을 처리한다.
    그리고, ORDER BY 5월예약건수 문자열이 아니라 컬럼 별칭으로 인식하기 때문이다.

  2. AS "진료과코드", COUNT(PT_NO) AS "5월예약건수"
    이 경우는 대소문자를 엄격하게 구분하는 경우와 특히 Oracle에서는 쌍따옴표를 쓰면 대소문자와 공백까지 그대로 별칭으로 인식한다.
    즉, ORDER BY "5월예약건수"라고 썼을 때, 쿼리 실행 엔진이 정확히 "5월예약건수"라는 이름의 별칭을 찾는데 어떤 DB에서는 ORDER BY 절에서는 별칭에 쌍따옴표를 쓰면 안 되거나, 혹은 AS "5월예약건수"를 인식 못 하는 설정이거나 호환 문제가 될 수 있다.

  3. 내가 선택한 DB 종류는 MySQL이다.

왜 MySQL은 틀렸을까?

기본 동작부터 알아보자

기본 동작 방식

  • 별칭(Alias)을 ORDER BY에서 사용할 때 대부분 쌍따옴표 없이 사용하는 걸 기본으로 한다.
  • MySQL의 기본 SQL 모드(SQL_MODE) 에서는 어떨까?
    • 쌍따옴표(" ") : 문자열 리터럴로 인식한다.
    • 백틱(``) : 컬럼명이나 별칭으로 인식한다.

쿼리에서 일어난 일

AS "5월예약건수"

여기서 MySQL은 쌍따옴표 안을 문자열로 인식하려다 보니 그걸 ORDER BY에서 컬럼명으로 해석하지 못해 에러 or 예상과 다른 결과가 발생하는 것이다.

반면 쌍따옴표를 사용하지 않으면, 별칭으로 인식되고 정상 동작이 된다.

결론

  • MySQL 내 별칭에 쌍따옴표(") 사용 금지
  • 별칭은 그냥 한글이나 영문으로 쓰고, ORDER BY에서도 동일하게 쓴다.
    혹은 필요하면 백틱(`)으로 감싸는 건 가능하다.
profile
Junior Backend Developer

0개의 댓글