SQL

[실무]프로그래머스 MySQL 기출문제 모음 Lv.1.1

노력하는 백곰 2024. 6. 5. 17:09

■ 출처

- 코딩테스트 : MySQL / Oracle / Lv.1

https://school.programmers.co.kr/learn/challenges?order=recent&languages=mysql%2Coracle&page=1&levels=1

 

코딩테스트 연습 | 프로그래머스 스쿨

개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!

school.programmers.co.kr

 

 

 

■ 연습문제

1. 특정 형질을 가지는 대장균 찾기

#설명: 비트연산자를 통해 보유 형질의 조건 판별하여 조회
#참고: 비트연산을 수행할 때 세 번째 형질을 나타내는 비트는 100이며, 이를 십진수로 표현하면 3이 아닌 4임을 확인!

SELECT 
    COUNT(1) AS COUNT
FROM 
    ECOLI_DATA 
WHERE
    (GENOTYPE & 1 OR GENOTYPE & 4) AND !(GENOTYPE & 2)

 

 

2. 가장 큰 물고기 10마리 구하기

IFNULL() : COLUMNS 값에 NULL 이 존재하며, 다른 값을 대체하여 조회하는 함수

#설명: 기준에 맞춰 정렬하고 출력을 제한하여 결과 조회

SELECT 
    ID, LENGTH
FROM 
    FISH_INFO 
ORDER BY 
    IFNULL(LENGTH, 10) DESC, ID ASC
limit 10

 

 

3. 한 해에 잡은 물고기 수 구하기

COUNT() : 행의 개수를 출력하는 함수

- COUNT(*) : NULL 값 포함
- COUNT(컬럼명) : NULL 값 제외

#설명: LIKE함수로 '2021' 문자가 있는 데이터를 필터링해서 개수 측정

SELECT 
    COUNT(1) AS FISH_COUNT
FROM
    FISH_INFO
WHERE 
    TIME LIKE '2021%'

 

 

4. 잡은 물고기 중 가장 큰 물고기의 길이 구하기

CONCAT() : 문자열을 결합해주는 함수

MAX() : NULL 값을 제외한 최대값을 찾아서 조회하는 함수

#설명: 물고기의 최대 길이에 'cm'을 추가하여 조회

SELECT
    CONCAT(MAX(LENGTH),'cm') AS MAX_LENGTH
FROM
    FISH_INFO 
WHERE
    IFNULL(LENGTH, 10)

 

 

5. 잡은 물고기의 평균 길이 구하기

#설명: NULL값을 10으로 대체하고 평균 값을 구한다. 그리고 3째짜리에서 반올림하여 2째자리로 조회

SELECT
    ROUND(AVG(IFNULL(LENGTH, 10)), 2) AS AVERAGE_LENGTH
FROM 
    FISH_INFO

 

 

6. 잔챙이 잡은 수 구하기

#설명: NULL 값의 LENGTH을 선별해서 개수를 측정하여 조회

SELECT
    COUNT(*) AS FISH_COUNT
FROM 
    FISH_INFO 
WHERE
    LENGTH IS NULL

 

 

7. Python 개발자 찾기

#설명: 'Python' 스킬를 갖는 대상자를 필터링하여 결과 조회

SELECT
    ID, EMAIL, FIRST_NAME, LAST_NAME
FROM 
    DEVELOPER_INFOS 
WHERE
    'Python' IN (SKILL_1, SKILL_2, SKILL_3) 
ORDER BY
    ID ASC

 

 

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

INNER JOIN : 특정 Columns 값을 기준으로 두 테이블을 결합하여 하나의 테이블을 산출하는 함수

#설명: INNER JOIN을 통해 교집합된 테이블을 산출하고, 2022년 10월 데이터에 대한 결과 산출

SELECT
    A_Table.TITLE, A_Table.BOARD_ID,
    B_Table.REPLY_ID, B_Table.WRITER_ID, B_Table.CONTENTS,
    DATE_FORMAT(B_Table.CREATED_DATE, '%Y-%m-%d') as 'CREATED_DATE ASC, '
FROM 
    USED_GOODS_BOARD as A_Table 
    INNER JOIN USED_GOODS_REPLY as B_Table 
    ON A_Table.BOARD_ID = B_Table.BOARD_ID
WHERE 
    A_Table.CREATED_DATE LIKE '2022-10%'
ORDER BY
    B_Table.CREATED_DATE, A_Table.TITLE ASC

 

 

9. 특정 옵션이 포함된 자동차 리스트 구하기

#설명: columns 값에 LIKE '%네비게이션%' 조건을 활용하여 결과 조회

SELECT
    *
FROM 
    CAR_RENTAL_COMPANY_CAR 
WHERE
    OPTIONS LIKE '%네비게이션%'
ORDER BY
    CAR_ID DESC

 

 

10. 자동차 대여 기록에서 장기/단기 대여 구분하기

DATEDIFF() : 두 날짜간 차이 결과를 조회하는 함수

- 예시) DATEDIFF(dd,'2018-01-01','2018-12-31') + 1   /   결과 365

CASE WHEN ~ THEN ~ ELSE ~ END : columns 값에 조건을 설정하여 새로운 columns 값들을 생성할 때 사용하는 함수
- 예시) CASE WHEN '조건식1' THEN '결과1' WHEN '조건식2' THEN '결과2' ELSE '결과3' END

#설명: 22년 9월에 이루어진 대출 중에서 대여 기간이 30일 이상인 결과 조회
#참고: DATEDIFF함수로 두 일자간 차이를 계산하며, 당일 값을 포함하지 않아 30일을 29로 조건을 설정한다. 

SELECT
    HISTORY_ID, CAR_ID, 
    DATE_FORMAT(START_DATE, '%Y-%m-%d') AS START_DATE,
    DATE_FORMAT(END_DATE, '%Y-%m-%d') AS END_DATE,
    CASE WHEN DATEDIFF(END_DATE, START_DATE) >= 29 THEN '장기 대여' ELSE '단기 대여'  END AS RENT_TYPE
FROM 
    CAR_RENTAL_COMPANY_RENTAL_HISTORY 
WHERE
    START_DATE LIKE '2022-09%'
ORDER BY 
    HISTORY_ID DESC

 

 

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

#설명: SUV 차량의 평균 일일 대여 요금 조회
#참고: 반올림 올려주는 인덱스 개념 숙지!

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

 

 

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

DATE_FORMAT() : 특정 날짜를 원하는 형태의 날자로 변형시켜주는 함수
- %Y : 년도(2021)
- %y : 년도 (21)

- %m : 월 (01, 02, 11)
- %c : 월 (1, 8)

- %d : 일(01, 19)
- %e : 일(1, 19)

#설명: 21년에 출판된 인문 카테고리 도서 조회

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

 

 

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

#설명: 상반기 아이스크림 총 주문량이 3,000건 보다 높으면서 아이스크림의 주 성분이 과일인 아이스크림의 맛 조회

SELECT
    A_Table.FLAVOR
FROM 
    FIRST_HALF AS A_Table
    LEFT JOIN ICECREAM_INFO AS B_Table
    ON A_Table.FLAVOR = B_Table.FLAVOR
WHERE
    A_Table.TOTAL_ORDER >= 3000 AND B_Table.INGREDIENT_TYPE = 'fruit_based'
ORDER BY
    A_Table.TOTAL_ORDER DESC

 

 

14. 인기있는 아이스크림

#설명: 상반기에 판매된 아이스크림의 맛을 총주문량 기준 내림차순 / 출하번호 기준 오름차순 정렬

SELECT
    FLAVOR
FROM 
    FIRST_HALF 
ORDER BY
    TOTAL_ORDER DESC, SHIPMENT_ID ASC

 

 

15. 흉부외과(CS) 또는 일반외과(GS) 의사 목록 출력하기

#설명: 흉부외과(CS)이거나 일반외과(GS)인 의사의 이름, ID, 진료과, 고용일자 조회

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

 

 

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

#설명: 12세 이하 여환자의 이름, 번호, 성별코드, 나이, 전화번호 조회

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