MySQL 쿼리 구문 주의 사항

always updating.....♥️
muaga's avatar
Apr 29, 2024
MySQL 쿼리 구문 주의 사항

1. 별칭으로 ORDER BY 할 때

SQL 데이터베이스에서는 열 이름을 직접 사용하거나 백틱(``) 또는 []로 감싸야 한다.
SELECT MCDP_CD AS '진료과 코드', COUNT(MCDP_CD) AS '5월예약건수' FROM APPOINTMENT WHERE YEAR(APNT_YMD) = 2022 and MONTH(APNT_YMD) = 05 GROUP BY MCDP_CD ⭕ ORDER BY `5월예약건수` ASC, `진료과 코드` ASCORDER BY '5월예약건수' ASC, '진료과 코드' ASC
 

2. 인덱스를 사용하여 열을 선택할 때

SELECT에서 출력 되는 을 인덱스 번호를 사용하여 지정할 수 있다.
SELECT MCDP_CD AS '진료과 코드', COUNT(MCDP_CD) AS '5월예약건수' FROM APPOINTMENT WHERE YEAR(APNT_YMD) = 2022 and MONTH(APNT_YMD) = 05 GROUP BY 1 // = GROUP BY MCDP_CD ORDER BY 2,1 // = ORDER BY `5월예약건수` ASC, `진료과 코드` ASC
위의 2가지 방법을 사용해도 되지만, 열의 이름을 지정하여 사용하는 것이 좀 더 견고하고 가독성이 좋다.
 

3. ORDER BY 시 주의할 점

정렬 조건을 다시 한 번 더 확인해야 한다.
SUBWAY_DISTANCE 테이블에서 노선별로 노선, 총 누계 거리, 평균 역 사이 거리를 노선별로 조회하는 SQL문을 작성해주세요. 총 누계거리는 테이블 내 존재하는 역들의 역 사이 거리의 총 합을 뜻합니다. 총 누계 거리와 평균 역 사이 거리의 컬럼명은 각각 TOTAL_DISTANCE, AVERAGE_DISTANCE로 해주시고, 총 누계거리는 소수 둘째자리에서, 평균 역 사이 거리는 소수 셋째 자리에서 반올림 한 뒤 단위(km)를 함께 출력해주세요. ⭐ 결과는 총 누계 거리를 기준으로 내림차순 정렬해주세요.
SELECT ROUTE, CONCAT(ROUND(SUM(D_BETWEEN_DIST), 1), 'km') AS TOTAL_DISTANCE, CONCAT(ROUND(AVG(D_BETWEEN_DIST), 2), 'km') AS AVERAGE_DISTANCE FROM SUBWAY_DISTANCE GROUP BY ROUTE ⭕ ORDER BY ROUND(SUM(D_BETWEEN_DIST), 1) DESCORDER BY TOTAL_DISTANCE DESC
ORDER BY 의 쿼리 진행은 마지막 이라서 ‘TOTAL_DISTANCE’ 을 할 수 있지만…
CONCAT 으로 타입이 문자 로 변경되었기 때문에, 조건인 총 누계거리 를 기준으로 정렬할 수 없다. 그래서 타입이 숫자‘ROUND(SUM(D_BETWEEN_DIST), 1)’ 를 정렬 조건에 넣어야 한다.
 

4. GROUP BY에 포맷 데이터를 기준으로 할 때

DATE 👉 FORMAT한 데이터 를 기준으로 GROUP BY 할 때, SELECT절에서 FORMAT한 데이터 를 추출할 수 있다.
➡️ GROUP BY 한 데이터 만을 SELECT 절에서 추출할 수 있다.
SELECT QUARTER(DIFFERENTIATION_DATE) AS QUARTER FROM ECOLI_DATA GROUP BY QUARTER(DIFFERENTIATION_DATE)
notion image
SELECT CONCAT(QUARTER(DIFFERENTIATION_DATE),'Q') AS QUARTER, FROM ECOLI_DATA ⭕ GROUP BY CONCAT(QUARTER(DIFFERENTIATION_DATE),'Q') ❌ GROUP BY QUARTER(DIFFERENTIATION_DATE)
notion image
 

5. HAVING에 SELECT 별칭 사용 가능

SELECT에서 선언한 별칭(AS)는 SELECT가 실행된 이후 사용 가능하다.
실행순서 4) SELECT U.USER_ID, U.NICKNAME, SUM(PRICE) AS TOTAL_SALES 1) FROM USED_GOODS_BOARD AS B JOIN USED_GOODS_USER AS U ON B.WRITER_ID = U.USER_ID 2) WHERE B.STATUS = 'DONE' 3) GROUP BY B.WRITER_ID 5) HAVING ⭐ TOTAL_SALES >= 700000 6) ORDER BY TOTAL_SALES DESC // 항상 마지막
Share article

muaga's Hub