ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Ch 05. 기본 SQL
    학교 수업/2-2 데이터베이스 기초 2021. 9. 14. 18:50
    반응형

    그림 5.1(6판은 그림 6.1)

     

     

    SQL 소개

    • 상업적 관계 데이터베이스의 표준 언어
    • 포괄적인 데이터베이스 언어
      • 데이터 정의, 질의, 갱신을 위한 문들을 가지고 있음(데이터 정의어 DDL과 데이터 조작어 DML을 포함함)
    • 기능
      • 데이터베이스에서 뷰를 정의함
      • 보안과 권한 관리를 명시함
      • 무결성 제약 조건을 정의함
      • 트랜잭션 제어를 명시하는 기능들을 가지고 있음
    • JAVA와 C/C++ 같은 범용 프로그래밍 언어로 작성된 프로그램에 SQL 문들을 삽입하기 위한 기능도 제공함

     

    SQL의 데이터 정의와 데이터 타입

    • SQL은 관계 데이터 모델의 릴레이션, 튜플, 애트리뷰트를 각각 테이블(표), 행, 열이라고 부름
    • SQL 데이터 정의어는 CREATE, ALTER, DROP이 있음
    • SQL안에는 schema evolution(스키마 진화)이라는 명령어가 있음
      • 테이블, 애트리뷰트, 제약 조건을 추가하거나 삭제하여 스키마를 변경하는 것

     

    SQL에서 스키마와 카탈로그 개념

    1. 스키마(schema)
      • 동일한 데이터베이스 응용에 속해있는 테이블이나 다른 구조체들을 말함
      • 스키마 이름, 각 원소에 대한 기술자(descriptor), 권한 부여 식별자
      • 스키마 요소
        • 테이블, 제약 조건, 뷰, 도메인, 그 외의 구성요소(권한 부여 등)
      • CREATE SCHEMA 문을 이용하여 스키마를 생성하며 이 문은 모든 스키마 원소의 정의를 포함할 수 있음. 또 다른 방법으로는 이름과 권한 부여 식별자를 할당받고 나중에 원소를 정의할 수 있음
        • ex) Jsmith라는 권한 부여 식별자를 갖는 사용자가 소유하고 있는 COMPANY라는 스키마를 생성
          • CREATE SCHEMA COMPANY.AUTHORZATION 'Jsmith'(COMPANY 스키마를 만들고 Jsmith가 관리함)
    2. 카탈로그(catalog)
      • SQL 환경 안에서는 스키마들의 모임이라는 이름을 가짐
      • 카탈로그는 항상 INFORMATION_SCHEMA라고 부르는 특별한 스키마를 포함하고 있음(system catalog)
        • 카탈로그 내에 있는 모든 스키마들과 이들 스키마 내의 모든 원소 기술문에 대한 정보를 제공

     

     

    SQL의 CREATE TABLE 명령

    1. CREATE TABLE 명령은 릴레이션의 이름과 함께 애트리뷰트와 초기 제약 조건들을 명시하여 새로운 릴레이션을 생성하는데 사용함
    2. 일반적으로 릴레이션들이 선언되는 SQL 스키마는 CREATE TABLE문이 실행되는 환경내에 묵시적으로 명시됨 또는 릴레이션 이름 앞에 스키마 이름과 함께 점(.)을 붙여서 명시적으로 표시할 수도 있음
      • ex) CREATE TABLE COMPANY.EMPLOYEE ...
      • ex) CREATE TABLE EMPLOYEE
    3. 이렇게 CREATE TABLE 명령을 통해 정의된 릴레이션을 기본 테이블(base table) 혹은 기본 릴레이션이라고 함

     

    그림 5.2(6판에서는 6.2)

     

    애트리뷰트 데이터 타입

    1. 숫자(numeric)
      • 정수 - INTEGER, INT, SMALLINT
      • 실수 - FLOAT, REAL, DOUBLE PRECESION
      • 형식화된 수 - DECIMAL(i, j), DEC(i, j), NUMERIC(i, j)
        1. i는 전체숫자의 길이, j는 길이 i에서 소수 부분의 길이를 뜻함
    2. 문자열(character string)
      • 고정 길이 - CHAR(n)
        • n값보다 문자열의 길이가 작으면 오른쪽을 공백으로 채움
      • 가변 길이 - VARCHAR(n), CHAR VARYING(n)
      • 많은 문자값을 갖는 열 - CLOB(Character Large OBject)
    3. 비트열(bit-string)
      • 고정 길이 - BIT(n)
      • 가변 길이 - BIT VARYING(n)
      • 이미지 같이 큰 이진 값을 갖는 열 - BLOB(Binary Large OBject)
    4. 불리언(boolean)
      • TRUE, FALSE, UNKNOWN
    5. 날짜와 시간 (DATE and TIME)
      • 기본 형식 - DATE(YYYY-MM-DD), TIME(HH:MM:SS)
      • ex) DATE'2013-10-01', TIME'09:12:47'
    6. 타임스탬프(TIMESTAMP) 
      • DATE + TIME + fractions + time zone(선택, WITH TIME ZONE)
      • ex) TIMESTAMP'2013-10-01 09:12:47.648302' UTC
    7. INTERVAL 데이터 타입
      • 날짜, 시간, 타임스탬프의 절대값을 증가시키거나 감소시키기위해 사용하는 상대값으로 기간을 명시함
      • 기간은 YEAR/MONTH와 DAY/TIME이 있음

     

     

    도메인(domain) - CREATE DOMAIN 명령어

    1. 각 애트리뷰트의 데이터 타입을 직접 명시할 수 있음
    2. ex) CREATE DOMAIN SSN_TYPE AS CHAR(9);
      • 이렇게 SSN_TYPE을 만들었으면 Ssn, Super_ssn, Mgr_ssn, Essn에서 CHAR(9)대신 SSN_TYPE을 사용 가능
    3. DEFALUT 절을 사용해서 선택적으로 디폴트 값을 명시할 수도 있음

     

     

     

    애트리뷰트 제약 조건과 디폴트 값 명시

    1. NOT NULL
      • 어떤 애트리뷰트에 널 값이 허용되지 않게 만들 때(기본값이 널 값 허용 가능임)
      • 널이 아닌 값을 요구하는 기타 여러 애트리뷰트 뿐만 아니라 각 릴레이션의 기본키 애트리뷰트에는 항상 NOT NULL을 명시해야함
    2. 애트리뷰트 정의에 'DEFAULT <값>'을 추가하여 애트리뷰트의 디폴트 값을 명시할 수도 있음(기본 디폴트 값은 NULL임)
      • ex) Dno INT NOT NULL DEFAULT 1
    3. 애트리뷰트나 도메인 값을 제한하려면 CHECK 절을 사용해야함
      • 부서 번호를 1에서 20사이의 정수로 제한한다면 그림 5.1의 Dnumber 애트리뷰트의 정의를 다음과 같이 변경할 수 있음
        • 원래 정의 : Dnumber INT NOT NULL
        • 변경된 정의: Dnumber INT NOT NULL CHECK(Dnumber > 0 AND Dnumber <21);
      • CHECK절은 또한 CREATE DOMAIN과 함께 사용이 가능함
        • ex) CREATE DOMAIN D_NUM AS INTEGER CHECK(D_NUM > 0 AND D_NUM <21);

     

     

    키와 참조 무결성 제약 조건의 명시

    1. PRIMARY KEY절
      • PK가 하나의 애트리뷰트로 구성되어 있으면 PRIMARY KEY절은 애트리뷰트 바로 뒤에 직접 올 수 있음
      • 원래 선언은 PRIMARY KEY(Dnumber)이지만, PK가 하나라면 Dnumber INT PRIMARY KEY가 가능
    2. UNIQUE 절
      • 후보키로 알려진 대체키(유일키)를 명시함. 대체키가 하나의 애트리뷰트면 직접적으로 지정 가능
      • 원래 선언은 UNIQUE(Dname)이지만, 대체키가 하나라면 Dname VARCHAR(15) UNIQUE가 가능
    3. FOREIGN KEY절 - 참조 무결성을 명시
      • 원래 무결성 제약 조건을 위반할 때 취하는 디폴트 동작은 위반을 초래한 갱신 연산을 거절하는 것인데, 참조 트리거된 동작(referential triggered action)절을 추가하여 위반된 경우에 취할 다른 동작을 명시할 수 있음
      • 동작의 종류
        • SET NULL(널 값으로 설정), CASCADE(연쇄 설정), SET DEFAULT(애트리뷰트에 명시된 디폴트로 변경)
        • 위반된 경우를 가르키는 ON DELETE(삭제시 어떻게?)나 ON UPDATE(업데이트시 어떻게?)를 같이 사용함
        • ex) 그림 5.2
          • EMPLOYEE 릴레이션의 외래키 Super_ssn에 대해서 ON DELETE SET NULL과 ON UPDATE CASCADE를 설정함
            • ON DELETE SET NULL : 해당 사원을 감독하는 사원이 삭제된 경우에, 삭제된 사원 튜플을 감독자로 참조하는 모든 사원 튜플에 대해서 Super_ssn값을 NULL로 지정하는 것
            • ON UPDATE CASCADE : 감독하는 사원의 Ssn 값이 갱신되면 갱신된 사원 튜플을 감독자로 참조하는 모든 튜플의 Super_ssn을 새로운 값으로 연쇄적으로 갱신함
    4. 제약 조건에 이름을 넣을 수도 있음(수정/삭제 등등 evolution이 가능함)
      • ex) CONSTRAINT EMPPK
        • PRIMARY KEY (Ssn)
    5. CHECK를 사용하여 튜플에 제약 조건을 명시하기
      • 다른 테이블 제약 조건들을 CREATE TABLE 구문 끝에 CHECK 절을 사용하여 명시할 수도 있음
      • 이런 제약 조건은 행이 삽입이나 삭제될 때마다 검사되고, 각 행에 대해 개별적으로 적용하여 행 기반 제약 조건(row-based constraints)이라고도 부름
      • ex) 그림 5.1 DEPARTMENT 테이블에 부서 창설 날짜를 유지하는 Dept_create_date라는 애트리뷰트가 추가된다고 가정하면 관리자의 시작 날짜는 Dept_create_date보다 늦은 값을 갖도록 해야함
        • DEPARTMENT의 CREATE TABLE 구문 끝에 CHECK (Dept_create_date <= Mgr_start_date)를 추가함

     

     

    SQL에서 스키마 변경문(Ch.06)

    1. DROP 명령문
      • 테이블, 도베인, 타입, 제약 조건과 같이 이름을 가진 스키마 요소를 제거하는데 사용
      • 제거 동작 옵션
        • CASCADE - 해당 스키마의 모든 테이블, 도메인 및 다른 관련 요소들을 제거할 때 사용
        • RESTRICT - 스키마 내의 각각의 요소를 먼저 개별적으로 제거한 후에 사용가능. 스키마 자체를 제거함. 테이블의 경우엔 다른 제약 조건이나 뷰 또는 다른 요소들에 의해 참조되지 않을 때만 테이블 제거 가능
      • 카탈로그에서 삭제되어짐(카탈로그에서는 남기려면 DELETE 사용)
      • DROP TABLE DEPENDENT CASCADE; DROP SCHEMA COMPANY CASCADE;
    2. ALTER 명령문
      • 기본 테이블에 대해 열(애트리뷰트) 추가 또는 제거, 열 정의의 변경, 테이블 제약 조건의 추가 또는 제거 등과 같은 테이블 변경 동작을 할 수 있음
        • ALTER TABLE COMPANY.EMPLOYEE ADD Job VARCHAR(12);
        • ALTER TABLE COMPANY.EMPLOYEE DROP Address CASCADE;
        • ALTER TABLE COMPANY.DEPARTMENT ALTER Mgr_ssn DROP DEFAULT;
        • ALTER TABLE COMPANY.DEPARTMENT ALTER Mgr_ssn SET DEFAULT "333445555";
        • ALTER TABLE COMPANY.EMPLOYEE DROP CONSTRAINT EMPSUPERFK CASCADE;
      • 디폴트 절을 명시하지 않았을 경우 릴레이션의 모든 튜플은 새로운 애트리뷰트에 대해 NULL값을 가짐. 따라서 NOT NULL 제약 조건은 허용되지 않음

     

     

    SQL에서의 기본 검색 질의

    1. SELECT : 정보를 검색하는 기본문
    2. SQL과 관계 모델 사이의 차이점
      • SQL의 테이블(릴레이션)은 모든 애트리뷰트 값이 동일한 튜플을 하나 이상 가질 수 있음
      • 키 제약 조건을 선언하거나 SELECT문에 DISTINCT 옵션을 함께 사용하면 SQL 릴레이션이 집합의 성질을 띠게 할 수 있음

     

    SELECT-FROM-WHERE 구조

    1. 사상(mapping) 또는 SELECT-FROM-WHERE 블록이라고 부름
    2. SELECT <애트리뷰트 리스트> - 질의에서 검색되는 값들에 대한 속성 이름들의 리스트
    3. FROM <테이블 리스트> - 질의 처리를 위해 필요한 릴레이션들의 리스트
    4. WHERE <조건> - 질의를 통해 검색되는 튜플들을 명시하는 조건(부울)식

     

     

    질의 0

    이름이 'John B. Smith'인 사원의 생년월일(Bdate)과 주소(Address)를 검색하라. 질의는 FROM절에 표시된 EMPLOYEE 릴레이션만 검색한다.

    SELECT Bdate, Address

    FROM EMPLYEE

    WHERE Fname = 'John B.Smith' AND Minit = 'B' AND Lname = 'Smith';

     

    • SELECT절은 값을 검색할 애트리뷰트들을 명시
    • WHERE절은 검색될 튜플들이 만족해야 하는불리언 조건을 명시

     

     

    질의 1

    'Research' 부서에서 근무하는 모든 사원의 이름(Fname, Lname)과 주소(Address)를 검색해라

    SELECT Fname, Lname, Address

    FROM EMPLOYEE, DEPARTMENT

    WHERE Dname = 'Research' AND Dnumber = Dno;

     

    • Dname = 'Research'는 선택 조건, Dnumber = Dno 같은 것은 조인 조건(또는 join query)이라고 부름
      • 대부분 PK - FK 관계로 되어 있음

     

    질의 2

    'Stafford'에 위치한 모든 프로젝트에 대해서 프로젝트 번호(Pnumber), 담당부서 번호(Dnum), 부서관리자의 성(Lname), 주소(Address), 생년월일(Bdate)를 검색하라

    SELECT Pnumber, Dnum, Lname, Address, Bdate

    FROM PROJECT, DEPARTMENT, EMPLOYEE

    WHERE Dnum = Dnumber AND Mgr_ssn = Ssn AND Plocation = 'Stafford';

     

    • 조인 조건: Dnum = Dnumber, Mgr_ssn = Ssn
    • 선택 조건: Plocation = 'Stafford'

     

     

     

    모호한 애트리뷰트 이름

    1. SQL에서는 동일한 이름을 갖는 애트리뷰트가 여러 테이블에 사용할 수 있음. 그때 다중 테이블 질의에서 동일한 이름을 갖는 두 개 이상의 애트리뷰트를 참조하면 모호함
    2. 이런 모호함을 피하기 위해서 릴레이션 이름과 함께 애트리뷰트 이름을 사용해야 하는데, 애트리뷰트 이름 앞에 릴레이션 이름을 사용하고 점(.)으로 구분함

     

    이러면 질의 Q1은 변경됨

    원래 질의1

    SELECT Fname, Lname, Address

    FROM EMPLOYEE, DEPARTMENT

    WHERE Dname = 'Research' AND Dnumber = Dno;

     

    변경된 질의1

    SELECT Fname, EMPLOYEE.Name, Address

    FROM EMPLOYEE, DEPARTMENT

    WHERE DEPARTMENT.Name = 'Research' AND DEPARTMENT.Dnumber = EMPLOYEE.Dnumber;

     

     

    재명명(Renaming, Aliasing)

    1. 변경된 Q1A를 보면 릴레이션.애트리뷰트로 적을 때 이름이 너무 길면 릴레이션의 이름을 짧게 재명명할 수도 있음
    2. 같은 릴레이션을 두 번 참조하는 질의에서도 애트리뷰트 이름의 모호함이 나타나면 AS를 사용하여 튜플 변수를 만들 수 있음
    3. AS는 생략 가능함
      • EMPLOYEE E, DEPARTMENT D
    4. Renaming을 하면 원래 릴레이션 이름을 쓸 수 없음

     

    질의 8

    각 사원에 대해 사원의 이름(Fname)과 성(Lname), 직속 상사의 이름(Fname)과 성(Lname)을 검색하라

    SELECT E.Fname, E.Lname, S.Fname, S.Lname

    FROM EMPLOYEE AS E, EMPLOYEE AS S

     

    • 질의 내의 릴레이션의 애트리뷰트 이름들을 재명명할 수도 있음
      • EMPLOYEE AS E(Fn, Mi, Ssn, Bd, Addr, Sex, Sal, Sssn, Dno)

     

     

    WHERE절의 생략

    1. WHERE절을 생략하면 튜플 선택에 대한 조건이 없다는 것을 의미하여 FROM절에 명시한 릴레이션의 모든 튜플이 질의 결과로 검색댐
    2. 만약 FROM절에 두 개 이상의 릴레이션이 명시되고, WHERE 절이 없다면 이 릴레이션들의 크로스 프로덕트(모든 가능한 튜플의 조합)이 선택됨

     

    질의  9와 10

    EMPLOYEE의 모든 Ssn을 선택하고(Q9), EMPLOYEE의 Ssn과 DEPARTMENT의 Dname의 모든 조합을 선택하라(Q10)

    Q9

    SELECT Ssn

    FROM EMPLOYEE;

    Q10

    SELECT Ssn, Dname

    FROM EMPLOYEE, DEPARTMENT;

     

     

    별표(Asterisk) 사용

    선택된 튜플들의 모든 애트리뷰트 값을 검색할 때, 모든 애트리뷰트의 이름을 열거하는 대신 *를 명시하면 댐

     

     

    질의 1

    SELECT *

    FROM EMPLOYEE

    WHERE Dno = 5;

     

    질의1

    SELECT *

    FROM EMPLOYEE, DEPARTMENT

    WHERE Dname = 'Research' AND Dno = Dnumber;

     

    질의 10

    SELECT *

    FROM EMPLOYEE, DEPARTMENT;

     

     

    SQL에서 집합으로의 테이블

    SQL이 질의 결과에서 중복된 튜플들을 자동적으로 제거하지 않는 이유

    • 중복을 없애는 것은 비용(시간)이 많이 들음. 튜플들을 정렬하고 중복된 튜플을 제거하기 때문
    • 사용자가 질의 결과에 중복된 튜플들이 나타나는 것을 원하는 경우가 있음
    • 집단 함수(aggregate function)가 튜플들에 적용될 때, 대부분의 경우에 중복 삭제가 필요하지 않음

     

    질의 11

    모든 사원의 급여(Salary)를 검색(Q11)하고, 구별되는 급여를 모두 검색(Q11A)하라

    Q11

    SELECT ALL Salary

    FROM EMPLOYEE;

    Q11A

    SELECT DISTINCT Salary

    FROM EMPLOYEE;

     

     

     

    집합 연산

    • 합집합(UNION)
    • 차집합(EXCEPT)
    • 교집합(INTERSECT)

     

    질의 4

    일반 직원이든 프로젝트를 담당하는 부서의 관리자이든 간에 성(Lname)이 'Smith'인 사원을 포함하는 모든 프로젝트에 대해서 프로젝트 번호(Pnumber)의 리스트를 검색하라

    (SELECT DISTINCT Pnumber

     FROM PROJECT, DEPARTMENT, EMPLOYEE

     WHERE Dnum = Dnumber AND Mgr_ssn = Ssn AND Lname = 'Smith')

    UNION

    (SELECT DISTINCE Pnumber

     FROM PROJECT, WORKS_ON, EMPLOYEE

     WHERE Pnumber = Pno AND Essn = ssn AND Lname = 'smith');

     

    첫 번째 질의는 부서의 관리자의 성이 'Smith'인 프로젝트들을 구한 것

    두 번째 질의는 프로젝트의 일반 사원의 성이 'Smith'인 프로젝트들을 구한 것

     

    • 집합 연산 뒤에 ALL을 붙이면 중복을 제거하지 않은 결과를 보여줌(UNION ALL, EXCEPT ALL, INTERSECT ALL)

     

     

    부분 문자열 패턴 비교와 산술 연산자

    1. LIKE 비교 연산자
      • 문자열의 일부에 대해서 비교 조건을 명시하는 것(문자열의 패턴 비교에 사용)
      • % 기호: 0보다 큰 임의의 개수의 문자
      • _ 기호: 임의의 한 개의 문자
      • 예시
        • 질의 12 - 주소가 'Houston, Texas'인 모든 사원을 검색하라
          • SELECT Fname, Lname
          • FROM EMPLOYEE
          • WHERE Address LIKE '%Houston,TX%'; (Houston, TX를 포함하는 문자열을 찾음)
        • 질의 12A - 1970년대에 태어난 모든 사원을 검색하라
          • SELECT Fname, Lname
          • FROM EMPLOYEE
          • WHERE Bdate LIKE '_ _ 7 _ _ _ _ _ _ _'; (_는 전부 붙어있는데 붙여쓰면 구분을 못해서 띄어쓰기로 구분해둠)
    2. 산술 연산자
      • 질의 내에서 산술식을 허용하는 것
      • 표준 산술 연산자 더하기(+), 빼기(-), 곱하기(*), 나누기(/)를 수치값 혹은 수치 애트리뷰트에 적용할 수 있음
      • 예시
        • 질의 13 - 'ProductX' 프로젝트에 참여하는 모든 사원의 급여를 10% 올린 경우의 급여를 구하라
          • SELECT E.Fname, E.Lname, 1.1 * E.Salary AS Increased_sal(이름을 Increased_sal로 출력함)
          • EMPLOYEE AS E, WORKS_ON AS W, PROJECT AS P
          • E.Ssn = W.Essn AND W.Pno = P.Pnumber AND P.Pname = 'ProductX';
      • BETWEEN 연산자(범위)
        • 질의 14 - 급여가 30,000달러에서 40,000 달러 사이에 있는 5번 부서의 모든 사원을 검색하라
          • SELECT *
          • FROM EMPLOYEE
          • WHERE (Salary BETWEEN 30000 AND 40000) AND Dno = 5;
        • 위 내용은 ((Salary >= 30000) AND (Salary =< 40000))과 동일함

     

     

     

    질의 결과의 정렬

    SQL에서는 ORDER BY 절을 사용하여 하나 이상의 애트리뷰트를 기준으로 질의 결과에 들어 있는 튜플들을 정렬하는 것이 가능함

    • 질의 15 - 사원 및 각 사원이 근무하는 프로젝트들의 리스트를 검색하는데, 부서 이름 순서대로, 그리고 각 부서 내에서는 사원의 성과 이름의 알파벳 순서대로 구하라
      • SELECT D.Dname, E.Lname, E.Fname, P.Pname
      • FROM DEPARTMENT AS D, EMPLOYEE AS E, WORKS_ON AS W, PROJECT AS P
      • WHERE D.Dnumber = E.Dno AND E.Ssn = W.Essn AND W.Pno = P.Pnumber
      • ORDER BY D.Dname, E.Lname, E.Fname;
    • 디폴트 값은 오름차순(ASC)으로 내림차순으로 보고 싶으면 DESC를 명시함
      • ORDER BY D.Dname DESC, E.Lname ASC, E.Fname ASC

     

     

    SQL에서 삽입, 삭제, 갱신문

    1. INSERT 명령
      • 가장 간단한 형식: 한 릴레이션에 튜플 한 개를 추가하는데 사용함
        • 릴레이션의 이름과 애트리뷰트 값들의 리스트를 명시해야함
        • 값들의 순서는 CREATE TABLE 명령에서 명시한 애트리뷰트들의 순서와 같아야함
        • ex)
          • INSERT INTO EMPLOYEE
          • VALUES ('Richard', 'K', 'Marini', '653298653', '1962-12-30', '98 Oak Forest, Katy, TX', 'M', 37000, '653298653', 4);
      • 두 번째 형식: 일부 애트리뷰트들의 값만 명시할 수도 있음
        • 값이 명시되는 애트리뷰트들은 NOT NULL이면서 디폴트 값이 없는 모든 애트리뷰트들임
        • 반대로 NULL값이 가능하면서 디폴트 값이 있으면 명시하지 않아도 상관없음
        • 한 개의 INSERT 명령을 사용해서 쉼표(,)로 분리한 여러 개의 튜플을 한 릴레이션에 삽입할 수도 있음
        • ex)
          • INSERT INTO EMPLOYEE(Fname, Lname, Dno, Ssn)
          • VALUES (('Richard', 'Marini', 4, '653298653'), ('Dabeen', 'Jeong', 3, '123456789'))
      • 모든 무결성 제약 조건을 만족해야함
      • INSERT 명령의 변형으로 한 질의의 결과로 검색되는 다수의 튜플을 생성된 릴레이션에 삽입 가능
        • 한 프로젝트에 일하는 각 사원들에 대해 사원의 성, 프로젝트 이름, 주당 근무 시간을 갖는 임시 테이블을 생성하기 위해 다음 문장을 사용 가능
          • CREATE TABLE WORKS_ON_INFO
          • (Emp_name VARCHAR(15),
          •  Proj_name VARCHAR(15),
          •  Hours_per_week DECIMAL(3,1));
          • INSERT INTO WORKS_ON_INFO(Emp_name, Proj_name, Hours_per_week)
          • SELECT E.Lname, P.Pname, W.Hours
          • FROM PROJECT P, WORKS_ON W, EMPLOYEE E
          • WHERE P.Pnumber = W.Pno AND W.Essn = E.ssn;
      • INSERT INTO도 SELECT-FROM-WHERE 사용가능
        • ex)
        • INSERT INTO WORKS_ON_INFO(Emp_name, Proj_name, Hours_per_week)
        • SELECT E.Lname, P.Pname, W.Hours
        • PROJECT P, WORKS_ON W, EMPLOYEE E
        • P.Pnumber = W.Pno AND W.Essn = E.Ssn;
    2. DELETE 명령
      • 한 릴레이션에서 튜플들을 삭제함
      • WHERE 절을 포함할 수 있음(한 번에 한 테이블 내의 튜플들만 삭제 가능)
      • DDL에서 참조 무결성 제약 조건내에 참조 트리거된 통작이 명시되어 있으면 삭제는 다른 릴레이션에 있는 튜플들도 연쇄적으로 삭제가 가능
      • ex)
        • U4A
        • DELETE FROM EMPLOYEE
        • WHERE Lname = 'Brown';
        • U4B
        • DELETE FROM EMPLOYEE
        • WHERE Ssn = '123456789';
        • U4C
        • DELETE FROM EMPLOYEE
        • WHERE Dno = 5;
        • U4D
        • DELETE FROM EMPLOYEE
    3. UPDATE 명령
      • 선택된 하나 이상의 튜플에서 애트리뷰트 값들을 수정하기 위해 사용함
      • WHERE 절을 포함할 수 있음(한 릴레이션에서 수정할 튜플들을 선택함, 여러개의 릴레이션을 바꾸려면 여러개의 UPDATE 명령이 필요)
      • 기본키 값이 수정된 경우에 참조 트리거된 동작이 명시되어 있으면 다른 릴레이션들에 있는 외래키 값도 연쇄적으로 변경시킬 수 있음
        • ex) 10번 프로젝트를 담당하는 부서의 위치와 번호를 각각 'Bellaire'와 5로 변경하면 아래 동작을 수행함
        • UPDATE PROJECT
        • SET Plocation = 'Bellaire', Dnum = 5
        • WHERE Pnumber = 10;
      • 단일 UPDATE를 이용해서 여러개의 튜플들을 수정할 수도 있음
        • ex) 'Research' 부서에 근무하는 모든 사원의 급여를 10% 인상함
        • UPDATE EMPLOYEE
        • SET Salary = Salary * 1.1
        • WHERE Dno = 5;
      • 애트리뷰트의 새로운 값으로 널 값이나 디폴트 값을 명시할 수 있음
    반응형

    댓글

Designed by Tistory.