🤷♂️예약어와 칼럼의 이름이 같을 때 조치 없이 칼럼을 소환하면, 예약어가 우선 수행되기 때문에 원하는 칼럼이 반환되지 않는 오류가 발생한다.
SELECT BOARD_ID,
WRITER_ID,
TITLE,
PRICE,
CASE WHEN STATUS = DONE THEN "거래완료"
ELSE "거래중" END "거래상태"
FROM USED_GOODS_BOARD
WHERE CREATED_DATE = '2022-10-05'
ORDER BY BOARD_IN DESC
위 코드에서 "STATUS" 칼럼은 예약어 "STATUS"와 동일하기에 예약어가 우선 수행되어 보라색 상태임을 관찰할 수 있다.
💡대상 칼럼 이름을 백틱(`)으로 감싸서 해결한다.
SELECT BOARD_ID,
WRITER_ID,
TITLE,
PRICE,
CASE
WHEN `STATUS` = 'DONE' THEN '거래완료'
ELSE '거래중'
END AS 거래상태
FROM USED_GOODS_BOARD
WHERE CREATED_DATE = '2022-10-05'
ORDER BY BOARD_ID DESC;
문자열 리터럴 = 작은 따옴표 '
식별자(열, 테이블)를 묶는 행위 등 = 큰 따옴표 "
문자열 리터럴에는 작은 따옴표를 사용하는 것이 표준
또한
MySQL 에서 큰따옴표는 허용되지 않는다.
둘 다 string문자열 구분기호로 사용된다.
(' ') are primarily used to enclose text values. For example, you can use single quotes to wrap a string that contains double quotes, such as a customer feedback quote.
Double quotes
(” “) are less commonly used than single quotes, but can be used to store an entire SQL statement in a variable for later use in code. When the ANSI_QUOTES SQL mode is enabled, double quotation marks are interpreted as identifiers, so string literals can only be quoted using single quotation marks.
https://school.programmers.co.kr/learn/courses/30/lessons/164672
SELECT BOARD_ID,
WRITER_ID,
TITLE,
PRICE,
CASE WHEN `STATUS` = 'SALE' THEN '판매중'
WHEN `STATUS` = 'RESERVED' THEN '예약중'
WHEN `STATUS` = 'DONE' THEN '거래완료'
END AS 'STATUS'
FROM USED_GOODS_BOARD
WHERE CREATED_DATE = '2022-10-05'
ORDER BY BOARD_ID DESC
STATUS 를 백틱으로 감싸 STATUS 예약어 문제를 해결하고
""를 ''로 바꿔 MySQL 상황의 대세를 따랐다.
https://school.programmers.co.kr/learn/courses/30/lessons/132204
별 거 없다.
첫 번째 join을 하나의 테이블로 생각하고 join을 한번 더 해주면 된다.
💡tip:
모든 키워드에 enter, indentation을 주어 debugging에 용이하게 만들어 두는 것을 습관화하라. 이렇게 정리하면서 쿼리를 짜주면, 복습과 질문에도 도움이 될 뿐 만 아니라, join을 여러개 수행할 때에도 헷갈리지 않게 할 수 있다.
# PATIENT P, DOCTOR D, APPOINTMENT A
# 2022-04-13 APNT_CNCL_YN = 'N'
# CS 의 진료 예약 내역 출력
# 진료예약번호, 환자이름, 환자번호, 진료과코드, 의사이름, 진료예약일시 항목
# A.APNT_NO, P.PT_NAME, P.PT_NO, A.APNT_YMD, D.MCDP_CD, D.DR_NAME 조회하라!
# INNER JOIN 3번 가보자
SELECT
A.APNT_NO,
P.PT_NAME,
P.PT_NO,
D.MCDP_CD,
D.DR_NAME,
A.APNT_YMD
FROM
PATIENT P
INNER JOIN
APPOINTMENT A ON P.PT_NO = A.PT_NO
INNER JOIN
DOCTOR D ON D.DR_ID = MDDR_ID
WHERE
A.APNT_CNCL_YN = 'N'
AND date_format(A.APNT_YMD,'%Y-%m-%d') = '2022-04-13'
ORDER BY A.APNT_YMD
원래 작성했던 코드
SELECT A.APNT_NO, P.PT_NAME, P.PT_NO, D.MCDP_CD, D.DR_NAME, A.APNT_YMD
FROM PATIENT P INNER JOIN APPOINTMENT A ON P.PT_NO = A.PT_NO INNER JOIN DOCTOR D ON D.DR_ID = MDDR_ID
WHERE A.APNT_CNCL_YN = 'N' AND date_format(A.APNT_YMD,'%Y-%m-%d') = '2022-04-13'
ORDER BY A.APNT_NO
column_name BETWEEN value1 AND value2
SELECT *
FROM orders
WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31';
20230101 ~ 20231231 구간 안에 있는 order_date 칼럼 데이터 반환.
💡 만약 날짜 칼럼이 두 개라면,
WHEN '특정 날짜' BETWEEN 날짜칼럼1 AND 날짜칼럼2 형태도 올 수 있다.
EX)
SELECT
CAR_ID,
CASE
WHEN '2022-10-16' BETWEEN START_DATE AND END_DATE THEN '대여중'
ELSE '대여 가능'
END AS AVAILABILITY
FROM
CAR_RENTAL_COMPANY_RENTAL_HISTORY
ORDER BY
CAR_ID DESC;