- 이름에 el이 들어가는 동물 찾기
동물 보호소에 들어온 동물 이름 중, 이름에 "EL"이 들어가는 개의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 이름 순으로 조회해주세요. 단, 이름의 대소문자는 구분하지 않습니다.
# 내가 작성한 쿼리<오답>
SELECT animal_id, name
FROM animal_ins
WHERE animal_type = 'Dog' AND name IN('%EL%' , '%el%')
ORDER BY name
SELECT animal_id, name
FROM animal_ins
WHERE animal_type = 'Dog' AND name LIKE '%EL%' OR name LIKE '%el%'
ORDER BY name
# <정답>
SELECT animal_id, name
FROM
(
SELECT *
FROM animal_ins
WHERE animal_type = 'Dog'
) a
WHERE name LIKE '%EL%' OR name LIKE '%el%'
ORDER BY name
+
1. IN 으로는 아무것도 조회되지 않았음
2. 'Dog' 이고 'EL' 이 들어갔거나 'el' 이 들어간 동물로 찾기 때문에
'Cat' 인 동물도 함께 출력되었다.
AND, OR 은 순서대로 실행됨!
3. 여러가지 조건을 사용 못하나 해서 서브쿼리를 사용했는데 정답이 나왔다.
MySQL 이어서 대소문자 두가지 경우만 적었어도 우연히 나왔던 것 같은데
문제에서 요청했던 사항은 대소문자가 섞여 있던 이름이기 때문에
경우의 수를 잘 생각해서 가공함수를 사용해야 할 것!
# <다른 쿼리 방식>
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'Dog'
AND UPPER(NAME) LIKE UPPER('%el%')
ORDER BY NAME
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NAME LIKE LOWER('%EL%') AND ANIMAL_TYPE = 'DOG'
ORDER BY NAME
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NAME like '%eL%' and ANIMAL_TYPE = 'DoG'
ORDER BY 2;
MySQL 은 LIKE 로 검사시 좌변을 UPPER, LOWER 등으로 가공하지 않아도 조회 가능하다고 한다!
UPPER: 대문자로
LOWER: 소문자로
Q. IN 으로는 왜 조회가 되지 않았는지?
SELECT animal_id, name
FROM animal_ins
WHERE animal_type = 'Dog' AND name IN('%EL%','%el%','%El%','%eL%')
ORDER BY name
경우의 수가 잘못되었나 해서 IN 안에 다 넣어봤으나
아무것도 조회되지 않았다.
dog 이고 이름에 EL 이 있는
dog 이고 이름에 el 이 있는
dog 이고 이름에 El 이 있는
dog 이고 이름에 eL 이 있는
이렇게 4가지를 찾는게 아닌건가.. ?
A. 와일드카드 % 는 LIKE 랑만 사용 가능하다!!
대소문자는 구분하지 않느다고 하여서 'EL' , 'el' 로 단순하게 생각하였는데
문제풀이를 보니 'El' ' eL' 이렇게도 들어갈 수 있는 거였다
MySQL 에서는 대소문자를 가리지 않고 조회가능하다고 하나
다른 언어에서는 좌변을 가공해야 수월하게 조회할 수 있을 것 같다
UPPER, LOWER 잘 외워둬야겠다.
'SQL 코드카타' 카테고리의 다른 글
진료과별 총 예약 횟수 출력하기 # MONTH() (0) | 2024.03.28 |
---|---|
입양 시각 구하기(1) # HOUR() (0) | 2024.03.28 |
12세 이하인 여자 환자 목록 출력하기 (0) | 2024.03.22 |
흉부외과 또는 일반외과 의사 목록 출력하기 (1) | 2024.03.22 |
자동차 대여 기록에서 장기/단기 대여 구분하기 (0) | 2024.03.21 |