4. NULL
4-1. ★ NULL 처리하기
입양 게시판에 동물 정보를 게시하려 합니다. 동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 프로그래밍을 모르는 사람들은 NULL이라는 기호를 모르기 때문에, 이름이 없는 동물의 이름은 "No name"으로 표시해 주세요.
MySQL
SELECT ANIMAL_TYPE, IFNULL(NAME,"No name") AS NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
MSSQL
SELECT ANIMAL_TYPE, ISNULL(NAME,"No name") AS NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
5. STRING, DATE
5-1. 루시와 엘라 찾기
동물 보호소에 들어온 동물 중 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물의 아이디와 이름, 성별 및 중성화 여부를 조회하는 SQL 문을 작성해주세요.
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy','Ella','Pickle','Rogan','Sabrina','Mitty')
5-2. 이름에 el이 들어가는 동물 찾기
보호소에 돌아가신 할머니가 기르던 개를 찾는 사람이 찾아왔습니다. 이 사람이 말하길 할머니가 기르던 개는 이름에 'el'이 들어간다고 합니다. 동물 보호소에 들어온 동물 이름 중, 이름에 "EL"이 들어가는 개의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 이름 순으로 조회해주세요. 단, 이름의 대소문자는 구분하지 않습니다.
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'Dog'
AND NAME LIKE '%el%'
ORDER BY NAME
5-3. ★★ 중성화 여부 파악하기
보호소의 동물이 중성화되었는지 아닌지 파악하려 합니다. 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.
SELECT
ANIMAL_ID
, NAME
, CASE
WHEN SEX_UPON_INTAKE LIKE 'Neutered%' THEN 'O'
WHEN SEX_UPON_INTAKE LIKE 'Spayed%' THEN 'O'
ELSE 'X'
END
AS '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
SELECT
ANIMAL_ID
, NAME
, CASE
WHEN SEX_UPON_INTAKE LIKE 'Neutered%'
OR SEX_UPON_INTAKE LIKE 'Spayed%' THEN 'O'
ELSE 'X'
END AS '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
SELECT
ANIMAL_ID
, NAME
, CASE
WHEN SEX_UPON_INTAKE LIKE 'Intact%' THEN 'X'
ELSE 'O'
END AS '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
놓친 점 : CASE WHEN 문 사용이 익숙치 않은 것 같습니다.
5-4. ★ 오랜 기간 보호한 동물(2)
입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.
MySQL
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS AS O
LEFT JOIN ANIMAL_INS AS I
ON O.ANIMAL_ID = I.ANIMAL_ID
ORDER BY O.DATETIME - I.DATETIME DESC
LIMIT 2
MSSQL
SELECT top2 O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS AS O
LEFT JOIN ANIMAL_INS AS I
ON O.ANIMAL_ID = I.ANIMAL_ID
ORDER BY O.DATETIME - I.DATETIME DESC
놓친 점
1. 최근일수록 큰 값입니다.
2. ORDER BY에 연산자 사용 가능합니다.
3. LEFT JOIN 했지만 결국 입양을 나가려면 보호소에 들어와야 하기 때문에 INNER JOIN해도 상관 없습니다.
5-5. ★ DATETIME에서 DATE로 형 변환
ANIMAL_INS 테이블에 등록된 모든 레코드에 대해, 각 동물의 아이디와 이름, 들어온 날짜1를 조회하는 SQL문을 작성해주세요. 이때 결과는 아이디 순으로 조회해야 합니다.
MySQL
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME,'%Y-%m-%d') AS '날짜'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
MSSQL
SELECT ANIMAL_ID, NAME, CONVERT(CHAR(10), DATETIME, 23) AS '날짜'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
놓친 점 : 날짜 변환 포맷 함수 사용이 익숙치 않고, MSSQL은 명시적이지 않아 표를 참고하지 않으면 더 어렵습니다.
6. JOIN
6-1. ★ 없어진 기록 찾기
천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_INS AS I
RIGHT JOIN ANIMAL_OUTS AS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
놓친 점 : JOIN문의 범위에 대한 이해가 더 필요할 것 같습니다.
6-2. 있었는데요 없었습니다
관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS AS O
LEFT JOIN ANIMAL_INS AS I
ON O.ANIMAL_ID = I.ANIMAL_ID
WHERE O.DATETIME < I.DATETIME
ORDER BY I.DATETIME
6-3. 오랜 기간 보호한 동물(1)
아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.
MySQL
SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS AS I
LEFT JOIN ANIMAL_OUTS AS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE O.DATETIME IS NULL
ORDER BY I.DATETIME
LIMIT 3
MSSQL
SELECT top 3 I.NAME, I.DATETIME
FROM ANIMAL_INS AS I
LEFT JOIN ANIMAL_OUTS AS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE O.DATETIME IS NULL
ORDER BY I.DATETIME
6-4. ★ 보호소에서 중성화한 동물
보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.
SELECT O.ANIMAL_ID, O.ANIMAL_TYPE, O.NAME
FROM ANIMAL_INS AS I
RIGHT JOIN ANIMAL_OUTS AS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.SEX_UPON_INTAKE LIKE 'Intact%'
AND O.SEX_UPON_OUTCOME NOT LIKE 'Intact%'
ORDER BY O.ANIMAL_ID
놓친 점 : NOT LIKE 사용을 안 했습니다.
JOIN 테이블 참고
배운 점
오랜만에 SQL문제를 풀 수 있어서 좋은 시간이었습니다. 특히 JOIN문제의 경우 처음 풀 때는 거의 못 풀었었는데, 이번에는 JOIN되는 테이블에 대한 범위를 이해하고 각각의 테이블이 어떻게 구성되어 있는지 알고 있는 상태에서 문제에 접근할 수 있었습니다. 테이블을 이해하는데 있어서 시각적으로 접근하는 것이 큰 도움이 된 것 같습니다.
본 글은 아래 링크의 내용을 참고하여 학습한 내용을 나름대로 정리한 글임을 밝힙니다.
https://yoo-hyeok.tistory.com/98
https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
'DataBase' 카테고리의 다른 글
[error/mssql] 개체 'DF__x'은(는) 열 'x'에 종속되어 있습니다. 하나 이상의 개체가 이 열에 엑세스하므로 xx이(가) 실패했습니다. (0) | 2022.06.02 |
---|---|
[MSSQL/MySQL] 비교 연산자 <>, != (0) | 2022.03.29 |
[MySQL/MSSQL] 프로그래머스 SQL문제 풀이#1 (0) | 2022.03.02 |
[MSSQL] 인덱스(INDEX) #1 + 페이지(Page) (0) | 2022.02.28 |
[MSSQL] 트랜잭션과 @@TRANCOUNT (0) | 2022.02.25 |