1주차 내용 정리 - SQL, python
작성 순서
select -> from -> where -> group by -> having -> order by
작동 순서
from -> on -> join -> where -> group by -> having -> select -> distinct -> order by
| 연산자 종류 | 연산자 | SELECT 절 | WHERE 절 | HAVING 절 |
|---|---|---|---|---|
| 비교 연산자 | =, !=, >, <, >=, <= | ✅ 사용 가능 | ✅ 사용 가능 | ✅ 사용 가능 |
| 범위 연산자 | BETWEEN ... AND ... | ❌ 사용 불가 | ✅ 사용 가능 | ✅ 사용 가능 |
| 집합 연산자 | IN (...), NOT IN (...) | ❌ 사용 불가 | ✅ 사용 가능 | ✅ 사용 가능 |
| 패턴 매칭 연산자 | LIKE, ILIKE | ❌ 사용 불가 | ✅ 사용 가능 | ❌ 사용 불가 |
| 논리 연산자 | AND, OR, NOT | ✅ 사용 가능 | ✅ 사용 가능 | ✅ 사용 가능 |
| 산술 연산자 | +, -, *, /, % | ✅ 사용 가능 | ✅ 사용 가능 | ❌ 사용 불가 |
| 집계 함수 | SUM, AVG, COUNT, MIN, MAX | ✅ 사용 가능 | ❌ 사용 불가 | ✅ 사용 가능 |
🚀 HAVING 절과 WHERE 절의 차이점
| 구분 | WHERE 절 | HAVING 절 |
|---|---|---|
| 사용 대상 | 개별 행(row) | 그룹(group) 결과 |
| 집계 함수 사용 | ❌ 불가능 | ✅ 가능 |
| 조건 적용 시점 | 데이터를 가져오기 전에 개별 행을 필터링 | GROUP BY로 그룹화한 후 필터링 |
| 사용 예시 | WHERE salary > 50000 | HAVING AVG(salary) > 50000 |
✔️ LIMIT은 기본적으로 맨 위에서부터 지정한 개수만큼 행을 가져옴.
✔️ 중간 데이터를 가져오려면 OFFSET과 조합해서 사용.
✔️ 보다 정교한 행 선택이 필요하면 ROW_NUMBER() 같은 함수 사용 가능!
🚀 REPLACE, SUBSTR, CONCAT 비교
| 함수 | 설명 | 주요 사용 사례 |
|---|---|---|
REPLACE(str, old, new) | 특정 문자열 변경 | 날짜 포맷 변경, 특정 단어 수정 |
SUBSTR(str, start, length) | 문자열 일부 추출 | 아이디 일부 가져오기, 특정 패턴 추출 |
CONCAT(str1, str2, ...) | 문자열 합치기 | 이름 조합, 문장 생성 |
| 구분 | IF문 | CASE문 |
|---|---|---|
| 사용 가능 위치 | SELECT, WHERE, HAVING 등 | SELECT, WHERE, HAVING, ORDER BY 등 |
| 기본 문법 | IF(조건, 참일 때 값, 거짓일 때 값) | CASE WHEN 조건 THEN 값 ELSE 값 END |
SELECT 컬럼명 FROM 테이블명
WHERE 컬럼명 = (서브쿼리);
💡 먼저 실행된 후, 메인 쿼리에 결과 전달
SELECT A.컬럼명, B.컬럼명
FROM 테이블A AS A INNER JOIN 테이블B AS B ON A.공통컬럼 = B.공통컬럼
| 구분 | INNER JOIN | LEFT JOIN |
|---|---|---|
| 설명 | 공통된 값이 있는 데이터만 가져옴 (교집합) | 왼쪽 테이블의 모든 행 + 오른쪽 테이블과 일치하는 데이터 |
| 일치하지 않는 데이터 | 결과에서 제외됨 | NULL로 표시됨 |
partition by와 함께 사용하면 그룹별 순위 계산 가능SELECT 컬럼명, RANK() OVER (PARTITION BY 그룹컬럼 ORDER BY 정렬컬럼 DESC) AS 순위
FROM 테이블명;
-- 전체 합계
SELECT SUM(컬럼명) FROM 테이블명;
-- 그룹별 합계
SELECT 그룹컬럼, SUM(집계할컬럼) FROM 테이블명 GROUP BY 그룹컬럼;
-- 누적 합계
SELECT 컬럼명, SUM(집계할컬럼) OVER (PARTITION BY 그룹컬럼 ORDER BY 정렬컬럼) AS 누적합계
FROM 테이블명;
SELECT DATE('2024-02-22 15:30:00') AS only_dateDATE_FORMAT(날짜컬럼, '%Y')🚀 날짜/시간 형식 코드 정리
| 단위 | 코드 | 설명 | 예제 (2024-02-22 15:30:45) |
|---|---|---|---|
| 연(Y) | %Y | 4자리 연도 | 2024 |
%y | 2자리 연도 | 24 | |
| 월(M) | %M | 월의 풀네임 (영어) | February |
%m | 2자리 숫자 월 | 02 | |
| 일(D) | %d | 2자리 숫자 일 | 22 |
| 시간(H) | %H | 24시간제 (00~23) | 15 |
%h | 12시간제 (01~12) | 03 | |
| 분(M) | %i | 분 (00~59) | 30 |
| 초(S) | %s | 초 (00~59) | 45 |
ROUND('수치값', '반올림 자릿수')| 함수 | 설명 | 예제 (text = "Hello World") | 결과 |
|---|---|---|---|
len() | 문자열 길이 반환 | len(text) | 11 |
upper() | 대문자로 변환 | text.upper() | "HELLO WORLD" |
lower() | 소문자로 변환 | text.lower() | "hello world" |
split() | 특정 구분자로 문자열 나누기 | text.split(" ") | ["Hello", "World"] |
replace() | 특정 문자열 치환 | text.replace("World", "Python") | "Hello Python" |
| 개념 | 설명 | 예제 (text = "Hello World") | 결과 |
|---|---|---|---|
인덱싱 ([]) | 특정 위치의 문자 가져오기 | text[0] | 'H' |
음수 인덱싱 (-1) | 뒤에서부터 문자 가져오기 | text[-1] | 'd' |
슬라이싱 ([:]) | 특정 범위 문자 가져오기 | text[0:5] | 'Hello' |
시작부터 ([:n]) | 처음부터 n번째까지 | text[:5] | 'Hello' |
끝까지 ([n:]) | n번째부터 끝까지 | text[6:] | 'World' |
🚀 리스트(List) 주요 기능
| 기능 | 설명 | 예제 fruits = ["apple", "banana", "cherry"] |
|---|---|---|
리스트 길이 (len()) | 리스트 요소 개수 반환 | len(fruits) → 3 |
인덱싱 ([]) | 특정 요소 접근 | fruits[1] → "banana" |
슬라이싱 ([:]) | 특정 범위 요소 가져오기 | fruits[1:3] → ["banana", "cherry"] |
리스트 추가 (append()) | 리스트 끝에 요소 추가 | fruits.append("grape") |
리스트 정렬 (sort()) | 리스트 요소 정렬 (오름차순) | numbers.sort() → [1, 2, 3] |
내림차순 정렬 (reverse=True) | 내림차순 정렬 | numbers.sort(reverse=True) |
리스트 내 요소 확인 (in) | 특정 값 존재 여부 확인 | "apple" in fruits → True |
| 개념 | 설명 | 예제 |
|---|---|---|
| 키-값 저장 | {key: value} 형태로 저장 | person = {"name": "Alice", "age": 25} |
| 순서 없음 | Python 3.7부터 삽입 순서 유지 | {1: "one", 2: "two"} |
| 키(Key) 중복 불가 | 동일한 키 사용 시 마지막 값 유지 | {"a": 1, "a": 2} → {"a": 2} |
| 값(Value) 중복 가능 | 여러 개의 동일 값 가능 | {"x": 100, "y": 100} |
💡 딕셔너리의 값으로 리스트(List)를 저장할 수 있으며, 이를 활용하면 여러 개의 데이터를 그룹화하여 관리할 수 있다.
📌 딕셔너리에서 리스트를 사용하는 주요 기능
| 기능 | 설명 | 예제 |
|---|---|---|
| 리스트 값 저장 | 딕셔너리 값에 리스트 저장 가능 | scores = {"math": [90, 85, 80]} |
| 리스트 요소 접근 | 인덱스를 사용하여 값 가져오기 | scores["math"][0] # 90 |
| 리스트 값 수정 | 리스트 내부 값 변경 가능 | scores["math"][1] = 88 |
| 리스트 값 추가 | .append()로 리스트에 요소 추가 | scores["math"].append(95) |
| 전체 값 조회 | .values()로 리스트 값 확인 | list(scores.values()) |