[SQL] 동명 동물 수 찾기

Ray·2025년 3월 6일
0

SQL

목록 보기
14/19

🔎 문제설명

  • 출처: 프로그래머스
  • 사용언어(RDBMS): SQL(MySQL)
  • 문제:

    동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 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에서 인덱스가 적용된 컬럼 확인 
profile
미래의 독자인 나를 위해 글을 씁니다.

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN