🔽 문제
INSERT INTO BOOK(BOOKNAME, PUBLISHER, PRICE)
VALUES('스포츠 세계', '대한미디어', '10000원');
DELETE FROM BOOK WHERE PUBLISHER='삼성당';
참조 무결성 제약조건
이 위배) DELETE FROM BOOK WHERE PUBLISHER='이상미디어';
delete from orders where orders.bookid in(select bookid 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');
🔽 문제
DROP TABLE THEATER;
DROP TABLE USERS;
DROP TABLE CINEMA;
-- 테이블 생성 : 극장 (theater)
CREATE TABLE theater (
theaterNum NUMBER PRIMARY KEY,
theaterName VARCHAR(20),
theaterLocation VARCHAR(20)
);
-- 튜플 내 값 생성
INSERT INTO theater(theaterNum, theaterName, theaterLocation)
VALUES (1, '롯데', '잠실');
INSERT INTO theater(theaterNum, theaterName, theaterLocation)
VALUES(2, '메가', '강남');
INSERT INTO theater(theaterNum, theaterName, theaterLocation)
VALUES (3, '대한', '잠실');
-- 테이블 생성 : 고객 (Users)
CREATE TABLE users (
userNum INTEGER PRIMARY KEY,
userName VARCHAR(20),
userAddress VARCHAR(20)
);
-- 튜플 내 값 생성
INSERT INTO users(userNum, userName, userAddress)
VALUES (3, '홍길동', '강남');
INSERT INTO users(userNum, userName, userAddress)
VALUES (4, '김철수', '잠실');
INSERT INTO users(userNum, userName, userAddress)
VALUES (9, '박영희', '강남');
-- 테이블 생성 : 상영관 (Cinema)
CREATE TABLE CINEMA (
theaterNum NUMBER REFERENCES THEATER(theaterNum),
cinemaNum NUMBER CHECK(cinemaNum >= 1 AND cinemaNum <= 10) PRIMARY KEY,
movieName VARCHAR(20),
price NUMBER CHECK (price <= 20000),
seat NUMBER
);
-- 튜플 내 값 생성
INSERT INTO cinema(theaterNum, cinemaNum, movieName, price, seat)
VALUES (1, 1, '어려운 영화', 15000, 48);
INSERT INTO cinema(theaterNum, cinemaNum, movieName, price, seat)
VALUES(3, 1, '멋진 영화', 7500, 120);
INSERT INTO cinema(theaterNum, cinemaNum, movieName, price, seat)
VALUES(3, 2, '재밌는 영화', 8000, 110);
-- 테이블 생성 : 예약 (reservation)
CREATE TABLE reservation (
theaterNum INTEGER NOT NULL REFERENCES theater(theaterNum),
cinemaNum INTEGER NOT NULL REFERENCES cinema (cinemaNum),
userNum INTEGER NOT NULL REFERENCES users (userNum),
seatNum INTEGER,
MOVIE_date DATE,
PRIMARY KEY(theaterNum, cinemaNum, userNum)
);
-- 튜플 내 값 생성
INSERT INTO reservation (theaterNum,cinemaNum, userNum, seatNum, MOVIE_date)
VALUES (3, 2, 3, 15, '2020-09-01');
INSERT INTO reservation (theaterNum,cinemaNum, userNum, seatNum, MOVIE_date)
VALUES(3, 1, 4, 16, '2020-09-01');
INSERT INTO reservation (theaterNum,cinemaNum, userNum, seatNum, MOVIE_date)
VALUES (1, 1, 9, 48, '2020-09-01');
SELECT * FROM reservation;
11-1-1)
SELECT 극장이름, 위치
FROM 극장;
11-1-2)
SELECT 극장이름
FROM 극장
WHERE 위치 = '극장';
11-1-3)
SELECT 이름
FROM 고객
WHERE 주소 = '잠실'
ORDER BY 이름;
11-1-4)
SELECT 극장번호, 상영관번호, 영화제목
FROM 상영관
WHERE 가격 <= 8000;
11-1-5)
SELECT DISTINCT 극장.위치 , 고객.주소
FROM 극장, 고객
WHERE 극장.위치 = 고객.주소;
11-2-1)
SELECT COUNT(*)
FROM 극장;
11-2-2)
SELECT AVG(가격)
FROM 상영관;
11-2-3)
SELECT COUNT(고객번호)
FROM 예약
WHERE 날짜 = '2020-09-01';
SELECT COUNT(이름)
FROM 고객 JOIN 예약 ON (예약.고객번호=고객.고객번호)
WHERE 날짜 = TO_DATE('2020-09-01', 'YYYY-MM-DD');
11-4-1)
SELECT 극장.극장이름, COUNT(상영관번호)
FROM 극장, 상영관
WHERE 극장.극장번호 = 상영관.극장번호
GROUP BY 극장이름;
11-4-2)
SELECT DISTINCT 극장이름, 상영관번호
FROM 극장, 상영관
WHERE 극장.극장번호 = 상영관.극장번호
AND 위치 = '잠실';
삭제이상(deletion anomly)
연쇄삭제(triggered deletion)
문제 발생삽입이상(insertion anomly)
→ NULL 값
문제 발생수정이상(update anomly)
불일치 문제
발생 DROP TABLE SUMMER;
CREATE TABLE SUMMER(
SID NUMBER,
CLASS VARCHAR2(20)
PRICE NUMBER
);
INSERT INTO SUMMER VALUES(100,'FORTRAN', 20000);
INSERT INTO SUMMER VALUES(150, 'PASCAL', 15000);
INSERT INTO SUMMER VALUES(200, 'C', 10000);
INSERT INTO SUMMER VALUES(250, 'FORTRAN', 20000);
SELECT *
FROM SUMMER;
🔽
-- C강좌 수강료 조회
SELECT PRICE "C 수강료"
FROM SUMMER
WHERE CLASS='C';
-- 200번 학생의 수강신청 취소
DELETE FROM SUMMER
WHERE SID=200;
-- C강좌 수강료 다시 조회
SELECT PRICE "C 수강료"
FROM SUMMER
WHERE CLASS='C';
-- 자바 강좌 삽입
INSERT INTO SUMMER VALUES(NULL, 'JAVA', 25000);
-- SUMMER 테이블 조회
SELECT *
FROM SUMMER;
--NULL 값이 있는 경우 주의할 질의: 투플은 다섯 개이지만 수강학생은 총 4명임.
SELECT COUNT(*) "수강인원"
FROM SUMMER;
🔽
SELECT COUNT(SID) "수강인원"
FROM SUMMER;
SELECT COUNT(*) "수강인원"
FROM SUMMER
WHERE SID IS NOT NULL;
🔽
-- 만약 UPDATE 문을 다음과 같이 작성하면 데이터 불일치 문제가 발생함
UPDATE SUMMER
SET PRICE=15000
WHERE CLASS='FORTRAN' AND SID=100;
-- SUMMER 테이블을 조회해보면 FORTRAN 강좌의 수강료가 한 건만 수정되었음
SELECT *
FROM SUMMER;
테이블의 구조를 수정하여 이상현상이 발생하지 않는 사례
🔽 SUMMER 테이블 분리
SUMMERPRICE 테이블과 SUMMERENROLL 테이블을 생성하는 SQL문
DROP TABLE SUMMERPRICE
DROP TABLE SUMMERENROLL
CREATE TABLE SUMMERPRICE
CLASS VARCHAR(20),
PRICE INTEGER
);
INSERT INTO SUMMERPRICE VALUES('FORTRAN', 20000);
INSERT INTO SUMMERPRICE VALUES('PASCAL', 15000);
INSERT INTO SUMMERPRICE VALUES('C', 10000);
SELECT *
FROM SUMMERENROLL;
SELECT PRICE "C 수강료"
FROM SUMMERPRICE
WHERE CLASS='C';
DELETE FROM SUMMERENROLL
WHERE SID 200;
SELECT *
FROM SUMMERENROLL;
SELECT PRICE "C 수강료"
FROM SUMMERPRICE
WHERE CLASS='C';
-- 자바 강좌 삽입, NULL 값을 입력할 필요가 없음
INSERT INTO SUMMERPRICE VALUES('JAVA', 25000);
SELECT *
FROM SUMMERPRICE;
-- 수강 신청 정보 확인
SELECT *
FROM SUMMERENROLL;
UPDATE SUMMERPRICE
SET PRICE=15000
WHERE CLASS='FORTRAN'
SELECT PRICE "FORTRAN 수강료"
FROM SUMMERPRICE
WHERE CLASS='FORTRAN';
학생수강성적 릴레이션에서 종속관계에 있는 예
학생번호 → 학생이름
학생번호 → 주소
강좌이름 → 강의실
학과 → 학과사무실
종속하지 않는 예
학생이름 → 강좌이름
학과 → 학생번호
종속하는 것처럼 보이지만 실제로는 그렇지 않은 예
학생이름 → 학과 (동명이인 존재 가능)
🔽 학생 수강 성적 릴레이션의 종속 관계
🔽 학생 수강 성적 릴레이션의 함수 종속성 다이어그램
참조 무결성 문제 해결 관련 ✔
delete from orders where orders.bookid in(select bookid from book where publisher = '이상미디어) ;
🔽
book 테이블에서 이상미디어가 포함된 튜플의 bookid 인 7,8을 참조하고 있는 orders 테이블의 튜플을 먼저 삭제해줘야 참조 무결성 문제를 해결하고 book 테이블에 있는 이상미디어 관련 튜플을 정상적으로 삭제할 수 있음.