내일배움캠프/TIL

[TIL]241217_SQL, Python, Pandas의 역할 / SQL코드카타 / SQL퀴즈 오답노트

dydatablog 2024. 12. 17. 20:08
728x90

SQL, Python, Pandas 각각의 기능을 배우면서 비슷한 것들을 할 수 있다는 점에서 세가지의 명확한 역할 구분이 궁금해졌다.

그래서 chatGPT에게 물어본 결과 밑에 답변을 얻어냈다.

특성 SQL Python Pandas
주요 사용 목적 데이터베이스에서 데이터를 조회하고 조작하는 데 사용 데이터 분석, 모델링, 시각화 등 범용적으로 사용 데이터 처리 및 전처리, EDA, 데이터 분석
사용 대상 관계형 데이터베이스(SQL Server, MySQL 등) 데이터 분석 및 프로그래밍 전반 데이터 전처리, 분석, 탐색적 분석
데이터 처리 방식 SQL 쿼리를 사용하여 데이터베이스에서 처리 다양한 라이브러리와 코드를 사용하여 처리 DataFrame을 사용하여 데이터를 처리
데이터 크기 처리 대규모 데이터 처리에 유리 (서버에서 처리) 메모리 내에서 처리 (큰 데이터는 어려움) 메모리 내에서 처리 (대용량 데이터 어려움)
시각화 제한적 (SQL 쿼리 결과로만 시각화 가능) 다양한 시각화 라이브러리(matplotlib, seaborn 등) 시각화 기능은 없지만, 다른 라이브러리와 연동 가능
기술적 복잡성 상대적으로 적음 (SQL 쿼리만 작성하면 됨) 코드 작성 및 알고리즘 구현이 필요 데이터 처리와 분석 코드 작성 필요

이렇게 보니 확실히 다르긴 하지만 실무에서 어떤 순서로 어떻게 사용하는지는 사실 아직 감이 잘 안온다.

아직 SQL하나도 완벽하게 못하는 것 같은데 python에 pandas라니...돌아가라 머리야...

 


 

74. 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기

WITH CTE1 AS (
    SELECT a.CAR_ID, a.CAR_TYPE, a.DAILY_FEE
    FROM CAR_RENTAL_COMPANY_CAR a
    JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY b ON a.CAR_ID = b.CAR_ID
    WHERE a.CAR_ID NOT IN 
        (SELECT CAR_ID
           FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
           WHERE START_DATE <= '2022-11-30' AND END_DATE >='2022-11-01') 
           AND a.CAR_TYPE IN ('세단', 'SUV')),
CTE2 AS (
    SELECT DISTINCT a.CAR_ID, a.CAR_TYPE,
        ROUND((a.DAILY_FEE - (a.DAILY_FEE * (discount_rate / 100))) * 30) AS FEE
    FROM CTE1 a
    JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN b ON a.CAR_TYPE = b.CAR_TYPE
WHERE b.duration_type = '30일 이상')

SELECT *
FROM CTE2
WHERE FEE >= 500000 and FEE < 2000000
ORDER BY FEE DESC, CAR_TYPE ASC, CAR_ID DESC

 

75. 자동차 대여 기록 별 대여 금액 구하기

WITH total AS (
    SELECT c.car_id, c.car_type, h.history_id, 
        datediff(end_date, start_date)+1 dates,
        daily_fee
    FROM CAR_RENTAL_COMPANY_CAR c
    JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY h ON c.car_id = h.car_id
    WHERE car_type = '트럭')
 
SELECT total.HISTORY_ID, 
    ROUND((1-IF(ISNULL(D.DISCOUNT_RATE),0,D.DISCOUNT_RATE)/100) * DAILY_FEE * total.dates ,0) AS FEE
	-- Null값이면 0으로, 아니면 discount_rate/100한 값에 하루 대여비 * 대여기간 
FROM total
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN D
ON total.CAR_TYPE = D.CAR_TYPE AND
IF(total.dates BETWEEN 7 AND 30,'7일 이상',
  IF(total.dates BETWEEN 30 AND 90, '30일 이상',
  IF(total.dates >= 90, '90일 이상','-'))) = DURATION_TYPE
ORDER BY FEE DESC, HISTORY_ID DESC

※ IF(ISNULL(D.DISCOUNT_RATE), 0) : DISCOUNT_RATE가 NULL이면, 0을 반환합니다.

D.DISCOUNT_RATE / 100: 할인율을 백분율에서 소수로 변환합니다.

 

76. 상품을 구매한 회원 비율 구하기

SELECT YEAR(sales_date) AS YEAR, 
       MONTH(sales_date) AS MONTH, 
       COUNT(DISTINCT user_id) AS PURCHASED_USERS ,
       ROUND(COUNT(DISTINCT user_id) / 
            (SELECT COUNT(user_id)
            FROM user_info
            WHERE joined BETWEEN '2020-12-31' AND '2022-01-01'),1) AS PUCHASED_RATIO
FROM ONLINE_SALE
WHERE user_id IN (
    SELECT user_id 
    FROM user_info
    WHERE joined BETWEEN '2020-12-31' AND '2022-01-01')
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH

 


퀴즈 오답노트

3️⃣ GROUP BY 뒤에 오는 컬럼의 어떤 값을 기준으로 테이블이 그룹화 될까요?

(1) 최소값

(2) 최대값

(3) 갯수

(4) 고유값

  • 정답: (4) 고유값
  • GROUP BY는 고유값을 기준으로 데이터를 그룹화합니다. 이후 각 그룹에 대해 SUM, COUNT, AVG 등의 집계 함수를 적용할 수 있습니다.

5️⃣ 다음 SQL 쿼리를 실행했을 때, 반환되는 결과로 올바른 설명을 고르세요.

(1) user_id 기준으로 중복된 값이 제거된다.

(2) age와 job 기준으로 중복된 값이 제거된다.

(3) user_id,age,job 세 컬럼의 조합이 중복된 경우만 제거된다.

(4) 모든 값이 중복되지 않으므로 결과는 원본 데이터와 같다.

SELECT 
	DISTINCT user_id, 
	age, 
	job 
FROM customers;
  • 정답: (3)
  • DISTINCT는 전체 SELECT 절에 대해 적용됩니다.
  • 즉, DISTINCT가 특정 컬럼 앞에 붙어있더라도, 실제로는 SELECT 절에 명시된 모든 컬럼들의 조합에 대해 중복이 제거됩니다. 따라서 DISTINCT는 user_id, age, job의 조합에 대해 중복을 제거합니다. 따라서, 고유한 user_id만 출력되는 것이 아니라, 세 컬럼의 조합이 유일한 행만 출력됩니다.

9️⃣ 윈도우함수는 어느 순서로 실행될까요?

(1) 윈도우 함수 → PARTITION BY → ORDER BY → 프레임 지정

(2) PARTITION BY → 윈도우 함수 → ORDER BY → 프레임 지정

(3) PARTITION BY → ORDER BY → 프레임 지정 → 윈도우 함수

(4) ORDER BY → PARTITION BY → 윈도우 함수 → 프레임 지정

 

  • 정답: (3) PARTITION BY → ORDER BY → 프레임 지정 → 윈도우 함수
  • PARTITION BY로 데이터 그룹화 → ORDER BY로 각 그룹 내 데이터 정렬 → 프레임 지정으로 윈도우 함수가 작동할 데이터 범위를 설정 → 윈도우 함수 실행으로 지정된 프레임을 기준으로 계산
  • *프레임 지정은 윈도우 함수가 작동할 데이터 범위를 설정하는 단계로, PARTITION BY와 ORDER BY 이후에 지정됩니다.

🔟 다음 중 서브쿼리(Subquery)에 대한 설명으로 틀린 것은 무엇인가요?

(1) 서브쿼리는 SELECT, FROM, WHERE 절에서 사용할 수 있다.

(2) 서브쿼리는 항상 메인 쿼리보다 먼저 실행된다.

(3) 상관 서브쿼리는 메인 쿼리와 서브쿼리가 상호 의존적이다.

(4) 서브쿼리 결과는 단일 값, 다중행, 혹은 테이블 형태로 반환될 수 있다.

  • 정답: (2)
  • 서브쿼리는 항상 메인 쿼리보다 먼저 실행되는 것이 아니라,서브쿼리의 위치나 종류(일반서브쿼리 vs 상관 서브쿼리)에 따라 실행 순서가 달라질 수 있습니다.

 

728x90