SQL
SQL은 현재 관계 DBMS가 압도적인 우위를 차지하는데 중요한 요인중 하나이다.
- IBM 연구소에서 1974년에 System R이라는 관계 DBMS 시제품을 연구할 때 관계 대수와 관계 해석을 기반으로, 집단 함수, 그룹화, 갱신 연산 등을 추가하여 개발된 언어.
- 1986년에 ANSI(미국 표준 기구)에서 SQL 표준을 채택함으로써 SQL이 널리 사용되는데 기여했다.
- 다양한 상용 관계 DBMS마다 지원하는 SQL 기능에 다소 차이가 있다.
장점
- 비절차적 언어(선언적 언어)로 사용자는 자신이 원하는 바만 명시하며, 원하는 것을 처리하는 방법은 명시할 수 없다.
- 자연어에 가까운 구문을 사용해 질의를 표현할 수 있다.
SQL | 관계 대수 | |
---|---|---|
언어 | 비절차적 언어 | 절차적 언어 |
연산 | 데이터베이스 구조 및 제약조건을 추가하거나 수정하는 명령(DDL) 투플을 검색, 삭제, 수정하는 명령(DML) |
검색 연산만 제공 |
관계 데이터베이스에 대한 인터페이스
- 대화식 SQL(interactive SQL)
- 내포된 SQL(embedded SQL)
데이터 정의어
스키마 생성과 제거
- SQL2에서 릴레이션, 도메인, 제약조건, 뷰, 권한 등을 그룹화하기 위해 스키마 개념을 지원한다.
CREATE SCHEMA MY_DB AUTHORIZATION KIM;
DROP SCHEMA MY_DB RESTRICT;
DROP SCHEMA MY_DB CASCADE;
데이터 타입
자주쓰는 타입
데이터 타입 | 의미 |
---|---|
NUMBER(n,s) | 소수점을 포함한 n개의 숫자에서 소수 아래 숫자가 s개인 십진수 |
VARCHAR2(n) | 최대 n바이트까지 가변 길이 문자열 |
DATE | 날짜형. 날짜, 시간 저장 |
기타
- 릴레이션 제거
DROP TABLE DEPARTMENT;
- ALTER TABLE
ALTER TABLE EMPLOYEE ADD PHONE CHAR(13);
- 인덱스 생성
CREATE INDEX EMPDNO_IDX ON EMPLOYEE(DNO);
- 애트리뷰트의 제약조건
NOT NULL
UNIQUE
DEFAULT
CHECK
- 기본 키 제약조건
PRIMARY KEY
- 참조 무결성 제약조건
FOREIGN KEY
- 참조 무결성 제약조건의 유지
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
Oracle에서는 ON UPDATE에 대해서는 NO ACTION만 명시 가능
- 무결성 제약조건의 추가 및 삭제
ALTER TABLE STUDENT ADD CONSTRAINT STUDENT_PK
PRIMARY KEY (STNO);
ALTER TABLE STUDENT DROP CONSTRAINT STUDENT_PK;
SELECT 문
데이터베이스에서 정보를 검색하는 SQL문
형식
SELECT | [DISTINCT] 애트리뷰트(들) |
---|---|
FROM | 릴레이션(들) |
[WHERE | 조건 |
[GROUP BY | 애트리뷰트(들) |
[HAVING | 조건 |
[ORDER BY | 애트리뷰트(들) [ASC | DESC]; |
중첩 질의
외부 질의의 WHERE절에 다시 SELECT …FROM…WHERE 형태로 포함된 SELECT 문
- 부질의(subquery)라고 한다.
- INSERT, DELETE, UPDATE에서도 사용할 수 있다.
- 결과값
- 한 개의 스칼라값(단일 값)
- 한 개의 애트리뷰트로 이루어진 릴레이션
- 여러 애트리뷰트로 이루어진 릴레이션
한 개의 애트리뷰트로 이루어진 릴레이션이 반환되는 경우
IN, ANY, ALL, EXISTS같은 연산자를 사용해야한다.
- IN : 애트리뷰트가 값들의 집합에 속하는가를 테스트
- ANY : 애트리뷰트가 값들의 집합에 속하는 하나 이상의 값들과 어떤 관계를 갖는가를 테스트
- ALL : 애트리뷰트가 값들의 집합에 속하는 모든 값들과 어떤 관계를 갖는가를 테스트
여러 애트리뷰트들로 이루어진 릴레이션이 반환되는 경우
EXISTS 연산자를 사용하여 중첩 질의의 결과가 빈 릴레이션인지 여부를 검사한다.
중첩질의의 결과가 빈 릴레이션이 아니면 참이 되고, 그렇지 않으면 거짓
상관 중첩 질의(correlated nested query)
- 중첩 질의의 WHERE절에서 외부 질의에 선언된 릴레이션의 일부 애트리뷰트를 참조하는 질의
- 외부 질의를 만족하는 각 투플이 구해진 후에 중첩 질의가 수행되므로 상관 중첩 질의는 외부 질의를 만족하는 투플 수만큼 여러 번 수행될 수 있다
INSERT 문
기존의 릴레이션에 투플을 삽입한다.
INSERT
INTO 릴레이션(애트리뷰트1, ..., 애트리뷰트n)
DELETE 문
한 릴레이션으로부터 한 개 이상의 투플들을 삭제한다.
DELETE
FROM 릴레이션
WHERE 조건;
UPDATE 문
한 릴레이션에 들어 있는 투플들의 애트리뷰트 값들을 수정한다
UPDATE 릴레이션
SET 애트리뷰트 = 값 또는 식[, …]
WHERE 조건;