TIL / 프로그래머스 MySQL 문제풀기 (Level2)

해달·2021년 10월 12일
0

TIL

목록 보기
55/80
post-thumbnail

Today 공부

  • MySQL 프로래머스 문제 풀기 (Level2)

SELECT 실행 순서

-작성순서실행순서실행해석
1SELECTFROM어느 테이블 대상으로 접근 할 것인가
2FROMWHERE해당 테이블에서 조건에 만족하는 레코드(row) 조회
3WHEREGROUP BY레코드(row)들을 기준으로 그룹화, 그룹은 하나의 row
4GROUP BYHAVING생성된 그룹 중 특정조건 필터
5HAVINGSELECT필터된 결과에 맞는 필드조회
6ORDER BYORDER BY필드를 기준으로 지정된 방식으로 정렬
7LIMITLIMIT입력된 개수 위에서부터 출력

1. NULL 처리하기(IS NULL)

  • 입양 게시판에 동물 정보를 게시하려 합니다. 동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 프로그래밍을 모르는 사람들은 NULL이라는 기호를 모르기 때문에, 이름이 없는 동물의 이름은 "No name"으로 표시해 주세요.

!

SELECT ANIMAL_TYPE, IFNULL(NAME, 'No name') AS NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

//IFNULL : 해당 Column의 값이 NULL을 반환할 때, 다른 값으로 출력할 수 있도록 하는 함수
SELECT IFNULL(컬럼이름, "반환 값");

2. 고양이와 개는 몇 마리 있을까 (GROUP BY)

  • 동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요
SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) AS count
FROM ANIMAL_INS 
GROUP BY ANIMAL_TYPE // 그룹끼리 묶어주기 
ORDER BY ANIMAL_TYPE

3. 루시와 엘라 찾기(String, Date)

  • 동물 보호소에 들어온 동물 중 이름이 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')
ORDER BY ANIMAL_ID

//WHERE - IN 구문(포함하는 자료 찾기 조건)

4. 최솟값 구하기

  • 동물 보호소에 가장 먼저 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.
SELECT DATETIME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1 // 상위 개수 고르기

5. 동명 동물 수 찾기(GROUP BY)

  • 동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.
SELECT NAME, COUNT(NAME) AS COUNT
FROM ANIMAL_INS 
GROUP BY NAME 
HAVING COUNT(NAME) > 1 // 그룹조건 주기 
ORDER BY NAME

6. 이름에 el이 들어가는 동물 찾기 (String, Date)

  • 보호소에 돌아가신 할머니가 기르던 개를 찾는 사람이 찾아왔습니다. 이 사람이 말하길 할머니가 기르던 개는 이름에 'el'이 들어간다고 합니다. 동물 보호소에 들어온 동물 이름 중, 이름에 "EL"이 들어가는 개의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 이름 순으로 조회해주세요. 단, 이름의 대소문자는 구분하지 않습니다.
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'DOG' AND NAME LIKE '%EL%' 
// 동물의 종이 'DOG이며 NAME 앞 뒤로 'el' 이 들어가는 조건 
ORDER BY NAME

7. 동물 수 구하기

  • 동물 보호소에 동물이 몇 마리 들어왔는지 조회하는 SQL 문을 작성해주세요.
SELECT COUNT(*)
FROM ANIMAL_INS 

8. 입양 시각 구하기(1)

  • 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
//HOUR 함수로 날짜에서 일부만 추출하기
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING hour BETWEEN 9 AND 19
ORDER BY HOUR ;
YEAR : 연도 
MONTH : 월 
DAY : 일 추출 (DAYOFMONTH와 같은 함수)
HOUR : 시 
MINUTE : 분 
SECOND : 초

9. 중성화 여부 파악하기(String, Date)

  • 보호소의 동물이 중성화되었는지 아닌지 파악하려 합니다. 중성화된 동물은 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;
//컬럼 선택 시 조건에 맞추어 출력이 가능하게 할 수 있다
CASE // 조건문에 맞추어 결과값 도출 
	WHEN 조건1
	THEN '결과 값'
	WHEN 조건2
	THEN '결과 값'
	ELSE 위 조건에 해당 되지않는 경우의 결과 값
END // 종료 

10. 중복 제거하기

  • 동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.
SELECT COUNT(DISTINCT NAME) AS 'count'
//중복쿼리 제거 
FROM ANIMAL_INS; 

11. DATETIME에서 DATE로 형 변환(String, Date)

  • ANIMAL_INS 테이블에 등록된 모든 레코드에 대해, 각 동물의 아이디와 이름, 들어온 날짜1를 조회하는 SQL문을 작성해주세요. 이때 결과는 아이디 순으로 조회해야 합니다.
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, "%Y-%m-%d") AS '날짜'
//DATE_FORMAT으로 원하는 형식의 날짜로 출력할 수 있다
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
DATE_FORMAT(시간값, 원하는 포맷);

마치며,

배운 내용에 한해서 문제를 푸려고 했는데, 생각보다 막히는 부분이 많아 검색을 해가며 풀었다.
SELECT구문에서 CASE로 조건을 주어서 출력할 수 있다는 사실도 알게 되었고, GROUP BY & HAVING도 다시 되짚어 보게 되었다.
막히는 문제의 다른사람들의 풀이를 보며 같은 조건의 문제여도 각각의 풀이 방식이 달라 어떠한 방식으로 작동되는 함수가 있는지 파악하여두면 나중에 검색하기 편할 것 같다.

0개의 댓글