동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.
# 동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회
# 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회
SELECT NAME, COUNT(*) AS COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT(*) >= 2
ORDER BY NAME
이 문제를 풀면서 GROUP BY
, HAVING
, NULL
이 사용되었는지 정리할 필요를 느꼈다.
GROUP BY
GROUP BY
문은 하나 이상의 컬럼에 대해 그룹화하여 집계함수와 함께 사용함. MySQL에서는
GROUP BY에서 사용한 컬럼은
SELECT문에 있지 않아도 에러가 나지 않지만, SQL표준에서는 포함해야 하므로 PostgreSQL, SQL Server, Oracle에서는 에러가 발생함. 따라서
GROUP BY에서 사용한 컬럼은
SELECT` 문에서 사용하도록 하자..
HAVING
HAVING
문은WHERE
문에서 집계함수가 사용되지 못하기에 추가되었다.
NULL
✔
COUNT(*)
는NULL
값이 포함된 컬럼이 있어도 전체 행 수를 반환함.
✔COUNT(컬럼명)
은NULL
값을 제외하고 개수를 계산함
⇒ 스터디에서 다른분이 COUNT(NAME)하셔서 굳이 WHERE문에 조건(WHERE NAME IS NOT NULL
)을 사용하지 않고 풀수도 있다는 사실을 알았다.
여기서, 생뚱맞게 WHERE
문을 사용하지 않는 게 무조건 좋은건지 궁금해졌다. 그래서 GPT에게 물어보았다.
WHERE
문을 사용하지 않는게 무조건 좋은가?
⇒ 그건 아님. 해당 컬럼이 인덱스에 속해 있으면 B-TREE로 탐색하기 때문에 오히려WHERE
문을 사용하는게 연산속도가 더 빠름. 그렇지 않은 경우WHERE
문이 전체 행을 탐색해야되서 연산속도가 느림
다만, 이 문제에서는 NAME이 인덱스가 아니므로 WHERE
문을 사용하지 않는 게 더 좋다고 판단했다.
SHOW INDEX FROM 테이블명;
# Column_name에서 인덱스가 적용된 컬럼 확인