문제:

풀이방법:

동물 이름 중 두 번 이상 쓰였다면 이름을 기준으로 grouping 했을 때, 그 갯수가 2개 이상일 것이다. 따라서 group by 와 HAVING 절을 사용하여 동명 동물들을 찾는다.

1
SELECT NAME,count(NAME) as 'COUNT' from ANIMAL_INS group by NAME HAVING count(NAME) >1 ORDER BY NAME;
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/59041

 

코딩테스트 연습 - 동명 동물 수 찾기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

 

문제:

풀이방법:

 이름이 있는 동물의 ID란 이름이 NULL이 아닌 동물과 같은 뜻이다.

1
SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NOT NULL;
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/59407

 

코딩테스트 연습 - 이름이 있는 동물의 아이디

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

 

문제:

풀이방법:

나갈 때 정보, 들어올 때의 정보가 둘 다 있는 테이블이 필요하므로 둘을 INNER JOIN을 하도록 한다. 그 뒤에 WHERE 절로 IN일 때는 Intact라는 단어를 포함하도록 하고, OUTS일 때는 Intact라는 단어가 없는 경우에 대해서만 출력하도록 했다.

1
2
SELECT I.ANIMAL_ID,I.ANIMAL_TYPE,I.NAME FROM ANIMAL_INS I, ANIMAL_OUTS O WHERE I.ANIMAL_ID = O.ANIMAL_ID
AND I.SEX_UPON_INTAKE LIKE '%Intact%' AND O.SEX_UPON_OUTCOME NOT LIKE '%Intact%' ORDER BY i.ANIMAL_ID;
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/59045

문제:

풀이방법:

이전 입양 시각 구하기에는 테이블에 있는 시간만 해도 상관이 없었으나 이번에는 전체 시간대를 표현해야 한다. 따라서 테이블에 없는 시간들을 만들어 줘야 한다. 그래서 시간 정보를 가지고 있는 새로운 테이블을 만들어서 이와 조인해서 표현하도록 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
-- 코드를 입력하세요
SELECT H1.HOUR, IFNULL(H2.COUNT, 0)
FROM (
    SELECT 0 as HOUR
    UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 
    UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
    UNION SELECT 11 UNION SELECT 12 UNION SELECT 13 UNION SELECT 14 UNION SELECT 15
    UNION SELECT 15 UNION SELECT 16 UNION SELECT 17 UNION SELECT 18 UNION SELECT 19
    UNION SELECT 20 UNION SELECT 21 UNION SELECT 22 UNION SELECT 23) H1
LEFT JOIN (
    SELECT HOUR(DATETIME) AS 'HOUR', COUNT(*) AS 'count'
    FROM ANIMAL_OUTS
    GROUP BY HOUR) as H2 on H1.hour = H2.hour ORDER BY H1.HOUR;
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/59413

문제:

풀이방법:

NULL이 필요한 문제가 아니므로 기본 조인인 INNER JOIN을 사용해도 상관이 없다. 따라서 두 테이블을 INNER JOIN 했다. 그 다음에 보호 기간이 가장 길었다는 것은 O.DATETIME과 I.DATETIME의 차이가 크다는 것이다. 따라서 이 연산을 ORDER BY에다가 DESC 조건을 넣어서 찾도록 한다.

1
2
SELECT I.ANIMAL_ID, I.NAME FROM ANIMAL_INS I, ANIMAL_OUTS O WHERE I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY (O.DATETIME -I.DATETIME) DESC LIMIT 2;
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/59411

문제:

풀이방법:

조인을 통해서 NULL 값을 만들어야 한다면 LEFT JOIN이나 RIGHT JOIN을 써야 하는 것 같다. 따라서 '입양을 못 갔다' 라는 것은 INS에는 있지만 OUTS에는 없어야 하는 값들이다. 따라서 INS에 OUTS에 붙임으로써 입양을 못 간 동물들을 만들어 낸다. 이는 WHERE절로 O.ANIMAL_ID가 NULL인 값으로 찾을 수 있다. 그리고 3마리만 출력을 해야 하므로 LIMIT 3을 사용한다.

1
2
3
SELECT I.NAME,I.DATETIME FROM ANIMAL_INS I LEFT JOIN ANIMAL_OUTS O ON I.ANIMAL_ID=O.ANIMAL_ID
WHERE O.ANIMAL_ID is NULL
ORDER BY I.DATETIME LIMIT 3;
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/59044

문제:

풀이방법:

OUTS에 있는 값의 DATETIME과 INS의 DATETIME의 값 차이를 비교해야 하는 문제이다. 두 테이블에 공통된 값인 ANIMAL_ID으로 INNER JOIN을 한다. 조인을 한 뒤에 IN의 DATETIME이 OUTS의 DATETIME보다 큰 값을 찾아주도록 한다. 

1
2
SELECT I.ANIMAL_ID, I.NAME FROM ANIMAL_OUTS O, ANIMAL_INS I WHERE O.ANIMAL_ID=I.ANIMAL_ID AND
I.DATETIME > O.DATETIME ORDER BY I.DATETIME;
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/59043

문제:

풀이방법:

ANIMAL_OUTS에는 있지만 ANIMAL_INS에는 없는 값을 찾아야 하는 문제이다. 두 테이블이 있으므로 JOIN을 사용해서 풀어야 함을 알 수 있다. OUTS에만 있는 값을 찾아야 하므로 OUT을 기준으로 INS의 값을 합쳐주면 된다. 따라서 ANIMAL_OUTS O LEFT JOINT ANIMAL_INS I 를 사용해서 OUTS에 INS의 값이 붙게 된다. (ANIMAL_ID를 기준으로)

따라서 입양을 간 기록이 있지만 들어온 기록이 없는 동물들은 ANIMAL_INS의 ANIMAL_ID의 값이 NULL이 될 것이다. 따라서 WHERE절로 이 조건에 해당하는 O.ANIMAL_ID와 O.NAME을 출력하도록 한다.

1
2
SELECT O.ANIMAL_ID, O.NAME FROM ANIMAL_OUTS O LEFT JOIN ANIMAL_INS I  ON I.ANIMAL_ID=O.ANIMAL_ID
WHERE I.ANIMAL_ID is NULL ORDER BY O.ANIMAL_ID;
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/59042

문제:

풀이방법:

시간을 나타내는 데이터를 원하는 꼴로 만들어주는 함수를 사용해야 하는 문제이다. 오라클에서는 TO_CHAR를 사용하기도 하지만 MySQL에서는 DATE_FORMAT을 사용하는 것 같다. %Y가 연도를 네 글자로 나타내며, %m 과 %d를 사용한다.

1
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME'%Y-%m-%d' ) AS "날짜" FROM ANIMAL_INS ORDER BY ANIMAL_ID;
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/59414

문제:

풀이방법:

특정한 값에 다른 값을 매칭시킬 때 사용할 수 있는 함수로는 DECODE와 CASE가 있다. 그 중 CASE를 사용해서 이 문제를 풀었다. SQL의 CASE를 이해하기 위해서 다른 프로그래밍 언어에 있는 switch와 비슷하고 생각하면 된다.

CASE

WHEN ~ THEN ~

WHEN ~ THEN ~

ELSE ~ END

Neutered 와 Spayed가 들어있으면 O, 그렇지 않다면 X라고 매칭을 해주고 나머지 값을 출력하도록 한다.

1
2
3
4
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;
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/59409

 

+ Recent posts