[내일배움캠프] SQL/Python 코드카타

sleekstar·2025년 5월 15일

SQL

문법 정리

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은 그룹화 후에 조건 필터링
    (둘 다 FROM문 이후에 등장)

GROUP BY에 관한 고민

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가 있어도 에러를 안 내기 때문에
실수한 줄 모르고 잘못된 결과를 쓸 수 있음에 유의해야 한다.

Python

고민

오늘의 코드카타들은 사칙연산을 하는 함수를 정의하는 것.
내용 자체는 쉬운데, 문제가 다음과 같이 나올 때 고민이 생겼다.

정수 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

실무에서는 예외 입력값이 정상 범위인지 반드시 확인해야 버그를 예방할 수 있기 때문에, 예외 처리 방식인 'raise'를 많이 사용한다고 한다.

✅ 예외 처리로 바꾸고 싶다면?

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

이렇게 하면 예외 발생 시 발생 원인까지 전달할 수 있어 효율적인 것 같다.

profile
기록용

0개의 댓글