모바일은 화면을 돌려 가로화면으로 보시는 게 읽으시기 편할 수 있습니다. 돌려서 보시는 걸 추천드릴게요!!
원래 문항은 구문에 따라 구분되어 있지만, 알고 푸는 것보다 모르고 푸는 게 재밌을 것 같아 난이도별로 공부하고 있습니다 :)
🔑 Q1. 조건에 부합하는 중고거래 상태 조회하기
☑️ 문제
☑️ 풀이
- CASE 문을 사용한 COLUMN 분류, WHERE 절을 사용한 조건 사용
SELECT BOARD_ID, WRITER_ID, TITLE, PRICE,
CASE
WHEN STATUS = 'SALE' THEN '판매중'
WHEN STATUS = 'RESERVED' THEN '예약중'
ELSE '거래완료' END AS STATUS
FROM USED_GOODS_BOARD
WHERE CREATED_DATE LIKE '2022-10-05%'
ORDER BY 1 DESC;
🔑 Q2. 자동차 평균 대여 기간 구하기
☑️ 문제
☑️ 풀이
- DATEDIFF 함수를 사용한 기간 연산, GROUP BY - HAVING 구문 이해
- DATEDIFF(END_DATE, START_DATE) : 변수 1로 더 나중 날짜가 들어가야 함
- 대여 기간 등을 구할 때는, DATEDIFF 함수 사용 후에 +1을 해줘야 함
- AS 문을 사용해 열의 이름을 다시 지정해 가져올 때, WHERE절에서는 그 이름을 못 쓰지만 HAVING 절은 가능함
- HAVING 구문에서는 GROUP BY로 산출한 결과값이 들어갈 수 있음
SELECT CAR_ID, ROUND(AVG(DATEDIFF(END_DATE, START_DATE) + 1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY 1
HAVING AVERAGE_DURATION >= 7
ORDER BY 2 DESC, 1 DESC;
🔑 Q3. 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기
☑️ 문제
☑️ 풀이
- REGEXP 함수를 사용한 정규표현식
SELECT CAR_TYPE, COUNT(DISTINCT(CAR_ID)) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS REGEXP '통풍시트|열선시트|가죽시트'
GROUP BY CAR_TYPE
ORDER BY 1;
🔑 Q4. 조건에 맞는 도서와 저자 리스트 출력하기
☑️ 문제
☑️ 풀이
- INNER JOIN 구문 사용
SELECT BOOK_ID, AUTHOR_NAME, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK AS B
INNER JOIN AUTHOR AS A
ON B.AUTHOR_ID = A.AUTHOR_ID AND B.CATEGORY = '경제'
ORDER BY 3;
🔑 Q5. 성분으로 구분한 아이스크림 총 주문량
☑️ 문제
☑️ 풀이
- INNER JOIN 구문 사용
SELECT INGREDIENT_TYPE, SUM(TOTAL_ORDER) AS TOTAL_ORDER
FROM FIRST_HALF AS F
INNER JOIN ICECREAM_INFO AS I
ON F.FLAVOR = I.FLAVOR
GROUP BY 1
ORDER BY 2;
🔑 Q6. 진료과별 총 예약 횟수 출력하기
☑️ 문제
☑️ 풀이
- LIKE 구문 사용
SELECT MCDP_CD AS '진료과 코드', COUNT(DISTINCT(PT_NO)) AS '5월예약건수'
FROM APPOINTMENT
WHERE APNT_YMD LIKE '2022-05-%'
GROUP BY 1
ORDER BY 2, 1;
🔑 Q7. 재구매가 일어난 상품과 회원 리스트 구하기
☑️ 문제
☑️ 풀이
- LIKE 구문 사용
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY 1, 2
HAVING COUNT(PRODUCT_ID) >= 2
ORDER BY 1, 2 DESC;
- 추가 : 중복 데이터 COUNT 쿼리
SELECT COLUMN1, COUNT(COLUMN2)
FROM TABLE
GROUP BY COLUMN1
HAVING COUNT(COLUMN2) >= 2;
🔑 Q8. 상품 별 오프라인 매출 구하기
☑️ 문제
☑️ 풀이
- INNER JOIN, GROUP BY 구문 사용
SELECT PRODUCT_CODE, SUM(PRICE * SALES_AMOUNT) AS SALES
FROM PRODUCT AS P
INNER JOIN OFFLINE_SALE AS O
ON P.PRODUCT_ID = O.PRODUCT_ID
GROUP BY 1
ORDER BY 2 DESC, 1;
🔑 Q9. 가격대 별 상품 개수 구하기
☑️ 문제
☑️ 풀이
- GROUP BY 구문 사용
- 집계 함수를 사용하는 경우, 집계의 기준을 정해줘야 하기 때문에 GROUP BY 구문이 반드시 필요함
SELECT FLOOR(PRICE / 10000) * 10000 AS PRICE_GROUP, COUNT(DISTINCT(PRODUCT_ID)) AS PRODUCTS
FROM PRODUCT
GROUP BY 1
ORDER BY 1;
🔑 Q10. 카테고리 별 상품 개수 구하기
☑️ 문제
☑️ 풀이
- LEFT(COLUMN, n) : 좌측에서 n개의 글자만 추출
- GROUP BY 구문 사용
SELECT LEFT(PRODUCT_CODE, 2) AS CATEGORY, COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY 1
ORDER BY 1;
🔑 Q11. 3월에 태어난 여성 회원 목록 출력하기
☑️ 문제
☑️ 풀이
- DATE_FORMAT(COLUMN, '%Y-%m-%d') : 년-월-일 형태로 날짜 출력
SELECT MEMBER_ID, MEMBER_NAME, GENDER,
DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE MONTH(DATE_OF_BIRTH) = '3'
AND GENDER = 'W'
AND TLNO IS NOT NULL
ORDER BY 1;
🔑 Q12. 가격이 제일 비싼 상품의 정보 출력하기
☑️ 문제
☑️ 풀이
- 서브쿼리 및 WHERE 조건문 사용
SELECT *
FROM FOOD_PRODUCT
WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT);
🔑 Q13. DATETIME에서 DATE로 형 변환
☑️ 문제
☑️ 풀이
- DATE_FORMAT(COLUMN, '%Y-%m-%d') : 년-월-일 형태로 날짜 출력
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS 날짜
FROM ANIMAL_INS
ORDER BY 1;
🔑 Q14. 입양 시각 구하기 (1)
☑️ 문제
☑️ 풀이
- HOUR(DATETIME) : 시간만 추출
SELECT HOUR(DATETIME) AS HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS
GROUP BY 1
HAVING HOUR BETWEEN 9 AND 19
ORDER BY 1;
🔑 Q15. NULL 처리하기
☑️ 문제
☑️ 풀이
- IS NULL : NULL 여부 확인 구문
SELECT ANIMAL_TYPE,
CASE
WHEN NAME IS NOT NULL THEN NAME
WHEN NAME IS NULL THEN 'No name' END AS NAME,
SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
🔑 Q16. NULL 처리하기
☑️ 문제
☑️ 풀이
- IS NULL : NULL 여부 확인 구문
SELECT ANIMAL_TYPE,
CASE
WHEN NAME IS NOT NULL THEN NAME
WHEN NAME IS NULL THEN 'No name' END AS NAME,
SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
🔑 Q17. 중성화 여부 파악하기
☑️ 문제
☑️ 풀이
- REGEXP : 정규표현식
SELECT ANIMAL_ID, NAME,
CASE
WHEN SEX_UPON_INTAKE REGEXP 'Neutered|Spayed' THEN 'O'
ELSE 'X' END AS 중성화
FROM ANIMAL_INS
ORDER BY 1;
🔑 Q18. 중복 제거하기
☑️ 문제
☑️ 풀이
- DISTINCT( ) : 고유값만 찾는 함수
SELECT COUNT(DISTINCT(NAME)) AS COUNT
FROM ANIMAL_INS;
🔑 Q19. 이름에 el이 들어가는 동물 찾기
☑️ 문제
☑️ 풀이
- REGEXP : 정규표현식
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'DOG'
AND NAME REGEXP 'EL'
ORDER BY 2;
⛔ Q20. 루시와 엘라 찾기
☑️ 문제
☑️ 풀이
- REGEXP : 정규표현식
- ^( )$ : ^는 문자열의 첫 글자를, $는 마지막 글자를 의미함. 따라서 원하는 글자만을 찾는 경우, 시작과 끝을 정의해야 함.
- 혹은, IN 을 사용해서 OR 느낌으로 사용해도 깔끔함.
-- 오답
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME REGEXP 'Lucy|Ella|Pickle|Rogan|Sabrina|Mitty'
ORDER BY 1;
-- 정답 1 : REGEXP 사용
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME REGEXP '^(Lucy|Ella|Pickle|Rogan|Sabrina|Mitty)$'
ORDER BY 1;
-- 정답 2 : IN 사용
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY 1;
🔑 Q21. 동명 동물 수 찾기
☑️ 문제
☑️ 풀이
- SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY
SELECT DISTINCT(NAME), COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY 1
HAVING COUNT >= 2
ORDER BY 1;
🔑 Q22. 고양이와 개는 몇 마리 있을까
☑️ 문제
☑️ 풀이
SELECT ANIMAL_TYPE, COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_INS
WHERE ANIMAL_TYPE REGEXP 'DOG|CAT'
GROUP BY 1
ORDER BY 1;
'🐬 SQL > 🏆 MySQL 문제풀이' 카테고리의 다른 글
🔓 06. 프로그래머스 LEVEL4, 5 문제풀이 (0) | 2023.11.11 |
---|---|
🔓 05. 프로그래머스 LEVEL3 문제풀이 (0) | 2023.10.27 |
🔓 03. 집계, CASE, JOIN 문 리트코드 문제풀이 (0) | 2023.10.10 |
🔓 02. 집계, CASE, JOIN 문 해커랭크 문제풀이 (1) | 2023.10.10 |
🔓 01. SELECT 문 해커랭크 문제풀이 (2) | 2023.10.08 |