--Q.대한미디어에서 출판한 도서를 구매한 고객의 이름을 보이시오
--1) join이용
SELECT c.NAME FROM ORDERS o
INNER JOIN BOOK b ON o.BOOKID = b.BOOKID
INNER JOIN CUSTOMER c ON c.CUSTID = o.CUSTID
WHERE b.PUBLISHER = '대한미디어';
--2) where in 이용
--1) 고객의 이름
SELECT c.NAME FROM CUSTOMER c
--2) 도서를 구매한
SELECT * FROM ORDERS o
--3) 대한미디어에서 출판한
SELECT * FROM BOOK b WHERE b.PUBLISHER = '대한미디어'
--4) 결과
SELECT c.NAME FROM CUSTOMER c
WHERE c.CUSTID IN (SELECT o.CUSTID FROM ORDERS o
WHERE o.BOOKID IN (SELECT b.BOOKID FROM BOOK b WHERE b.PUBLISHER = '대한미디어') );
---------강사님 방법-----------
--1) SELECT * FROM CUSTOMER c WHERE c.CUSTID In
--2) SELECT * FROM ORDERS o WHERE o.BOOKID IN
--3) SELECT * FROM BOOK b WHERE b.PUBLISHER = '대한미디어'
SELECT * FROM CUSTOMER c
WHERE c.CUSTID IN(
SELECT o.CUSTID FROM ORDERS o
WHERE o.BOOKID IN (
SELECT b.BOOKID FROM BOOK b WHERE b.PUBLISHER = '대한미디어'));
--Q. 출판사별로 출판사의 평균 도서 가격보다 비싼 도서를 구하시오
-- 1) where 활용
--1) 책찾기
SELECT * FROM BOOK b1;
--2) 출판사별 평균도서가격 찾기
SELECT avg(b2.price) FROM BOOK b2 WHERE b2.PUBLISHER = b1.publisher;
--3) 합치기
SELECT b1.BOOKNAME FROM BOOK b1
WHERE b1.PRICE > (SELECT AVG(b2.price) FROM BOOK b2 WHERE b2.PUBLISHER = b1.publisher);
-- 출판사의 평균 도서 가격
SELECT b.PUBLISHER , AVG(b.PRICE) FROM BOOK b GROUP BY b.PUBLISHER ;
-- 비싼도서
SELECT b1.BOOKNAME FROM BOOK b1 WHERE b1.PRICE > (SELECT AVG(b.PRICE) FROM BOOK b);
-- 강의
--A.
SELECT * FROM BOOK b1
WHERE b1.PRICE > (
SELECT AVG(b2.PRICE) FROM BOOK b2 WHERE b2.PUBLISHER = b1.PUBLISHER) ;
-- 정답은 아닌데 그냥 내가 생각하기 쉬운 for문
for(int x = 0 ; x < 10 ; x++){
if(x.price > y.avg){
syso(x.bookname)
}
for(int y = 0 ; y < 10 ; y++)
if(y.publisher = x.publisher){
y.avg += y.price/y.num ;
}
}
------> 그냥 이렇게 생각할래....
--2) join활용
SELECT b1.*
FROM BOOK b1
INNER JOIN (
SELECT PUBLISHER, AVG(PRICE) AS avg_price
FROM BOOK
GROUP BY PUBLISHER
) b2 ON b1.PUBLISHER = b2.PUBLISHER
WHERE b1.PRICE > b2.avg_price;
--> Q. 따로 별칭을 만드는 이유?
--> 함수 이름은 대소문자가 중요하며, 일반적으로 대문자로 작성됩니다.
--> 함수 이름을 소문자로 작성하면 SQL 엔진이 이를 인식하지 못하거나 문법 오류가 발생할 수 있습니다.
--> Q. join --- on 사이에 테이블을 새로 만들어서 넣을 수 있는건가?
--> JOIN 절 사이에 서브쿼리(subquery) 또는 중첩 쿼리(nested query)를 사용하여
--> 새로운 가상 테이블을 만들고 그것을 결합할 수 있습니다.
--> 이렇게 하면 원하는 데이터를 효과적으로 추출하고 조작할 수 있습니다.
==== 내가 해보기 ====
SELECT b1.* FROM BOOK b1
INNER JOIN (
SELECT b2.PUBLISHER , AVG(PRICE) AS avg_price FROM BOOK b2 GROUP BY PUBLISHER
) tempTable ON b1.PUBLISHER = tempTable.publisher;
WHERE b1.PRICE > tempTable.avg_price
--Q. SELECT b2.PUBLISHER , AVG(PRICE) FROM BOOK b2 GROUP BY PUBLISHER
--> AVG(PRICE) : 그룹화된 데이터 내에서 "PRICE" 열의 평균 값을 계산합니다.
--Q. SELECT b1.* FROM BOOK b1
--> b1.* 이런식으로하면 b1의 전체만 볼수있겠찌?
--> 안그러면 join한 tempTable 까지 합쳐져서 보인다.
--Q. 작동 순서:
-- 1. 서브쿼리(tempTable)를 실행하여 각 출판사의 평균 가격을 계산합니다 --> 이러한 결과는 임시 테이블에 저장됩니다.
-- 2. 주 쿼리에서 "BOOK" 테이블 (b1)을 사용하여 모든 도서를 선택하고,
-- 3. 임시 테이블 (tempTable)과 조인하여 동일한 출판사의 도서와 해당 출판사의 평균 가격을 결합합니다.
-- 4. WHERE 절에서 각 도서의 가격이 해당 도서의 출판사에 대한 평균 가격을 초과하는 경우에만 해당 도서를 선택합니다.
'DataBase(SQL) > DAY 25 _ 23.09.21' 카테고리의 다른 글
Exists (0) | 2023.09.21 |
---|---|
집합 연산 (0) | 2023.09.21 |
Where~in / inner join (0) | 2023.09.21 |
Sub Query (0) | 2023.09.21 |
Outer join (0) | 2023.09.21 |