서브쿼리는 어떻게 작성할까?
서브쿼리
--
서브쿼리는
SQL문에서 내부에 또 다른 SQL문을 작성하는 쿼리다.
일반적으로 서브쿼리를 작성하는 절
- SELECT절
- FROM절
- WHERE절
- HAVING절
SELECT문뿐만 아니라 INSERT, UPDATE, DELETE문에서도 작성 가능하다.
서브쿼리와 같이 사용할 수 있는 연산자
- IN : 서브쿼리에서 반환된 값들 중에 하나라도 일치하는 값이 있는지 확인
- EXISTS : 서브쿼리의 결과가 존재하는지 여부 확인
주로 WHERE절 or HAVING절에서 사용된다.
IN 연산자 형식
속성명 IN (서브쿼리)
EXISTS 연산자 형식
EXISTS (서브쿼리)
--
SELECT절에 서브쿼리 작성하기
--
SELECT절에 작성하는 서브쿼리는
일반적으로 특정 속성(컬럼)을 계산하거나 , 특정 값을 반환하는 데 사용될 수 있다.
SELECT memberId, ( SELECT COUNT(*)
FROM Order
WHERE Order.orderId ) AS OrderCount
FROM Members;
--
FROM절에 서브쿼리 작성하기
--
FROM절에 사용하는 서브쿼리는
일반적으로 해당 SQL문에 임시로 사용할 테이블처럼 사용된다.
(이러한 방식을 "인라인 뷰(Inline)"라고도 부른다.)
SELECT AVG(OrderCount)
FROM ( SELECT customerId, COUNT(*) AS OrderCount
FROM Orders
GROUP By coustomerId ) AS CustomerOrders;
--
WHERE절에 서브쿼리 작성하기
--
WHERE절에 사용하는 서브쿼리는
일반적으로 어떠한 조건에 사용할 데이터를 반환하는 데 사용된다.
SELECT bookName
FROM Book
WHERE price = ( SELECT MAX(price)
FROM Book; );
IN 연산자를 사용하는 경우
SELECT Name
FROM Customers
WHERE CustomerID IN ( SELECT CustomerID
FROM Orders
WHERE Amount > 100 );
EXISTS 연산자를 사용하는 경우
SELECT Name
FROM Customers C
WHERE EXISTS ( SELECT 1
FROM Orders O
WHERE O.CustomerID = C.CustomerID
AND O.Amount > 100 );
서브쿼리에 해당하는 행이 Customers 테이블에 하나라도 있으면
해당하는 행의 name속성의 값을 반환
(만약 해당하는 행이 하나도 없다면 빈테이블을 반환)
서브쿼리에서 SELECT 1에 1은 아무의미가 없다.
사실 EXISTS 연산자에서 사용하는 서브쿼리는 반환 값이 무엇인지 전혀 중요하지 않다.
해당 조건의 행 존재만 확인하기 때문에
SELECT에 다른 속성을 작성하든 *를 작성하든 상관이 없기 때문에
불필요한 데이터를 선택하지 않고, 최소한의 값인 1을 작성하는 것이 간단하고 효율적이다.
--
HAVING절에 서브쿼리 작성하기
--
HAVING절에 사용하는 서브쿼리는
일반적으로 집계 함수에 조건을 걸어 필터링할 때 사용된다.
SELECT CustomerID, COUNT(*) AS OrderCount
FROM Orders
GROUP BY CustomerID
HAVING COUNT(*) > ( SELECT AVG(OrderCount)
FROM ( SELECT CustomerID, COUNT(*) AS OrderCount
FROM Orders
GROUP BY CustomerID ) AS CustomerOrders );
--
'SQL [DB]' 카테고리의 다른 글
[SQL문] 트랜잭션 제어어 (TCL) (0) | 2024.09.14 |
---|---|
[SQL문] 데이터 제어어 (DCL) (0) | 2024.09.13 |
[SQL문] 데이터 조작어 (DML) (0) | 2024.09.12 |
[SQL문] 데이터 정의어 (DDL) (0) | 2024.09.12 |
관계 데이터 모델의 개념 (릴레이션, 무결성, 관계대수) (0) | 2024.09.10 |