SQL 코드카타
문제 23
중성화 여부 파악하기
처음 답안
SELECT ANIMAL_ID,
NAME,
IF(SEX_UPON_INTAKE LIKE '%Neutered%'
OR SEX_UPON_INTAKE LIKE '%Sprayed%', 'O', 'X' ) AS '중성화' -- 오타, 'Spayed'가 맞다
FROM ANIMAL_INS;
최종 답안
SELECT ANIMAL_ID,
NAME,
CASE WHEN SEX_UPON_INTAKE LIKE '%Neutered%' then 'O' -- IF 대신 CASE WHEN 사용
WHEN SEX_UPON_INTAKE LIKE '%Spayed%' then 'O' -- 오타 수정
ELSE 'X' END AS '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
틀린 이유
'spayed'를 'sprayed'라고 오타냄
개선점
[MySQL] 조건이 하나일 때는 IF 사용, 조건이 여러 개일 때는 CASE WHEN 사용
이 문제의 경우 IF문으로 처리해도 문제없었지만
조건이 여러 개일 때는 CASE WHEN을 사용하는 것이 더 깔끔하다고 느껴진다.
SELECT ANIMAL_ID,
NAME,
IF(SEX_UPON_INTAKE LIKE '%Neutered%'
OR SEX_UPON_INTAKE LIKE '%Spayed%', 'O', 'X' ) AS '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
Python 알고리즘 코드카타
문제 16
x만큼 간격이 있는 n개의 숫자
처음 답안
def solution(x, n):
answer = []
for i in range(1, n+1):
answer += i*x #int object is not iterable 오류
return answer
최종 답안
def solution(x, n):
answer = []
for i in range(1, n+1):
answer.append(x*i)
return answer
틀린 이유
리스트에 원소를 추가할 때 '+=' 사용
개선점
리스트에 원소를 추가할 때는 listname.append(추가할 값) 쓴다.
새롭게 알게 된 것
1. for loop + list에 원소 추가
템플릿
answer = []
for i in range(1, n, 2):
answer.append(i)
print(answer)
2. for loop + string에 문자열 이어붙이기
템플릿
answer = ''
for i in range(1, n):
answer += str(i)
print(answer)
3. for loop + integer에 특정 값 연산하기
템플릿
answer = 1
for i in range(1, n, 4):
answer *= i
print(answer)
SQLD
NULL
- 값이 정해지지 않은 상태
- 공백이나 숫자 0과는 전혀 다르다
- 집계함수는 NULL 값을 제외하고 처리한다.
- 사칙 연산 시 NULL과 함께 하면: 대부분 NULL
본질식별자(Natural Key)와 인조식별자(Surrogate Key)
- 본질식별자
자연스럽게 만들어진 식별자
데이터 자체에 들어 있음
복합 본질식별자는 복잡성 증가할 수 있음
예시) 주민등록번호
- 본질식별자의 단점
길이와 복잡성
갱신 연산 부하
- 인조식별자
외부에서 임의로 지정해서 만들어진 식별자
데이터 일관성 유지
복합 본질식별자의 복잡성 피할 수 있음
- 인조식별자의 단점
비즈니스 의미 부족
추가적인 인덱스 관리
인덱스 낭비
- 문제1: 중복 데이터로 인한 품질 문제
외부 식별자 사용해도 중복 데이터를 막을 수 없다.
데이터 일관성 문제
데이터 정확성 문제
검색 및 분석의 어려움
자원 낭비
오류 가능성 증가
- 문제2: 불필요한 인덱스 생성
인덱스란? DB가 데이터를 빠르게 찾기 위해 순서를 유지하고 있는 데이터