
SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE)
FROM ANIMAL_INS a
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE
SELECT NAME, COUNT(NAME) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT > 1
ORDER BY NAME
SELECT hour(datetime) as hour, count(datetime) as count
FROM animal_outs
GROUP BY hour
HAVING hour >= 9 and hour <20
ORDER BY hour
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 다.
문제를 풀거나 결과 값을 보게 되면 감이 잡히지만 말로 설명하자면 꽤나 어렵다...
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'에 따라'~
GROUP BY로 묶을 때 조건을 달고 싶다면,
GROUP BY 밑에 HAVING 을 달아준다.
WHERE의 역할과 같지만,
그렇다고 WHERE을 쓰면 에러가 발생한다.
표에서는 필요한데, table에는 값이 없다면, 변수를 설정하면 된다.
@변수명 := 초기 값;
이후 변수에 기본적인 연산이 가능하고, 조건문에서 비교할 수도 있다.
@의 등장은 그 뒤의 값이 변수라는 뜻이다.
변수는 query가 끝나도 유지된다.
*변수 선언 시, 세미클론은 필수!
하나의 SQL문 안에 포함된 또 다른 SQL문을 뜻한다.
단일 행을 리턴하기 때문에 단일행 비교 연산자를 사용해야 한다.
단일행 비교 연산자: =, >, <, <>
여러 행을 리턴하기 때문에 다중행 비교 연산자를 사용해야 한다.
다중행 비교 연산자: IN, ANY, SOME, EXISTS