본문 바로가기

언어 공부/SQL

[SQL] 프로그래머스 SQL > String, Date

https://programmers.co.kr/learn/courses/30/parts/17047

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

String, Date > 카테고리 별 상품 개수 구하기

 
SELECT SUBSTR(PRODUCT_CODE, 1,2) as CATEGORY, COUNT(*)
FROM PRODUCT
GROUP BY CATEGORY

SUBSTR은 0이아니라 1부터 시작한다

 

LEFT로도 가능

SELECT LEFT(PRODUCT_CODE, 2) as CATEGORY, COUNT(*)
FROM PRODUCT
GROUP BY CATEGORY

 


String, Date > 조건별로 분류하여 주문상태 출력하기

 
SELECT ORDER_ID, PRODUCT_ID, DATE_FORMAT(OUT_DATE, "%Y-%m-%d"), 
CASE WHEN  OUT_DATE IS NULL THEN "출고미정" 
       WHEN OUT_DATE > DATE_FORMAT("2022-05-01", "%Y-%m-%d")
       THEN "출고대기"
       ELSE "출고완료"
END  as "출고여부"
FROM FOOD_ORDER
ORDER BY ORDER_ID

 

 

 

 

 

 


 

String, Date > 루시와 엘라 찾기

 

01. IN 방법

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE FROM ANIMAL_INS
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY ANIMAL_ID

02. OR 방법

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE FROM ANIMAL_INS
WHERE NAME = "Lucy" OR NAME = "Ella" OR NAME = "Pickle" OR NAME = "Rogan" OR NAME = "Sabrina" OR NAME = "Mitty"
ORDER BY ANIMAL_ID

 

 

String, Date > 이름에 el이 들어가는 동물 찾기

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
WHERE ANIMAL_TYPE="Dog" AND NAME LIKE '%el%'  
ORDER BY NAME

 

 

 

String, Date > 중성화 여부 파악하기

MYSQL - 1) IF 방법

SELECT ANIMAL_ID,NAME,
IF(SEX_UPON_INTAKE LIKE '%Neutered%' OR SEX_UPON_INTAKE LIKE '%Spayed%' , 'O', 'X') AS '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

구글 검색으로 풀었는데, 처음엔 IF문 안에

IF( SELECT SEX_UPON_INTAKE LIKE '%NEUTERED%' OR SEX_UPON_INTAKE LIKE '%SPAYED%' FROM ANIMAL_INS , 'O', 'X') AS '중성화' 

이런식으로 검색할때는 SELECT와 FROM으로 묶어줘야한다고 생각해서 오류가 났었다. 

 

MYSQL - 2) CASE 방법

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

 

ORACLE - CASE 방법

SELECT ANIMAL_ID,NAME,
CASE WHEN SEX_UPON_INTAKE LIKE '%Neutered%' THEN 'O'
WHEN SEX_UPON_INTAKE LIKE '%Spayed%'
THEN 'O' ELSE 'X' END
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

Oracle에서는 IF문으로 어떻게 해야하는지는 잘 모르겠다...

 

 

 

String, Date > 오랜 기간 보호한 동물(2)

1)MYSQL

SELECT A.ANIMAL_ID , A.NAME
FROM ANIMAL_INS A, ANIMAL_OUTS B
WHERE A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY B.DATETIME - A.DATETIME DESC
LIMIT 2

ANIMAL_OUTS테이블의 ANIMAL_ID는 ANIMAL_INSANIMAL_ID 외래 키

라고 했으므로 ANIAML_INS (A) 테이블, ANIMAL_OUTS (B) 테이블을 두개 사용해서 A.ANIMAL_ID = B.ANIMAL_ID 일때

보호소에 있던 기간이 가장 긴 동물을 두마리 찾아야 한다.

 

보호소에 있던 기간 = B.DATETIME - A.DATETIME 으로 찾을 수 있다.

DESC (내림차순)으로 정렬하면, 가장 큰것부터 찾을 수 있으므로 LIMIT 2를 하면 가장 긴것 두개를 찾을 수 있다.

 

2)ORACLE

SELECT ANIMAL_ID, NAME
FROM  (SELECT INS.ANIMAL_ID, INS.NAME FROM ANIMAL_INS INS, ANIMAL_OUTS OUTS
WHERE INS.ANIMAL_ID = OUTS.ANIMAL_ID
ORDER BY (OUTS.DATETIME - INS.DATETIME) DESC)
WHERE ROWNUM <= 2;

 

 

 

 

String, Date > DATETIME에서 DATE로 형변환

SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS '날짜' 
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

DATE_FORMAT(DATETIME, '%Y-%m-%d') 에서 %M, %D 처럼 대문자를 사용하면 숫자가 아닌 날짜형식 데이터 포맷으로 변환된다.

소문자 %y를 사용하면 2022에서 끝자리 두개 22 까지만 출력된다.