| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- 파이썬 |
- 개발자사이드프로젝트
- 파이썬 map 함수
- print("""
- 99클럽
- 백준
- 99일지
- 10430번
- fatal:not a git repository
- Til
- 파이썬 sep
- not a git repository
- 파이썬
- cp949
- 파이썬 int()
- 개발자스터디
- 코딩부트캠프후기
- 파이썬 클래스
- Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
- 항해99
- vscode cp949
- 주니어개발자역량강화
- 99클럽 #99일지 #코딩테스트 #개발자스터디 #항해 #til
- EnvCommandError
- 항해플러스
- MomentumParameters
- 주니어개발자멘토링
- print sep
- 코딩테스트
- 항해
- Today
- Total
선발대
[DB] 김영한의 실전 데이터베이스 - 기본편 (2) 본문
강의 순서
- 섹션 3. 조인2 - 외부 조인과 기타 조인
- 섹션 4. 서브쿼리
섹션 3. 조인2 - 외부 조인과 기타 조인
외부 조인 1
내부 조인은 양쪽 테이블에 모두 데이터가 존재하는 교집합 영역만 조회한다.
한쪽 테이블에만 데이터가 존재하는 경우까지 포함해서 조회하려면 외부 조인을 사용해야 한다.
외부 조인은 기준 테이블의 모든 데이터를 결과에 포함시킨다.
LEFT JOIN 은 왼쪽 테이블을 기준으로 하고 RIGHT JOIN 은 오른쪽 테이블을 기준으로 한다.
기준 테이블과 짝이 맞는 데이터가 없는 경우 해당 필드는 NULL 값으로 채워진다.
NULL 값을 비교할 때는 반드시 IS NULL 또는 IS NOT NULL 을 사용해야 한다.
외부 조인 2
LEFT JOIN 과 RIGHT JOIN 은 테이블의 위치를 바꾸면 서로 동일한 결과를 만들 수 있다.
FROM A LEFT JOIN B 는 FROM B RIGHT JOIN A와 같은 결과를 반환한다.
실무에서는 분석 기준이 되는 테이블을 FROM 절에 먼저 쓰고 LEFT JOIN으로 다른 테이블을 붙여나가는 방식이 더 직관적이므로 LEFT JOIN이 주로 사용된다.
조인의 특징
조인 시 행의 개수가 변하는지 여부는 테이블 간의 관계(PK-FK)와 조인 방향에 따라 결정된다.
자식 테이블에서 부모 테이블로 조인(FK PK)하면 자식 테이블의 각 행은 부모의 단 하나의 행과 연결되므로 행 개수가 유지된다.
부모 테이블에서 자식 테이블로 조인(PK FK)하면 부모 테이블의 한 행이 자식의 여러 행과 연결될 수 있으므로 행 개수가 증가할 수 있다.
조인으로 인한 행 수 변화를 이해해야 SUM, COUNT 같은 집계 함수를 정확하게 사용할 수 있다.
셀프 조인
셀프 조인은 하나의 테이블을 자기 자신과 조인하는 기법을 말한다.
한 테이블 내에 계층적인 관계나 자기 참조 관계가 있을 때 사용한다(예: 직원의 상사 정보).
테이블 별칭(Alias)을 사용해 하나의 테이블을 두 개의 다른 테이블처럼 보이게 만드는 것이 핵심이다.
상사가 없는 최상위 직원을 포함하려면 INNER JOIN 대신 LEFT JOIN을 사용한다.
CROSS 조인
CROSS JOIN 은 ON 조건 없이 한 테이블의 모든 행을 다른 테이블의 모든 행과 각각 연결한다.
두 테이블의 모든 경우의 수를 조합한 카테시안 곱(Cartesian Product) 결과를 만든다.
상품의 사이즈 색상 재질 등 모든 옵션 조합을 생성할 때 유용하다.
INSERT INTO ... SELECT 구문과 함께 사용하면 마스터 데이터를 쉽게 생성할 수 있다.
데이터가 많은 테이블에 사용하면 결과 행이 기하급수적으로 늘어나 서버에 심각한 부하를 줄 수 있으므로 주의해야 한다.
조인 종합 실습
실무 문제는 여러 테이블을 동시에 조인하고 여러 조건을 적용해야 해결할 수 있다.
문제를 작은 단위로 나누어 필요한 정보 테이블 조건과 정렬 순서를 파악하는 전략이 유용하다.
JOIN 구문은 체인처럼 계속 이어서 여러 테이블을 연결할 수 있다.
여러 필터링 조건은 WHERE 절에 AND 로 연결하고 최종 결과는 ORDER BY 로 정렬한다.
섹션 4. 서브쿼리
서브쿼리 소개
서브쿼리는 SQL 쿼리 문 안에 포함된 또 다른 SELECT 쿼리를 의미한다.
여러 단계로 나누어 처리해야 할 문제를 하나의 쿼리로 해결할 수 있게 돕는다.
서브쿼리가 먼저 실행되고 그 결과가 메인쿼리에서 사용된다.
반환하는 행과 열의 수 사용되는 위치에 따라 종류가 나뉜다.
스칼라 서브쿼리
단일 행 단일 열의 값을 반환하는 서브쿼리다.
스칼라는 단 하나의 값을 의미한다.
= , > , < 같은 단일 행 비교 연산자와 함께 사용한다.
서브쿼리의 결과가 반드시 하나의 행만 반환하도록 주의해야 하며 그렇지 않으면 오류가 발생한다.
다중 행 서브쿼리
여러 행의 결과를 반환하는 서브쿼리다.
IN , ANY , ALL 같은 다중 행 연산자와 함께 사용한다.
IN 은 목록에 포함된 값과 일치하는지 확인하며 가장 직관적이고 흔하게 사용된다.
ANY 와 ALL 은 주로 비교 연산자와 쓰이며 MIN 이나 MAX 집계 함수로 대체하는 것이 더 명확할 수 있다.
다중 컬럼 서브쿼리
두 개 이상의 컬럼을 반환하는 서브쿼리다.
WHERE 절에서 여러 컬럼을 동시에 비교해야 할 때 유용하다.
WHERE (컬럼1, 컬럼2) = (서브쿼리) 형태로 사용하며 = 연산자를 쓸 때는 서브쿼리가 단일 행을 반환해야 한다.
서브쿼리가 여러 행을 반환할 때는 IN 연산자를 사용한다.
상관 서브쿼리1
메인쿼리와 서브쿼리가 서로 연관 관계를 맺고 동작하는 서브쿼리다.
메인쿼리의 각 행에 대해 서브쿼리가 반복적으로 실행된다.
서브쿼리는 메인쿼리의 컬럼 값을 참조하여 결과를 계산한다.
예시로 각 상품이 자신이 속한 카테고리의 평균 가격보다 비싼지 확인할 때 사용한다.
상관 서브쿼리2
EXISTS 연산자는 상관 서브쿼리의 대표적인 활용 사례다.
EXISTS 는 서브쿼리의 결과값이 존재하는지 여부만 확인하며 결과 행이 하나라도 있으면 TRUE 를 반환한다.
서브쿼리 테이블이 매우 클 때 IN 보다 효율적인 경우가 많다.
NOT EXISTS 는 서브쿼리 결과가 존재하지 않을 때 TRUE 를 반환하여 특정 조건에 해당하지 않는 데이터를 찾을 때 사용한다.
SELECT 서브쿼리
SELECT 절에 위치하는 서브쿼리로 결과가 하나의 컬럼처럼 동작한다.
반드시 하나의 값만 반환하는 스칼라 서브쿼리여야 한다.
비상관 서브쿼리는 메인쿼리의 모든 행에 동일한 값을 보여준다.
상관 서브쿼리는 메인쿼리의 각 행과 상호작용하며 행마다 다른 계산 결과를 보여준다.
상관 서브쿼리는 메인쿼리의 행 수만큼 반복 실행되므로 성능 저하에 주의해야 한다.
테이블 서브쿼리
FROM 절에 위치하는 서브쿼리로 인라인 뷰(Inline View)라고도 부른다.
서브쿼리의 실행 결과가 하나의 독립된 가상 테이블처럼 사용된다.
집계나 그룹핑된 결과를 다시 한번 조인하거나 필터링해야 할 때 유용하다.
FROM 절의 서브쿼리는 반드시 별칭(Alias)을 가져야 한다.
서브쿼리 vs JOIN
많은 문제는 서브쿼리와 JOIN 두 가지 방법으로 모두 해결할 수 있다.
일반적으로 데이터베이스 옵티마이저는 JOIN 을 더 효율적으로 처리하여 성능이 좋은 경우가 많다.
하지만 최신 옵티마이저는 간단한 서브쿼리를 JOIN 으로 자동 변환하기도 한다.
가독성 측면에서는 서브쿼리가 논리적 단계를 명확히 보여줘 더 쉬울 때가 있다.
JOIN 을 우선 고려하되 쿼리가 너무 복잡해지면 가독성이 좋은 서브쿼리를 사용하고 성능이 의심될 때는 반드시 측정해야 한다.