프로그래머스 SQL 고득점 Kit
1. SELECT
-- 정렬의 기본은 오름차순. 여러 기준으로 정렬 가능하다
-- NAME으로 오름차순, DATETIME으로 내림차순
SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC
-- 조건문 연산 기호: < <= > >= <> = (C++과 다르니 주의)
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION="Sick" /* 아픈 동물 */
WHERE INTAKE_CONDITION<>"Aged" /* 어린 동물 */
-- 중첩문을 사용하는 조건문
SELECT NAME
FROM ANIMAL_INS
WHERE DATETIME <= All(SELECT DATETIME FROM ANIMAL_INS)
WHERE DATETIME = (SELECT MIN(DATETIME) FROM ANIMAL_INS)
2. SUM, MAX, MIN
-- 중복하지 않게 세기
SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS
-- *GROUP BY를 사용할 수도 있다 (AS 안하면 안돌아감)
SELECT COUNT(A.NAME)
FROM (SELECT NAME FROM ANIMAL_INS
GROUP BY NAME) AS A
3. GROUP BY
-- cat과 dog의 마리 수 조회
SELECT ANIMAL_TYPE, COUNT(*) AS COUNT
FROM ANIMAL_INS
WHERE ANIMAL_TYPE="cat" OR ANIMAL_TYPE="dog"
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE
-- 이름별 동물 수 조회
SELECT NAME, COUNT(*) AS COUNT
FROM ANMAL_INS
WHERE NAME IS NOT NULL /* NULL 검사 반드시!! */
GROUP BY NAME
HAVING COUNT>1 /* GROUP BY ~ HAVING */
ORDER BY NAME /* 이름의 오름차순 */
-- 시각 별 동물 조회
-- : datetime 함수 공부가 필요함
SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR>8 AND HOUR<20
ORDER BY HOUR
-- *근데 이제 24시간을 곁들인
-- : WITH절, JOIN과 CASE, RECURSIVE 등 필요....!
WITH RECURSIVE TIME
AS (SELECT 0 AS HOUR
UNION ALL
SELECT HOUR+1 FROM TIME WHERE HOUR<23)
SELECT HOUR,
COUNT(CASE WHEN ANIMAL_ID IS NOT NULL
THEN 1 END) AS COUNT
FROM TIME
LEFT OUTER JOIN ANIMAL_OUTS
ON (HOUR=HOUR(DATETIME))
GROUP BY HOUR
ORDER BY HOUR
왜 문법 하이라이트 표시가,,,이따위지,,,?
댓글