SQL 개요

  • SQL은 현재 DBMS 시장에서 관계 DBMS가 압도적인 우위를 차지하는데 중요한 요인 중 하나이다.
  • SQLIBM 연구소에서 1974년에 System R이라는 관계 DBMS 시제품을 연구할 때 관계 대수와 관계 해석을 기반으로, 집단 함수, 그룹화, 갱신 연산 등을 추가하여 개발된 언어이다.
  • 1986년에 ANSI(미국 표준 기구)에서 SQL 표준을 채택함으로써 SQL이 널리 사용되는데 기여
  • 다양한 상용 관계 DBMS마다 지원하는 SQL 기능에 다소 차이가 있다.
  • MSSQL에서는 추가기능이 존재한다.
  • SQL은 비절차적 언어(선언적 언어)이므로 사용자는 자신이 원하는 바(what)만 명시하며, 원하는 것을 처리하는 방법(how)은 명시할 수 없다.
  • 관계 DBMS는 사용자가 입력한 SQL문을 번역하여 사용자가 요구한 데이터를 찾는데 필요한 모든 과정(질의 처리 과정)을 담당한다.
  • 자연어에 가까운 구문을 사용하여 질의를 표현할 수 있다.
  • 대화식 SQL(interactive SQL)과 내포된 SQL(embedded SQL) 두 가지 인터페이스를 지원한다. 내포된 SQL이란 고급 프로그래밍 언어(C, C++, Java )에 내포되어 사용되는 SQL이다.


  SQL의 구성요소

  • 데이터 정의어 (Data Definition Language, DDL)

CREATE

DOMAIN

도메인을 생성

TABLE

테이블을 생성

VIEW

뷰를 생성

INDEX

인덱스를 생성 (SQL2 표준 X)

ALTER

TABLE

테이블의 구조(스키마)를 변경

DROP

DOMAIN

도메인을 제거

TABLE

테이블을 제거

VIEW

뷰를 제거

INDEX

인덱스를 제(SQL2 표준 X)

  • 데이터 조작어 (Data Manipulation Language, DML)
  • 데이터 제어어 (Data Control Language, DCL)

 

  데이터 정의어와 무결성 제약조건

  • 스키마의 생성과 제거 : SQL2에서는 동일한 데이터베이스 응용에 속하는 릴레이션, 도메인, 제약 조건, , 권한 등을 그룹화하기 위해서 스키마 개념을 지원한다.

CREATE SCHEMA DBNAME AUTHORIZATION KIM;

 

DROP SCHEMA DBNAME RESTRICT; // 하나 이상의 릴레이션이 존재하면 못지운다.

DROP SCHEMA DBNAME CASCADE;

 

  • 데이터 타입

데이터 타입

의미

INTEGER 또는 INT

정수형

SMALLINT

작은 정수형

NUMBER(n, s) 또는 DECIMAL(n, s)

n개의 숫자에서 소수 아래 숫자 s개인 십진수

REAL

실수형

FLOAT(n)

적어도 n개의 숫자가 표현되는 실수형

CHAR(n) 또는 CHARACTER(n)

n바이트 문자열, 디폴트는 1바이트

VARCHAR(n) 또는 CHARACTER VARYING(n)

최대 n바이트까지의 가변 길이 문자열

BIT(n) 또는 BIT VARYING(n)

n개의 비트열 또는 최대 n개까지의 가변 비트열

DATE

날짜형

BLOB

Binary Large Object, 멀티미디어 데이터 등을 저장


  • 릴레이션 정의

CREATE TABLE DEPARTMENT (

DEPTNO INTEGER NOT NULL,

DEPTNAME CHAR(10),

FLOOR INTEGER,

PRIMARY KEY(DEPTNO)

);

 

CREATE TABLE EMPLOYEE (

EMPNO INTEGER NOT NULL,

EMPNAME CHAR(10),

TITLE CHAR(10),

MANAGER INTEGER,

SALARY INTEGER,

DNO INTEGER,

PRIMARY KEY(EMPNO),

FOREIGN KEY(MANAGER) REFERENCES EMPLOYEE(EMPNO),

FOREIGN KEY(DNO) REFERENCES DEPARTMENT(DEPTNO)

);


  • 릴레이션 제거 : DROP TABLE TABLENAME;

ex) DROP TABLE DEPARTMENT;

  • 릴레이션 스키마 변경 : ALTER TABLE TABLENAME [ADD] COLNAME NEW_DATATYPE;

ex) ALTER TABLE EMPLOYEE ADD PHONE CHAR(13);

  • 인덱스 생성 : CREATE INDEX INDEXNAME ON TABLENAME(COLNAME);

ex) CREATE INDEX EMPDNO_IDX ON EMPLOYEE(DNO);

* 외래 키의 경우 조인 참여가 잦기 때문에 인덱스 사용률이 높은 편이다.

  • 도메인 생성 : CREATE DOMAIN COLNAME DATATYPE DEFAULT ‘value’;

ex) CREATE DOMAIN DEPTNAME CHAR(10) DEFAULT 개발’;

  • 제약 조건 예시

CREATE TABLE EMPLOYEE (

EMPNO INTEGER NOT NULL,

EMPNAME CHAR(10) UNIQUE,  // 중복된 데이터를 거절(대체 키임을 의미)

TITLE CHAR(10) DEFAULT ‘사원’,

MANAGER INTEGER,

SALARY INTEGER CHECK(SALARY < 6000000),  // 조건을 만족하는 데이터만 허용

DNO INTEGER CHECK(DNO IN (1, 2, 3, 4)) DEFAULT 1, // 허용 가능 데이터 표시

PRIMARY KEY(EMPNO),

FOREIGN KEY(MANAGER) REFERENCES EMPLOYEE(EMPNO),

FOREIGN KEY(DNO) REFERENCES DEPARTMENT(DEPTNO)

ON DELETE SET DEFAULT ON UPDATE CASCADE

);


- 자기 자신을 참조하는 경우

FOREIGN KEY(MANAGER) REFERENCES EMPLOYEE(EMPNO),

-> MANAGER(외래 키) 컬럼이 EMPNO(기본 키) 컬럼을 참조한다.

 

- 다른 릴레이션을 참조하는 경우

FOREIGN KEY(DNO) REFERENCES DEPARTMENT(DEPTNO)

ON DELETE SET DEFAULT ON UPDATE CASCADE

-> EMPLOYEEDNO(외래 키) 컬럼이 DEPARTMENTDEPTNO(기본 키) 컬럼을 참조한다.

=> 참조되는 릴레이션(DEPARTMENT)에서 DELETE가 발생하면 삭제된 기본 키를 참조하던 외래 키(DNO)는 디폴트(1)을 가진다.

=> 참조되는 릴레이션(DEPARTMENT)에서 UPDATE가 발생하면 갱신된 기본 키를 참조하던 외래 키(DNO)는 갱신된 값을 상속 받는다.

 

- 또 다른 예시 : 조건 걸기

CREATE TABLE EMPLOYEE (

ID INTEGER,

NAME CHAR(10),

SALARY INTEGER,

MANAGER_SALARY INTEGER,

CHECK(MANAGER_SALARY > SALARY)

);

-> 매니저의 월급이 기본 사원의 월급보다 높은 투플(레코드)만 삽입을 허용함.

  • 참조 무결성 제약 조건 유지하기 위한 SQL

... ON DELETE NO ACTION

... ON DELETE CASCADE : 기본 키 삭제 시 연쇄적으로 외래 키도 삭제된다.

... ON DELETE SET NULL

... ON DELETE SET DEFAULT

 

... ON UPDATE NO ACTION

... ON UPDATE CASCADE : 기본키 수정 시 연쇄적으로 외래키도 수정된다.

... ON UPDATE SET NULL

... ON UPDATE SET DEFAULT

 

- ON INSERT 가 없는 이유 : 삽입의 경우 참조 무결성 제약조건을 위배하지 않으므로 반복적으로 확인하는 것은 오버헤드를 키우기 때문이다. (성능 저하)

- CASCADE 할 때, 외래키에는 반드시 인덱스가 있어야 한다.

 

  • 무결성 제약조건의 추가 및 삭제

ALTER TABLE STUDENT ADD CONSTRAINT STUDENT_PK

PRIMARY KEY(STNO);

 

ALTER TABLE STUDENT DROP CONSTRAINT STUDENT_PK;






+ Recent posts