Programmers SQL 고득점 Kit - GROUP BY편

1 minute read

GROUP BY

programmers SQL 고득점 Kit - GROUP BY 편

1. (*) 고양이와 개는 몇 마리 있을까

  • GROUP BY

    => Select ~~~ From ~ where ~ GROUP BY ~ Order By (정렬하고 싶은 열) ASC DESC
  • MySQL 그룹별 카운트 값 구할 때,

    => SELECT COUNT(칼럼명) ~~~~ GROUP BY (칼럼명)

  • 오래 걸린 이유 -> ORDER BY 해주지 않아도 알아서 오름차순으로 정렬될 줄 알았는데 ORDER BY 할 COLUMN명을 명시해줬어야 함!

    SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) AS count FROM ANIMAL_INS GROUP BY ANIMAL_TYPE ORDER BY ANIMAL_TYPE ASC
    

2. 동명 동물 수 찾기

  • GROUP BY ~ HAVING

    => 그룹으로 묶은 다음 해당 그룹마다 조건을 주고 싶을 때 HAVING 절을 사용한다

    SELECT NAME, COUNT(NAME) as COUNT FROM ANIMAL_INS WHERE NAME IS NOT NULL GROUP BY NAME HAVING COUNT(NAME)>=2 ORDER BY NAME
    

3. (**) 입양 시각 구하기(1)

  • 조건절에 BETWEEN을 사용하려다가 오래걸림(아래 두 가지 조건절 모두 가능!)

    => WHERE HOUR(DATETIME) BETWEEN 9 AND 19

    => WHERE HOUR(DATETIME)>=9 AND HOUR(DATETIME)<=19

  • DATETIME을 시간으로 뽑으려면 HOUR(DATETIME)

    => 그룹으로 묶은 다음 해당 그룹마다 조건을 주고 싶을 때 HAVING 절을 사용한다

    SELECT HOUR(DATETIME) AS HOUR, COUNT(HOUR(DATETIME)) AS COUNT
    FROM ANIMAL_OUTS
    WHERE HOUR(DATETIME)>=9 AND HOUR(DATETIME)<=19
    GROUP BY HOUR(DATETIME)
    ORDER BY HOUR(DATETIME)
    

(*) SQL 구문 읽는 순서 FROM(1)-> WHERE(2) -> GROUPBY(3) -> HAVING(4) -> SELECT(5) -> ORDER BY(6)

4. (***) 입양 시각 구하기(2)

  • SET 변수 선언 ( = , := )

    => SET @hour := -1

    (*) 이후에 해당 변수 사용할 때 계속 ‘@’ 붙여주면서 사용해야해

    (*) += 이런 수식은 사용 불가하고 변수에 값을 대입하려면 ‘@hour := @hour +1’ 이런식으로 써야돼

  • SUBQUERY

    스칼라 서브쿼리 - SELECT절에 사용하는 SUBQUERY

    중첩 서브쿼리 - WHERE문에 작성하는 서브쿼리

    인라인 뷰 - FROM 문에 작성하는 서브쿼리

  • 사실 이런문제까지 코테 SQL에 나올 것 같진 않다…

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

Leave a comment