본문 바로가기

DataBase(SQL)/DAY 26 _ 23.09.22

Sub Query3

-- 1. 인라인 뷰 (from 부속질의)-따로 for문 

-- 괄호안을 테이블로 인식시킴

SELECT t1.*, c.* FROM (
	SELECT o.CUSTID AS a, AVG(o.SALEPRICE) AS b FROM ORDERS o 
	GROUP BY o.CUSTID
) t1 -- 별칭
INNER JOIN CUSTOMER c ON c.CUSTID = t1.a
WHERE t1.b > 10000 -- for문 끝나고 이후에 필터링
; 

-- 별칭을 잘 지어줘야함(필수). 이 상태로도 실행됨
SELECT o.CUSTID, AVG(o.SALEPRICE) AS avg FROM ORDERS o 
GROUP BY o.CUSTID
--HAVING AVG(o.SALEPRICE) > 10000 
;

-- ex1. 고객번호가 2 이하인 고객의 판매액을 보이시오
SELECT cs.name, SUM(od.SALEPRICE) FROM (
	SELECT * FROM CUSTOMER WHERE custid <= 2
) cs
INNER JOIN ORDERS od ON od.CUSTID = cs.CUSTID 
GROUP BY cs.name -- 순서 2. 그루핑해주기
;

-- 순서1. 고객번호가 2이하(필터링 먼저 해주기)
SELECT * FROM CUSTOMER c WHERE custid <= 2;

 


-- 2. 스칼라 부속질의(select 부속질의) - 이중 for문
-- join으로 풀어보기
-- SELECT 다음은 스칼라밖에 안나옴. 무조건 단일 값
-- 논리적을 100% 상관 부속질의가 들어감. (이중 for문)
-- 별칭 필수

SELECT 
	o.*, 
	(
		SELECT c.name FROM CUSTOMER c WHERE c.CUSTID = o.CUSTID 
	) AS name 
FROM ORDERS o
;

-- SELECT o.*, (1111,2,2,2) FROM  ORDERS o 벡터 불가

-- ex. 마당서점의 고객별 판매액을 보이시오(결과는 고객이름과 고객별 판매액을 출력)
-- join으로 풀어보기
-- group by 기준 : custid(프라이머리 키)
-- select에 o.custid밖에 못들어옴 -> 서브쿼리를 넣어서 바꿔버림

SELECT (
	-- 바꿔치기중..(상관 부속 질의)
	SELECT c.NAME FROM CUSTOMER c WHERE c.CUSTID = o.CUSTID 
)AS name,
SUM(o.SALEPRICE) AS SUM 
FROM ORDERS o
GROUP BY o.CUSTID 
;

 


-- 3. 네스티드 서브쿼리 => WHERE 부속 질의(서브 쿼리. 중첩질의) - 이중 for문

-- 가장 비싼 도서의 이름을 보이시오
-- 최종본
SELECT * FROM BOOK b1 WHERE b1.PRICE = 35000;

-- 스칼라 값 출력
SELECT MAX(PRICE) FROM Book;

-- 서브쿼리
SELECT * 
FROM BOOK b1 
WHERE b1.PRICE = (
-- 그냥 price로는 실행이 안됨. 문법적으로 불가(1개의 값만 받는 연산자 '=') <-> IN이면 가능
-- WHERE b1.price = (1,2,3,4); 불가 
	SELECT MAX(PRICE) FROM Book
);

'DataBase(SQL) > DAY 26 _ 23.09.22' 카테고리의 다른 글

Where 연산자  (0) 2023.09.25
NVL  (0) 2023.09.25
형태변환 1. 날짜 2. 숫자 3. 문자  (0) 2023.09.25
DB _ API  (0) 2023.09.25