240704

Gi Woon Lee·2024년 7월 4일
1

TIL

목록 보기
10/78

SQL

예약어 충돌 해결하기

🤷‍♂️예약어와 칼럼의 이름이 같을 때 조치 없이 칼럼을 소환하면, 예약어가 우선 수행되기 때문에 원하는 칼럼이 반환되지 않는 오류가 발생한다.

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.

quotation mark, 예약어 충돌 문제

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 상황의 대세를 따랐다.

JOIN으로 테이블 3개 연결하기

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 

🟦 BEWTEEN

기본 문법

column_name BETWEEN value1 AND value2
  • column_name: 비교할 열의 이름.
  • value1: 범위의 시작 값.
  • 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;

0개의 댓글