요약/나만의 인사이트
- select는 행마다 돌며 조건에 맞는 값을 출력해서 조회한다.
- 따라서 @hour = @hour +1 할 경우 1씩 더하며 변수에 저장 후 행마다 돌기 때문에 반복문을 실행하는 것과 같은 효과가 나타난다.
- 단 반복하는 구간을 지정하고 싶으면 where < 23 해주면 된다.
- 행이 0부터 시작하길 원하면 변수 초기값을 -1로 셋팅하면 수월하다.
- 파이썬 코드짤 때 요구사항 → 로직정리(이때 첫번째관문, 두번째 관문 등의 거쳐하는 관문을 블록처럼 생각하면 수월하다.)
- 공통으로 거쳐야 하는 요소 (예를들어 빈 반환값 셋팅 anwer = []) 은 상단에 만들어 놓는다.)
- for문 if문 등은 같은 들여쓰기 위치에 있으면 독립적으로 실행된다.
- 위의 if의 참, 거짓과 상관없이 둘다 실행 if if
- 순서대로 실행, 만약 참이면 참인 구문만 실행 if elif else
새롭게 알게 된 것
- SQL 변수선언 @hour := hour + 1
#변수 선언
DECLARE @product_name VARCHAR(50);
DECLARE @product_price DECIMAL(10, 2);
#참고 DECIMAL(10, 2) : 소수점을 포함하는 숫자 데이터를 저장하기 위한 자료형
10 - 전체자릿수
2 - 소수점 이하 자리수
즉 최대 10자리 숫자까지 저장할 수 있으며 2자리는 소수점 이하 자릿수로 사용
12345678.90
#변수 할당
SET @product_name = 'Laptop';
SET @product_price = 1200.50;
#쿼리 결과 변수 할당
SELECT @product_name = name, @product_price = price
FROM products
WHERE product_id = 1;
- 관련 문제
- 문제:https://school.programmers.co.kr/learn/courses/30/lessons/59413
- 요구사항
- 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회
- 시간대 순으로 정렬
- 오답
- #단순하게 시간대별 입양횟수를 파악하기 위해 COUNT 함수를 수행했다. #그러나 0시 ~ 6시 정보가 없다는 점을 파악했다. SELECT HOUR(DATETIME) AS HOUR, COUNT(ANIMAL_ID) FROM ANIMAL_OUTS GROUP BY HOUR(DATETIME) ORDER BY 1
- 정답SET @hour := -1; hour이라는 변수를 만들고 값을 -1로 초기화
| @hour := @hour +1 |
0 = -1 +1 |
| 그래서 HOUR는 0 |
|
| count(*) |
datetime의 시간 값이 0인 행의 개수 카운트 |
| FROM ANIMAL_OUTS |
이 테이블의 행 수만큼 반복해서 실행하게 만들어줌 |
| 즉 @hour := @hour + 1 평가되어 증가된 값이 변수에 저장되고 다음 행 이어서 실행 |
|
| @hour < 23 |
다만 @hour <23일 때까지만 결과 출력 |
| (즉, 0시부터 23시까지) |
|
- 꼭 기억해야 할 핵심 포인트
- set @hour := -1 은 변수 선언해서 초기값 -1을 할당하는 것
- @hour := @hour +1 select가 실행될 때마다 1씩 증가하며 누적됨, → 각 행(row)이 평가될 때 이 식이 실행돼서, @hour가 차례대로 0, 1, 2...로 변함
- from animal_outs 이 테이블의 행 수만큼 select가 반복실행됨
- @hour <23 hour이 23 전까지는 멈춤
다시 말해 행(row)의 수만큼 SELECT가 반복 실행되며, 각 행마다 @hour를 1씩 증가시켜 hour 값을 만들고 @hour <23 조건을 통해 24만 출력되도록 제한된다. 행 수만큼 SELECT가 반복 실행되는 이유는 SELECT문이 행 단위로 데이터를 처리하는 언어이기 때문. 즉 FROM 절에 있는 테이블의 각 행마다 SELECT 절이 한번씩 실행된다는 개념
SET @hour := -1; -- 변수 선언 SELECT (@hour := @hour + 1) as HOUR, -- 행이 1씩 추가되도록 함 (SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) as COUNT FROM ANIMAL_OUTS WHERE @hour < 23
특히 어려웠던 것
다음에 적용해 볼 것
- [ ] 가벼운 마인드, 꾸준히 재밌게 정진해서 실력을 향상한다. 나는 나만의 속도로 간다!
- [ ] 중요한건 학습의 즐거움이다!!