COALESCE (COLUMN, ... , NULL이 아닌 대체값): NULL값 대체.
HAVING: GROUP BY 이후 집계 함수 결과를 조건으로 필터링할 때 사용.
=>관련 문제: 동명 동물 수 찾기
답안:
SELECT
NAME,
COUNT(NAME) AS COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT >=2
ORDER BY NAME;
WHERE은 그룹화 전에 조건 필터링HAVING은 그룹화 후에 조건 필터링GROUP BY는 필요 없는 경우에도 써서 나쁠 게 없어 보이는데 맞나?
예를 들어, '동물 보호소에 들어온 동물 중 아픈 동물의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.'SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION = 'Sick'이 코드의 끝에 GROUP BY를 붙여도 코드 실행에는 문제가 없어 보였음.
BUT 안됨. 왜?
GROUP BY를 썼다는 건 집계를 하고 싶다는 뜻인데,
집계 함수(COUNT, MAX, MIN 등) 없이 SELECT만 하면: MySQL은 같은 ANIMAL_ID 중 하나만 무작위로 보여줌
특히 MySQL은 SELECT에 집계함수 없이 GROUP BY가 있어도 에러를 안 내기 때문에
실수한 줄 모르고 잘못된 결과를 쓸 수 있음에 유의해야 한다.
오늘의 코드카타들은 사칙연산을 하는 함수를 정의하는 것.
내용 자체는 쉬운데, 문제가 다음과 같이 나올 때 고민이 생겼다.
정수 num1, num2가 매개변수로 주어질 때, num1을 num2로 나눈 몫을 return 하도록 solution 함수를 완성해주세요.
제한사항
0 < num1 ≤ 100
0 < num2 ≤ 100
이때, 제한사항을 코딩에 넣지 않아도 작동에 문제 없었음, 정답 처리.
def solution(num1, num2):
return num1 // num2
아마 테스트에서는 이미 조건이 충족되어있다고 전제하는 것 같음.
그래도 제한 조건을 포함하는 방법으로 작성해보았다.
def solution(num1, num2):
if not (0 < num1 <= 100):
return "num1은 1 이상 100 이하의 정수여야 합니다."
if not (0 < num2 <= 100):
return "num2는 1 이상 100 이하의 정수여야 합니다."
return num1 // num2
✅ 예외 처리로 바꾸고 싶다면?
def solution(num1, num2):
if not (0 < num1 <= 100):
raise ValueError("num1은 1 이상 100 이하의 정수여야 합니다.")
if not (0 < num2 <= 100):
raise ValueError("num2는 1 이상 100 이하의 정수여야 합니다.")
return num1 // num2
이렇게 하면 예외 발생 시 발생 원인까지 전달할 수 있어 효율적인 것 같다.