[내일배움캠프] 주말 공부 - SQL 코드카타, Python 알고리즘 코드카타, SQLD 헷갈리는 개념 정리
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끼리 묶는 것