[내일배움캠프] 데이터 트랙/본 캠프

[내일배움캠프] 주말 공부 - SQL 코드카타, Python 알고리즘 코드카타, SQLD 헷갈리는 개념 정리

554083460 2025. 6. 1. 23:46

 

 

 

 SQL 코드카타

 

 

문제 67

주문량이 많은 아이스크림들

7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성해주세요.

 

 

처음 답안 (틀림)

SELECT F.FLAVOR
FROM FIRST_HALF F
INNER JOIN JULY J
ON F.FLAVOR = J.FLAVOR
GROUP BY F.FLAVOR
ORDER BY F.TOTAL_ORDER + J.TOTAL_ORDER DESC
LIMIT 3;

 

최종 답안

SELECT F.FLAVOR
FROM FIRST_HALF F
INNER JOIN (SELECT FLAVOR, 
                   SUM(TOTAL_ORDER) AS SUM_J
            FROM JULY
            GROUP BY FLAVOR) J
ON F.FLAVOR = J.FLAVOR
GROUP BY F.FLAVOR
ORDER BY F.TOTAL_ORDER + SUM_J DESC
LIMIT 3;

 

 

틀린 이유 

 

1. 테이블을 가공하지 않고 join함

2. 문제의 조건 중 7월 아이스크림 총 주문량은 맛별 합계(SUM)를 구하는 과정이 필요하다.

조건을 꼼꼼히 읽지 않아 이 부분을 놓쳤다.

 

개선점

 

JOIN

테이블 조인할 때,

테이블을 그대로 조인하기도 하지만

테이블을 가공한 뒤 조인하기도 함

이때 FROM절에 서브쿼리 사용해서 조인하면 됨

 

예시

SELECT F.FLAVOR
FROM FIRST_HALF F
INNER JOIN (SELECT FLAVOR, -- 서브쿼리 그 자체로 테이블의 역할을 함
                   SUM(TOTAL_ORDER) AS SUM_J
            FROM JULY
            GROUP BY FLAVOR) J
ON F.FLAVOR = J.FLAVOR
GROUP BY F.FLAVOR
ORDER BY F.TOTAL_ORDER + SUM_J DESC
LIMIT 3;

 

새롭게 알게 된 것

 

위치에 따른 서브쿼리 종류

1) 스칼라 서브쿼리 (Scalar Subquery)

 

설명

SELECT 절에서 사용

단일 행, 단일 열 반환

서브쿼리의 결과를 하나의 열처럼 사용

 

예시

SELECT first_name, 
       (SELECT department_name 
        FROM departments 
        WHERE departments.department_id = employees.department_id)
        AS department_name
FROM employees;

 

2) 인라인 뷰 (Inline View)

 

설명

FROM 절에서 사용

서브쿼리의 결과를 테이블처럼 사용

데이터베이스에 저장되지 않음

 

예시

SELECT *
FROM (SELECT first_name, salary 
      FROM employees 
      WHERE salary > 5000) AS "high_salaried"

 

3) 중첩 서브쿼리 (Nested Subquery)

 

설명

WHERE, HAVING절에서 사용

메인쿼리의 데이터를 조건 걸어 필터링하거나 비교

단일행 서브쿼리 → 단일행 비교 연산자 =, <>, <, <=, >, >=

                                다중행 비교 연산자도 가능

다중행 서브쿼리 → 다중행 비교 연산자 IN, ALL, ANY, SOME, EXISTS

 

예시

SELECT first_name
FROM employees
WHERE department_id IN (SELECT department_id 
                        FROM departments
                        WHERE location_id>1500);

 

SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (SELECT AVG(salary) FROM employees);

 

참고자료

https://bruders.tistory.com/173

https://www.w3resource.com/sql/subqueries/understanding-sql-subqueries.php

 

 

 

 Python 알고리즘 코드카타

 

 

문제 49

두 개 뽑아서 더하기

 

 

최종 답안

def solution(numbers):
    answer = []
    for i in range(len(numbers)):
        for j in range(i+1, len(numbers)):
            answer.append(numbers[i]+numbers[j])
    answer = list(set(answer))
    answer.sort()
    return answer

 

새롭게 알게 된 것

 

1. set(): 중복 제거

 

설명

중복 제거하고 결과를 집합으로 만들어줌

순서가 없어서 print할 때마다 순서 다를 수 있음

집합은 인덱싱, 슬라이싱 불가능

 

문법

set()

합집합: union = set1 | set2

교집합: intersection = set1 & set2

차집합: difference = set1 - set2

 

예시 (gpt)

num = [1, 3, 5, 5, 6, 7, 8, 8]
new_num = set(num)
print(new_num)

# {1, 3, 5, 6, 7, 8}

 

set1 = {1, 2, 3}
set2 = {3, 4, 5}

# 합집합
union = set1 | set2
print(union)  # {1, 2, 3, 4, 5}

# 교집합
intersection = set1 & set2
print(intersection)  # {3}

# 차집합
difference = set1 - set2
print(difference)  # {1, 2}

 

2. 리스트 정렬

  listname.sort() sorted(listname)
기능 오름차순 정렬
오름차순 정렬
종류 메서드 함수
원본 원본 리스트 정렬 변화 원본 리스트 정렬 그대로
내림차순 listname.sort(reverse=True) sorted(listname, reverse=True)
return None 리스트
예시 listname.sort()
return listname
return sorted(listname)

 

 

 

 SQLD 시험 후 헷갈렸던 개념 정리

 

 

GROUP BY 여러 개의 column

GROUP BY column: column 값이 동일한 row끼리 묶는것

GROUP BY column1,  column2, column3: 세 컬럼의 값이 모두 동일한 row끼리 묶는 것