[데이터베이스 - 부속질의(서브쿼리)]

yedy·2023년 5월 12일
0

[mySQL]

목록 보기
7/16
post-thumbnail

✔️ 부속질의(subquery)란?

하나의 SQL 문 안에 다른 SQL 문이 중첩된 nested 질의를 말함.
다른 테이블에서 가져온 데이터로 현재 테이블에 있는 정보를 찾거나 가공할 때 사용함.
보통 데이터가 대량일 때 데이터를 모두 합쳐서 연산하는 조인보다 필요한 데이터만 찾아서 공급해주는 부속질의가 성능이 더 좋음.
주 질의(main query,외부질의)와 부속질의(sub query, 내부질의)로 구성됨.
쿼리문을 여러번 수행해야 얻을 수 있는 결과를 하나의 문장(중첩된)으로 간편하게 조회할 수 있다!!


🔹 주의 사항
서브쿼리를 괄호로 묶어서 사용
서브쿼리 안에서는 Order by절은 사용 못함
연산자로 오른쪽에 사용해야 함


부속질의의 종류

✔️ WHERE

보통 데이터를 선택하는 조건 혹은 술어와 같이 사용됨. 그래서 중첩질의를 술어 부속질의라고도 함.

🔺 비교 연산자

부속질의가 반드시 단일 행, 단일 열을 반환해야 하며, 아닐 경우 질의를 처리할 수 없음.

평균 주문금액 이하의 주문에 대해서 주문번호와 금액

각 고객의 평균 주문금액보다 큰 금액의 주문 내역에 대해서 주문번호, 고객번호, 금액

🔺 IN, NOT IN

IN 연산자는 주질의 속성 값이 부속질의에서 제공한 결과 집합에 있는지 확인하는 역할을 함. IN 연산자는 부속질의의 결과 다중 행을 가질 수 있음. 주질의는 WHERE 절에 사용되는 속성 값을 부속 질의의 결과 집합과 비교해 하나라도 있으면 참이 된다. NOT IN은 이와 반대로 값이 존재하지 않으면 참이 됨.

대한민국에 거주하는 고객이게 판매한 도서의 총판매액을 구하시오.

🔺 ALL, SOME(ANY)

ALL은 모두, SOME(ANY)는 어떠한(최소한 하나라도)이라는 의미를 가짐.

3번 고객이 주문한 도서의 도서의 최고 금액보다 더 비싼 도시를 구입한 주문의 주문번호와 금액

🔺 EXISTS, NOT EXISTS

데이터의 존재 유무를 확인하는 연산자
주질의에서 부속질의로 제공된 속성의 값을 가지고 부속질의에 조건을 만족하여 값이 존재하면 참이 되고 , 주질의는 해당 행의 데이터를 출력함.

EXISTS 연산자로 대한민국에 거주하는 고객에 판매한 도서의 총 판매액

😂
여기서 IN이랑 EXISTS랑 비슷하지만 다르다!!
EXISTS는 안에 하나라도 값이 있으면 있다고 나오는 것! ( 'IN'이랑 비교 )

🔺 스칼라 부속질의

SELECT 절에서 사용되는 부속질의로, 부속직의의 결과 값을 단일 행, 단일 열을 스칼라 값으로 반환함. 스칼라 부속질의는 원칙적으로 스칼라 값이 들어갈 수 있는 모든 곳에 사용 가능하며, 일반적으로 SELECT 문과 UPDATE SET 절에 사용됨. 주 질의와 부속질의와의 관계는 상관/비상관 모두 가능함.

마당서점의 고객별 판매액

Orders 테이블에 각 주문에 맞는 도서이름

✔️ FROM

🔺 인라인 뷰

FROM 절에서 사용되는 부속질의
테이블 이름 대신 인라인 뷰 부속질의를 사용하면 보통의 테이블과 같은 형태로 사용할 수 있음. 부속질의 결과 반환되는 데이터는 다중 행, 다중 열이러도 상관없음. 다만 가상의 테이블인 뷰 형태로 제공되어 상관 부속질의로 사용

✔️ 뷰(view)

하나 이상의 테이블을 합하여 만든 가상의 테이블

🔺 장점

  • 편리성(및 재사용성) : 자주 사용되는 복잡한 질의를 뷰로 미리 정의해 놓을 수 있음.
    => 복잡한 질의를 간단히 작성, 미리 정의된 뷰를 일반 테이블처럼 사용할 수 있기 때문에 편리함
  • 보안성 : 각 사용자별로 필요한 데이터만 선별하여 보여줄 수 있음. 중요한 질의의 경우 질의 내용을 암호화할 수 있음.
    => 개인정보(주민번호)나 급여, 건강 같은 민감한 정보를 제외한 테이블을 만들어 사용
  • 논리적 독립성 제공:
    => 개념 스키마의 데이터베이스 구조가 변하여도 외부 스키마에 영향을 주지 않도록하는 논리적 데이터 독립성 제공

🔺 뷰의 특징
1. 원본 데이터 값에 따라 같이 변함
2. 독립적인 인덱스 생성이 어려움
3. 삽입, 삭제, 갱신 연산에 많은 제약이 따름

기본 문법

Book table에서 축구라는 문구가 포함된 자료만 보여주는 뷰

위 SELECT 문을 이용해 작성한 뷰 정의문

주소에 '대한민국'을 포함하는 고객들로 구성된 뷰를 만들고 조회. 뷰의 이름은 vw_Customer로 설정

Orders 테이블에 고객이름과 도서이름을 바로 확인할 수 있는 뷰를 생성한 후, '김연아' 고객이 구입한 도서의 주문번호, 도서이름, 주문액

🔺 뷰의 삭제

기본문법

DROP VIEW 뷰이름 [,... n];

앞서 생성한 뷰 vw_Customer를 삭제

DROP VIEW vw_Customer;
profile
공주 개발자

0개의 댓글