데이터베이스

MariaDB 데이터베이스[database, DB] InLine View

멈머이 2023. 11. 24. 00:03
728x90

[ InLine View ]

 - From절 뒤에 테이블대신에 SubQury를 사용함
 - 행렬의 데이터를 테이블과 동일한 개념으로 사용하기 때문에 가상테이블이라고 칭한다
 - 가상테이블은 별칭을 이용해서 테이블 이름처럼 사용한다.

 - 보통 테이블 별칭은 대문자 컬럼은 소문자
 - 가상테이블 개념이 적용됨

 - FROM 절에 서브쿼리를 사용하면 특정 조건식을 갖는 SELECT 문을 테이블처럼 사용할 수 있다.

 

한마디로 SELECT 절에서 나온 결과를 FROM 절에서 하나의 테이블처럼 사용하고 싶을 때 사용한다.

 

예제로 알아보겠다.

 

   * 주문내역이 있는 회원별로 지금까지 총 지출한 총액 조회하기
     조회컬럼 : 회원아이디, 회원이름, 총 지출액

SELECT mem_id, mem_name, sum(cart_qty * prod_sale) AS total 
FROM member 
		INNER JOIN cart
		ON(mem_id = cart_member)
		INNER JOIN prod
		ON(cart_prod = prod_id)
GROUP BY mem_id, mem_name 
ORDER BY total DESC;

총 19개의 값이 나온다.

 

* 위 결과에서 가장 지출이 가장 큰 값과, 가장 작은 값 조회하기
    조회값 : 최댓값, 최솟값

SELECT MAX(A.total) AS total_max, MIN(A.total) AS total_min
FROM (SELECT mem_id, mem_name, sum(cart_qty * prod_sale) AS total 
FROM member 
		INNER JOIN cart
		ON(mem_id = cart_member)
		INNER JOIN prod
		ON(cart_prod = prod_id)
GROUP BY mem_id, mem_name 
ORDER BY total DESC) A;

여기서 InLine View를 사용한다.

앞서 만들었던 회원별 지출 총액을 하나의 테이블처럼 사용해서 그 테이블 내에서 max() 함수와 min() 함수를 사용해서

최댓값과 최솟값을 뽑아낸다.

 

* 위에 결과에서 최댓값을 가지는 회원아이디와 이름 조회하기

SELECT AA.mem_id, AA.mem_name, AA.total
FROM(SELECT mem_id, mem_name, sum(cart_qty * prod_sale) AS total 
		FROM member 
		INNER JOIN cart
			ON(mem_id = cart_member)
		INNER JOIN prod
			ON(cart_prod = prod_id)
		GROUP BY mem_id, mem_name 
		ORDER BY total DESC) AA,
		
		(SELECT MAX(A.total) AS total_max, MIN(A.total) AS total_min
		FROM (SELECT mem_id, mem_name, sum(cart_qty * prod_sale) AS total 
				FROM member 
				INNER JOIN cart
					ON(mem_id = cart_member)
				INNER JOIN prod
					ON(cart_prod = prod_id)
				GROUP BY mem_id, mem_name 
				ORDER BY total DESC) A) BB
WHERE AA.total = BB.total_max;

앞서 구했던 total의 값이 mem_id와 mem_name과 연결되어있지 않기 때문에 이 둘의 값을 연결해 주는 과정이다.

 

InLine View를 사용하는 이유

기존 단일 쿼리로는 '테이블에서 최대 / 최소 지출' 까지만 알 수 있었다면,

서브쿼리를 통해서 누가 최대 지출을 했는지 확인할 수 있다.

728x90