뷰(View)
- 실제 데이터를 저장하지 않고 쿼리 결과를 동적으로 생성하는 가상의 논리적 테이블
뷰의 특징
- 데이터 접근제어를 통해 데이터의 논리적 독립성과 보안을 제공
- 사용자의 요구에 맞게 데이터를 제공할 수 있어 사용자 데이터 관리 용이
- 뷰 위에 또 다른 뷰를 정의할 수 있음 (복잡한 쿼리 대신에 쿼리 사용한 뷰를 만들어두면 뷰를 조회하는 것 만으로 사용자는 복잡한 쿼리 없이 복잡한 데이터를 쉽게 볼 수 있다.
- 삽입(Insert), 갱신(Update), 삭제(Delete) 연산 및 인덱스 생성에 제약사항이 따름
- 기본 테이블처럼 Create 문을 사용해 정의하고 Drop 문을 통해 제거 (뷰도 테이블 같은 데이터베이스 “객체” 라서)
인덱스(index)
- 문헌의 색인, 사전과 같이 데이터를 쉽고 빠르게 찾을 수 있도록 만든 데이터 구조
인덱스의 특징
- 데이터 검색 시 처리속도 향상에 도움
- 테이블 삭제 시 인덱스도 같이 삭제
- 기본 테이블처럼 Create 문을 사용해 정의하고 Drop문을 통해 제거
집합 연산
- 두 개 이상의 쿼리 결과를 결합하거나 비교하는 연산
- 집합 연산 수행 시에는 각 쿼리 결과의 열 개수와, 데이터 유형이 일치해야 함

- Union
- 두 쿼리의 결과를 합치고, 중복을 제거한 후 반환
- Union All
- 두 쿼리의 결과를 합치고, 중복을 유지하여 반환. 데이터 중복여부 판별가능
- Intersect
- Minus
이러한 집합연산들은 복잡한 데이터 분석이나 보고서 작성시 유용하게 사용가능
예시) 집합 연산의 결과

조인
- 두 개 이상의 테이블을 연결하여 데이터를 결합하는 방법
- 여러 테이블에 분리된 데이터를 함께 조회할 때 사용
- 관계형 데이터베이스의 핵심 기능으로, 논리적 조인과 물리적 조인으로 나뉨

내부 조인(Inter Join)
- 두 테이블 간에 공통된 값이 있는 행만 결합하여 반환
- 일치하는 데이터만 조회되므로 양쪽 테이블 모두에 있는 값만 결과에 포함됨
외부 조인(Outer Join)
- Left Outer Join : 왼쪽 테이블의 모든 행을 반환하고, 오른쪽 테이블에서 일치하는 데이터를 함께 반환
- Right Outer Join : 오른쪽 테이블의 모든 행을 반환하고, 왼쪽 테이블에서 일치하는 데이터를 함께 반환
- Full Outer Join : 두 테이블의 모든 데이터를 반환
- 매칭되지 않는 행은 NULL이 반환됨
교차 조인(Cross Join)
- 별도의 조인 조건 없이, 두 테이블의 모든 행을 다른 테이블의 모든 행과 결합
셀프 조인(Self Join)
- 한 테이블을 스스로와 조인하는 방식으로, 같은 테이블 내에서 데이터를 조합할 때 사용
서브 쿼리
- 쿼리 안에 또 다른 쿼리가 포함된 구조 (주로 복잡한 쿼리에서 사용됨)
- 복잡한 쿼리에서 일부 데이터를 먼저 조회한 후, 그 데이터를 바탕으로 메인 쿼리를 실행할 때 사용
Where 절에 조건으로 활용되는 서브쿼리
SELECT column1, column2
FROM table_name
WHERE column_name IN | ALL | ANY | EXISTS (subquery);
- IN : 서브쿼리 결과 목록에 특정 값이 있는지 확인
SELECT name
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date > ‘2024-01-01’);
- ALL : 서브쿼리의 모든 결과에 대해 주어진 조건을 만족하는지 확인
SELECT name
FROM Products
WHERE price > ALL (SELECT Price FROM Products WHERE category = ‘Electronics’);
- ANY : 서브쿼리 결과 중 하나라도 조건을 만족하는지 확인
SELECT name
FROM Products
WHERE price < ANY (SELECT Price FROM Products WHERE category = ‘Electronics’);
- EXISTS : 서브쿼리 결과가 존재하는지 여부만 확인
SELECT name
FROM customers
WHERE EXISTS IN (SELECT customer_id FROM orders WHERE orders.customer_id = customer_id);
From 절에 테이블로 활용되는 서브쿼리
- 서브쿼리의 결과를 임시 테이블처럼 사용
그러나 이 결과에는 문제가 있다. 인사 변경이력까지 포함하기 때문에 직원테이블의 행수를 세는 것 뿐, 실제 직원수를 세는 것이 아님.
그래서 위와 같이 서브쿼리 활용해서 해결가능
