CAFE

독서

러닝 SQL

작성자박대선|작성시간26.01.12|조회수67 목록 댓글 0

러닝 SQL 을 읽었다. 조인(join)은 주로 데이터베이스(SQL)나 데이터 처리(Pandas 등)에서 사용. 
1️ 조인(join) 기본 개념
* 조인 = 두 개 이상의 테이블(혹은 데이터셋)을 공통된 컬럼(키)을 기준으로 합치는 것
* 목적: 서로 다른 데이터에 있는 관련 정보를 한 행(row)에 결합
예:
* 테이블 A: 고객 정보
* 테이블 B: 주문 정보
* 고객 ID를 기준으로 두 테이블 합치기 → 고객과 주문 정보를 동시에 조회

2️ SQL 기준 주요 조인 종류
| 조인 종류                              | 설명                         | 결과 예시                   |
| INNER JOIN                     | 양쪽 테이블 모두에 키가 존재하는 행만 합침   | 겹치는 고객만 조회              |
| LEFT JOIN / LEFT OUTER JOIN    | 왼쪽 테이블 기준, 오른쪽에 키가 없어도 포함  | 모든 고객, 주문 없는 경우 NULL    |
| RIGHT JOIN / RIGHT OUTER JOIN  | 오른쪽 테이블 기준, 왼쪽에 키 없어도 포함   | 모든 주문, 고객 정보 없는 경우 NULL |
| FULL OUTER JOIN                | 양쪽 테이블 모두 포함, 없는 값은 NULL   | 모든 고객과 모든 주문 포함         |
| CROSS JOIN                     | 조건 없이 모든 행의 조합             | 카테고리 × 상품 전체 조합         |

3️ Pandas에서의 join
* `merge()` 함수 사용
```python
import pandas as pd
df1 = pd.DataFrame({'ID':[1,2,3], '이름':['A','B','C']})
df2 = pd.DataFrame({'ID':[2,3,4], '주문':['X','Y','Z']})
# INNER JOIN
pd.merge(df1, df2, on='ID', how='inner')
# LEFT JOIN
pd.merge(df1, df2, on='ID', how='left')
```
* `on='ID'` → 공통 키 컬럼 지정
* `how=` → 조인 방식 지정

4️ 핵심 포인트
1. 조인은 키 컬럼 기반으로 데이터 합치기
2. 조인 방식(Inner, Left, Right, Full)에 따라 결과 행 수와 NULL 존재 여부 달라짐
3. 실무에서는 데이터 중복, 누락, 메모리 문제 주의 130

프로그래밍과 SQL에서의 서브쿼리(Subquery) 개념
1️ 서브쿼리(Subquery)란?
* 쿼리 안에 포함된 쿼리.
* 다른 쿼리(주 쿼리)의 조건, 계산, 데이터 반환 기준으로 사용.
* 즉, 쿼리 안에서 데이터를 임시로 만들어서 다시 활용하는 것
예:
> “주문 테이블에서, 가장 많이 주문한 고객의 정보 조회”
* 먼저 서브쿼리로 최대 주문 수 구함
* 그 결과를 주 쿼리에서 조건으로 사용

2️ 서브쿼리 종류
| 유형               | 특징                 | 예시                                                                                      |
| 단일값 서브쿼리     | 결과가 1개만 나오는 경우     | `WHERE score = (SELECT MAX(score) FROM students)`                                       |
| 다중값 서브쿼리     | 결과가 여러 개 나오는 경우    | `WHERE id IN (SELECT student_id FROM honors)`                                           |
| FROM 서브쿼리    | 서브쿼리를 임시 테이블처럼 사용  | `SELECT * FROM (SELECT id, COUNT(*) as cnt FROM orders GROUP BY id) AS t WHERE cnt > 5` |
| EXISTS 서브쿼리  | 결과 존재 여부만 확인       | `WHERE EXISTS (SELECT 1 FROM orders WHERE orders.customer_id = customers.id)`           |

3️ 특징과 장점
1. 복잡한 조건 처리 가능;  여러 테이블, 그룹, 통계를 하나의 쿼리 안에서 활용 가능
2. 가독성 향상;  단계별로 논리를 나눠서 작성 가능
3. 중간 결과 활용; 임시로 데이터를 만들고 바로 조건으로 사용

4️ 주의점
* 성능 문제: 큰 테이블에서는 서브쿼리보다 JOIN이 더 빠른 경우가 많음
* 단일값 vs 다중값 구분 필수: `=` vs `IN` 사용 여부 주의
* FROM 서브쿼리는 반드시 별칭 필요 (예: `AS t`)

5️ 예시
① 단일값 서브쿼리
```sql
SELECT name, score
FROM students
WHERE score = (SELECT MAX(score) FROM students);
```
* 결과: **최고 점수 학생 조회**

② 다중값 서브쿼리
```sql
SELECT name
FROM students
WHERE id IN (SELECT student_id FROM honors);
```
* 결과: **우수 학생 목록 조회**

③ FROM 서브쿼리
```sql
SELECT id, cnt
FROM (SELECT id, COUNT(*) AS cnt FROM orders GROUP BY id) AS t
WHERE cnt > 5;
```
* 결과: **주문 5회 이상 고객 조회** 226

데이터베이스 테이블 분할(Table Partitioning)은 하나의 큰 테이블을 논리적으로는 하나처럼 보이게 유지하면서, 물리적으로 여러 조각(파티션)으로 나누어 저장하는 기법.
1️ 왜 테이블을 분할하나?
* 대용량 데이터 성능 개선 (조회·삭제·집계 빠름)
* 관리 편의성 (오래된 데이터만 삭제/백업 가능)
* 쿼리 최적화 (필요한 파티션만 스캔)
* 장애 영향 최소화

2️ 테이블 분할 vs 테이블 분리
| 구분      | 테이블 분할 (Partitioning)  | 테이블 분리 (Sharding/정규화) |
| 사용자 관점  | 하나의 테이블                | 여러 테이블                |
| SQL     | 기존 SQL 그대로 사용          | JOIN 또는 라우팅 필요        |
| 목적      | 성능·관리                  | 구조 설계·확장성             |

3️ 주요 테이블 분할 방식
① RANGE 분할; 특정 범위 기준으로 분할
```sql
날짜, 금액, ID 범위
```
예:
* 2023년 데이터
* 2024년 데이터
✅ 로그, 이력 테이블에 매우 적합

② LIST 분할; 정해진 값 목록 기준
```sql
국가, 지역, 상태값
```
예:
* KOREA
* USA
* JAPAN

③ HASH 분할; 해시 함수로 균등 분산
```sql
user_id % N
```
✅ 트래픽 분산에 유리
❌ 특정 범위 조회에는 불리

④ KEY 분할 (DB 자동); DB가 내부 알고리즘으로 분할(MySQL 등)


4️ 예시 (MySQL RANGE 파티션)
```sql
CREATE TABLE orders (
  order_id INT,
  order_date DATE
)
PARTITION BY RANGE (YEAR(order_date)) (
  PARTITION p2023 VALUES LESS THAN (2024),
  PARTITION p2024 VALUES LESS THAN (2025)
);
```
👉 쿼리:
```sql
SELECT * FROM orders WHERE order_date = '2024-05-01';
```
➡️ **p2024 파티션만 조회**

5️ 장점과 단점
✅ 장점
* 대용량 테이블에서도 빠른 조회
* 파티션 단위 삭제 가능 (`DROP PARTITION`)
* 백업·복구 효율적

❌ 단점
* 설계가 잘못되면 오히려 성능 저하
* 파티션 키 없는 쿼리는 전체 스캔
* DB별 제약 조건 존재

6️ 언제 쓰면 좋은가?
✔ 데이터가 수천만~수억 건 이상
✔ 날짜 기반 데이터
✔ 오래된 데이터 정리가 잦은 경우
✔ 조회 조건에 명확한 기준 컬럼이 있을 때 376

데이터베이스에서 말하는 해시(Hash)는 특정 값을 계산식(해시 함수)으로 변환해 빠르게 찾기 위한 기법.
테이블 분할(Partitioning)이나 인덱스에서 자주 사용.

1️ 해시란?
* 입력값 → 고정된 규칙으로 숫자 변환
* 같은 입력 → 항상 같은 결과
* 결과값을 기준으로 저장 위치 결정
예:
```text
user_id = 12345
hash(12345) = 7
→ 7번 파티션에 저장
```

2️ 해시 테이블 분할 (HASH PARTITION)
### 개념
```text
파티션 번호 = hash(컬럼값) % 파티션 개수
```

### 특징
| 항목     | 설명            |
| 분산     | 데이터가 균등하게 분산됨 |
| 조회     | = 조건에 매우 빠름   |
| 범위 검색  | ❌ 비효율적        |
| 관리     | 파티션 추가/변경 어려움 |

3️ 예시 (MySQL HASH 파티션)
```sql
CREATE TABLE users (
  user_id INT,
  name VARCHAR(50)
)
PARTITION BY HASH(user_id)
PARTITIONS 4;
```
👉 내부적으로:
* user_id % 4 → 파티션 결정

4️ 해시 vs 범위 분할
| 구분       | HASH   | RANGE    |
| 기준       | 계산식    | 값 범위     |
| 데이터 분산   | 매우 균등  | 치우칠 수 있음 |
| 특정 값 조회  | 빠름     | 빠름       |
| 범위 조회    | 느림     | 매우 빠름    |
| 로그/이력    | ❌      | ✅        |

5️ 해시 인덱스 vs B-Tree 인덱스
| 항목     | 해시 인덱스         | B-Tree 인덱스    |
| 검색     | = 만 빠름         | =, <, > 모두 가능 |
| 정렬     | 불가능            | 가능            |
| 범위 쿼리  | ❌              | ✅             |
| 사용 DB  | Memory, 일부 엔진  | 대부분 DB 기본     |

6️ 언제 해시를 쓰면 좋을까?
✔ `WHERE user_id = ?` 같은 동등 조건이 대부분
✔ 데이터가 특정 값에 쏠리면 안 될 때
✔ 파티션 간 부하를 균등하게 나누고 싶을 때

❌ 날짜 검색, 정렬, 범위 조회가 많다면 비추천

7️ 실무 주의사항 ⚠️
* 파티션 개수 변경 = 대규모 재구성
* 파티션 키는 자주 조회되는 컬럼이어야
* 복합 조건 쿼리에는 효과 제한적

https://product.kyobobook.co.kr/detail/S000001810371

CHAPTER 1 배경 1.1 데이터베이스 소개 1.2 SQL 1.3 MySQL 1.4 SQL의 변화
1.5 이후 내용 소개
CHAPTER 2 데이터베이스 생성과 데이터 추가 2.1 MySQL 데이터베이스 생성 2.2 mysql 명령줄 도구 사용 방법 2.3 MySQL 자료형 2.4 테이블 생성
2.5 테이블 수정 2.6 좋은 구문을 망치는 경우 2.7 샤키라 데이터베이스
CHAPTER 3 쿼리 입문 3.1 쿼리 역학 3.2 쿼리 절 3.3 Select 절 3.4 From 절
3.5 Where 절 3.6 Group by 절과 having 절 3.7 Order by 절 3.8 학습 점검
CHAPTER 4 필터링 4.1 조건 평가 4.2 조건 작성 4.3 조건 유형 4.4 Null 4.5 학습 점검
CHAPTER 5 다중 테이블 쿼리 5.1 조인 5.2 세 개 이상 테이블 조인 5.3 셀프 조인 5.4 학습 점검
CHAPTER 6 집합 연산자 6.1 집합 이론 6.2 집합 이론 실습 6.3. 집합 연산자 6.4 집합 연산 규칙 6.5 학습 점검
CHAPTER 7 데이터 생성, 조작과 변환 7.1 문자열 데이터 처리 7.2 숫자 데이터 처리 7.3 시간 데이터 처리 7.4 변환 함수 7.5 학습 점검
CHAPTER 8 그룹화와 집계 8.1 그룹화의 개념 8.2 집계 함수 8.3 그룹 생성 8.4 그룹 필터조건 8.5 학습 점검
CHAPTER 9 서브쿼리 9.1 서브쿼리 9.2 서브쿼리의 유형 9.3 비상관 서브쿼리 9.4 상관 서브쿼리
9.5 서브쿼리를 사용하는 경우 9.6 서브쿼리 요약 정리 9.7 학습 점검
CHAPTER 10 조인 심화 10.1 외부 조인 10.2 교차 조인 10.3 자연 조인 10.4 학습 점검

CHAPTER 11 조건식 11.1 조건식 11.2 case 표현식 11.3 case 표현식의 예 11.4 학습 점검
CHAPTER 12 트랜잭션 12.1 다중 사용자 데이터베이스 12.2 트랜잭션 12.3 학습 점검
CHAPTER 13 인덱스와 제약조건 13.1 인덱스 13.2 제약조건 13.3 학습 점검
CHAPTER 14 뷰 14.1 뷰 14.2 뷰를 사용하는 이유 14.3 갱신 가능한 뷰 14.4 학습 점검
CHAPTER 15 메타데이터 15.1 데이터에 관한 데이터 15.2 정보 스키마 15.3 메타데이터로 작업하기 15.4 학습 점검
CHAPTER 16 분석 함수 16.1 분석 함수의 개념 16.2 순위 16.3 리포팅 함수 16.4 학습 점검
CHAPTER 17 대용량 데이터베이스 작업 17.1 분할 17.2 군집화 17.3 샤딩 17.4 빅데이터
CHAPTER 18 SQL과 빅데이터; 18.1 아파치 드릴 소개 18.2 드릴로 파일 쿼리하기 18.3 드릴로 MySQL 쿼리하기 18.4 드릴로 몽고DB 쿼리하기
18.5 다양한 데이터소스를 사용한 드릴 18.6 SQL의 미래
APPENDIX A 예제 데이터베이스의 ER 다이어그램
APPENDIX B 실습문제 해답

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼