천천히 빛나는
MySQL : SELECT 문 고득점 Kit 본문
프로그래머스 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
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 |