Coding/데이터베이스
[오라클] SQL기초 복습예제
찡콩찡
2022. 8. 22. 17:11
madang접속
--1. book테이블에서 축구가 들어가들어가 있는 책을 찾아보기
select *
from book
where bookname like '%축구%';
--2.고객의 정보
SELECT * FROM CUSTOMER;
--3. 도서의 수
SELECT COUNT (*) FROM BOOK;
--4. 주문테이블 확인
SELECT * FROM ORDERS;
--5.2014.7월 5일 이후에 판매된 건
SELECT *
FROM ORDERS
WHERE ORDERDATE >= '14/07/05';
--6.BOOK테이블에서 출판사 굿스포츠에서 출판한 책들
SELECT *
FROM BOOK
WHERE PUBLISHER = '굿스포츠';
--7.영국에 살고 있는 고객들의 정보
SELECT *
FROM CUSTOMER
WHERE ADDRESS LIKE '%영국%';
--8.영국에서 살고 있는 사람들이 주문한 책이름 (테이블 3개 필요)
SELECT BOOKNAME
FROM ORDERS O, CUSTOMER C, BOOK B
WHERE O.CUSTID = C.CUSTID
AND ADDRESS LIKE '%영국%' AND B.BOOKID=O.BOOKID;
--9.도서 정가가 만원이하인 도서구매자 명
SELECT NAME
FROM CUSTOMER C, ORDERS O, BOOK B
WHERE C.CUSTID =O.CUSTID AND B.BOOKID =O.BOOKID AND PRICE <=10000;
--10.축구라는 이름이 들어간 도서를 구매한 고객들의 이름(WHERE절 사용)
SELECT DISTINCT NAME
FROM BOOK B, CUSTOMER C,ORDERS O
WHERE BOOKNAME LIKE '%축구%' AND B.BOOKID=O.BOOKID AND C.CUSTID=O.CUSTID;
--NATURAL JOIN
SELECT DISTINCT NAME
FROM BOOK B NATURAL JOIN ORDERS O NATURAL JOIN CUSTOMER C
WHERE BOOKNAME LIKE '%축구%';
--JOIN USING 니꺼내꺼 가리는게 필요가 없어 (공통으로 들어가는거 자동으로 써주기)
SELECT DISTINCT NAME
FROM BOOK B JOIN ORDERS O USING(BOOKID)
JOIN CUSTOMER C USING(CUSTID)
WHERE BOOKNAME LIKE '%축구%';
--JOIN ON 누구걸 쓰는지 콕 집어서 얘기해줘야 함
SELECT DISTINCT NAME
FROM BOOK B JOIN ORDERS O ON(B.BOOKID=O.BOOKID)
JOIN CUSTOMER C ON(C.CUSTID=O.CUSTID)
WHERE BOOKNAME LIKE '%축구%';
--11.판매가 15000이상인 도서를 구매한 구매자명 (WHERE)
SELECT NAME
FROM CUSTOMER C, ORDERS O
WHERE C.CUSTID =O.CUSTID AND SALEPRICE >= 15000;
--11.1 NATURAL JOIN
SELECT NAME
FROM CUSTOMER C NATURAL JOIN ORDERS O
WHERE SALEPRICE >= 15000;
--11.2 JOIN USING(소속 안밝힘, 따지지 말고 쓰자)
SELECT NAME
FROM CUSTOMER C JOIN ORDERS O USING(CUSTID)
WHERE SALEPRICE >= 15000;
--11.3 JOIN ON(소속을 밝혀라)
SELECT NAME
FROM CUSTOMER C JOIN ORDERS O ON(C.CUSTID=O.CUSTID)
WHERE SALEPRICE >= 15000;
--12. 도서번호 1번을 구매한 고객명, 고객주소
SELECT NAME, ADDRESS
FROM CUSTOMER C, ORDERS O
WHERE C.CUSTID=O.CUSTID AND BOOKID=1;
--12.1 NATURAL JOIN
SELECT NAME, ADDRESS
FROM CUSTOMER C NATURAL JOIN ORDERS O
WHERE BOOKID=1;
--12.2 JOIN USING
SELECT NAME, ADDRESS
FROM CUSTOMER C JOIN ORDERS O USING(CUSTID)
WHERE BOOKID=1;
--12.3 JOIN ON
SELECT NAME, ADDRESS
FROM CUSTOMER C JOIN ORDERS O ON(C.CUSTID=O.CUSTID)
WHERE BOOKID=1;
--13. 굿스포츠 출판사에서 출판한 판매가 10000원 이하인 도서명, 정가, 구매자명
SELECT DISTINCT BOOKNAME,PRICE,NAME
FROM CUSTOMER C,BOOK B, ORDERS O
WHERE PUBLISHER='굿스포츠' AND PRICE<=10000
AND O.CUSTID =C.CUSTID AND B.BOOKID = O.BOOKID;
--13.1 NAUTRAL JOIN
SELECT BOOKNAME,PRICE, NAME
FROM BOOK B NATURAL JOIN CUSTOMER C NATURAL JOIN ORDERS O
WHERE PUBLISHER='굿스포츠' AND PRICE<=10000;
--13.2 JOIN USING
SELECT BOOKNAME,PRICE, NAME
FROM BOOK B JOIN ORDERS O USING(BOOKID)
JOIN CUSTOMER C USING(CUSTID)
WHERE PUBLISHER='굿스포츠' AND PRICE<=10000;
--13.3 USING ON
SELECT BOOKNAME,PRICE, NAME
FROM BOOK B JOIN ORDERS O ON(B.BOOKID=O.BOOKID)
JOIN CUSTOMER C ON(C.CUSTID=O.CUSTID)
WHERE PUBLISHER='굿스포츠' AND PRICE<=10000;
--14. 제일 많이 팔린 도서명
SELECT BOOKID FROM ORDERS GROUP BY BOOKID
HAVING COUNT(*) = (SELECT MAX(COUNT(*)) FROM ORDERS GROUP BY BOOKID);
=================================================
SELECT BOOKID, C
FROM ( SELECT BOOKID, COUNT(*) C
FROM ORDERS
GROUP BY BOOKID
ORDER BY COUNT(*) DESC)BB
WHERE ROWNUM <=5;
=================================================
--14.1 전체도서번호
SELECT BOOKID
FROM BOOK;
--15.안팔린 도서번호 (전체도서번호 빼기 팔린 도서번호)
SELECT BOOKID
FROM BOOK
MINUS
SELECT BOOKID
FROM ORDERS;
--15.1전체도서번호 팔린도서번호가 아닌 것만 출력 ( not in 사용하기 )
SELECT BOOKID
FROM BOOK
WHERE BOOKID NOT IN (SELECT BOOKID FROM ORDERS);
--16.제일 많이 팔린 책번호와 이름을 출력하라
SELECT BB.BOOKID,RANK, BOOKNAME
FROM (SELECT BOOKID, RANK() OVER (ORDER BY COUNT(*) DESC) RANK
FROM ORDERS
GROUP BY BOOKID
ORDER BY COUNT(*) DESC) BB, BOOK
WHERE RANK = 1 AND BB.BOOKID=BOOK.BOOKID;
--17.책을 제일 많이 구매한 고객명
SELECT NAME
FROM CUSTOMER
WHERE CUSTID IN (SELECT CUSTID
FROM ORDERS
GROUP BY CUSTID
HAVING COUNT(*) = (SELECT MAX(COUNT(*))
FROM ORDERS
GROUP BY CUSTID);
--18.책 구매한 권수로 등수출력(RANK사용)
SELECT RANK() OVER (ORDER BY COUNT(O.CUSTID) DESC ) AS RANK, C.NAME, COUNT(*) || '권' AS CNT
FROM ORDERS O JOIN CUSTOMER C ON O.CUSTID = C.CUSTID
GROUP BY O.CUSTID, C.NAME
ORDER BY COUNT(*) DESC;
--19부서별 급여역순, 보너스 역순, 등수
SELECT DEPTNO,
DNAME,
ENAME,
SAL,
COMM,
RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC, COMM DESC) RANK,
DENSE_RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC, COMM DESC) RANK
FROM EMP NATURAL JOIN DEPT
ORDER BY DEPTNO, SAL DESC, COMM DESC;
--20도서 판매 합계
SELECT SUM(SALEPRICE)
FROM ORDERS;
--21.어느 고객이 얼마나 주문했는지
SELECT CUSTID, SUM(SALEPRICE)
FROM ORDERS
GROUP BY CUSTID;
--21.2 어느 고객(고객번호, 고객명)이 얼마나 주문했나?
SELECT CUSTID, SUM(SALEPRICE)
FROM ORDERS O NATURAL JOIN CUSTOMER C
GROUP BY CUSTID, NAME;
--22.도서를 주문하지 않은 고객명, 전화번호
--1차: 주문한 고객번호 2차:전체 고객에서 주문한 고객 제외
SELECT CUSTID,NAME,PHONE
FROM CUSTOMER
WHERE CUSTID NOT IN (SELECT CUSTID FROM ORDERS);
--23.날짜별로 판매건수와 판매금액 합계
SELECT ORDERDATE, COUNT(*)|| '권' AS 판매권수, SUM(SALEPRICE) || '원' AS 판매금액
FROM ORDERS
GROUP BY ORDERDATE;
--24.도서 정가가(price)가 10000원이 아닌 것 정보 출력
select *
from book
where price <>10000;
--25. 도서 정가가 10000원~20000원 사이 도서 정보 출력
SELECT *
FROM BOOK
WHERE PRICE BETWEEN 10000 AND 20000;
--26. 판매 가격이 20000원 이상인 도서들의 번호와 이름
SELECT BOOKID, BOOKNAME
FROM BOOK
WHERE PRICE >=20000;
--27. 판매가격이 10000원 이상인 도서를 구매한 고객의 번호, 고객명
SELECT CUSTID, COUNT(*), NAME
FROM ORDERS NATURAL JOIN CUSTOMER
WHERE SALEPRICE>=10000
GROUP BY CUSTID, NAME;
SCOTT으로 접속
--1. MP 테이블에서 급여가 가장 많은 사람 3명
--정렬을 세워놓고 급여가 높은 3명을 뽑게끔해야해
--ROWNUM쓸때는 SELECT절에 괄호를 쓰고 시작하자
SELECT ENAME,SAL
FROM (SELECT *
FROM EMP
ORDER BY SAL DESC)
WHERE ROWNUM <=3;
--2.급여 등수대로 사원명, 사원번호, 급여, 등수 출력하기
SELECT ENAME, SAL, RANK() OVER (ORDER BY SAL DESC) AS RANK,
DENSE_RANK() OVER (ORDER BY SAL DESC) AS DENSE_RANK
FROM EMP
ORDER BY SAL DESC;
--3.보너스 받는 사람들의 이름과 급여, 보너스 출력
SELECT ENAME, SAL,COMM
FROM EMP
WHERE COMM>0;
--4.보너스가 정해진 사람들의 이름과 급여, 보너스 출력
SELECT ENAME,SAL,COMM
FROM EMP
WHERE COMM IS NOT NULL;
도구 > 환경설정 : 날짜 RR로 변경하면 예: 14/07/05로 찾아봐도 검색결과가 잘 나온다.