1. 동작하는 방식에 따른 서브쿼리 분류
•
서브쿼리에 메인쿼리의 컬럼이 포함되는지에 따라 구분
◦
연관 서브쿼리
◦
비연관 서브쿼리
연관 서브쿼리
•
메인쿼리의 컬럼이 서브쿼리에 포함되며, 메인쿼리의 컬럼은 서브쿼리에 특정조건으로 사용됨
•
문제 예시
◦
EMPLOYEE A가 서브쿼리 안의 A.DEPARTMENT_ID 로 연관되어서 영향을 끼치기 때문에
연관 서브쿼리로 보는 것
◦
ELICE 는 DEAPRTMENT_ID가 1임. 서브쿼리의 A.DEPARTMENT_ID로 들어가서
B.DEPARTMENT_ID랑 매치되면 그것들끼리 묶어서 AVG(SALARY)가 나옴
→ 나온 값 보다 > SALARY를 구할때 서브쿼리에 설정해두었던게 영향을 미치는듯 ?
→ ELICE의 SALARY값이 12,000으로 들어갈때 서브쿼리는 6,900로 설정되어있음
비연관 서브쿼리
•
메인쿼리 컬럼이 서브쿼리에 포함되지 않으며, 주로 메인쿼리에 특정한 값을 제공할 때 사용
•
문제 예시
◦
NAME인 'ELICE'가 들어간 'DEPARTMENT_ID'를 찾고 이거의 AVG(SALARY)를 구하는것
2. 반환되는 데이터 형태에 따른 서브쿼리 분류
•
서브쿼리 분류
◦
단일 행 서브쿼리
◦
다중 행 서브쿼리
◦
다중 컬럼 서브쿼리
•
연관, 비연관은 다른 기준으로 서브쿼리를 나눈 것이라고 생각하면 됨
단일 행 서브쿼리
•
서브쿼리의 결과가 한 개의 행을 반환 함
•
단일 행 비교 연산자 (=, <, >, ≤, ≥) 과 같이 사용됨
◦
ELICE의 값은 한 개기 때문에 단일 행 서브쿼리라고 함
다중 행 서브쿼리 - In, All, Any, Exist
•
서브쿼리의 결과가 두 개 이상 행을 반환할 수 있음
•
다중 행 비교 연산자(In, All, Any, Exist) 와 같이 사용된다
•
다 중행 서브쿼리 연산자
◦
In: 서브쿼리 존재하는 값들 중 하나가 무조건 일치해야 함
◦
Exists: 서브쿼리의 존재가 존재하는 지의 여부
•
IN
•
Exists - 서브쿼리의 결과가 존재 하느냐 아니냐
◦
in의 경우는 어떤 컬럼에 있는 값이 들어가 있느냐를 봐야해서 앞에 컬럼명이 있었는데
exist는 없어도 됨
◦
EXIST뒤에 서브쿼리의 값이 존재하느냐 안하느냐가 중요
◦
서브쿼리에 대한 설명
▪
왜 ELICE, LINDA, ROBERT가 출력이 되는거냐?
•
ALL
•
ANY
다중 컬럼 서브쿼리
•
서브쿼리의 결과가 여러개의 컬럼(행이 아니라)을 반환함
•
메인쿼리의 조건과 동시에 비교됨
•
다중컬럼 서브쿼리
◦
서브쿼리의 결과는 두개의 컬럼을 갖게 됨
스칼라 서브쿼리
단일 행과 단일 컬럼의 데이터를 반환을 해야 한다
•
하나의 속성을 가지면서, 하나의 행만을 반환하는 쿼리이다
•
select, where, having 절 등에서 사용할 수 있다
•
문제
스칼라 서브쿼리 예시 - DUAL
•
from을 사용한 특정 테이블 참조 없이 쿼리를 작성할 수 있음
•
mysql에서는 굳이 from을 쓰지 않아도 됨 → 이럴때 ‘dual’(아무의미 없는 테이블)을 사용 함
뷰 View
물리적으로 저장되어있는 것이 아님
•
뷰는 다른테이블에서 파생된 테이블
•
물리적으로 데이터가 저장되는 것이 아니라 논리적으로만 존재함
•
뷰를 사용한 질의 시에는 DBMS에서 뷰 정의따라 질의를 재작성하여 수행한다
View의 장점
•
편리성
◦
어떠한 데이터를 그떄마다 join을 하는게 아니라, 이걸 view로 만들어 놓을 수 있음
•
보안성
◦
전체 데이터는 admin만 볼수 있게 설정해놓고, 나머지 ID/NAME은 전체 볼수 있도록 설정 가능
View의 특징
•
생성된 뷰는 또 다른 뷰를 생성하는데 사용 될 수 있다
◦
table → view 생성 → 또다른 view 생성 이런식으로
•
뷰의 정의는 변경할 수 없으며, 삭제 후 재생성이 필요하다
◦
table의 경우는 update가 가능했는데 view는 재생성해야함
•
뷰를 통한 갱신에는 제약이 따른다. 갱신을 위해서는 기본적으로 원천 테이블의 기본키가 포함되어야 한다
•
원천이 되는 테이블이나 뷰가 삭제되면 이를 기반으로 하는 뷰도 함께 삭제된다
◦
오리지널 데이터가 삭제되면 view 테이블도 삭제됨
View 정의 쿼리
•
위를 보고 예시
create view member_name as
select ID, name
from member


















