SQL > SQL인스트럭션 > WITH

때로는 단일 SQL 문 하나로 쉽게 대답할 수 없는 복잡한 질문에 직면하게 될 수 있습니다.

여러 개의 인라인 뷰 또는 여러 개의 서브쿼리를 사용하여 한 번에 답을 내려고 할 수 있지만, 그렇게 하면 SQL 이 이해하기 어려워질 가능성이 있으며, Hive SQL 과 같이 특정 SQL 종류에서는 여러 개의 서브쿼리를 허용하지 않을 수 있습니다.

또 다른 접근 방법은 복잡성을 다양한 단계로 나누는 것입니다. 이를 위한 한 가지 방법은 각 단계의 결과를 저장하는 여러 개의 테이블을 생성하는 것입니다. 이것은 종종 디버깅을 쉽게 만들어주고 코드가 어떻게 실행되는지 따라가는 것이 더 간단해지는 좋은 전략일 수 있습니다.

그러나 불필요한 부작용은 이 분석이 끝난 후에 이러한 테이블을 삭제해야 한다는 것입니다. 그렇지 않으면 이러한 테이블은 데이터베이스에 남아 데이터베이스 관리 문제를 야기할 수 있습니다.

여러 개의 테이블을 생성하는 대신 SQL 의 WITH 절을 사용하는 것이 대안입니다.

통사론

WITH 절의 기본 구문은 다음과 같습니다:

WITH <쿼리_이름_1> AS (
SELECT 문 1
)
주 SELECT 문

WITH 절의 사용법은 테이블 생성과 매우 유사합니다. 테이블을 생성할 때 이름을 지정합니다. 마찬가지로 WITH 절을 사용할 때도 이름을 지정하며, 이 이름은 주 SQL 문에서 테이블 이름처럼 작동합니다.

WITH 는 테이블이나 뷰를 생성하지 않기 때문에 WITH 문과 관련된 객체는 주 SQL 문이 실행된 후에 사라지며 정리할 것이 없습니다.

여러 개의 WITH 절을 사용할 수도 있습니다. 구문은 다음과 같습니다:

WITH <쿼리_이름_1> AS (
SELECT 문 1
), <쿼리_이름_2> AS (
SELECT 문 2
),
..
<쿼리_이름_n> AS (
SELECT 문 N
)
주 SELECT 문

여러 개의 WITH 절을 사용하려면 WITH를 여러 번 지정할 필요가 없습니다. 첫 번째 WITH 절이 완료된 후 쉼표를 추가하고, 다음 절을 지정할 때 <쿼리_이름> 다음에 AS를 사용하면 됩니다. 마지막 WITH 절과 주 SQL 쿼리 사이에는 쉼표가 없습니다.

우리는 다음의 테이블을 우리 예제에서 사용합니다.

Store_Sales 도표
 Store_Name  Sales 
 Los Angeles  15000 
 San Diego  2500 
 New York  3000 
 Boston  7000 

예제 1: SELECT 문에 WITH 사용

평균 이상의 매출이 있는 모든 상점을 나열하려고 합시다. 이를 위해 다음과 같은 WITH 문을 사용할 수 있습니다:

WITH t1 AS (
SELECT AVG(Sales) AVG_SALES FROM Store_Sales
)
SELECT a1.* FROM Store_Sales a1, t1
WHERE a1.Sales > t1.AVG_SALES;

결과:

Store_Name Sales
Los Angeles 15000
Boston 7000

WITH 문은 평균 매출액(6,875 달러)을 계산하고, 그런 다음 주 SQL 쿼리는 매출 열의 값이 이 평균 금액보다 큰 모든 행을 반환합니다.

인라인 뷰를 사용한 동등한 SQL 은 다음과 같이 구현할 수 있습니다:

SELECT a1.* FROM Store_Sales a1,
(SELECT AVG(Sales) AVG_SALES FROM Store_Sales) t1
WHERE a1.Sales > t1.AVG_SALES;

마찬가지로, 서브쿼리를 사용한 SQL 로도 동일한 결과를 얻을 수 있습니다.

SELECT a1.* FROM Store_Sales a1
WHERE a1.Sales >
(SELECT AVG(Sales) AVG_SALES FROM Store_Sales);

주의: 서브쿼리 버전은 Hive SQL 에서 서브쿼리를 지원하지 않기 때문에 작동하지 않습니다.

예제 2: CREATE TABLE 문에 WITH 사용

WITH 를 사용하여 CREATE TABLE 문과 함께 사용할 수도 있습니다. 이전 예제에서 WITH 절을 사용하여 테이블을 만들고 싶다고 가정해 봅시다. 이를 위해 다음과 같이 입력할 것입니다.

CREATE TABLE Above_Average_Sales
AS
WITH t1 AS (
SELECT AVG(Sales) AVG_SALES FROM Store_Sales
)
SELECT a1.* FROM Store_Sales a1, t1
WHERE a1.Sales > t1.AVG_SALES;

쿼리의 WITH 부분은 CREATE TABLE AS 뒤에 나옵니다. WITH 절을 처음에 두지 마세요. 아래의 쿼리는 오류를 발생시킵니다:

WITH t1 AS (
SELECT AVG(Sales) AVG_SALES FROM Store_Sales
)
CREATE TABLE Above_Average_Sales
AS
SELECT a1.* FROM Store_Sales a1, t1
WHERE a1.Sales > t1.AVG_SALES;

SQL EXISTS >>

이페이지는 2023년10월16일에 마지막으로 업데이트되었습니다



Copyright © 2024   1keydata.com   All Rights Reserved