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
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: 할인율을 백분율에서 소수로 변환합니다.
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 상관 서브쿼리)에 따라 실행 순서가 달라질 수 있습니다.
'내일배움캠프 > TIL' 카테고리의 다른 글
[TIL]241219_매개변수와 인자, 파이썬 제곱근 하는 법, 정렬 (1) | 2024.12.19 |
---|---|
[TIL]241217_알고리즘 코드카타 / Pandas 시작! (0) | 2024.12.19 |
[TIL]파이썬 코드카타, 개인과제4번 (0) | 2024.12.16 |
[TIL]241212_SQL코드카타, Python 개인과제 문제1~3 (2) | 2024.12.12 |
[TIL]241211_코트카타Lv.4 (복습 필요), 파이썬 3주차 복습 (1) | 2024.12.11 |