SELECT *
FROM CUSTOMER, ORDERS;
select *
from customer, orders
where customer.custid=orders.custid;
select *
from customer, orders
where customer.custid=orders.custid
order by customer.custid;
select name, saleprice
from customer, orders
where customer.custid=orders.custid;
🔽
select name, sum(saleprice)
from customer, orders
where customer.custid=orders.custid
group by customer.name
order by customer.name;
🔽
GROUP BY는 컬럼들의 값을 그룹으로 만들어(중복제거) 그 그룹들의 집계를 낼때 사용한다.
컬럼에 어떠한 데이터들이 있는지 확인만 하려고 한다면 DISTINCT를 이용하여 중복제거를 해주는게 좋다.
(중복 값이 많을때는 DISTINCT에 비해 GROUP BY가 성능이 떨어질 수 있음)
HAVING은 GROUP BY한 그룹들에 조건을 적용할 때 사용한다.
WHERE 과 HAVING 차이점
WHERE : 기본적으로 모든 행에 대해서 조건을 적용HAVING : GROUP BY절과 같이 사용하여야 되고 그룹화된 결과들에 조건을 적용select customer.name, saleprice
from customer left outer join orders
on customer.custid=orders.custid;
select customer.name, saleprice
from customer right outer join orders
on customer.custid=orders.custid;
select customer.name, saleprice
from customer full outer join orders
on customer.custid=orders.custid;
select customer.name, book.bookname
from customer, orders, book
where customer.custid=orders.custid
and orders.bookid=book.bookid;
select customer.name, book.bookname
from customer, orders, book
where customer.custid=orders.custid
and orders.bookid=book.bookid and book.price=20000;
select customer.name, saleprice
from customer left outer join orders
on customer.custid=orders.custid;
select bookname
from book
where price=(select max(price) from book);
- 질의 3-32) 도서를 주문하지 않은 고객의 이름을 보이시오
select name
from customer
minus
select name
from customer
where custid in (select custid from orders);
- 마당서점의 고객이 요구하는 다음 질문에 대해 SQL문을 작성하시오.
- select bookname from book where bookid=1;
- select bookname from book where price>=20000;
- select sum(saleprice)
from customer c, orders o
where c.custid=o.cutid and c.name='박지성';
- select count(*)
from orders where custid=1;
- select count(*)
from customer c, orders o
where c.custid = o.custid and c.name = '박지성';
- select count(distinct publisher)
from customer c, orders o, book b
where (c.custid=o.custid)
and (b.bookid=o.bookid)
and (c.name='박지성');
- select bookname, price, price-saleprice
from customer c, orders o, book b
where (c.custid=o.custid)
and (b.bookid=o.bookid)
and (c.name='박지성');
- select bookname from book, orders, customer
minus
select bookname from book b, orders o, customer c
where (c.custid=o.custid)
and (b.bookid=o.bookid)
and (c.name='박지성');
- 마당서점의 운영자와 경영자가 요구하는 다음 질문에 대해 SQL문을 작성하시오.
- select count(*)
from book;
- select count(distinct publisher)
from book;
- select name, address
from customer;
- select orderid, orderdate
from orders
where orderdate
between to_date('2020-07-04','YYYY-MM-DD')
and to_date('2020-07-07','YYYY-MM-DD');
- select orderid, orderdate
from orders
where orderdate
not between to_date('2020-07-04','YYYY-MM-DD')
and to_date('2020-07-07','YYYY-MM-DD');
- select name, address
from customer
where name like '김%';
- select name, address
from customer
where name like '김%아';
- select name
from book, orders, Customer
MINUS
select name
from book b, orders o, customer c
where (c.custid=o.custid) and (b.bookid=o.bookid);
- select sum(saleprice), avg(saleprice)
from orders;
- select name, sum(saleprice)
from orders o, customer c
where o.custid=c.custid group by name;
- select name, bookname
from customer c, orders o, book b
where (c.custid=o.custid) and (b.bookid=o.bookid)
where, having, group by 의미 차이 기억
[출제 형식]
이 질의의 의미는 무엇인가? 1,2,3,4 4지 선다
학생이 10명 이상 가입한 동아리에 대하여 동아리와 제출한 총 과제 수를 출력하시오.
select 동아리, sum(과제 수)
from 과제
group by 동아리
having sum(학생 수) >= 10;
-- 기본키는 학년과 동아리
WHERE
HAVING
SELECT * FROM 테이블 GROUP BY 필드 HAVING 조건절;
항상 GROUP BY 뒤에 위치하며 WHERE 과 마찬가지로 다양한 비교 연산자로 조건을 줄 수 있다.
둘 다 필드에 조건을 줄 수 있다는 것은 동일하나, WHERE은 기본적으로 모든 필드에 조건을 둘 수 있지만 HAVING은 GROUP BY로 그룹화 된 필드에 조건을 줄 수 있다. 또한, HAVING에서 조건을 줄 필드는 SELECT에 반드시 명시되어 있어야 한다.
만약 두 조건절을 함께 사용한다면 아래와 같은 형태가 된다.
SELECT * FROM 테이블명 WHERE 조건절 GROUP BY 컬럼 HAVING 조건절;
r 테이블에서 중복 제거해서 1,2,3,5 4개이고, s 테이블 전체 1,1,2,4,6, 합집합해서 9개
🔽

🔽



CREATE TABLE NEWBOOK(
BOOKID NUMBER,
BOOKNAME VARCHAR2(20),
PUBLISHER VARCHAR2(20),
PRICE NUMBER);
unique는 중복값 허용 안함

질의 3-35) 다음과 같은 속성을 가진 NEWCUSTOMER 테이블을 생성하시오.
CREATE TABLE NEWCUSTOMER(
CUSTID NUMBER PRIMARY KEY,
NAME VARCHAR2(40),
ADDRESS VARCHAR2(40),
PHONE VARCHAR2(30));
CREATE TABLE NEWORDERS(
ORDERID NUMBER,
CUSTID NUMBER NOT NULL,
BOOKID NUMBER NOT NULL,
SALEPRICE NUMBER,
ORDERDATE DATE,
PRIMARY KEY(ORDERID),
FOREIGN KEY(CUSTID) REFERENCES NEW CUSTOMER(CUSTID) ON DELETE CASCADE);
DROP TABLE NEWBOOK; DROP TABLE NEWCUSTOMER;+) 쿼리문 실행 순서
🔽

ALTER TABLE NEWBOOK ADD ISBN VARCHAR2(13);
ALTER TABLE NEWBOOK MODIFY ISBN NUMBER;
ALTER TABLE NEWBOOK DROP COLUMN ISBN;
ALTER TABLE NEWBOOK MODIFY BOOKID NUMBER NOT NULL;
ALTER TABLE NEWBOOK ADD PRIMARY KEY(BOOKID);
INSERT INTO BOOK(BOOKID, BOOKNAME, PUBLISHER, PRICE)
VALUES (11, '스포츠 의학', '한솔의학서적', 90000);
INSERT INTO BOOK(BOOKID, BOOKNAME, PUBLISHER)
VALUES (14, '스포츠 의학', '한솔의학서적`); INSERT INTO BOOK(BOOKID, BOOKNAME, PRICE, PUBLISHER)
SELECT BOOKID, BOOKNAME, PRICE, PUBLISHER
FROM IMPORTED_BOOK; UPDATE CUSTOMER
SET ADDRESS='대한민국 부산'
WHERE CUSTID=5; UPDATE CUSTOMER
SET ADDRESS = (SELECT ADDRESS
FROM CUSTOMER
WHERE NAME='김연아')
WHERE NAME='박세리';DELETE FROM CUSTOMER
WHERE CUSTID=5;
SELECT * FROM CUSTOMER; DELETE FROM CUSTOMER; 
INSERT INTO BOOK(BOOKNAME, PUBLISHER, PRICE)
VALUES('스포츠 세계', '대한미디어', '10000원');
DELETE FROM BOOK WHERE PUBLISHER='삼성당';
참조 무결성 제약조건이 위배) DELETE FROM BOOK WHERE PUBLISHER='이상미디어';
UPDATE BOOK
SET PUBLISHER='대한출판사'
WHERE PUBLISHER='대한미디어';
CREATE TABLE Bookcompany (
name VARCHAR(20) PRIMARY KEY,
address VARCHAR(20),
begin DATE);
ALTER TABLE Bookcompany
ADD webaddress VARCHAR(30);
INSERT INTO Bookcompany
(name, address, begin, webaddress)
VALUES
('한빛아카데미', '서울시 마포구',
'1993-01-01', 'http://hanbit.co.kr');