JOIN
데이터베이스에서 데이터는 다수의 테이블에 나뉘어 저장되어 있습니다. 데이터의 중복을 제거하고 무결성을 보장하기 위해서 데이터 성격에 따라 분류하여 테이블에 저장을 하는 겁니다.
이렇게 테이블별로 분리되어 있는 데이터를 연결하여 하나의 결과 데이터 셋으로 출력해야 할 때가 반드시 존재합니다. 이럴때 사용하는 것이 조인(Join)입니다.
1. INNER JOIN
Inner join은 교집합( A ∩ B ) 연산과 같습니다. 조인 키 컬럼 값이 양쪽 테이블 데이터 집합에서 공통적으로 존재하는 데이터만 조인해서 결과 데이터 집합으로 추출하게 됩니다.
2. OUTER JOIN
OUTER JOIN은 조인하는 여러테이블에서 한 쪽에는 데이터가 있고, 한 쪽에는 데이터가 없는 경우, 데이터가 있는 쪽 테이블의 내용을 모두 출력하는 것입니다. 즉, 조건에 맞지 않아도 해당하는 행을 출력하고 싶을 때 사용할 수 있습니다.
- LEFT OUTER JOIN : 조인문의 왼쪽에 있는 테이블의 모든 결과를 가져 온 후 오른쪽 테이블의 데이터를 매칭하고, 매칭되는 데이터가 없는 경우 NULL로 표시한다.
- RIGHT OUTER JOIN : 조인문의 오른쪽에 있는 테이블의 모든 결과를 가져온 후 왼쪽의 테이블의 데이터를 매칭하고, 매칭되는 데이터가 없는 경우 NULL을 표시한다.
- FULL OUTER JOIN : LEFT, RIGHT OUTER JOIN을 합친 것으로 양쪽 모두 조건이 일치하지 않는 것까지 모두 결합해 출력한다.
※ MySQL에서는 FULL OUTER JOIN이 없으므로,
LEFT OUTER JOIN 과 RIGHT OUTER JOIN을 UNION 하는 식으로 하여 FULL OUTER JOIN을 만들어 준다.
서브쿼리
하나의 SQL 문에 포함되어 있는 또 다른 SQL 문을 말한다.
주의사항
- 서브쿼리를 괄호로 감싸서 사용한다.
- 서브쿼리는 단일 행 또는 복수 행 비교 연산자와 함께 사용 가능하다.
- 서브쿼리에서는 ORDER BY 를 사용하지 못한다.
사용 가능한 위치
1. SELECT 절
2. FROM 절
3. WHERE 절
4. HAVING 절
5. ORDER BY 절
6. INSERT 문의 VALUES 절
7. UPDATE 문의 SET 절
단일 행 서브쿼리
서브쿼리가 단일 행 비교 연산자(=, <, <=, >, >=, <>)와 함께 사용할 때는 서브쿼리의 결과 건수가 반드시 1건 이하여야 합니다.
만약 결과가 2건 이상인 경우 오류가 발생합니다.
다중 행 서브쿼리
서브쿼리의 결과가 2건 이상 반환될 수 있다면 반드시 다중 행 비교 연산자(IN, ALL, ANY, SOME)와 함께 사용해야 합니다.
다중 컬럼 서브쿼리
서브쿼리 결과로 여러 개의 컬럼이 반환되어 메인쿼리의 조건과 동시에 비교되는 것을 의미합니다.
연관 서브쿼리
서브쿼리 내에 메인쿼리 컬럼이 사용된 서브쿼리 입니다.
SELECT 절에 사용하는 서브쿼리
스칼라 서브쿼리라고도 합니다.
스칼라 서브쿼리는 한 행, 한 컬럼만을 반환하는 서브쿼리를 말합니다.
FROM 절에 사용하는 서브쿼리
인라인 뷰 라고 합니다.
기본적으로 FROM 절에는 테이블 명이 오도록 되어있습니다. 그런데 서브쿼리가 FROM 절에 사용되면 동적으로 생성된 테이블인 것처럼 사용할 수 있습니다.
인라인 뷰는 SQL 문이 실행될 때만 임시적으로 생성되는 동적인 뷰이기 때문에 데이터베이스에 해당 정보가 저장되지 않습니다.
인라인 뷰는 동적으로 조인 방식을 사용하는 것과 같습니다.
HAVING 절에서 사용하는 서브쿼리
그룹함수와 함께 사용될 때 그룹핑된 결과에 대해 부가적인 조건을 주기 위해 사용합니다.
데이터 삭제 쿼리 종류
1. DELETE
- WHERE절을 사용하여 테이블에 있는 데이터를 하나하나 선택하여 제거하는 방식
- WHERE절을 사용하지않고 테이블의 모든 데이터를 삭제하더라도, 내부적으로는 한줄 한줄 일일히 제거하는 과정을 거침
- 처리속도가 늦고, 퍼포먼스에 좋지않은 영향을 줄 수 있음
- 원하는 데이터만 골라서 삭제할 때에는 DELETE 사용 / 전체 데이터 삭제할 때에는 TRUNCATE 사용
- 데이터를 삭제하더라도 데이터가 담겨있던 Storage는 Release 되지않는다.
- DELETE된 데이터는 COMMIT 명령어를 사용하기 전이라면, ROLLBACK 명령어를 통해 되돌릴 수 있음
2. TRUNCATE
- 전체 데이터를 한번에 삭제하는 방식 ( <-> DELETE)
- 최초 생성되었을 당시의 Storage만 남기고, 데이터가 남겨있던 Storage는 Release 된다.
- TRUNCATE TABLE을 하면 CREATE TABLE을 한 직후의 상태와 같다.
- 자동 COMMIT이 되는 명령어이기 때문에, 이미 지운 데이터는 되돌릴 수 없다.
3. DROP
- 테이블 자체를 완전히 날려버리는 방식 -> 처음부터 없었던 테이블처럼
- 테이블 자체가 모두 지워지며, 해당 테이블에 생성되어있던 모든 인덱스도 사라진다.
- 자동 COMMIT이 되는 명령어이기 때문에, 이미 지운 데이터는 되돌릴 수 없다.
- 오라클10g부터는 테이블이 삭제되는 것이 아니라 윈도우의 휴지통 개념처럼 잠시 삭제 -> 테이블 이름이 BIN$..로 변경됨
DISTINCT
데이터 조회 시 데이터 중복을 제거하기 위해서 사용하는 키워드이다.
DISTINCT 키워드를 사용하여 데이터 중복을 제거할 때는 SELECT 절에 DISTINCT 키워드만 명시하면 되므로 쿼리문이 복잡하지 않고 간결하다. 그러나 DISTINCT 키워드를 사용하면 temp tablespace에 임시로 저장하고 작업하는 방식이라서 시스템에 조금 부하가 발생할 수도 있다.
'DB' 카테고리의 다른 글
HDD와 SSD, 랜덤 I/O, 순차 I/O (0) | 2023.09.29 |
---|---|
SQL 안티패턴, SQL Injection 공격 (0) | 2023.09.21 |
VIEW 와 SELECT 실행 순서 (0) | 2023.09.21 |
SQL (0) | 2023.09.21 |
키(Key)의 종류 (0) | 2023.09.15 |