행궁동 데이터 엔지니어

반응형

프로그래머스 SQL 문제 중 GROUP BY 카테고리에 속한 1문제를 풀어 봤습니다.

이번에는 0~23시의 모든 HOUR를 출력하기 위해 [SET @변수명 = '값';]을 사용해서 풀어봤습니다.

확실히 UNION을 사용해 SELECT 쿼리를 결합할 때보다 쿼리문이 짧아졌습니다.

 

주요 사용 쿼리/함수 : [SET @변수명 = '값';] [@변수명 := '값';], GROUP BY, HOUR(시간)

 

변수 선언과 관련한 짤막한 이야기

  • SET @변수명 = '값';
  • SET @변수명 := '값'; 
  • 위의 2가지 방법으로 MySQL에서 변수를 선언할 수 있습니다.
  • SET 명령어를 사용한 변수 선언 시 '=' 와 ':=' 2가지 방법은 차이가 없습니다.
  • 하지만 SET을 제외한 다른 쿼리문(SELECT 등)은 '=' 를 비교연산자(comparison operator)로 인식하기 때문에, SET이 아닌 쿼리문에서는 반드시 대입 연산자(assignment operator) ':='을 사용해 야 합니다.
  • 결론적으로 보면 '='와 ':=' 차이는 아래와 같습니다.
  • '=' : MySQL에서 대입연산자, 비교연산자 2가지로 사용 됨 (SET 명령어에서만 대입 연산자로 인식)
  • ':=' : MySQL에서 대입 연산자로만 사용 됨 
  • 변수 사용 시 명시적으로 대입 연산자의 의미만을 갖는 ':=' 의 사용을 권장합니다. 

 

입양 시각 구하기(2) 문제 풀이 2안

  • SET으로 HOUR_LIST라는 변수를 선언하고 +1 씩 하며 0~23시 까지 모든 시간에 대한 COUNT를 출력
  • UNION을 이용한 문제 풀이도 아래에 남겨두었습니다.

https://programmers.co.kr/learn/courses/30/lessons/59413

 

코딩테스트 연습 - 입양 시각 구하기(2) | 프로그래머스

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. NAME TYPE NULLABLE ANIMAL_ID VARCHAR(N) FALSE ANIMAL_TYPE VARCHAR(N) FA

programmers.co.kr

- 프로그래머스 SQL 문제풀이
-- 2(변수 사용)
-- 프로그래머스 > GROUP BY > 입양 시각 구하기(2)
-- 링크 : https://programmers.co.kr/learn/courses/30/lessons/59413
-- 코드를 입력하세요
SET @HOUR_LIST = -1;
SELECT
(@HOUR_LIST := @HOUR_LIST + 1) AS 'HOUR',
(SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @HOUR_LIST) AS 'COUNTS'
FROM ANIMAL_OUTS
WHERE @HOUR_LIST <23;
-- 1(UNION 사용)
-- 프로그래머스 > GROUP BY > 입양 시각 구하기(2)
-- 링크 : https://programmers.co.kr/learn/courses/30/lessons/59413
-- 코드를 입력하세요
SELECT H1.HOUR, IFNULL(OUTS.COUNT,0) AS COUNT
FROM (
SELECT 0 AS HOUR
UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8
UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12
UNION SELECT 13 UNION SELECT 14 UNION SELECT 15 UNION SELECT 16
UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION SELECT 20
UNION SELECT 21 UNION SELECT 22 UNION SELECT 23 ) H1
LEFT JOIN (
SELECT HOUR(DATETIME) AS 'HOUR', COUNT(*) AS 'COUNT'
FROM ANIMAL_OUTS
GROUP BY HOUR) AS OUTS ON H1.HOUR = OUTS.HOUR

혹시 UNION을 사용한 풀이가 궁금하신 분은 아래 링크에서 확인하시면 됩니다.

(쿼리문은 위에 통합으로 올라가 있습니다.)

https://mentha2.tistory.com/97

 

[프로그래머스, SQL 문제] 입양 시각 구하기(2) (GROUP BY) with MySQL

프로그래머스 SQL 문제 중 GROUP BY 카테고리에 속한 1문제를 풀어 봤습니다. SQL문제 중 LEVEL 4로 난이도가 높았습니다. UNION을 사용하니 확실히 쿼리가 길어지네요. 다음번에는 변수를 사용해서 풀어 보겠습니..

mentha2.tistory.com

1. TCPschool, 대입 연산자 설명, http://tcpschool.com/mysql/mysql_operator_assignment
2. 삼쾌한 IT 강의, MySQL 변수 종류 및 사용법, https://three-pleasure.tistory.com/256
반응형

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band