[내일배움캠프_데이터분석] 2주차 금요일 TIL _ Like문, In문, REGEXP()
A. 어떤 문제가 있었는지
SQL 코드카타 중 SQL WHERE절에 LIKE문, IN문의 사용 방식이 익숙하지 않다.
문제 |
보호소의 동물이 중성화되었는지 아닌지 파악하려 합니다. 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요. |
B. 내가 시도해본 것
1. WHERE절에 IF문 활용
SELECT ANIMAL_ID, NAME,SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE IF (SEX_UPON_INTAKE IN ('Neutered','Spayed'),'O','X') 중성화
ORDER BY ANIMAL_ID
2-1. SELECT 절에 CASE문 활용
SELECT ANIMAL_ID, NAME,
CASE WHEN SEX_UPON_INTAKE LIKE '%Neutered%' THEN 'O',
WHEN SEX_UPON_INTAKE LIKE '%Spayed%' THEN 'O',
ELSE 'X' END 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
2-2. SELECT 절에 CASE문 활용
SELECT ANIMAL_ID, NAME,
CASE WHEN SEX_UPON_INTAKE LIKE '%Neutered%'
OR SEX_UPON_INTAKE LIKE '%Spayed%' THEN 'O',
ELSE 'X' END 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
2-3. SELECT 절에 CASE문 활용
SELECT ANIMAL_ID, NAME,
CASE WHEN SEX_UPON_INTAKE LIKE '%Neutered%' THEN 'O'
WHEN SEX_UPON_INTAKE LIKE '%Spayed%' THEN 'O'
ELSE 'X' END 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
ERROR
/* You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '중성화 ORDER BY ANIMAL_ID' at line 6 */
3. SELECT 절에 IF 문 활용
SELECT ANIMAL_ID, NAME,
IF((SEX_UPON_INTAKE LIKE 'Nuatered%' OR SEX_UPON_INTAKE LIKE 'Spayed%'),'O','X') 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
정답이 아님.
C. 어떻게 해결했는지
1. SELECT절에 CASE문 활용
SELECT ANIMAL_ID, NAME,
CASE WHEN SEX_UPON_INTAKE LIKE '%Neutered%'
OR SEX_UPON_INTAKE LIKE '%Spayed%' THEN 'O'
ELSE 'X'
END 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
2. SELECT절에 IF문 활용
SELECT ANIMAL_ID, NAME,
IF((SEX_UPON_INTAKE LIKE 'Neutered%' OR SEX_UPON_INTAKE LIKE 'Spayed%'),'O','X') 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
D. 무엇을 새롭게 알았는지
1. WHERE 절에 IF문을 사용하지 않음. WHERE절이 이미 IF문과 비슷한 역할을 함. 이에 여러 조건을 내걸고 싶다면 AND, OR 등을 사용한다.
2. CASE문을 사용할 때 여러 조건을 사용할 시 CASE WHEN ~ WHEN~ END 로 중간 쉼표(,)를 사용한다.
3. 오타에 주의해야 한다.
그 외 문제를 풀면서 새롭게 안 사실
1. HOUR 함수를 사용하면 DATE의 '시' 만 출력한다.
SELECT HOUR(DATETIME) HOUR, COUNT(ANIMAL_ID) COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) BETWEEN 9 AND 19
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME)
2. MySQL 5.8 이상부터는 성능 이슈로 인해 SELECT에 포함되지 않은 컬럼으로 정렬할 수 없다.
SELECT FLAVOR
FROM FIRST_HALF
GROUP BY FLAVOR
ORDER BY SUM(TOTAL_ORDER) DESC, SHIPMENT_ID
3. WHERE 절에 REGEXP함수를 사용하면 LIKE 연산자를 여러 번 사용한 코드와 같은 결과를 출력한다.
SELECT CAR_TYPE,COUNT(*) CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS REGEXP ('통풍시트|열선시트|가죽시트')
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE
SELECT CAR_TYPE,COUNT(*) CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%통풍시트%'
OR OPTIONS LIKE '%열선시트%'
OR OPTIONS LIKE '%가죽시트%'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE