본문 바로가기
카테고리 없음

[데이터베이스] 3장 SQL 기초

by KAYEON 2022. 4. 7.

1. 마당서점에서 다음의 심화된 질문에 대해 SQL 문을 작성하시오.

(1) 박지성이 구매한 도서의 출판사와 같은 출판사에서 도서를 구매한 고객의 이름

#첫 번째 방법

SELECT c1.name
FROM Customer c1, Orders o1, Book b1
WHERE c1.custid=o1.custid AND o1.bookid=b1.bookid AND c1.name NOT LIKE '박지성'
	AND b1.publisher IN (SELECT b2.publisher FROM Customer c2, Orders o2, Book b2
                    	WHERE c2.custid=o2.custid AND o2.bookid=b2.bookid
                    	AND c2.name LIKE '박지성');

 

#두 번째 방법

SELECT DISTINCT c1.name
FROM Customer c1 JOIN Orders o1 ON c1.custid=o1.custid
WHERE c1.name NOT LIKE '박지성' AND
                    o1.bookid IN (SELECT bookid
					FROM Book
					WHERE publisher IN (SELECT publisher
                    					FROM Orders Join Book ON Orders.bookid=Book.bookid
                                        WHERE Orders.custid=(SELECT custid
                                        					FROM Customer c2
                                                            WHERE c2.name LIKE '박지성')));

이게 제일 헷갈렸다.. 돌아가라 머리야

 

 

(2) 두 개 이상의 서로 다른 출판사에서 도서를 구매한 고객의 이름

1. Customer, Orders, Book 세 테이블을 모두 조인시키기

>> 결과

2. JOIN 된 테이블의 이름과 추출할 Customer 테이블의 이름이 같고 출판사가 중복이 아니면 COUNT +1

3. COUNT가 2 이상일 때 고객 이름 출력

 

#첫 번째 방법

SELECT name
FROM Customer c
WHERE (SELECT COUNT(DISTINCT publisher)
        FROM Customer c1, Orders o1, Book b1
        WHERE c1.custid=o1.custid AND o1.bookid=b1.bookid AND c.name=c1.name) >= 2;

 

#두 번째 방법

SELECT name
FROM Customer c1
WHERE (SELECT COUNT(DISTINCT publisher)
		FROM Book JOIN Orders ON Book.bookid=Orders.bookid
        			JOIN Customer c2 On Orders.custid=c2.custid
        WHERE c1.name LIKE c2.name) >= 2;