https://eminentstar.github.io/2017/06/24/select-groupby.html
https://gent.tistory.com/505
NULL 값을 가진 행을 제외
하고 수행한다.WHERE 절로 가장 처음에 row들을 필터링하고, 그 후에 그룹핑까지 거친 후에 HAVING 절에서 그 조회된 그룹들을 다시 필터링한다.
SELECT - 5순위 (필수)
FROM - 1순위 (필수)
WHERE - 2순위
GROUP BY - 3순위
HAVING - 4순위
ORDER BY - 6순위
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
SELECT INGREDIENT_TYPE, sum(TOTAL_ORDER) as TOTAL_ORDER
from FIRST_HALF A
inner join ICECREAM_INFO B
on A.FLAVOR = B.FLAVOR
group by INGREDIENT_TYPE
order by TOTAL_ORDER
SELECT ANIMAL_TYPE, count(ANIMAL_TYPE) as count
from ANIMAL_INS
group by ANIMAL_TYPE
order by ANIMAL_TYPE;
SELECT NAME, count(name) as count
from ANIMAL_INS
where NAME is not null
group by NAME
having count(name) >= 2
order by NAME
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 /* SELECT이 먼저 실행되기 때문에 HOUR라고 작성해도 된다. */
[ 다른 사람의 코드 ]
SELECT HOUR(DATETIME) HOUR, COUNT(DATETIME) COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
HAVING HOUR >= 9 and HOUR <= 19 /* SELECT 절의 HOUR alias를 사용한다. */
order by HOUR
HAVING HOUR >= 9 and HOUR <= 19
을 작성했는데, HAVING이 SELECT 보다 먼저 실행되는데 SELECT에서 사용된 alias를 사용해도 문제가 발생하지 않는지?⭐️ SELECT의 alias는 GROUP BY, HAVING, ORDER BY에서만 사용 가능하다!!
1. ORDER BY: SELECT 보다 나중에 실행되기 때문에
2. GROUP BY, HAVING: SELECT보다 먼저 실행되지만, MySQL이 미리 SELECT 절을 살펴보기 때문에 사용 가능하다.
⭐️ WHERE 절에서는 SELECT alias를 사용할 수 없고, 실제 컬럼명만 사용해야 한다.
서브 쿼리를 통해서 사용할 수는 있다.
https://stackoverflow.com/questions/49888360/using-alias-in-the-where-and-having-statements
HAVING 절에서 SELECT 절의 Alias를 사용할 수 있는 이유
SELECT USER_ID, PRODUCT_ID
from ONLINE_SALE
group by USER_ID, PRODUCT_ID
having count(*) >= 2
order by USER_ID, PRODUCT_ID desc;
SELECT USER_ID, PRODUCT_ID
from ONLINE_SALE
group by (USER_ID, PRODUCT_ID) /* ❗️ 문제 발생 */
having count((USER_ID, PRODUCT_ID)) >= 2 /* ❗️ 문제 발생 */
order by USER_ID, PRODUCT_ID desc;