■ 출처
- 코딩테스트 : MySQL / Oracle / Lv.1
■ 연습문제
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