문제:

풀이방법:

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

 

문제:

풀이방법:

문자열의 일부분을 포함하는 값들을 찾을 때 LIKE절을 사용한다. Column LIKE '표현식' 과 같은 방법으로 사용한다. '표현식'의 형태는 정규표현식과 유사하다. 이 문제에서는 el만 표함되면 된다 했으므로 앞 뒤로 몇개가 있어도 상관없는지를 나타내는 %를 앞뒤로 사용한다. 

1
SELECT ANIMAL_ID,NAME FROM ANIMAL_INS WHERE NAME LIKE '%el%' AND ANIMAL_TYPE = 'Dog'ORDER BY NAME;
cs

문제링크:

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

 

문제:

풀이방법:

Where 조건 절에서 한 컬럼이 여러 개의 값을 가져도 되는지에 대한 여부를 파악하기 위해서는 IN을 사용한다. IN과 tuple 값을 사용하며 tuple에 값들을 나열한다.

1
2
SELECT ANIMAL_ID,NAME,SEX_UPON_INTAKE FROM ANIMAL_INS
WHERE NAME in ('Lucy''Ella''Pickle''Rogan''Sabrina''Mitty');
cs

문제링크:

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

문제:

풀이방법:

시간단위로 값을 출력하는 HOUR를 사용해서 시간대를 표현하도록 한다. HOUR를 사용하면 2019-10-2 09:35 -> 9

2019-10-3 09:59 -> 9 와 같이 변환시켜준다. 따라서 이를 기준으로 GROUPBY를 하고 갯수를 세준다. 또한 9시부터 19시까지라고 시간이 정해져 있으므로 이에 대한 조건을 HAVING으로 넣어주도록 한다.

1
2
SELECT HOUR(DATETIME) as 'HOUR',COUNT(*) as 'COUNT' FROM ANIMAL_OUTS
GROUP BY HOUR HAVING HOUR>=9 AND HOUR<=19 ORDER BY HOUR;
cs

문제링크:

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

문제:

풀이방법:

 HAVING 절을 사용하는 예제이다. HAVING절은 WHERE절과 비슷하게 조건을 걸어줄 수 있다. 하지만 WHERE절에 조건을 걸 때에는 제약이 없지만 HAVING절은 GROUPBY에 사용한 컬럼에 대해서만 조건을 걸어 줄 수 있다. 따라서 NAME에 대해서 GROUPBY를 걸어주고 count가 1보다 크다는 조건을 걸어서 두 번 이상 쓰인 이름을 파악한다.

1
SELECT name,count(name) as 'COUNT' from animal_ins GROUPBY name HAVING count(name) >1 ORDER BY NAME;
cs

문제링크:

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

문제:

풀이방법:

NULL이라는 값을 다른 값으로 전부 바꿔야 하는 문제이다. NULL이라는 값을 다른 값으로 바꿔주는 함수가 NVL인줄 알고 문제를 풀었다. 그런데 오류가 발생해서 알아보니 NVL은 Oracle에서 지원하고, MySQL에서는 isnull이라는 함수라고 한다. 

 따라서 isnull(column, 채울값)과 같이 사용하면 column에 있는 null 값을 채울 값으로 전부 바꿔준다.

1
SELECT ANIMAL_TYPE,ifnull(NAME,"No name") AS 'NAME',SEX_UPON_INTAKE FROM ANIMAL_INS;
cs

문제링크:

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

문제:

풀이방법:

특정한 분류를 기준으로 값들을 묶어야 할 때 GROUPBY를 사용한다. GROUPBY절을 사용하면 이 절에 사용한 컬럼만을 SELECT절에 사용을 해야하며 COUNT와 같은 내장함수는 이 컬럼을 기준으로 작동한다. 따라서 GROUPBY ANIMAL_TYPE을 사용했으므로 SELECT에 ANIMAL_TYPE만을 사용해야 하며 COUNT도 CAT과 DOG의 수를 세어준다.

1
SELECT ANIMAL_TYPE,COUNT(ANIMAL_TYPE) FROM ANIMAL_INS GROUPBY ANIMAL_TYPE;
cs

문제링크:

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

+ Recent posts