SQL

프로그래머스) [SQL 고득점 KIT] 입양 시각 구하기, 중성화여부, 오랜기간 보호한 동물(2), DATETIME에서 DATE로 변환, NULL 처리하기

Zin0_0 2020. 6. 4. 21:36
반응형

이전에 풀었던 한번씩 풀었던 문제들이지만, 리마인드를 위해 한번 다시 훑어봤다.

입양 시각 구하기

 

코딩테스트 연습 - 입양 시각 구하기(2)

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물

programmers.co.kr

 

풀기에 어려웠던 문제였다. 처음에도 그렇고, 지금도 그렇고 아직도 모르겠다..

SQL에서 변수를 설정하고 (편의상)반복문을 돌린 적이 없으니..

아무튼 MySql에서는 SET을 통해 변수를 설정할 수 있다. SET @변수명 = 초기값; 으로 변수를 만들어 줄 수 있다.

변수를 이용하는 반복문은 WHERE 조건에서 설정한 변수 값의 범위를 주는 것이다.

 

기억해둬야할 점

1. SET을 통해 변수를 설정할 수 있다. -> SET @변수명 = 초기값;

2. SET에서는 := 는 할당 연산자 =와 같다. 하지만, 비 SET 구문에서는 =를 동등연산자로 인식한다.

 

링크

 

:::MySQL Korea:::

9.3. 사용자 정의 변수  여러분은 사용자 정의 변수에 값을 저장한 후에 나중에 그 값을 참조할 수 있다. 이를 통해 하나의 명령문에 있는 값을 다른 명령문으로 전달하는 것이 가능하다. 사용자

www.mysqlkorea.com

QUERY

 

SET @hour = -1;
SELECT (@hour := @hour +1) AS 'HOUR', (SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) AS 'COUNT'
FROM ANIMAL_OUTS
WHERE @hour <23;

 

중성화여부

 

코딩테스트 연습 - 중성화 여부 파악하기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

CASE WHEN END 구문을 완벽하게 숙지하지 못한 것 같아서 포스팅에 남겨본다.

조건에 따라 값을 부여할 때, CASE WHEN END를 쓴다.

CASE WHEN 컬럼 = 조건 THEN 부여할 값 END;  로 표현할 수 있다.

 

또한

CASE 컬럼 WHEN 조건 THEN 부여 값 END; 로 표현할 수도 있다.

 

하지만 이 문제에서는 문자열에 특정 문자가 포함되는지 확인하는 LIKE 구문을 이용해야하기 때문에 첫번째로 작성한 구문으로 하는 것이 맞는 것 같다. (아래 표현은 하는 법을 모르겠어서인지 제대로 안나옴)

 

QUERY

 

SELECT ANIMAL_ID, NAME,
    (CASE WHEN SEX_UPON_INTAKE LIKE 'Neutered%' THEN 'O'
          WHEN SEX_UPON_INTAKE LIKE 'Spayed%' THEN 'O' ELSE 'X' END) AS '중성화'
FROM ANIMAL_INS;

 

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

 

코딩테스트 연습 - 오랜 기간 보호한 동물(2)

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

이 문제는 LIMIT에 대한 기억을 남기려고 작성한다.

특정 조건에서 갯수 제한을 둘 때, LIMIT 숫자 를 적어, 입력한 숫자만큼만 테이블에 표시되도록 설정해준다.

또한, INNER JOIN과 WHERE 절 둘 다 이용해서 풀 수 있었다.

 

QUERY

 

## INNER JOIN
SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS AS I
JOIN ANIMAL_OUTS AS O
ON I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY (O.DATETIME - I.DATETIME) DESC LIMIT 2;

## WHERE Clause
#SELECT I.ANIMAL_ID, I.NAME 
#FROM ANIMAL_INS AS I, ANIMAL_OUTS AS O
#WHERE I.ANIMAL_ID = O.ANIMAL_ID
#ORDER BY O.DATETIME-I.DATETIME DESC LIMIT 2;

 

DATETIME에서 DATE로 변환

 

코딩테스트 연습 - DATETIME에서 DATE로 형 변환

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

DATE_FORMAT 이라는 것이 익숙하지 않았다. DATE_FORMAT(DATETIME 컬럼명, "변환할 형식") 으로 표현한다.

이때, 변환할 형식에는 "%Y-%m-%d" 이런 식으로 표현하고, 대소문자에 따라서 값이 달라진다. 확인하자.

 

QUERY

 

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

 

NULL 처리하기

 

코딩테스트 연습 - NULL 처리하기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

IFNULL 구문은 해당 컬럼이 NULL인 경우, 특정 값을 넣어줄 수 있다.

IFNULL(컬럼명, 넣을 값) 을 이용하면 된다. ( SELECT 안에서 이용하는듯)

 

QUERY

 

SELECT ANIMAL_TYPE, IFNULL(NAME,'No name') AS 'NAME', SEX_UPON_INTAKE FROM ANIMAL_INS;
반응형