[TIL] 2025.03.04

성소희·2025년 3월 4일
post-thumbnail

본 캠프 11일 차!
새로운 조 배정과 함께 3주차 시작!


[TODAY'S SQL 코드카타]
SELECT문
1) 첫 번째 문제는 '상위 n개 레코드'

Q. ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.

👉조회 시 보여야 하는 데이터 : 동물의 이름(NAME)
✔️조건 : 동물 보호소에 가장 먼저 들어온 동물(ORDER BY ~ ASC)

select name
from animal_ins
order by datetime asc
limit 1;

2) 두번째 문제는 '3월에 태어난 여성 회원 목록 출력하기'

Q. 다음은 식당 리뷰 사이트의 회원 정보를 담은 MEMBER_PROFILE 테이블입니다. MEMBER_PROFILE 테이블은 다음과 같으며 MEMBER_ID, MEMBER_NAME, TLNO, GENDER, DATE_OF_BIRTH는 회원 ID, 회원 이름, 회원 연락처, 성별, 생년월일을 의미합니다.

MEMBER_PROFILE 테이블에서 생일이 3월인 여성 회원의 ID, 이름, 성별, 생년월일을 조회하는 SQL문을 작성해주세요. 이때 전화번호가 NULL인 경우는 출력대상에서 제외시켜 주시고, 결과는 회원ID를 기준으로 오름차순 정렬해주세요.

👉조회 시 보여야 하는 데이터 : 회원 ID, 이름, 성별, 생년월일
✔️조건 : 여성(WHERE ~ GENDER = 'W')
✔️조건2: 생일이 3월(MONTH(DATE_OF_BIRTH=3)
✔️조건3: 전화번호가 NULL인 경우 출력대상에서 제외(WHERE TLNO IS NOT NULL)
✔️조건4: 회원ID를 기준으로 오름차순 정렬(ORDER BY ~ ASC)

작성한 쿼리문은

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

세 번째 문제는 '특정 물고기를 잡은 총 수 구하기'

Q. 낚시앱에서 사용하는 FISH_INFO 테이블은 잡은 물고기들의 정보를 담고 있습니다. FISH_INFO 테이블의 구조는 다음과 같으며 ID, FISH_TYPE, LENGTH, TIME은 각각 잡은 물고기의 ID, 물고기의 종류(숫자), 잡은 물고기의 길이(cm), 물고기를 잡은 날짜를 나타냅니다.

단, 잡은 물고기의 길이가 10cm 이하일 경우에는 LENGTH 가 NULL 이며, LENGTH 에 NULL 만 있는 경우는 없습니다.

FISH_NAME_INFO 테이블은 물고기의 이름에 대한 정보를 담고 있습니다. FISH_NAME_INFO 테이블의 구조는 다음과 같으며, FISH_TYPE, FISH_NAME 은 각각 물고기의 종류(숫자), 물고기의 이름(문자) 입니다.

FISH_INFO 테이블에서 잡은 BASS와 SNAPPER의 수를 출력하는 SQL 문을 작성해주세요.
컬럼명은 'FISH_COUNT`로 해주세요.

👉조회 시 보여야 하는 데이터 : 물고기 수(COUNT(*) FISH_COUNT)
✔️조건 : FISH_INFO 테이블과 FISH_NAME_INFO 테이블 LEFT JOIN
✔️조건2: 이름이 BASS와 SNAPPER (WHERE ~ OR ~)

나의 최종 쿼리문은

SELECT COUNT(*) FISH_COUNT
FROM FISH_INFO FI
LEFT JOIN FISH_NAME_INFO FNI
ON FI.FISH_TYPE=FNI.FISH_TYPE
WHERE FISH_NAME ='BASS' OR FISH_NAME ='SNAPPER'

네 번째 문제는 '자동차 대여 기록에서 장기/단기 대여 구분하기'

Q. 다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.


CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가하여 대여기록을 출력하는 SQL문을 작성해주세요. 결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.

주의사항)START_DATE와 END_DATE의 경우 예시의 데이트 포맷과 동일해야 정답처리 됩니다.

👉조회 시 보여야 하는 데이터 : 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일, 대여기록
✔️조건 : 대여 시작일 2022년 9월에 속함(WHERE ~ DATEFORMAT(컬럼명, '%Y-%m')='2022-09')
✔️조건2 : 대여기록 컬럼은 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여'로 표시(case when ~ datediff(END_DATE, START_DATE)>=29)
✔️조건3 : 대여 기록 id를 기준으로 내림차순 정렬(ORDER BY ~ DESC)

최종 쿼리문은


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 DATE_FORMAT(START_DATE,'%Y-%m')='2022-09'
ORDER BY HISTORY_ID DESC;

다섯 번째 문제는 '자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기'

Q. 다음은 어느 자동차 대여 회사에서 대여중인 자동차들의 정보를 담은 CAR_RENTAL_COMPANY_CAR 테이블입니다. CAR_RENTAL_COMPANY_CAR 테이블은 아래와 같은 구조로 되어있으며, CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS 는 각각 자동차 ID, 자동차 종류, 일일 대여 요금(원), 자동차 옵션 리스트를 나타냅니다.


자동차 종류는 '세단', 'SUV', '승합차', '트럭', '리무진' 이 있습니다. 자동차 옵션 리스트는 콤마(',')로 구분된 키워드 리스트(옵션 리스트 값 예시: '열선시트', '스마트키', '주차감지센서')로 되어있으며, 키워드 종류는 '주차감지센서', '스마트키', '네비게이션', '통풍시트', '열선시트', '후방카메라', '가죽시트' 가 있습니다.

CAR_RENTAL_COMPANY_CAR 테이블에서 '통풍시트', '열선시트', '가죽시트' 중 하나 이상의 옵션이 포함된 자동차가 자동차 종류 별로 몇 대인지 출력하는 SQL문을 작성해주세요. 이때 자동차 수에 대한 컬럼명은 CARS로 지정하고, 결과는 자동차 종류를 기준으로 오름차순 정렬해주세요.

👉조회 시 보여야 하는 데이터 : 자동차 종류, 자동차 수(COUNT() CARS)
✔️조건 : 옵션에 '통풍시트','열선시트','가죽시트' 중 하나 이상 옵션이 포함된 것 (WHERE ~ LIKE '%~%')
✔️조건2: 자동차 종류 기준 오름차순(ORDER BY ~ )
COUNT 집계 함수 들어갔으니 GROUP BY
*자동차 수에 대한 컬럼명은 CARS로 지정

최종 쿼리문은

SELECT CAR_TYPE
,COUNT(*) CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%시트%'
GROUP BY 1
ORDER BY CAR_TYPE


💡오늘의 인사이트

<데이터 리터러시 강의를 완강 후 배웠던 내용 정리>

데이터 리터러시란 데이터를 단순히 받아들이는 것이 아니라, 비판적으로 분석하여 도출한 결과를 효과적으로 의사소통에 활용하는 능력을 의미한다. 눈앞에 보이는 데이터에 의존하기보다는, 스스로 목적과 문제를 정의하고, 그 목적을 달성하는 데 필요한 데이터와 지표를 설정한 뒤, 데이터를 어떻게 바라봐야 문제 해결에 효과적인 정보를 얻을 수 있는지를 분석하는 과정이 중요하다.

데이터 작업을 시작하기 전에 "무엇을 알고 싶은가?" 를 먼저 생각하는 목적 중심 사고가 필수적이다. 또한, 결과를 공유할 대상이 누구인지 고려하면서, 그들의 입장에서 문제를 정의하고 적절한 지표를 설정해야 한다. 분석한 데이터를 단순히 나열하는 것이 아니라, 해석과 추론을 통해 의미 있는 결론과 권고 사항을 도출하고, 적절한 스토리텔링을 곁들여 전달하는 것이 중요하다.

결론을 정리할 때는 처음 문제를 정의하고 지표를 설정할 당시의 목적을 다시 떠올려야 하며, 공유할 대상이 누구인지, 원하는 변화가 무엇인지 고려해야 한다.

흥미를 유발하면서도 쉽고 직관적으로 전달하는 것이 중요하며, 청중이 쉽게 이해할 수 있도록 시각적 자료(그래프, 차트 등)를 활용하는 것이 효과적이다.

데이터를 있는 그대로 읽는 것이 아니라, 그 안에서 의미를 읽어내고, 말하고자 하는 바를 정확히 전달할 수 있도록 사고하는 연습이 필요하다. 앞으로도 목적 중심의 사고를 익히고, 데이터를 분석하는 과정에서 "이 데이터가 말해주는 핵심은 무엇인가?" 를 고민하는 습관을 길러야겠다.

profile
매일 한 걸음, 데이터 분석 실무자로 성장하는 기록

0개의 댓글