MySQL + Programmers_3

naughty _deer·2022년 4월 26일
0

MySQL

목록 보기
5/13
post-thumbnail

GROUP BY

문제 1. 고양이와 개는 몇 마리 있을까

SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE)
FROM ANIMAL_INS a
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE

문제 2. 동명 동물의 수 찾기

SELECT NAME, COUNT(NAME) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT > 1
ORDER BY NAME

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

SELECT hour(datetime) as hour, count(datetime) as count
FROM animal_outs
GROUP BY hour
HAVING hour >= 9 and hour <20
ORDER BY hour

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

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

여기서 @hour <=23 or @hour < 24 라고 하면,
24까지 조회된다. query가 시작할 때, 1을 더하면서 시작되기 때문이다.
따라서, WHERE @hour가 23일 때, query가 시작되면 결과 값에 찍히는 것은 기존의 23에 +1 이 된 24 다.

사용된 명령어

GROUP BY

문제를 풀거나 결과 값을 보게 되면 감이 잡히지만 말로 설명하자면 꽤나 어렵다...

SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE)
FROM ANIMAL_INS a
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE

위 코드의 경우,
ANIMAL_TYPE의 종류'에 따라' 그 수를 센다.
말 그대로 그룹핑한다고 느끼면 된다.

GROUP BY hour 라면,
hour가 여러 종류가 있을텐데, hour'에 따라'~

GROUP BY name이라면,
여러 name이 있을텐데, name'에 따라'~

HAVING

GROUP BY로 묶을 때 조건을 달고 싶다면,
GROUP BY 밑에 HAVING 을 달아준다.

WHERE의 역할과 같지만,
그렇다고 WHERE을 쓰면 에러가 발생한다.

SET

표에서는 필요한데, table에는 값이 없다면, 변수를 설정하면 된다.

@변수명 := 초기 값;

이후 변수에 기본적인 연산이 가능하고, 조건문에서 비교할 수도 있다.
@의 등장은 그 뒤의 값이 변수라는 뜻이다.
변수는 query가 끝나도 유지된다.

*변수 선언 시, 세미클론은 필수!

서브 쿼리

하나의 SQL문 안에 포함된 또 다른 SQL문을 뜻한다.

서브쿼리 사용 시 주의점

  1. 괄호로 감싸서 사용.
  2. 서브쿼리에서는 ORDER BY 사용 불가

서브쿼리의 종류

  1. Single Row 서브쿼리
    쿼리 결과가 단일 행만을 리턴.

    단일 행을 리턴하기 때문에 단일행 비교 연산자를 사용해야 한다.
    단일행 비교 연산자: =, >, <, <>

  2. Multie Row 서브쿼리
    쿼리 결과가 여러 행을 리턴.

여러 행을 리턴하기 때문에 다중행 비교 연산자를 사용해야 한다.
다중행 비교 연산자: IN, ANY, SOME, EXISTS

  1. Multie column 서브 쿼리
    쿼리 결과가 여러 column을 리턴.
profile
개발자로 취업하기

0개의 댓글