Search
🔺

8. 서브쿼리 심화

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