[SQL] 04. String, Date 9문제 정리

다나·2023년 1월 25일
0

SQL

목록 보기
4/6
post-thumbnail

String, Date 문제 KEY POINT
☝️ String 문제 중에서 특정 문자 포함여부 : where 열 like "%특정문자%"
☝️ Date 문제 중에서 출력 시간의 형식 지정 : DATE_FORMAT(열, "%Y-%m-%d)
☝️Date 문제 중에서 날짜, 시간 차이 일수 계산 : DATEDIFF(종료일자, 시작 일자)
☝️특정 조건에 따라서 행의 값을 지정 : CASE WHEN 조건 THEN '출력값1' ELSE '출력값2' END 열
☝️ 문자열 자르기 : SUBSTRING(문자열, 시작위치, 길이), LEFT(문자열, 길이), RIGHT(문자열, 길이)
✌️여러 개의 테이블을 조인하는 경우 : select 열 from A join B on A.열 = B.열 join C on A.열 = C.열

1. 루시와 엘라 찾기 🐨

난이도 : LEVEL 2

동물 보호소에 들어온 동물 중 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물의 아이디와 이름, 성별 및 중성화 여부를 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.

문제 풀이

1️⃣ 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물을 조회한다.

  • 조회할 이름의 조건들이 여러 개이므로 in을 사용한다.
  • WHERE NAME in ("Lucy","Ella","Pickle","Rogan","Sabrina","Mitty")

2️⃣ 아이디 순으로 조회한다.

* 열 IN (조건1, 조건2 ...) : 특정 컬럼이 여러개의 값 중 하나일 때의 조건에 사용한다.

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE 
FROM ANIMAL_INS
WHERE NAME in ("Lucy","Ella","Pickle","Rogan","Sabrina","Mitty")
Order by ANIMAL_ID

참고 자료 : https://dololak.tistory.com/812
https://gent.tistory.com/430


2. 자동차 대여 기록에서 장기/단기 대여 구분하기 🚘

난이도 : LEVEL 1

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가하여 대여기록을 출력하는 SQL문을 작성해주세요. 결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.

문제 풀이

1️⃣ 대여 시작일이 2022년 9월에 속하는 대여 기록을 출력한다.

  • where START_DATE like "2022-09-%"

2️⃣ 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가한다.
🔥 이때, 대여 시작일이 2022-09-28이고 대여 종료일이 2022-09-28이면, DATEDIFF의 값이 0이지만 대여 기간은 1로 고려해야한다! 따라서 대여 기간이 30일 이상은 DATEDIFF(END_DATE,START_DATE) >= 29을 의미한다!

  • CASE WHEN DATEDIFF(END_DATE,START_DATE) < 29 THEN '단기 대여'
    ELSE '장기 대여'
    END RENT_TYPE

3️⃣ 대여 기록 ID를 기준으로 내림차순 정렬한다.

  • order by HISTORY_ID desc
SELECT HISTORY_ID, CAR_ID, 
	DATE_FORMAT(START_DATE, "%Y-%m-%d") as START_DATE,
	DATE_FORMAT(END_DATE, "%Y-%m-%d") as END_DATE,
CASE WHEN DATEDIFF(END_DATE,START_DATE) < 29 THEN '단기 대여'
    ELSE '장기 대여'
    END RENT_TYPE
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
where START_DATE like "2022-09-%"
order by HISTORY_ID desc;

참고 자료 : https://gent.tistory.com/435


3. 중성화 여부 파악하기 🐴

난이도 : LEVEL 2

보호소의 동물이 중성화되었는지 아닌지 파악하려 합니다.
중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.

문제 풀이

1️⃣ 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 중성화가 되어있다면 'O', 아니라면 'X'라고 표시한다.

  • CASE WHEN SEX_UPON_INTAKE like "Neutered%"
    or SEX_UPON_INTAKE like"Spayed%" then "O"
    ELSE "X"

2️⃣ 아이디 순으로 조회한다.

  • order by ANIMAL_ID
SELECT ANIMAL_ID, NAME,
CASE WHEN SEX_UPON_INTAKE like "Neutered%" 
     or SEX_UPON_INTAKE like"Spayed%" then "O"
ELSE "X"
END 중성화
from ANIMAL_INS
order by ANIMAL_ID

4. 이름에 el이 들어가는 동물 찾기 🐥

난이도 : LEVEL 2

동물 보호소에 들어온 동물 이름 중, 이름에 "EL"이 들어가는 개의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 이름 순으로 조회해주세요. 단, 이름의 대소문자는 구분하지 않습니다.

문제 풀이

1️⃣ 이름에 "EL"이 들어가는 의 아이디와 이름을 조회한다.

  • where ANIMAL_TYPE = "Dog" and NAME like "%el%"

2️⃣ 이름 순으로 조회한다.

  • order by NAME
SELECT ANIMAL_ID, NAME from ANIMAL_INS
where ANIMAL_TYPE = "Dog" and NAME like "%el%"
order by NAME

5. 오랜 기간 보호한 동물(2) 🦊

난이도 : LEVEL 3

입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.

문제 풀이

1️⃣ 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회한다.

  • 보호 기간이 가장 길었던 동물을 조회하기 위해서 (나간 시점 - 들어온 시점)을 내림차순으로 정렬한다.
    order by DATEDIFF(ANIMAL_OUTS.DATETIME, ANIMAL_INS.DATETIME) desc
  • 그리고 두 마리를 조회하기 위해서 limit 2를 사용한다.

2️⃣ 보호 기간이 긴 순으로 조회한다.

  • order by ANIMAL_INS.ANIMAL_ID
SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME
from ANIMAL_INS join ANIMAL_OUTS 
on ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
order by DATEDIFF(ANIMAL_OUTS.DATETIME, ANIMAL_INS.DATETIME) desc, ANIMAL_INS.ANIMAL_ID 
limit 2

6. 카테고리 별 상품 개수 구하기 📚

난이도 : LEVEL 2

PRODUCT 테이블에서 상품 카테고리 코드(PRODUCT_CODE 앞 2자리) 별 상품 개수를 출력하는 SQL문을 작성해주세요. 결과는 상품 카테고리 코드를 기준으로 오름차순 정렬해주세요.

문제 풀이

1️⃣ 상품 카테고리 코드(PRODUCT_CODE 앞 2자리) 별 상품 개수를 출력한다.

  • 먼저, PRODUCT_CODE 앞 2자리를 구하기 위해서 PRODUCT_CODE 문자열을 왼쪽에서 2번째까지 잘라야 한다.
    LEFT(PRODUCT_CODE,2) as CATEGORY

GROUP BY : 유형별로 갯수를 알고 싶을 때는 컬럼에 데이터를 그룹화해야 한다.

  • 따라서, CATEGORY로 그룹화를 하고 count()로 유형별 개수를 센다.
    count(*) as PRODUCTS, group by CATEGORY

2️⃣ 상품 카테고리 코드를 기준으로 오름차순 정렬한다.

  • order by CATEGORY
SELECT LEFT(PRODUCT_CODE,2) as CATEGORY, count(*) as PRODUCTS
from PRODUCT
group by CATEGORY
order by CATEGORY

참고 자료 : [문자열 자르기] https://gent.tistory.com/436
[Group By] https://extbrain.tistory.com/56


7. DATETIME에서 DATE로 형 변환

난이도 : LEVEL 2

ANIMAL_INS 테이블에 등록된 모든 레코드에 대해, 각 동물의 아이디와 이름, 들어온 날짜를 조회하는 SQL문을 작성해주세요. 이때 결과는 아이디 순으로 조회해야 합니다.

문제 풀이

1️⃣ 모든 레코드에 대해, 각 동물의 아이디와 이름, 들어온 날짜를 조회한다.

  • DATE_FORMAT(DATETIME, "%Y-%m-%d") as 날짜

2️⃣ 아이디 순으로 조회한다.

  • order by ANIMAL_ID
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, "%Y-%m-%d") as 날짜
from ANIMAL_INS
order by ANIMAL_ID

8. 조건별로 분류하여 주문상태 출력하기 🧾

난이도 : LEVEL 3

FOOD_ORDER 테이블에서 5월 1일을 기준으로 주문 ID, 제품 ID, 출고일자, 출고여부를 조회하는 SQL문을 작성해주세요. 출고여부는 5월 1일까지 출고완료이 후 날짜는 출고 대기미정이면 출고미정으로 출력해주시고, 결과는 주문 ID를 기준으로 오름차순 정렬해주세요.

문제 풀이

1️⃣ 5월 1일까지 출고완료로 이 후 날짜는 출고 대기로 미정이면 출고미정으로 출력한다.

  • 총 3가지의 조건로 나누어서 출력한다.
  • 다중 조건인 경우 WHEN을 여러번 사용한다~!
    CASE WHEN OUT_DATE IS null THEN "출고미정"
    WHEN OUT_DATE <= "2022-05-01" THEN "출고완료"
    ELSE "출고대기"
    END 출고여부

2️⃣ 주문 ID를 기준으로 오름차순 정렬한다.

  • order by ORDER_ID
SELECT ORDER_ID, PRODUCT_ID, DATE_FORMAT(OUT_DATE,"%Y-%m-%d") as OUT_DATE,
CASE WHEN OUT_DATE IS null THEN "출고미정"
WHEN OUT_DATE <= "2022-05-01" THEN "출고완료"
ELSE "출고대기"
END 출고여부
from FOOD_ORDER
order by ORDER_ID

9. 취소되지 않은 진료 예약 조회하기 👩‍⚕️

난이도 : LEVEL 4

PATIENT, DOCTOR 그리고 APPOINTMENT 테이블에서 2022년 4월 13일 취소되지 않은 흉부외과(CS) 진료 예약 내역을 조회하는 SQL문을 작성해주세요. 진료예약번호, 환자이름, 환자번호, 진료과코드, 의사이름, 진료예약일시 항목이 출력되도록 작성해주세요. 결과는 진료예약일시를 기준으로 오름차순 정렬해주세요.

문제 풀이

1️⃣ 2022년 4월 13일 취소되지 않은 흉부외과(CS) 진료 예약 내역을 조회한다.

  • 1) 2022년 4월 13일 -> where A.APNT_YMD like "2022-04-13%"
    2) 취소되지 않은 -> and APNT_CNCL_YN like "N"
    3) 흉부외과(CS) -> and A.MCDP_CD like "CS"

2️⃣ 진료예약일시를 기준으로 오름차순 정렬한다.

  • order by A.APNT_YMD

*여러 개의 테이블을 조인하는 경우 : select 열 from A join B on A.열 = B.열 join C on A.열 = C.열

  • 이때, 여러 테이블을 연결할 수 있는 모든 키를 가진 A가 되는 테이블을 먼저 찾는 것이 중요하다! 🔥
SELECT A.APNT_NO, B.PT_NAME, A.PT_NO, A.MCDP_CD, C.DR_NAME, A.APNT_YMD
from APPOINTMENT as A
join PATIENT as B on A.PT_NO = B.PT_NO
join DOCTOR as C on A.MDDR_ID = C.DR_ID
where A.APNT_YMD like "2022-04-13%" and APNT_CNCL_YN like "N" and A.MCDP_CD like "CS"
order by A.APNT_YMD

10. 추후 정리할 예정

profile
컴퓨터공학과 학생이며, 백엔드 개발자입니다🐰

0개의 댓글