일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- github
- 파이썬 # python # copy
- mysql # SQL # 프로그래머스 # 코딩테스트
- 프로그래머스 # sql # mysql # 코딩테스트 # 연습
- 프로그래머스 # sql #mysql # 코딩테스트 # recursive cte
- 프로그래머스 # 코딩테스트 # SQL # mysql # 차집합
- inflearn
- 딥러닝 # GPU # 프레임워크 # 엣지 AI # GTC 2020 Online
- 딥러닝#초보#MLE#Cross-entropy#메모
- udacity#유다시티#자료구조#알고리즘#기초
- Git
- NVIDIA # GTC 2020 # Webinar # GTC 행사
- spark#apache spark#입문#스파크#빅데이터
- Today
- Total
from Karte,
[프로그래머스 코딩테스트 연습 SQL ] #1. string type 열에서 조건 검색 본문
* 오타, 오류 등 포스팅 내용에 문제가 있을 시 댓글로 알려주세요. 수정하겠습니다.
* 유/무료 서비스 혹은 국비지원 프로그램의 이름이 등장합니다만, 광고 또는 홍보 목적이 아니며 금전적 지원을 받은 사실이 없음을 밝힙니다.
올해 4월부터 6월까지 Dataquest 라는 데이터 분석/사이언스/엔지니어링 학습 사이트를 구독하면서 해당 사이트 기준의 intermediate 단계 ( join, subquery, with clause 활용 & pysql) 까지 연습을 했었다. 그간 데이터 청년 캠퍼스 교육을 받느라 sql 공부는 잠시 미루어 놓았었는데 😭 조금씩 여유 시간이 나기 시작해 다시 연습을 시작했다!
우연히 구글링을 통해 '프로그래머스' 라는 사이트를 알게 되었고, 감사하게도 sql 연습 문제도 무료로 제공한다고 하길래 가입을 했다. 그리고 바로 코딩 테스트 연습용 문제인 최댓값 구하기부터 풀어보기로 했다.
한동안 이 카테고리에는 프로그래머스에서 제공하는 코테 연습용 sql 문제를 풀고 나서 잘 못 푼 문제들을 정리하거나 기본 문제에서 나만의 응용을 추가하여 다시 푼 것을 정리한 식의 포스팅이 올라올 예정이다.
첫 번째 정리 string type 열에서 조건 검색
문제: 코딩테스트 연습 - 모든 문제 - MySQL 필터링 적용 - NULL 처리하기
( 본문 링크 : programmers.co.kr/learn/courses/30/lessons/59410 )
ANIMAL_INS 테이블은 동물 보호소에 들어온 정보를 담은 테이블 입니다.
ANIMAL_TABLE 테이블 구조는 다음과 같으며, ANIMAL_ID ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME,
SEX_UPON_INTAKE 는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
NAME | TYPE |
ANIMAL_ID | VARCHAR(N) |
ANIMAL_TYPE | VARCHAR(N) |
DATETIME | DATETIME |
INTAKE_CONDITION | VARCHAR(N) |
NAME | VARCHAR(N) |
SEX_UPON_INTAKE | VARCHAR(N) |
입양 게시판에 동물 정보를 게시하려 합니다. 동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회하는 SQL 문을 작성해 주세요. 이때 프로그래밍을 모르는 사람들은 NULL 이라는 기호를 모르기 때문에, 이름이 없는 동물의 이름은 "No name" 으로 표시해 주세요.
정답 화면 예시
원래 문제 내용 및 부가 설명을 요약하면 위와 같다. IFNULL() 함수를 이용하여 답은 맞췄으나, SEX_UPON_INTAKE 컬럼으로부터 '중성화 여부' 라는 컬럼을 파생하여 보호 동물의 중성화 여부를 더 확실히 알 수 있도록 하면 어떨까 하는 생각이 들었다. 즉, 'Neutered' 혹은 'Spayed' 라는 단어가 포함 되었으면 중성화 "Yes", 아니면 "No" 이다. 결과 화면은 다음과 같다.
(+ 09.29 추가: 'MySQL - Level 2 로 필터 걸어서 '중성화 여부 파악하기' 문제 발견. 생각했던 내용이 이미 다른 문제로 출제되어 있었다.)
내가 생각한 풀이는 CASE statement 와 LIKE 연산자를 함께 이용하는 것이었다.
SELECT
ANIMAL_TYPE 종,
IFNULL(NAME, "No name") 이름,
SEX_UPON_INTAKE 성별, # CASE 문으로 넘어갈 때 쉼표 주의!
CASE
WHEN SEX_UPON_INTAKE LIKE 'Neutered%' OR SEX_UPON_INTAKE LIKE 'Spayed%'
THEN 'Yes'
ELSE 'No'
END AS '중성화 여부'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC; # 아이디 순으로 오름차순 정렬
그런데 쓰고 보니 LIKE ~ OR 을 여러 번 반복해서 쓰는 것이 한 눈에 이해가 잘 되긴 해도 귀찮기도 하고 (...) 오타를 낼 가능성도 높아지는 것 같아 여러 개의 substring 을 한꺼번에 검색할 수 있는 방법이 없는지 구글링을 했고...스택오버플로우 사이트에서 REGEXP 연산자를 찾아냈다!
따라서 위 코드의 CASE 문을 다시 쓰면 아래와 같다.
CASE
WHEN SEX_UPON_INTAKE REGEXP 'Neutered |Spayed'
THEN 'Yes'
ELSE 'No'
END AS '중성화 여부'
이외에도 substring 을 검색하는 방법에는 CONTAINS() 함수 또는 CHARINDEX() 함수를 사용하는 방법이 있다고 한다. 그러나 프로그래머스 실행 창에서 실험을 한 결과 CONTAINS() 함수는 결과가 뜨지 않았고, CHARINDEX() 함수는 해당 명령을 실행할 권한이 없다고 하여 내가 짠 코드가 제대로 된 것인지 확인을 할 수 없었다.
우선 오늘은 여기까지 하고, 두 함수와 실행 속도 등에 대한 이야기는 가능하다면 추후 다른 포스팅에서 다루어 보기로 한다.
'study log > SQL' 카테고리의 다른 글
[프로그래머스 코딩 테스트 연습 SQL] #4. 교집합 (0) | 2020.10.07 |
---|---|
[프로그래머스 코딩테스트 연습 SQL] #3. 차집합 (0) | 2020.10.01 |
[프로그래머스 코딩 테스트 연습 SQL] #2. RECURSIVE WITH 문 ( Recursive CTE) (0) | 2020.09.25 |