부속질의
하나 이상의 행을 결과로 반환
다중 행 부속 질의문은 비교 연산자 사용 불가, 아래 연산자 사용
| 연산자 | 설명 |
|---|---|
| IN | 부속 질의문의 결과 값 중 일치하는 것이 있으면 검색 조건이 참 |
| NOT IN | 부속 질의문의 결과 값 중 일치하는 것이 없으면 검색 조건이 참 |
| EXISTS | 부속 질의문의 결과 값이 하나라도 존재하면 검색 조건이 참 |
| NOT EXISTS | 부속 질의문의 결과 값이 하나도 존재하지 않으면 검색 조건이 참 |
| ALL | 부속 질의문의 결과 값 모두와 비교한 결과가 참이면 검색 조건을 만족 |
| (비교 연산자와 함께 사용) | |
| ANY 또는 SOME | 부속 질의문의 결과 값 중 하나라도 비교한 결과가 참이면 검색 조건을 만족 |
| (비교 연산자와 함께 사용) |
SELECT name
FROM Customer
WHERE custid IN(SELECT custid
FROM Orders
WHERE bookid IN(SELECT bookid
FROM Book
WHERE publisher='대한미디어'));상관(correlated, 연결) 부속질의
SELECT b1.bookname
FROM Book b1
WHERE b1.price > (SELECT avg(b2.price)
FROM Book b2
WHERE b2.publisher=b1.publisher);집합 연산
-- UNION 연산 사용 (UNION ALL은 중복을 포함하여 모든 결과를 구함)
SELECT name
FROM Customer
WHERE address LIKE '대한민국%'
UNION
SELECT name
FROM Customer
WHERE custid IN (SELECT custid FROM Orders);-- 대한민국에 거주하는 고객의 이름에서 도서를 주문한 고객의 이름을 제외하고 나타내세요
SELECT name
FROM Customer
WHERE address LIKE '대한민국%' AND name NOT IN (SELECT name
FROM Customer
WHERE custid IN (SELECT custid
FROM Orders));
-- 대한민국에 거주하는 고객 중 도서를 주문한 고객의 이름을 나타내세요
SELECT name
FROM Customer
WHERE address LIKE '대한민국%' AND name IN (SELECT name
FROM Customer
WHERE custid IN (SELECT custid
FROM Orders));SELECT name, address
FROM Customer cs
WHERE EXISTS (SELECT *
FROM Orders od
WHERE cs.custid=od.custid);JOIN 정리
cf) 실무 권장사항: 성능은 같더라도 협업과 유지보수, 표준 준수 측면에서 명시적 JOIN을 사용하는 것이 가장 바람직하다.
-- 문법
CREATE TABLE 테이블이름
({속성이름 데이터타입 [NULL|NOT NULL|UNIQUE|DEFAULT 기본값|CHECK 체크조건]}
[PRIMARY KEY 속성이름(들)]
[FOREIGN KEY 속성이름 REFERENCES 테이블이름(속성이름)]
[ON DELETE {CASCADE|SET NULL}]
);
CREATE TABLE NewBook (
bookname VARCHAR(20) NOT NULL,
publisher VARCHAR(20) UNIQUE,
price INTEGER DEFAULT 10000 CHECK(price >= 1000),
PRIMARY KEY (bookname, publisher));ON DELETE CASCADE : 관련 튜플을 함께 삭제함
ON DELETE SET NULL : 관련 튜플의 외래키 값을 NULL로 변경함
ON DELETE RESTRICT : 부모행이 참조되고 있으면 삭제/수정 불가(기본값)
ON DELETE NO ACTION : SQL 표준 키워드, RESTRICT와 동일
-- 예
CREATE TABLE NewOrders (
orderid INTEGER,
custid INTEGER NOT NULL,
bookid INTEGER NOT NULL,
saleprice INTEGER,
orderdate DATE,
PRIMARY KEY(orderid),
FOREIGN KEY(custid) REFERENCES NewCustomer(custid) ON DELETE CASCADE);
-- 문법
ALTER TABLE 테이블이름
[ADD 속성이름 데이터타입]
[DROP COLUMN 속성이름]
[ALTER COLUMN 속성이름 데이터타입]
[ALTER COLUMN 속성이름 [NULL|NOT NULL]]
[ADD PRIMARY KEY(속성이름)]
[[ADD|DROP] 제약이름]
-- NewBook 테이블에 VARCHAR(13)의 자료형으로 isbn 속성을 추가하세요
ALTER TABLE NewBook ADD isbn VARCHAR(13);
-- NewBook 테이블에서 isbn 자료형을 INTEGER로 변경하세요
ALTER TABLE NewBook MODIFY isbn INTEGER;
-- NewBook 테이블의 isbn 속성을 삭제하세요
ALTER TABLE NewBook DROP COLUMN isbn;
-- NewBook 테이블의 bookname 속성에 NOT NULL 제약조건을 적용하세요
ALTER TABLE NewBook MODIFY bookname VARCHAR(20) NOT NULL;
-- NewBook 테이블의 bookid 속성을 기본키로 변경하세요
ALTER TABLE NewBook ADD PRIMARY KEY(bookid);
cf) MODIFY vs ALTER COLUMN
ALTER COLUMN을 사용MODIFY를 사용-- 문법
DROP TABLE 테이블이름;
-- NewBook 테이블을 삭제하세요
DROP TABLE NewBook;
-- NewCustomer 테이블을 삭제하세요.
DROP TABLE NewOrders;
DROP TABLE NewCustomer;
INSERT INTO 테이블이름[(속성리스트)] VALUES (값리스트);-- 속성 리스트를 생략하면 테이블을 정의할 때 지정한 속성의 순서대로 값이 삽입됨
INSERT INTO Book VALUES (12, '스포츠 의학', '한솔의학서적', 90000);INSERT INTO Book(bookid, bookname, price, publisher)
VALUES (13, '스포츠 의학', 90000, '한솔의학서적');-- 도서 가격은 0이 아닌 NULL 값으로 저장됨
INSERT INTO Book(bookid, bookname, publisher)
VALUES (12, '스포츠 의학', '한솔의학서적');-- 수입도서테이블(imported_book)에 있는 모든 목록을 Book 테이블에 모두 삽입
INSERT INTO Book(bookid, bookname, price, publisher)
SELECT bookid, bookname, price, publisher
FROM Imported_book;-- SET 키워드 다음에 속성값을 어떻게 수정할 것인지를 지정
-- WHERE 절에 제시된 조건을 만족하는 튜플만 속성값을 수정
UPDATE 테이블이름
SET 속성이름1=값1, ...
[WHERE <검색조건>];UPDATE Customer
SET address='대한민국 부산'
WHERE custid=5;-- 안전 모드 끄기
SET SQL_SAFE_UPDATES=0UPDATE Book
SET publisher = (SELECT publisher
FROM imported_book
WHERE bookid=21)
WHERE bookid=14;-- WHERE 절에 제시한 조건을 만족하는 튜플만 삭제
DELETE FROM 테이블이름
[WHERE 검색조건];DELETE FROM Book
WHERE bookid=11;TRUNCATE : 테이블 안 데이터 삭제TRUNCATE TABLE Book;