-- 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 |