천천히 빛나는

MySQL : SELECT 문 고득점 Kit 본문

STUDY/MYSQL

MySQL : SELECT 문 고득점 Kit

까만콩 •ᴥ• 2023. 10. 20. 16:05

프로그래머스 SQL 고득점 Kit의 SELECT 문제입니다.

https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit

1. 12세 이하인 여자 환자 목록 출력하기

SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO, 'NONE') AS TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC;

IFNULL(속성, 값) : 속성값이 만약 NULL이라면 값으로 치환하여 출력함

ORDER BY : 순서 설정 가능

 

2. 재구매가 일어난 상품과 회원 리스트 구하기

SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*)>=2
ORDER BY USER_ID, PRODUCT_ID DESC;

Group by : 특정 속성의 값이 같은 투플들을 모아 그룹을 생성

Having : Group BY 절에 대한 조건을 제시

 

3. 인기있는 아이스크림

SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID;

간단한 select 문이다

 

4. 평균 일일 대여 요금 구하기

SELECT ROUND(AVG(DAILY_FEE)) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV';

ROUND : 반올림함수이다. ROUND(값, 몇번째에서 반올림할지)으로 작성하며 값만 입력하면 자동으로 첫번째자리에서 반올림한다. -2와 같이 음수를 작성하면 반올림하여 10의 2승까지만 표시하게 된다.

 

5. 조건에 맞는 도서 리스트 출력하기

SELECT BOOK_ID, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d')
FROM BOOK
WHERE YEAR(PUBLISHED_DATE) = 2021 AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE;

그냥 FORMAT 함수가 아니라 DATE_FORMAT 함수를 사용해야 했다. 

%D는 일 이름을 1st, 2nd로 나타내며 %M은 October과 같이 영어로 출력한다.

%d와 %m은 숫자로 출력해준다. %y는 년도를 2자리로 표현해준다.

%H는 24시 표기법으로 시간을, %i는 분을 나타내며 %s은 초를 나타낸다.

YEAR 함수로 DATE의 년도만 뽑아낼 수 있다

https://bramhyun.tistory.com/28

 

[MYSQL] DATE_FORMAT 함수 - 날짜 포맷/ 형식 지정하기

DATE_FORMAT 함수 SQL을 작성하다 보면, 시간과 날짜에 관련된 COLUMN들을 활용하는 경우가 종종 있습니다. 이번 글에서는 DATETIME 에 관련된 포맷과 DATE_FORMAT 함수에 관련하여 정리 해 보겠습니다. 이

bramhyun.tistory.com

 

6. 3월에 태어난 여성 회원 목록 출력하기

SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d')
FROM MEMBER_PROFILE
WHERE TLNO IS NOT NULL AND MONTH(DATE_OF_BIRTH)=3 AND GENDER ='W'
ORDER BY MEMBER_ID;

IS NOT NULL : 비어있지 않은 경우

 

7. 과일로 만든 아이스크림 고르기

SELECT F.FLAVOR
FROM FIRST_HALF AS F, ICECREAM_INFO AS I
WHERE F.TOTAL_ORDER > 3000 AND F.FLAVOR = I.FLAVOR AND INGREDIENT_TYPE ='fruit_based'
ORDER BY TOTAL_ORDER DESC;

테이블끼리 연결해주어야 한다

 

8. 조건에 부합하는 중고거래 댓글 조회하기

SELECT B.TITLE, B.BOARD_ID, R.REPLY_ID, R.WRITER_ID, R.CONTENTS, 
DATE_FORMAT(R.CREATED_DATE, '%Y-%m-%d') AS CREATED_DATE
FROM USED_GOODS_BOARD AS B, USED_GOODS_REPLY AS R
WHERE B.BOARD_ID = R.BOARD_ID AND 
YEAR(B.CREATED_DATE)=2022 AND 
MONTH(B.CREATED_DATE)=10
ORDER BY R.CREATED_DATE, B.TITLE;

앞에 문제에서 적용된 함수들이 그대로 사용되었다. 모호성을 막기 위해 별명을 설정해주어야 한다.

 

9. 서울에 위치한 식당 목록 출력하기

SELECT I.REST_ID, REST_NAME, FOOD_TYPE, FAVORITES, ADDRESS, ROUND(AVG(REVIEW_SCORE),2) AS SCORE
FROM REST_INFO AS I, REST_REVIEW AS R
WHERE I.REST_ID=R.REST_ID AND ADDRESS LIKE '서울%'
GROUP BY I.REST_ID
ORDER BY AVG(REVIEW_SCORE) DESC, FAVORITES DESC;

HAVING으로 서울 조건을 달아준 코드가 대부분이긴 한데 그룹핑하고 서울만 골라내는거랑 서울만 골라내고 그룹핑하는 거랑 똑같아서 상관없다

 

10. 흉부외과 또는 일반외과 의사 목록 출력하기

SELECT DR_NAME, DR_ID, 	MCDP_CD, DATE_FORMAT(HIRE_YMD,'%Y-%m-%d') AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN ('CS', 'GS')
ORDER BY HIRE_YMD DESC, DR_NAME;

IN : ANY와 같은 역할을 한다

 

11. 강원도에 위치한 생산공장 목록 출력하기

SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS LIKE '강원도%'
ORDER BY FACTORY_ID;

기본적인 SELECT 문이다

 

12. 모든 레코드 조회하기

SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

*을 이용해서 전체를 표현할 수 있다

 

13. 오프라인/온라인 파매 데이터 통합하기

(SELECT DATE_FORMAT(SALES_DATE,'%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE YEAR(SALES_DATE)=2022 AND MONTH(SALES_DATE)=3
UNION
SELECT DATE_FORMAT(SALES_DATE,'%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, NULL AS 'NULL', SALES_AMOUNT
FROM OFFLINE_SALE
WHERE YEAR(SALES_DATE)=2022 AND MONTH(SALES_DATE)=3)
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;

나는 UNION을 이용해서 합집합을 구현하였다. 나는 NULL AS 'NULL'로 했는데 보통 NULL AS USER_ID로 하는 것 같았다.

 

14. 역순 정렬하기

SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC;

역순 = 내림차순이다.

 

 

15. 동물의 아이디와 이름

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

기초 SELECT 문이다

 

16. 상위 N개 레코드

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1;

LIMIT 1 : 맨 위에서부터 1개까지의 정보 출력

LIMIT 2, 6 : 2번째부터 6번째까지의 정보 출력

 

17. 조건에 맞는 회원수 구하기

SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE YEAR(JOINED)=2021 AND AGE BETWEEN 20 AND 29;

COUNT 함수를 사용하면 된다

 

 

18. 업그레이드 된 아이템 구하기

select t.ITEM_ID,ITEM_NAME,RARITY from ITEM_TREE as t
inner join ITEM_INFO as i
on t.ITEM_ID = i.ITEM_ID
where PARENT_ITEM_ID is not null 
and exists (select * from ITEM_INFO as s where t.PARENT_ITEM_ID = s.ITEM_ID and s.RARITY =  "RARE")
order by t.ITEM_ID desc;

parent_item이 비어있지 않으면 업그레이드 아이템이다. name이랑 rarity도 출력해줘야 하기 때문에 parent가 null인 item만 뽑아냈다.

또한 parent에 해당하는 아이템이 특성 rare을 가지고 있어야 한다. 

SELECT
    it.ITEM_ID,
    ii.ITEM_NAME,
    ii.RARITY
FROM
    ITEM_INFO AS ii
    INNER JOIN ITEM_TREE AS it
        ON ii.ITEM_ID=it.ITEM_ID
WHERE it.PARENT_ITEM_ID IN (SELECT ITEM_ID
                              FROM ITEM_INFO
                              WHERE RARITY='RARE')

훨씬 간단한 코드를 발견해서 가져왔다!... 엄청 복잡하게 풀었다는 걸 알게 되었다....

 

19. 조건에 맞는 개발자 찾기

select ID,EMAIL,FIRST_NAME,LAST_NAME from DEVELOPERS
where SKILL_CODE & (Select CODE from SKILLCODES where NAME = 'C#') > 0
or SKILL_CODE & (Select CODE from SKILLCODES where name = 'Python') > 0
order by ID;

비트연산자 &에 대해서 알면 금방 풀 수 있다. >0을 해주지 않아도 된다.

'&' (AND), '|' (OR), '~' (NOT), '^' (XOR)

 

 

20. 대장균들의 자식의 수 구하기

select id, IFNULL((select count(*) from ECOLI_DATA as d where e.id = d.parent_id), 0) as CHILD_COUNT
from ECOLI_DATA as e
order by id;

IFNULL을 사용하면 되는 간단한 문제이다.

 

'STUDY > MYSQL' 카테고리의 다른 글

MySQL : IS NULL 문 고득점 Kit  (0) 2023.10.21
MySQL : GROUP BY 문 고득점 Kit  (0) 2023.10.21
MySQL : SUM, MAX, MIN 문 고득점 Kit  (1) 2023.10.20
MySQL : SELECT 문 + 기본 예제 (2)  (1) 2023.10.20
MySQL : SELECT 문 + 기본 예제 (1)  (0) 2023.10.20