[정보처리기사]실기 암기노트 데이터베이스 3장
정보처리기사 실기 암기노트 (데이터베이스)
3장. SQL
DDL(Data Definition Language)의 개념
스키마도메인테이블뷰인덱스정의변경제거언어메타데이터시스템 카탈로그CREATEALTERDROPCREATE SCHEMA
스키권을 인증할 사람(AUTH ORI ZATION) 필요CREATE SCHEMA 스키마명 AUTHORIZATION 사용자_ID;CREATE DOMAIN 도메인은 도타(도메인명 + 데이터타입), 도타는 기본(디폴트)이 잘되있음, 인성이 쓰레기라 제약도 큼, 그래서 확인(CHECK) 해야됨
CREATE DOMAIN 도메인명 데이터_타입 [DEFAULT 기본값] [CONSTRAINT 제약조건명 CHECK (범위값)];CREATE DOMAIN SEX CHAR(1) DEFAULT '남' CONSTRAINT VALID-SEX CHECK (VALUE IN('남', '여'));CREATE TABLE
프라이머리고유포린키옵션 두개 DELETE UPDATE제약조건CHECKCREATE TABLE 테이블명 (속성명 데이터_타입 [NOT NULL], ... [, PRIMARY KEY (기본키_속성명, ...)] [, UNIQUE (대체키_속성명, ...)] [, FOREIGN KEY (외래키_속성명, ...) REFERENCES 참조테이블(기본키_속성명, ...)] [ON DELETE 옵션] [ON UPDATE 옵션] [, CONSTRAINT 제약조건명][CHECK (조건식)]);- 속성명에
NOT NULL적용 가능 - 기본키
PRIMARY KEY - 대체키로 사용할 속성(집합)
UNIQUE속성들이 최소성을 만족시켜야함 FOREIGN KEY ~ REFERENCES ~외래키참조무결성CASCADEON DELETENO ACTIONCASCADESET NULLSET DEFAULTON UPDATENO ACTIONCASCADESET NULLSET DEFAULTCONSTRAINT제약조건명이 없을경우 CHECK만 사용가능

- 속성명에
CREATE VIEW
VIEW는 AS SELECT문이 따라온다 ASSCREATE VIEW 뷰명[(속성명[, 속성명, ...])] AS SELECT문;SELECT문을 서브쿼리로 사용
SELECT문의 결과로서 뷰를 생성
UNION 이나 ORDER BY절을 사용할 수 없음
CREATE VIEW 안산고객(성명, 전화번호) AS SELECT 성명, 전화번호 FROM 고객 WHERE 주소 = '안산시';CREATE INDEX
검색을 빠르게보조적인 데이터 구조I-O-T INDEX-ON-TABLE NAMECREATE [UNIQUE] INDEX <인덱스명> ON 테이블명 ({속성명 [ASC | DESC] [,속성명 [ASC | DESC]]}) [CUSTER];UNIQUE 이 사용됬으면, 중복값이 없는 속성으로 인덱스를 생성 (없으면 중복값 허용)
〈고객〉테이블에서 UNIQUE한 특성을 갖는 고객번호 속성에 대해 내림차순으로 정렬하여 ‘고객번호_idx’ 라는 이름으로 인덱스를 정의하시오.
CREATE UNIQUE INDEX 고객번호_idx ON 고객(고객번호 DESC);
CREATE TRIGGER
입력갱신삭제이벤트가 발생할 때마다자동적으로 수행되는 사용자 프로시저무결성 제약조건 구현관련 테이블의 데이터 일치트리거명 AB IUD ON 테이블명트리거가 언제 실행되게 할것인지?무슨 작업을 할것인지?어떤 테이블에서?REFERENCING NO TABLE AS 테이블명FOR EACH ROWWHEN 조건식트리거 BODY(BEGIN-END)CREATE TRIGGER 트리거명 [동작시기 옵션][동작 옵션] ON 테이블명 REFERENCING [NEW | OLD] TABLE AS 테이블명 FOR EACH ROW WHEN 조건식 트리거 BODY- 동작시기
AFTER테이블이 변경된 후BEFORE테이블이 변경되기 전 - 동작옵션
INSERTDELETEUPDATE - 테이블 선택옵션
NEWOLD WHEN조건- 트리거
BEGIN - END
CREATE TRIGGER 학년정보_tri BEFORE INSERT ON 학생 REFERENCING NEW TABLE AS 학생 FOR EACH ROW WHEN new_table.학년 = '' BEGIN SET new_table.학년 = '신입생'; END;- 동작시기
ALTER TABLE
DC - DROP COLUMNALTER TABLE 테이블명 ADD 속성명 데이터_타입 [DEFAULT '기본값']; ALTER TABLE 테이블명 ALTER 속성명 [SET DEFAULT '기본값']; ALTER TABLE 테이블명 DROP COLUMN 속성명 [CASCADE];〈학생〉테이블에 최대 3문자로 구성되는 학년 속성을 추가하는 SQL문 ALTER TABLE 학생 ADD 학년 VARCHAR(3);DROP
DROPSCHEMA, DOMAIN, TABLE, VIEW, INDEX, TRIGGER[CASCADE | RESTRICT];DROPCONSTRAINT제약조건명;RESTRICT다른 개체가 제거할 개체를 참조중일 경우 제거가 취소〈학생〉테이블을 제거하는 SQL문을 작성하시오. 단, 〈학생〉 테이블을 참조하는 모든 데이터도 함께 제거한다. DROP TABLE 학생 CASCADE;오답노트
내가 쓴 답 CONSTRAINT sex_ck CHECK (sex = ‘f’ OR sex = ‘m’;), 정답 CONSTRAINT sex_ck CHECK (sex = ‘f’ or sex = ‘m’),제약조건 CONSTRAINT ~ CHECK 안에 세미콜론(;) 이 들어가지 않는다!
내가 쓴 답 CONSTRAINT id_fk CHECK ( FOREIGN KEY id REFERENCES doctor.doc_id; )); 정답 CONSTRAINT id_fk FOREIGN KEY (id) REFERENCES doctor(doc_id));외래키가 제약조건으로 들어간 경우, CHECK 생략 이후 id 는 전부 괄호() 를 사용한다.
내가 쓴 답 FOREIGN KEY (dept) REFERENCES Department(name), ON DELETE SET NULL, ON UPDATE CASCADE ); 정답 FOREIGN KEY(dept) REFERENCES Department(name) ON DELETE SET NULL ON UPDATE CASCADE );외래키 부분에서의 ON DELETE, ON UPDATE 로 이루어지는 부분은 콤마(,) 를 찍지 않는다.
내가 쓴 답 AS SELECT id, Course.name, Instructor.name 정답 AS SELECT Course.id, Course.name, Instructor.nameVIEW 를 정의할 때, 테이블이 나와있는 것이 아니면
테이블.속성으로 표시한다.그리고 맨 뒤에 그냥 세미콜론(;) 넣어주면 된다.
내가 쓴 답 CREATE UNIQUE INDEX Stud_idx ON Student(ssn) ASC; 정답 CREATE UNIQUE INDEX Stud_idx On Student(ssn, ASC); * ASC는 생략할 수 있음INDEX 정의에서 I-O-T (괄호안에 모두 넣고 끝남)
내가 쓴 답 CONSTRAINT VALID-직위 VALUE IN(‘사원’, ‘대리’, ‘과장’, ‘부장’, ‘이사’, ‘사장’); 정답 CONSTRAINT VALID-직위 CHECK VALUE IN (...);CONSTRAINT - CHECK 는 항상! (외래키 사용할 때만 제외)
CREATE ( ) 월급_trg AFTER UPDATE ON 급여 REFERENCING OLD TABLE AS old_tbl NEW TABLE AS new_tbl FOR EACH ROW WHEN old_tbl.직위 =new_tbl.직위 BEGIN UPDATE 사원 SET 월급 = new_tbl.기본급 + new_tbl.성과급; END;내가 쓴 답 CREATE SCHEMA 개인정보 AUTHORIZATION id=‘장발장’; 정답 CREATE SCHEMA 개인정보 AUTHORIZATION '장발장';
SQL-SELECT
SELECT문의 일반 형식
SELECT [PREDICATE] [테이블명.]속성명[AS 별칭][, [테이블명.]속성명, ...] FROM 테이블명[, 테이블명, ...] [WHERE 조건] [GROUP BY 속성명[, 속성명, ...]] [HAVING 조건] [ORDER BY 속성명 [ASC|DESC][, 속성명 [ASC|DESC], ...]];- PREDICATE
검색할 튜플을 제한할 목적으로 사용되는 조건ALL- 모든 튜플 검색 (기본값)DISTANCT- 중복된 튜플 제거DISTANCTROW- 튜플 전체값을 대상으로 중복된 튜플 제거
- 2개 이상의 테이블을 검색할 때
테이블명.속성명으로 사용 AS다른 제목으로 표현FROMWHEREGROUP BY: 특정 속성을 기준으로 그룹화하여 검색할 때 사용, 그룹함수와 함께 사용HAVING: 그룹에 대한 조건ORDER BY


- WHERE 조건문에
IS NULL또는IS NOT NULL을 사용할 수 있다 


- GROUP BY 는 해당 속성의 중복을 전부 제거하는 것인가?
그룹으로 묶는다이런느낌 
- IN, NOT IN 의 차이 및 복수테이블과 하위 질의에 대한 차이점 인식하기
- 하위질의 괄호 안에 세미콜론(;) 넣지 않음


- 2개의 테이블의 속성들이 SELECT에 들어있을 때,
복수 테이블 - 1개씩 SELECT에 들어있을 때,
하위질의
- 2개의 테이블의 속성들이 SELECT에 들어있을 때,
- PREDICATE
기출 따라잡기

괄호가 항상 중요함!
중복되는 레코드는 한번만 표시하고= DISTINCT내답 : SELECT name (...) 정답 : SELECT DISTINCT name (...)

결과 테이블에 네이밍이 다른것이 아니면 AS 절은 빼는식으로 작성하자
내답 : SELECT SUM(psale) AS 합계 정답 : SELECT SUM(psale)

ORDER BY 구문을 정확히 알 것
내답 : ORDER BY ASC; 정답 : ORDER BY name [ASC];


HAVING 조건에 대해서 조금 더 명확하게
내답 : GROUP BY 결제여부 HAVING COUNT(결제여부); 정답 : GROUP BY 결제여부;
SQL - JOIN
JOIN 개념
2개 테이블튜플 결합하나의 새로운 릴레이션INNER JOINOUTER JOIN일반적으로 FROM 절에 기술한 테이블에만 있는 속성은 생략가능두 테이블에 모두 속해있는 속성은 테이블명과 함께 표시INNER JOIN
EQUI JOIN
공통속성=(equal)행을 연결- NATURAL JOIN
중복제거모드- 이름이 같고, 도메인이 같은 속성이 반드시 존재해야됨
- JOIN 속성
연결고리공통속성
/* WHERE 절을 이용한 EQUI JOIN */ SELECT [테이블명1.]속성명, [테이블명2.]속성명, ... FROM 테이블명1, 테이블명2, ... WHERE 테이블명1.속성명 = 테이블명2.속성명; /* NATURAL JOIN을 이용한 EQUI JOIN*/ SELECT [테이블명1.]속성명, [테이블명2.]속성명, ... FROM 테이블명1 NATURAL JOIN 테이블명2; /* JOIN ~ USING절을 이용한 EQUI JOIN의 표기형식*/ SELECT [테이블명1.]속성명, [테이블명2.]속성명, ... FROM 테이블명1 JOIN 테이블명2 USING(속성명);
SELECT 학번, 이름, 학과.학과코드, 학과.학과명 FROM 학생, 학과 WHERE 학생.학과코드 = 학과.학과코드; SELECT 학번, 이름, 학과.학과코드, 학과.학과명 FROM 학생 NATURAL JOIN 학과; /* 학과코드가 학생, 학과 테이블에 둘다 존재하므로 NATURAL JOIN이 가능한 것 */ SELECT 학번, 이름, 학과.학과코드, 학과.학과명 FROM 학생 JOIN 학과 USING 학과코드;- NATURAL JOIN
NON-EQUI JOIN
- 비교연산자 사용 (= 이 아닌 >, <, <>, >=, <=)
SELECT [테이블명1.]속성명, [테이블명2.]속성명, ... FROM 테이블명1, 테이블명2, ... WHERE (NON-EQUI JOIN 조건);
- 테이블명.속성을 BETWEEN 하면, 학생.성적에 맞게 BETWEEN 되어 등급이 결정됨 (JOIN)
OUTER JOIN
OUTER 니까 ON 이 필요JOIN 조건에 만족하지 않는 튜플도 결과로 출력LEFT OUTER JOIN
우측 항 릴레이션의 어떤 튜플과도 맞지 않는좌측 항 릴레이션에 있는 튜플들에NULL 값을 붙임
SELECT[테이블명1.]속성명, [테이블명2.]속성명, ••• FROM 테이블명1 LEFT OUTER JOIN 테이블명2 ON 테이블명1.속성명 = 테이블명2.속성명; SELECT[테이블명1.]속성명, [테이블명2.]속성명, ••• FROM 테이블명1, 테이블명2 WHERE 테이블명1.속성명 = 테이블명2.속성명(+);RIGHT OUTER JOIN
좌측 항 릴레이션의 어떤 튜플과도 맞지 않는우측 항 릴레이션에 있는 튜플들에NULL 값을 붙임
SELECT[테이블명1.]속성명, [테이블명2.]속성명, ••• FROM 테이블명1 RIGHT OUTER JOIN 테이블명2 ON 테이블명1.속성명 = 테이블명2.속성명; SELECT[테이블명1.]속성명, [테이블명2.]속성명, ••• FROM 테이블명1, 테이블명2 WHERE 테이블명1.속성명(+) = 테이블명2.속성명;INNER JOIN에서LEFT 일경우 우측에 (+)RIGHT 일 경우 좌측에 (+)랑 동일FULL OUTER JOIN
(LEFT + RIGHT) OUTER JOININNER JOINRIGHTLEFT순으로 진행
SELECT [테이블명1.]속성명, [테이블명2.]속성명,••• FROM 테이블명1 FULL OUTER JOIN 테이블명2 ON 테이블명1.속성명 = 테이블명2.속성명;


답
SELECT 학번, 이름, 학생.학과코드, 학과명 FROM 학생 LEFT OUTER JOIN 학과 ON 학생.학과코드 = 학과.학과코드; SELECT 학번, 이름, 학생.학과코드, 학과명 FROM 학생, 학과 ON 학생.학과코드 = 학과.학과코드(+);
SELF JOIN
같은 테이블2개의 속성을 연결EQUI JOINSELECT [별칭1.]속성명, [별칭1.]속성명. ••• FROM 테이블명1 [AS] 별칭1 JOIN 테이블명1 [AS] 별칭2 ON 별칭1.속성명 = 별칭2.속성명; SELECT [별칭1.]속성명, [별칭1.]속성명, ••• FROM 테이블명1 [AS] 별칭1, 테이블명1 [AS] 별칭2 WHERE 별칭1.속성명 = 별칭2.속성명;
기출 따라잡기


- 학생 LEFT OUTER JOIN 학과
- 학생.학과코드 = 학과.학과코드(+);
- 학생에만 NULL 값이 존재하므로,
LEFT OUTER JOIN이다
SQL - DML
DML(Data Manipulation Language) 의 개념
데이터베이스 사용자응용프로그램OR질의어저장된 데이터관리언어데이터베이스 사용자-데이터베이스 관리 시스템 (DBMS)인터페이스 제공INSERTDELETEUPDATEINSERT문
INSERTINTOVALUESINSERT INTO 테이블명[(속성명1, 속성명2, •••)] VALUES (데이터1, 데이터2, •••);
대응하는 속성, 데이터개수, 데이터타입 일치속성명 생략 가능단, 기술된 속성 순으로INSERT INTO 사원 VALUES (‘장보고’, ‘기획’, ’05/03/73’, ‘구의동’, 90);SELECT 문검색 결과 삽입 가능〈사원〉테이블에 있는 편집 부서의 모든 튜플을 〈편집부원(이름, 생일, 주소, 기본급)〉 테이블에 삽입하는 SQL문을 작성하시오.
SELECT 결과를 이용해 삽입VALUES 생략INSERT INTO 편집부원(이름, 생일, 주소, 기본급) SELECT 이름, 생일, 주소, 기본급 FROM 사원 WHERE 부서 = '편집';
DELETE문
DELETEFROM[WHERE]DELETE FROM 테이블명 WHERE 조건;DELETE FROM 사원 WHERE 이름 = '임꺽정'; DELETE FROM 사원; /* 모든 튜플을 삭제할 때 WHERE 절 생략 */단,
DMLDELETE문은 테이블 구조나 테이블 자체는 남겨두고테이블 내의 튜플만 삭제하는 것임전부 삭제하려면
DDL의 DROP문을 사용해야 함UPDATE문 : UPDATE SET WHERE
특정 튜플내용 갱신UPDATE 테이블명 SET 속성명 = 데이터[, 속성명=데이터, •••] WHERE 조건;〈사원〉테이블에서 홍길동의 주소를 ‘퇴계동’ 으로 갱신하는 SQL문을 작성하시오.
UPDATE 사원 SET 주소='퇴계동 WHERE 이름='홍길동';〈사원〉테이블에서 황진이의 부서를 ‘기획’으로 변경하고 기본급을 5 인상하는 SQL문을 작성하시오.
UPDATE 사원 SET 부서='기획', 기본급 = 기본급+5 WHERE 이름='황진이';
기출 따라잡기
SECTION 072/* 〈사원〉테이블에 있는 자료 중에서 ‘부서’가 “기획”인 자료를 검색하여 〈기획부(성명, 경력,주소, 기본급)〉테이블에 삽입하는 SQL문을 작성하시오.*/ 내답 : INSERT INTO 기획부 SELECT 성명, 경력, 주소, 기본급 FROM 사원 WHERE 부서='기획'; 정답 : INSERT INTO 기획부(성명, 경력, 주소, 기본급) SELECT 성명, 경력, 주소, 기본급 FROM 사원 WHERE 부서 = '기획';/* "장발장”과 “황진이” 사원의 ‘부서’를 “편집”으로 갱신하는 SQL문을 작성하시오. */ 내답 : UPDATE 사원 SET 부서='편집' WHERE 성명=‘장발장’ OR 성명=‘황진이’; 정답 : UPDATE 사원 SET 부서='편집' WHERE 성명 IN ('장발장', '황진이');
SQL - DCL
DCL(Data Control Language)
보안무결성회복병행제어보병은 권한이 없으니 우회(무회)해서 돌아가세요COMMITROLLBACKGRANTREVOKECOMMIT / ROLLBACK
- COMMIT :
트랜잭션데이터베이스반영일관성(Consistency)데이터베이스에 반영완료(Commit) - ROLLBACK :
변경 내용 취소비일관성(Incosistency)일부만 반영롤백(Rollback)
- COMMIT :
GRANT / REVOKE
- GRANT
권한부여 - REVOKE
권한해제
GRANT 사용자등급 TO 사용자_ID_리스트[IDENTIFIED BY 암호]; REVOKE 사용자등급 FROM 사용자_ID_리스트;사용자 등급
DBA(데이터베이스 관리자)RESOURCE(데이터베이스 및 테이블 생성 가능자)CONECT(일반 사용자)GRANT RESOURCE TO NABI;GRANT CONNECT TO STAR;테이블 속성에 대한 권한 부여 및 취소 GRANTOT, ROF
GRANT 권한_리스트 ON 개체 TO 사용자 [WITH GRANT OPTION]; REVOKE [GRANT OPTION FOR] 권한_리스트 ON 개체 FROM 사용자 [CASCADE];- 권한 종류
ALLSELECTINSERTDELETEUPDATEALTER WITH GRANT OPTIONGRANT OPTION FORCASCADEGRANT ALL ON 고객 TO NABI WITH GRANT OPTION;REVOKE GRANT OPTION FOR UPDATE ON 고객 FROM STAR;- 작은따옴표로 구분하지 않는다
- 권한 종류
- GRANT
SECTION 073
김하늘에게〈강좌〉테이블에 대해 삭제하는 권한을 부여하고, <강좌>테이블에 대해 삭제하는 권한을 다른 사람에게부여할 수 있는 권한을 부여하는 SQL문을 작성하시오.강좌>
내답 : GRANT DELETE ON 학생 TO 김하늘 GRANT OPTION; 정답 : GRANT DELETE ON 강좌 TO 김하늘 WITH GRANT OPTION;
예상 문제은행
문제 항상 잘 읽을 것! 조건! 조건! 조건!
CHECK (기본급 >= 1000000);
2개의 테이블이 있을 때, 해당 속성이 어느 테이블에 속한지 확인하고, FROM 구문 틀리지 말것!
~가 없는이라는 조건이 붙었을 때,IS NULL보다는NOT IN을 먼저 생각해본다SELECT 이름, 재직년도, 기본급 FROM 사원 내가쓴답 : WHERE 사원 IN ( SELECT 이름 FROM 사원 WHERE 자격증 IS NULL); 정답 : WHERE 이름 NOT IN ( SELECT 이름 FROM 자격증);SELECT 이름 FROM 자격증 GROUP BY 이름 HAVING COUNT(*) >= 2;WITH CHECK OPTION
CREATE VIEW 3학년학생 SELECT * FROM 학생 WHERE 학년=3 WITH CHECK OPTION;

검색 결과가 오른차순으로 되있는지, 내림차순으로 되어있는지 확인 (문제에서 제시한 것 말고)
<검색 결과>대로 표시하는 SQL문을 작성하시오.
SELECT 상호, 총액 FROM 거래내역 WHERE 총액 IN (SELECT MAX(총액) FROM 거래내역);iff 는…

