서브쿼리
- 서브쿼리는 메인쿼리의 칼럼을 모두 사용할 수 있음
- 메인쿼리는 서브쿼리의 칼럼을 사용할 수 없음
- 서브쿼리 칼럼을 표시해야한다면 스칼라 서브쿼리(SELECT(SELECT ~)), 함수 등을 사용
- 서브쿼리는 서브쿼리 레벨과는 상관없이 항상 메인쿼리 레벨로 결과 집합이 생성
- 서브쿼리는 괄호로 감싸서 사용
- 서브쿼리는 단일행 또는 복수행 비교연산자와 함께 사용가능
- 서브쿼리에서는 ORDER BY 절을 사용하지 못하고, 메인쿼리 마지막 문장에 사용 가능
서브쿼리가 SQL문에서 사용가능한 곳
SELECT, FROM, WHERE, HAVING, ORDER BY, INSERT 문의 VALUES, UPDATE 문의 SET
서브쿼리의 종류는 동작하는 방식이나 반환 되는 데이터 형태에 따라 다음과 같이 두개로 분류
- 비연관 서브쿼리
서브쿼리가 메인쿼리 컬럼을 가지고 있지 않는 형태의 서브쿼리이다. 메인쿼리에 값을 제공하기 위한 목적으로 주로 사용한다. - 연관 서브쿼리
서브쿼리가 메인쿼리 컬럼을 가지고 있는 형태의 서브쿼리이다. 일반적으로 메인쿼리가 먼저 수행되어 읽혀진 데이터를 서브쿼리에서 조건이 맞는지 확인하고자 할 때 주로 사용된다.
- 비연관 서브쿼리
다만 서브쿼리는 메인쿼리 안에 포함된 종속적인 관계이기 때문에, 논리적인 실행순서는 항상 메인쿼리에 읽혀진 데이터에 대해 서브쿼리에서 해당 조건이 만족하는 지를 확인하는 방식으로 수행되어야 하지만, 실제 서브쿼리의 실행순서는 상황에 따라 달라질 수 있다
WHERE 부속질의
비상관 서브쿼리
- 평균 주문금액 이하의 주문에 대해서 주문번호와 금액을 보이시오.
SELECT orderid, saleprice FROM Orders
WHERE saleprice <= (SELECT AVG(saleprice) FROM Orders);
상관 서브쿼리
- 각 고객의 평균 주문금액보다 큰 금액의 주문 내역에 대해서 주문번호, 고객번호, 금액을 보이시오.
- 고객별 스칼라 값이 나오기 때문에, 이럴 때 상관 서브쿼리를 사용한다.
SELECT orderid, custid, saleprice FROM Orders od
WHERE saleprice > (SELECT AVG(saleprice) FROM Orders so
WHERE od.custid = so.custid);
IN, NOT IN
- IN 연산자는 주 질의 속성 값이 부속질의에서 제공한 결과 집합에 있는지 확인(CHECK)하는 역할을 함.
- IN 연산자는 부속질의의 결과 다중 행을 가질 수 있음.
- 주 질의는 WHERE 절에 사용되는 속성 값을 부속질의의 결과 집합과 비교해 하나라도 있으면 참이 된다.
- NOT IN은 이와 반대로 값이 존재하지 않으면 참이 됨
SELECT SUM(saleprice) "total"
FROM Orders
WHERE custid IN (SELECT custid
FROM Customer
WHERE address LIKE '%대한민국%');
ALL, SOME(ANY)
- ALL은 모두, SOME(ANY)은 어떠한(최소한 하나라도)라는 의미를 가짐
- 3번 고객이 주문한 도서의 최고 금액보다 더 비싼 도서를 구입한 주문의 주문번호와 금액을 보이시오
SELECT orderid, saleprice
FROM Orders
WHERE saleprice > ALL (SELECT saleprice
FROM Orders
WHERE custid = '3');
'데이터 엔지니어링 > 데이터베이스 및 운영체제' 카테고리의 다른 글
SQL(ORACLE) 시스템 및 DML 권한 명령어 모음 (0) | 2023.03.24 |
---|---|
SQL - 뷰 (0) | 2023.03.24 |
SQL 집합 연산, EXISTS (0) | 2023.03.23 |
SQL 서브쿼리(부속질의) (1) | 2023.03.22 |
SQL_기초(JOIN) (0) | 2023.03.22 |