SQL WITH |
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 도표
예제 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; 결과:
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;
|