-
HiveQL - SELECT 문DATABASE/Hive 2024. 6. 11. 21:53728x90
중첩 SELECT 문
상위 2개의 테이블을 사용하여 고객의 총 주문 금액을 계산하고, 총 주문 금액이 300,000원 이상인 고객을 선택하는 쿼리를 작성했다.
SELECT a.고객ID ,a.이름 ,a.총_주문금액 FROM ( SELECT 고객.고객ID, 고객.이름, SUM(주문.주문금액) AS 총_주문금액 FROM 고객 JOIN 주문 ON 고객.고객ID = 주문.고객ID GROUP BY 고객.고객ID, 고객.이름 ) a # 서브쿼리를 이용하여 a라는 테이블로 임시 테이블을 생성 WHERE a.총_주문금액 >= 300000 # 조건에 일치하는 데이터를 LIMIT 10; # 상위 10위를 뽑아냄
결과
1) 서브쿼리의 결과는 다음과 같다.
고객ID 이름 총_주문금액 1 김철수 250000 2 이영희 600000 3 박민수 750000 4 최수지 250000 5 정지훈 350000 2) WHERE a.총_주문금액 >= 300000 조건을 만족하는 행들은 다음과 같다.
고객ID 이름 총_주문금액 2 이영희 600000 3 박민수 750000 5 정지훈 350000 3) 결과적으로 SELECT a.고객ID, a.이름, a.총_주문금액 FROM (...) a WHERE a.총_주문금액 >= 300000 LIMIT 10; 결과
고객ID 이름 총_주문금액 2 이영희 600000 3 박민수 750000 5 정지훈 350000 위의 결과는 총 주문 금액이 300,000원 이상인 고객 중에서 고객ID, 이름, 총_주문금액을 선택하고, 상위 10개의 행만 반환한 것이다. 이 경우에는 반환된 행이 3개뿐이다.
서브쿼리의 장점
1. 가독성 향상
별칭을 사용하면 긴 테이블 이름을 간단하게 줄일 수 있어 쿼리의 가독성을 높인다. 예를 들어, 긴 테이블 이름 대신 짧은 별칭을 사용하면 코드가 훨씬 간결해진다.
SELECT a.이름 ,a.성적1 ,a.성적2 FROM ( SELECT 이름, 성적1, 성적2, (성적1 * 성적2) AS 성적_곱 FROM 학생 ) a WHERE a.성적_곱 > 200 LIMIT 10; # 여기서 a는 서브쿼리 결과에 대한 별칭이다. a를 사용함으로써 쿼리를 더 간결하고 읽기 쉽게 만든다.
2. 유지보수성 향상
별칭을 사용하면 쿼리를 변경하거나 유지보수할 때 유용하다. 테이블 이름이 바뀌더라도 별칭만 변경하면 되므로, 쿼리를 전체적으로 수정할 필요가 줄어든다.
3. 복잡한 쿼리 구조 관리
서브쿼리를 사용하는 경우, 특히 여러 개의 서브쿼리가 포함된 복잡한 쿼리에서는 각 서브쿼리 결과를 명확하게 구분할 필요가 있다. 별칭을 사용하면 각 서브쿼리의 결과를 명확히 식별하고 관리할 수 있다.
SELECT outer_query.이름 ,outer_query.성적1 ,outer_query.성적2 FROM ( SELECT inner_query.이름, inner_query.성적1, inner_query.성적2, (inner_query.성적1 * inner_query.성적2) AS 성적_곱 FROM 학생 inner_query ) outer_query WHERE outer_query.성적_곱 > 200 LIMIT 10; # 여기서 inner_query와 outer_query라는 별칭을 사용하면 각 쿼리 단계의 역할을 명확히 구분할 수 있다.
4. 동일 테이블의 다중 참조
한 쿼리 내에서 동일 테이블을 여러 번 참조할 때, 별칭을 사용하면 각 참조를 구분할 수 있다. 이는 특히 자기 자신과 조인해야 하는 경우 유용하다.
SELECT a.이름 AS 학생A ,b.이름 AS 학생B FROM 학생 a JOIN 학생 b ON a.성적1 = b.성적2 # 여기서 학생 테이블을 두 번 참조하지만, 별칭을 통해 두 참조를 명확히 구분한다.
728x90'DATABASE > Hive' 카테고리의 다른 글
UNION과 UNION ALL의 차이점 (0) 2024.09.29