데이타베이스 Chap 6. SQL 2014.03.26. 오병우 컴퓨터공학과
SQL 의역사 SEQUEL(Structured English QUEry Language) 에연유 1974 년, IBM 연구소에서발표 IBM 은 'SYSTEM R' 의인터페이스로설계구현 실험적관계데이터베이스시스템인터페이스표준 SQL 1986 년, SQL-86 또는 SQL1 1992 년개정, SQL/92, SQL-92 또는 SQL2 다음버전 : SQL3, SQL-99 현재 상용 DBMS 인 DB2 와 SQL/DS 의데이터언어로사용 ORACLE, INFORMIX, SYBASE 등과같은다른회사에서도채택 미국표준연구소 (ANSI) 와국제표준기구 (ISO) 에서관계데이터베이스의표준언어로채택 Department of Computer Engineering 2
SQL(Structured Query Language) SQL 의의미 구조화질의어 종합데이터베이스언어역할 단순히검색만을위한데이터질의어가아님 데이터정의어 (DDL), 데이터조작어 (DML), 데이터제어어 (DCL) 의기능모두제공 Department of Computer Engineering 3
SQL 의특징 Relational algebra 의특징포함 + 확장된 relational calculus 기초 고급비절차적데이터언어 사용자친화적인인터페이스제공 SQL 의표준화 상용 RDBMS 간의전환용이 관계데이터베이스를접근하는데이터베이스응용프로그램을작성기능제공 온라인터미널을통해대화식질의어로사용 Department of Computer Engineering 4
SQL 의특징 (2) 응용프로그램에삽입된형태로도사용가능 Java, COBOL, C/C++ 등과같은범용프로그래밍언어로된응용프로그램 개개의레코드단위로처리하기보다는레코드집합단위로처리 선언적언어 SQL 명령문에는데이터처리를위한접근경로 (access path) 에대한명세가불필요 Note 관계모델의공식적용어대신일반적인용어사용 릴레이션 테이블, 투플 행, 애트리뷰트 열 Department of Computer Engineering 5
MySQL 개발환경구축 주로 APMSetup 활용 Apache-PHP-MySQL 한번에설치 http://dev.naver.com/projects/apmsetup/ http://www.apmsetup.com 은없어짐 최신버전아님 Autoset: 유사한설치방법제공 http://autoset.net/ http://dev.naver.com/projects/autoset Department of Computer Engineering 6
Show databases; Create database MySong; Use MySong; Create table song ( Name varchar(50), Singer varchar(20), Number dec(6), Favorite int ); Describe song; 선호도 10~100 MySQL 실습 금영노래방번호 http://www.ikaraoke.kr/isong/search_so ng.asp School of Computer Engineering 7
Insert into song values ( MySQL 실습 애인있어요, 이은미, 45387, 100); 다른노래들 10 곡삽입 따옴표없음 본인이선호하는노래방번호찾아서넣고 선호도는 10~100 사이에서골고루넣을것 Select * from song; Select * from song where favorite > 50; Select * from song where Number < 10000; Select singer from song where favorite > 50; Select distinct singer from song where favorite > 50; School of Computer Engineering 8
use mysong; MySQL 실습 select * from song order by favorite desc; delete from song where name= 소주한잔 ; delete from song where singer= 임창정 ; delete from song where number=12345; delete from song where favorite <= 30; delete from song; select * from song; Department of Computer Engineering 9
스키마와카탈로그 스키마 SQL 데이터정의문 하나의응용 ( 사용자 ) 에속하는테이블과기타구성요소등의그룹 스키마이름, 스키마소유자나허가권자, ( 테이블, 뷰, 도메인, 기타내용 ) 포함 CREATE SCHEMA UNIVERSITY AUTHORIZATION SHLEE ; 실제로 CREATE SCHEMA 보다 CREATE DATABASE 명령문을씀 카탈로그 한 SQL 시스템에서의스키마들의집합 use information_ schema; show tables; Information_schema : 그카탈로그에속한모든스키마에대한정보제공 Department of Computer Engineering 10
일반형식 도메인정의문 (1) CREATE DOMAIN 도메인 _ 이름데이터 _ 타입 [ 기정값 _ 정의 ] [ 도메인 _ 제약조건 _ 정의리스트 ]; ex) CREATE DOMAIN Dept CHAR(4) DEFAULT '??? CONSTRAINT VALID-DEPT CHECK( VALUE IN ('COMP', 'ME', 'EE', 'ARCH', '???')); ALTER DOMAIN 도메인 _ 이름 < 변경내용 > 참조하는곳이없을때 이것중하나 DROP DOMAIN 도메인 _ 이름 RESTRICT CASCADE ; 따라가서삭제 Department of Computer Engineering 11
도메인정의문 (2) 데이터타입시스템데이터타입만사용 숫자 INTEGER, SMALLINT : 정수 FLOAT(n), REAL, DOUBLE PRECISION : 실수 DECIMAL(i, j), NUMERIC(i, j) : 정형숫자 문자스트링 CHAR(n) : 고정길이문자 VARCHAR(n) : 가변길이문자 비트스트링 BIT(n), BIT VARYING(n) 날짜 DATE : YYYY-MM-DD 시간 TIME : hh:mm:ss TIMESTAMP : DATE 와 TIME 포함 INTERVAL : DATE, TIME, TIMESTAMP 포함 Department of Computer Engineering 12
테이블의종류 기본테이블의생성 (1) 기본테이블 (base table) 원래 DDL 에의해만들어지는테이블 독자적으로존재가능 뷰 (view) DDL 로만들어지지만독자적으로존재불가 어떤기본테이블로부터유도 (derived) 되어만들어지는가상테이블 (virtual table) 임시테이블 (temporary table) DDL 에의해만들어지는것이아님 질의문처리과정의중간결과로만들어지는테이블 Department of Computer Engineering 13
일반형식 기본테이블의생성 (2) CREATE TABLE 기본테이블 ({ 열이름데이터타입 [NOT NULL] [DEFAULT 값 ],} + [PRIMARY KEY ( 열이름 _ 리스트 ),] {[UNIQUE ( 열이름 _ 리스트 ),]} * {[FOREIGN KEY( 열이름 _ 리스트 ) REFERENCES 기본테이블 [( 열이름 _ 리스트 )] [ON DELETE 옵션 ] [ON UPDATE 옵션 ],]} * [CONSTRAINT 이름 ] [CHECK( 조건식 )]); Department of Computer Engineering 14
예제 기본테이블의생성 (3) CREATE TABLE ENROL ( Sno DSNO NOT NULL, Cno DCNO NOT NULL, Grade INTEGER, PRIMARY KEY(Sno,Cno), FOREIGN KEY(Sno) REFERENCES STUDENT(sno) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY(Cno) REFERENCES COURSE ON DELETE CASCADE ON UPDATE CASCADE, CHECK(Grade 0 AND Grade 100)); Department of Computer Engineering 15
기본테이블의제거와변경 (1) 기본테이블의제거 일반형식 DROP TABLE 기본 _ 테이블 _ 이름 { RESTRICT CASCADE } ; DROP TABLE COURSE CASCADE; 스키마제거 일반형식 DATABASE DROP SCHEMA 스키마 _ 이름 { RESTRICT CASCADE }; DROP SCHEMA UNIVERCITY CASCADE; Department of Computer Engineering 16
기본테이블의제거와변경 (2) 기본테이블의변경 일반형식 ALTER TABLE 기본 _ 테이블 _ 이름 예제 ([ADD 열 _ 이름데이터 _ 타입 ] [DEFAULT 기정값 ] [DROP 열 _ 이름 ] [CASCADE] [ALTER 열 _ 이름 (DROP DEFAULT SET DEFAULT 기정값 )]); ALTER TABLE ENROL ADD Final CHAR DEFAULT 'F'; ALTER TABLE ENROL DROP Grade CASCADE; Department of Computer Engineering 17
Example 대학 (University) 관계데이터베이스 학생 (STUDENT) 과목 (COURSE) 학번 (Sno) 이름 (Sname) 학년 (Year) 학과 (Dept) 100 나수영 4 컴퓨터 200 이찬수 3 전기 300 정기태 1 컴퓨터 400 송병길 4 컴퓨터 500 박종화 2 산공 과목번호 (Cno) 과목이름 (Cname) 학점 (Credit) 학과 (Dept) C123 프로그래밍 3 컴퓨터 C312 자료구조 3 컴퓨터 C324 화일구조 3 컴퓨터 C413 데이터베이스 3 컴퓨터 E412 반도체 3 전자 담당교수 (PRname) 김성국황수관이규찬이일로홍봉진 Department of Computer Engineering 18
Example (cont d) 대학 (University) 관계데이터베이스 등록 (ENROL) 학번 (Sno) 100 100 200 300 300 300 400 400 400 400 500 과목번호 (Cno) C413 E412 C123 C312 C324 C413 C312 C324 C413 E412 C312 성적 (Grade) A A B A C A A A B C B 중간성적 (Midterm) 90 95 85 90 75 95 90 95 80 65 85 기말성적 (Final) 95 95 80 95 75 90 95 90 85 75 80 Department of Computer Engineering 19
SQL 데이터조작문 데이터검색 기본구조 SELECT 열 _ 리스트 FROM 테이블 _ 리스트 WHERE 조건 ; 예 SELECT FROM WHERE Sname, Sno STUDENT Dept = ' 컴퓨터 '; 실행결과 Sname Sno 나수영 100 정기태 300 송병길 400 SELECT FROM WHERE STUDENT.Sname, STUDENT.Sno STUDENT STUDENT.Dept = ' 컴퓨터 '; Department of Computer Engineering 20
폐쇄시스템 (closed system) 데이터검색 (1) 기존테이블처리결과가또다른테이블이되는시스템 중첩질의문 (nested query) 의이론적기초 SQL 과이론적관계모델의차이점 SQL 의테이블 한테이블내에똑같은레코드 ( 행 ) 중복가능 Primary key를반드시가져야하는것은아님 이론상 SQL의테이블 투플의집합 같은원소의중복을허용하는다중집합 (multiset) 또는백 (bag) DISTINCT 명세 : 집합과같은결과를만듦 Department of Computer Engineering 21
일반적인형식 데이터검색 (2) SELECT [ALL DISTINCT] 열 _ 리스트 FROM 테이블 _ 리스트 [WHERE 조건 ] [GROUP BY 열 _ 리스트 [HAVING 조건 ]] [ORDER BY 열 _ 리스트 [ASC DESC]]; 검색결과에레코드의중복제거 SELECT DISTINCT Dept FROM STUDENT; 테이블의열전부를검색하는경우 SELECT * FROM STUDENT; Department of Computer Engineering 22
조건검색 데이터검색 (3) SELECT Sno,Sname FROM STUDENT WHERE Dept = ' 컴퓨터 ' AND Year = 4; 순서를명세하는검색 SELECT Sno, Cno FROM ENROL WHERE Midterm 90 ORDER BY Sno DESC, Cno ASC; 산술식과문자스트링이명세된검색 교재 p.142 ( 구교재 p.183) SELECT Sno AS 학번, ' 중간시험 = ' AS 시험, Midterm + 3 AS 점수 FROM ENROL WHERE Cno = 'C312'; Department of Computer Engineering 23
데이터검색 (4) 복수테이블로부터의검색 ( 조인 ) SELECT S.Sname, S.Dept, E.Grade FROM STUDENT S, ENROL E WHERE S.Sno = E.Sno AND E.Cno = 'C413'; 자기자신의테이블에조인하는검색 SELECT S1.Sno, S2.Sno FROM STUDENT S1, STUDENT S2 WHERE S1.Dept = S2.Dept AND S1.Sno < S2.Sno; Department of Computer Engineering 24
FROM 절에조인명세 데이터검색 (5) SELECT Sname, Dept, Grade FROM STUDENT JOIN ENROL ON (STUDENT.Sno=ENROL.Sno) WHERE ENROL.Cno = 'C413'; SELECT Sname, Dept, Grade FROM STUDENT JOIN ENROL USING(Sno) WHERE ENROL.Cno = 'C413'; SELECT Sname, Dept, Grade FROM STUDENT NATURAL JOIN ENROL WHERE ENROL.Cno = 'C413'; 참조 http://ko.wikipedia.org/wiki/join_(sql) Department of Computer Engineering 25
데이터검색 (6) 집계함수 (aggregate function) 를이용한검색 집계함수 : COUNT, SUM, AVG, MAX, MIN SELECT COUNT(*) AS 학생수 FROM STUDENT; SELECT COUNT(DISTINCT Cno) FROM ENROL WHERE Sno = 300; SELECT AVG(Midterm) AS 중간평균 FROM ENROL WHERE Cno = C413 ; Department of Computer Engineering 26
GROUP BY 를이용한검색 데이터검색 (7) SELECT Cno, AVG(Final) AS 기말평균 FROM ENROL GROUP BY Cno; Cno에따라그룹으로분할 HAVING 을사용한검색 SELECT Cno, AVG(Final) AS 평균 FROM ENROL GROUP BY Cno HAVING COUNT(*) >= 3; GROUP BY에따른그룹의구성요건 3 명이상등록한과목 Department of Computer Engineering 27
데이터검색 (8) 부속질의문 (Subquery) 을사용한검색 부속질의문 다른질의문에중첩 (nested) 되어사용된검색문 형태 : SELECT-FROM-WHERE-GROUP BY-HAVING 중첩질의문 : 부속질의문을포함하고있는질의문 IN 다음에사용 : 집합의멤버십연산자 ( ) 로해석가능 SELECT Sname FROM STUDENT WHERE Sno IN (SELECT Sno FROM ENROL WHERE Cno = 'C413'); Department of Computer Engineering 28
데이터검색 (9) 부속질의문을사용한검색 (cont d) SELECT FROM WHERE Sname STUDENT Sno NOT IN (SELECT Sno FROM ENROL WHERE Cno = C413 ); SELECT Sname, Dept FROM STUDENT WHERE Dept = (SELECT Dept FROM STUDENT WHERE Sname = 정기태 ); Department of Computer Engineering 29
데이터검색 (10) 부속질의문을사용한검색 (cont d) SELECT Sno, Cno FROM ENROL WHERE Final > ALL (SELECT Final FROM ENROL WHERE Sno = 500); Department of Computer Engineering 30
LIKE 를사용하는검색 LIKE 데이터검색 (11) 서브스트링패턴 (substring pattern) 비교연산자 % _ 어떤길이의어떤문자스트링도관계없음을의미 (underbar) 문자하나를의미 SELECT FROM WHERE Cno, Cname COURSE Cno LIKE 'C%'; Department of Computer Engineering 31
NULL 을사용한검색 NULL 데이터검색 (12) 누락된정보 (missing information) 값은있지만모르는값 (unknown value) 해당되지않는값 (unapplicable value) 의도적으로유보한값 (withheld value) NULL 이추가된 3- 값논리 (3-VL: 3-value logic) 논리값으로보면참 (true) 도거짓 (false) 도아닌미정 (unknown) AND T F U OR T F U NOT T F U T F U F F U U F U T F U T T T T F U T U U T F U F T U Department of Computer Engineering 32
데이터검색 (13) NULL 을사용한검색 (cont d) SELECT Sno, Sname FROM STUDENT WHERE Dept IS NULL; 열 _ 이름 IS [NOT] NULL 의형식만허용 열 _ 이름 = NULL 의형식은불법적형식 널값 : 조건식에서비교연산자와같이사용 항상거짓 Year 의값이널인경우다음은모두거짓이거나불법 Year > 3 Year 3 Year = 3 Year 3 Year = NULL ( 불법적형식 ) Year NULL ( 불법적형식 ) 주의 : 안됨 Department of Computer Engineering 33
EXISTS 를사용하는검색 데이터검색 (14) 과목 C413 에등록한학생의이름을검색하라. SELECT Sname FROM STUDENT WHERE EXISTS (SELECT * FROM ENROL WHERE Sno = STUDENT.Sno AND Cno = 'C413'); Note : EXISTS 이하 SELECT 문이참 ( 공집합이아님 ) 일때본 SELECT 문을실행 Department of Computer Engineering 34
데이터검색 (15) EXISTS 를사용하는검색 (cont d) 과목 C413 에등록하지않은학생의이름을검색하라. SELECT Sname FROM STUDENT WHERE NOT EXISTS (SELECT * FROM ENROL WHERE Sno = STUDENT.Sno AND Cno = 'C413'); Department of Computer Engineering 35
UNION 이관련된검색 SELECT Sno FROM STUDENT WHERE Year = 1 UNION SELECT Sno FROM ENROL WHERE Cno = 'C324'; 데이터검색 (16) Note : 중복되는투플은제거 Department of Computer Engineering 36
일반적인형식 UPDATE 데이터의갱신 (1) 테이블 SET { 열 _ 이름 = 산술식 } + [WHERE 조건 ]; 하나의레코드변경 UPDATE STUDENT SET Year = 2 WHERE Sno = 300; 복수의레코드변경 UPDATE COURSE SET Credit = Credit + 1 WHERE Dept = ' 컴퓨터 '; Department of Computer Engineering 37
부속질의문을이용한변경 데이터의갱신 (2) UPDATE ENROL SET Final = Final + 5 WHERE Sno IN ( SELECT Sno FROM STUDENT WHERE Dept = ' 컴퓨터 '); UPDATE STUDENT SET Dept = (SELECT Dept FROM COURSE WHERE Cname = 데이터베이스 ) WHERE Year = 4; Department of Computer Engineering 38
데이터의삽입 (1) 일반형식 INSERT INTO 테이블 [( 열 _ 이름 _ 리스트 )] VALUES ( 열값 _ 리스트 ); INSERT INTO 테이블 [( 열 _ 이름 _ 리스트 )] SELECT 문 ; Department of Computer Engineering 39
레코드의직접삽입 데이터의삽입 (2) INSERT INTO STUDENT(Sno, Sname, Year, Dept) VALUES (600, ' 박상철 ', 1, ' 컴퓨터 '); INSERT INTO VALUES STUDENT (600, ' 박상철 ', 1, ' 컴퓨터 '); INSERT INTO STUDENT(Sno, Sname, Year) VALUES (600, ' 박상철 ', 1); Department of Computer Engineering 40
데이터의삽입 (3) 부속질의문을이용한레코드삽입 INSERT INTO COMPUTER(Sno, Sname, Year) SELECT Sno, Sname, Year FROM STUDENT WHERE Dept = ' 컴퓨터 '; Department of Computer Engineering 41
데이터의삭제 (1) 일반형식 DELETE FROM 테이블 [WHERE 조건 ]; 하나의레코드삭제 DELETE FROM STUDENT WHERE Sno = 100; Note : Primary key 와 referential integrity( 참조무결성 ) 문제 Department of Computer Engineering 42
데이터의삭제 (2) 복수의레코드삭제 DELETE FROM ENROL; 주의 : 전체삭제 부속질의문을사용한삭제 DELETE FROM ENROL WHERE Cno = 'C413' AND Final < 60 AND ENROL.Sno IN ( SELECT Sno FROM STUDENT WHERE Dept = ' 컴퓨터 '); Department of Computer Engineering 43
SQL 뷰 하나또는둘이상의기본테이블 (base table) 로부터유도되어만들어지는가상테이블 (Virtual table) 외부스키마는뷰와기본테이블들의정의로구성됨 기본테이블을들여다보는 ' 유리창 ' (window) 동적임 (dynamic) cf.) Snapshot: static 물리적인구현이아님 뷰의정의만시스템카탈로그 (SYSVIEWS) 에 SELECT-FROM- WHERE 의형태로저장됨 뷰에대한변경 테이블에대한변경 ( 제한적임 ) 불가능할수있음 (derived attribute) Error 가발생할수있음 (with check option) Null 로채워질수있음 ( 뷰에없는 attribute) Graphics 의 window & view 개념 Department of Computer Engineering 44
뷰의생성 (1) 일반형식 CREATE VIEW 뷰 _ 이름 [( 열 _ 이름리스트 )] AS SELECT 문 [WITH CHECK OPTION]; WITH CHECK OPTION 갱신이나삽입연산시조건확인 CREATE VIEW CSTUDENT2(Sno, Sname, Dept) AS SELECT Sno, Sname, Dept FROM STUDENT WHERE Dept = ' 컴퓨터 WITH CHECK OPTION; 컴퓨터 아님 insert into CSTUDENT2 values (600, 아무로, 메카트로닉스 ) Error 발생 Department of Computer Engineering 45
뷰의생성 (2) CREATE VIEW CSTUDENT(Sno, Sname, Year) AS SELECT Sno, Sname, Year FROM STUDENT WHERE Dept = ' 컴퓨터 ; 기본테이블학생 (STUDENT) 의컴퓨터과학생 (CSTUDENT) 뷰 컴퓨터과학생 (CSTUDENT) 학번 이름 학년 Sno Sname Year 학과 Dept 100 나수영 4 컴퓨터 200 이찬수 3 전기 300 정기태 1 컴퓨터 400 송병길 4 컴퓨터 500 박종화 2 산공 Department of Computer Engineering 46
뷰의생성 (3) 예 (cont d) CREATE VIEW DEPTSIZE(Dept, Tstdn) AS SELECT Dept, COUNT(*) FROM STUDENT GROUP BY Dept; AS SELECT : 열의이름상속상속불가한경우나열이름이중복될경우반드시열이름명세 CREATE VIEW HONOR(Sname, Dept, Grade) AS SELECT STUDENT.Sname, STUDENT.Dept, ENROL.Final FROM WHERE 두개이상테이블조인 STUDENT, ENROL STUDENT.Sno = ENROL.Sno AND ENROL.Final > 90; Department of Computer Engineering 47
뷰의생성 (4) 예 (cont ) CREATE VIEW COMHONOR AS SELECT Sname FROM HONOR WHERE Dept = ' 컴퓨터 '; 정의된뷰를이용하여또다른뷰정의 Department of Computer Engineering 48
뷰의제거 (1) 일반형식 DROP VIEW 뷰 _ 이름 { RESTRICT CASCADE }; 예 RESTRICT 다른곳에서참조되고있지않는한데이터베이스에서제거 CASCADE 이뷰가사용된다른모든뷰나제약조건이함께제거 DROP VIEW DEPTSIZE RESTRICT; Note : Propagated Destroys 기본테이블이제거되면그위에만들어진인덱스나뷰도자동적으로제거됨 Department of Computer Engineering 49
뷰의조작연산 (1) 기본테이블에사용가능한검색 (SELECT) 문도뷰에사용가능변경 ( 삽입, 삭제, 갱신 ) 연산은제약 열부분집합뷰 (column subset view) CREATE VIEW STUDENT_VIEW1 AS SELECT Sno, Dept FROM STUDENT; Primary key 포함 : 이론적으로삽입, 삭제, 갱신, 검색가능 CREATE VIEW STUDENT_VIEW2 AS SELECT Sname, Dept FROM STUDENT; Primary key 불포함 : 이론적으로삽입, 삭제, 갱신, 검색불가 행부분집합뷰 (row subset view) CREATE VIEW STUDENT_VIEW3 AS SELECT Sno, Sname, Year, Dept FROM STUDENT WHERE Year=4; Department of Computer Engineering 50
조인뷰 (join view) 뷰의조작연산 (2) CREATE VIEW HONOR(Sname, Dept, Grade) AS SELECT STUDENT.Sname, STUDENT.Dept, ENROL.Final FROM STUDENT, ENROL WHERE STUDENT.Sno = ENROL.Sno AND ENROL.Final > 95; 통계적요약뷰 (statistical summary view) CREATE VIEW COSTAT(Cno, Avpoint) AS SELECT Cno, AVG(Midterm) FROM ENROL GROUP BY Cno; Department of Computer Engineering 51
뷰의조작연산 (3) 뷰는제한적인갱신만가능함 뷰이론적으로변경이가능한뷰 실제로변경이가능한뷰 Department of Computer Engineering 52
뷰의조작연산 (4) 변경연산이허용되지않는경우 1 뷰의열이상수나산술연산자또는함수가사용된산술식으로만들어질경우 2 집계함수 (COUNT, SUM, AVG, MAX, MIN) 가관련되어정의된경우 3 DISTINCT, GROUP BY, HAVING 이사용되어정의된경우 4 두개이상의테이블이관련되어정의된경우 5 변경할수없는뷰를기초로정의된경우 Department of Computer Engineering 53
뷰의장점 뷰의장단점 논리적독립성을제공 ( 확장, 구조변경 ) 데이터의접근을제어 ( 보안 ) 사용자의데이터관리를단순화 여러사용자에다양한데이터요구를지원 뷰의단점 정의를변경할수없음 삽입, 삭제, 갱신연산에제한이많음 Department of Computer Engineering 54