05 조인 이해 및 실습
- 조인 (Join)
- 두 개의 테이블을 연결하여 데이터를 검색하는 방법
- 서로 다른 테이블에 저장된 관련된 데이터를 가져와서 하나의 결과로 표시 (하나의 테이블)
- ANSI SQL 조인 방식
- FROM 절에서 두 테이블명 사이에 조인 종류에 따라 CROSS, INNER, OUTER 중 선택하고 JOIN 키워드 같이 입력
- 조인에 대한 조건은 ON절에 저장하고 나머지 조건은 WHERE절에 작성
- CROSS, INNER, OUTER 키워드는 생략도 가능
- 형태
-
SELECT * FROM 테이블A [CROSS|INNER|OUTER] JOIN 테이블B ON 조인조건 WHERE 기타조건;
-
- Non-ANSI SQL 조인 방식
- FROM절에 테이블을 쉼표로 구분하여 작성
- 조인조건과 기타조건을 구분하지 않고 모두 WHERE 절에 작성
- 형태
-
SELECT * FROM 테이블A, 테이블B WHERE 조인조건과 기타조건;
-
- ERD (Entity Relationship Diagram)
- 테이블 간의 관계를 설명해주는 다이어그램
- 데이터베이스의 구조와 관계를 한눈에 파악 가능
- 조인의 종류
- Cross Join
- 한쪽 테이블의 각 행마다 다른쪽 테이블의 모든 행이 각각 한번씩 매칭되는 조인
- 카티션 곱(Cartesian Product)라고도 부른다.
- 크로스 조인 결과 행의 개수는 테이블A 행의 개수*테이블B 행의 개수
- 형태
-
SELECT * FROM 테이블A [CROSS] JOIN 테이블B WHERE 기타조건;
-
- Inner Join (내부 조인)
- 각 테이블에서 조인조건에 일치하는 데이터만 가져오는 조인
- Equi Join과 Non-Equi Join
- Equi Join
- 조인조건에 = 연산자 사용
- Non-Equi Join
- 조인조건에 = 연산지 외에 비교 연산자 사용
- Equi Join
- 다중 조인
- JOIN - ON 아래에 또다시 JOIN - ON
- 형태
-
SELECT * FROM 테이블A [INNER] JOIN 테이블B ON 조인조건 WHERE 기타조건;
- 예시
-
SELECT 사원번호, 직위, 사원.`부서번호`, 부서명 FROM 사원 INNER JOIN 부서 ON 사원.`부서번호` = 부서.`부서번호` WHERE 이름 = '이소미';
-
- Outer Join (외부조인)
- 조건에 맞지 않은 행도 함께 출력할 수 있다.
- 두 테이블에서 한쪽은 데이터가 있고 한쪽에는 없을 경우 데이터가 있는 쪽을 기준으로 데이터 출력
- LEFT/RIGHT 외부조인
- 테이블명 사이에 LEFT나 RIGHT를 넣어서 OUTER JOIN (OUTER은 생략 가능)
- LEFT JOIN
- 왼쪽에 있는 테이블을 기준으로 오르쪽 테이블의 데이터를 매칭
- 매칭데이터 없을 시 NULL 표시
- RIGHT JOIN
- 오른쪽에 있는 테이블을 기준으로 왼쪽 테이블의 데이터를 매칭
- 매칭데이터 없을 시 NULL 표시
- 형태
-
SELECT * FROM 테이블A LEFT|RIGHT [OUTER] JOIN 테이블B ON 조인조건 WHERE 기타조건;
-
- FULL OUTER JOIN
- LEFT OUTER JOIN에 RIGHT OUTER JOIN을 합한 형태
- 두 OUTER JOIN 중간에 UNION 연산자 사용
- SELF JOIN
- 동일한 테이블 내에서 한 컬럼이 다른 컬럼을 참조하는 조인
- 조인 조건에 동일한 테이블명을 두번 작성하여 조인한다. 이때 테이블명을 다른 별명으로 지정하여 다른 테이블인 것처럼 사용해야 한다.
- 컬럼명도 다 똑같기 때문에 테이블의 별명.컬럼명 형태로 구분해야 한다.
- Cross Join
06 서브쿼리 이해 및 실습
- 서브쿼리 (SubQuery)
- SELECT 문 안에 SELECT 문을 서브쿼리라고 한다.
- 복잡한 데이터 추출 및 조작시 사용
- 서브쿼리는 괄호 안에 기술해야 하고, SELECT, FROM, WHERE, HAVING 절 등에 넣어서 사용 가능
- 서브쿼리가 먼저 실행 후 메인 쿼리 실행
- 단일 행 서브쿼리 (Single-Row SubQuery)
- 서브쿼리의 결과로 단일 행 반환
- =, <, ≤, ≥, >, <> 등 단일 행 비교연산자 사용하여 연결
- 예시
-
SELECT 컬럼명 FROM 테이블명 WHERE 컬럼명 = (SELECT MAX(컬럼명) FROM 테이블명);
-
- 복수 행 서브쿼리 (Multi-Row SubQuery)
- 서브쿼리의 결과가 여러 행
- IN, ALL, ANY, SOME, EXISTS 같은 복수행 비교 연산자 사용하여 연결
- IN
- 서브쿼리 결과 중 일치하는 것이 하나라도 있으면 참
- ANY, SOME
- 하나 이상 일치하면 참
- ALL
- 각 결과값이 모두 일치하면 참
- EXISTS
- 비교 조건을 만족하는 결과가 존재하면 참
- IN
- 인라인 뷰(Inline View)
- FROM 절에서 서브쿼리 사용하는 것을 인라인 뷰라고 한다.
- 뷰에는 반드시 별명 지정, 해당 별명은 테이블명처럼 사용 가능
- 스칼라 서브쿼리 (Scalar Subquery)
- SELECT 절 내에서 서브쿼리 사용 시 이때 서브쿼리가 하나의 값을 생성하는 형태를 스칼라 서브쿼리라고 한다.
- 정확히 한 개의 행에 대해 한개의 값을 반환하는 서브쿼리
- 0개 반환시 메인 쿼리 결과는 NULL
- 2개 이상 반환시 오류 발생
- 쿼리를 실행하여 반환되는 값은 메인 쿼리에서 사용
- CTE(Common Table Expression)
- 쿼리로 만든 임시 데이터셋으로 WITH 절에서 정의한다.
- 쿼래 내에서 여러 번 참조 가능
- 하나의 쿼리를 논리적인 블록으로 나누기 가능
- 형식
- WITH CTE명 AS ( SELECT문 )
'교육 (Today I Learned) > Hanaro' 카테고리의 다른 글
[Hanaro] 47일차 / SQL (DML, DDL, 제약조건, 데이터타입, 윈도우함수, 데이터모델링) (0) | 2024.03.22 |
---|---|
[Hanaro] 43일차 / SQL (SELECT문, 연산자) (0) | 2024.03.22 |
[Hanaro] 45일차 / SQL (집계 함수) (0) | 2024.03.21 |
[Hanaro] 44일차 / SQL (단일행 함수) (0) | 2024.03.20 |
[Hanaro] 42일차 / Java (Collection, JDBC, 기본 SQL문, DB연결) (0) | 2024.03.18 |