SQL

섬네일|275px|이 도표는 단문을 구성하는 SQL 언어 요소 몇 가지를 보여준다.

**SQL**(, 또는 , , 구조화 질의어, S-Q-L)은 관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계한 특수 목적의 프로그래밍 언어이다. 개체와 변수를 포함하는 구조화된 데이터를 처리하는데 유용하다. 개체와 변수 관계형 데이터베이스 관리 시스템에서 자료의 검색과 관리, 데이터베이스 스키마 생성과 수정, 데이터베이스 객체 접근 조정 관리를 위해 고안되었다. 많은 수의 데이터베이스 관련 프로그램들에서 SQL을 표준으로 채택하고 있다.

## 역사
SQL은 IBM에서 1970년대 초에 도널드 D. 챔벌린과 레이먼드 F. 보이스가 처음 개발하였다. 초기에는 **SEQUEL**(Structured English Query Language, 구조 영어 질의어)라는 이름으로 시작하였으며, IBM의 준 관계형 데이터베이스 관리 시스템 시스템 R에 저장된 데이터를 조작하고 수신하기 위해 고안하였다. 초기 명칭인 SEQUEL이 영국의 호커 시들리 항공사의 상표와 동일하였기에 SQL로 변경해야 했다.

## 설계
SQL은 관계형 모델과 그것의 튜플 해석이라는 이론적 기초로부터 파생되었다. 해당 모델에서 테이블은 튜플의 집합이지만, SQL에서는 테이블과 쿼리 결과는 행(row)의 목록이다. 같은 행은 여러 번 발생할 수 있고 행의 순서는 쿼리에 의해 나타난다. (예: LIMIT 절)

## SQL 구문
### 명령어 종류
데이터베이스 언어 SQL 문법의 종류는 다음 세 가지로 대별된다.
* 데이터 정의 언어 (DDL : Data Definition Language)
* 데이터 조작 언어 (DML : Data Manipulation Language)
* 데이터 제어 언어 (DCL : Data Control Language)
기타 이러한 명령의 적용 범위를 보완하기 위한 기능으로 SQL 문을 실행 시에 해석하는 "동적 SQL"과 내장 SQL에 대한 지침이 포함되어 있다. 관계형 데이터베이스 관리시스템(RDBMS) 이전의 데이터베이스 관리 시스템(DBMS)에서 이들은 반드시 동일한 언어가 아니었다. 데이터 정의 언어는 존재하지 않고, 모든 전용 명령에 매개 변수를 사용하여 실행하는 구현도 존재했다.

### 명령어 문법
#### 데이터 정의 언어

* CREATE (데이터베이스 개체 (테이블, 인덱스, 제약조건 등)의 정의)
* DROP (데이터베이스 개체 삭제)
* ALTER (데이터베이스 개체 정의 변경)

데이터 정의 언어는 테이블과 인덱스 구조를 관리한다. DDL의 가장 기본적인 요소는 CREATE, ALTER, RENAME, DROP과 TRUNCATE 구문이다:

CREATE는 데이터베이스에서 객체(예, 테이블)를 생성한다. 예를 들어:

```sql
CREATE TABLE My_table(
 my_field1 INT,
 my_field2 VARCHAR(50),
 my_field3 DATE NOT NULL,
 PRIMARY KEY (my_field1, my_field2)
);
```


* `[[Alter (SQL)|ALTER]]`는 다양한 방법으로 현존하는 객체의 구조를 변경한다. 예를 들어, 현재의 테이블에 컬럼을 추가하거나 제한을 추가한다. 예를 들면:


```sql
ALTER TABLE My_table ADD my_field4 NUMBER(3) NOT NULL;
```


* `[[Truncate (SQL)|TRUNCATE]]`는 테이블에서 모든 데이터를 빠르게 삭제한다. 내부 테이블의 데이터를 삭제하는 것이지, 테이블 자체를 삭제하는 것은 아니다. 이 과정은 보통 순차적인 COMMIT 연산을 내포한다. 예를 들어, 이것은 롤백되지 않는다. (DELETE와는 달리 이후 롤백을 위한 로그가 기록되지 않는다.).


```sql
TRUNCATE TABLE My_table;
```


* `[[Drop (SQL)|DROP]]`은 데이터베이스에서 객체를 삭제하며, 보통 롤백을 통해 복원할 수 없다. 예를 들어:


```sql
DROP TABLE My_table;
```


#### 데이터 조작 언어

* INSERT INTO (행 데이터 또는 테이블 데이터의 삽입)
* UPDATE ~ SET (표 업데이트)
* DELETE FROM (테이블에서 특정 행 삭제)
* SELECT ~ FROM ~ WHERE (테이블 데이터의 검색 결과 집합의 취득)
:뒷부분의 “동적 SQL”에서 SELECT 문은 한 번 실행에 1행의 결과를 얻는 “단일행 SELECT 문장”과 커서로 여러 줄의 결과를 얻는 “커서 SELECT 문”이 있다.

#### 데이터 제어 언어

* GRANT (특정 데이터베이스 사용자에게 특정 작업을 수행 권한을 부여)
* REVOKE (특정 데이터베이스 이용자로부터 이미 준 권한을 박탈 함.)
* SET TRANSACTION ( 트랜잭션 모드 설정 (동시 트랜잭션 격리 수준 (ISOLATION MODE) 등))
* BEGIN (트랜잭션 시작)
* COMMIT (트랜잭션의 실행)
* ROLLBACK (트랜잭션 취소)
* SAVEPOINT (무작위로 롤백 지점을 설정)
* LOCK (TABLE 등의 자원을 차지)

#### 커서 정의 및 사용
‘커서’는 SELECT 문장 등에 의한 데이터베이스 검색에 의한 검색 실행 결과를 한 줄씩 검색하고, 처리하기 위해 데이터베이스 서버 측의 결과 집합과 행 획득 위치를 나타내는 개념을 말한다. 커서의 정의와 그 작업은 주로 응용 프로그램 등의 절차적 언어에서의 SQL 실행시 사용한다.
* DECLARE CURSOR (커서 정의)
* OPEN (커서 열기)
* FETCH (커서 포인터가 가리키는 위치의 행 데이터를 검색하고 포인터를 일행 분 진행)
* UPDATE (커서 포인터가 가리키는 위치의 행 데이터 업데이트)
* DELETE (커서 포인터가 가리키는 위치의 행 데이터 삭제)
* CLOSE (커서 닫기)

### 연산자

### 조건 표현
SQL은 `case/when/then/else/end` 표현을 가지고 있으며, 이것은 SQL-92에서 도입되었다. 일반적인 형식에서, 이것은 SQL 표준에서 "searched case"라고 불리며, 다른 프로그램 언어에서 else if와 같은 역할을 수행한다:


```sql
CASE WHEN n > 0 THEN 'positive' WHEN n < 0 THEN 'negative' ELSE 'zero' END
```


`WHEN` 조건은 소스에서 등장하는 순서에서 시험된다. 아무런 `ELSE` 표현식이 지정되지 않으면, `ELSE NULL`을 기본값으로 하게 된다. switch statement을 미러링하는 약어 구문도 존재한다. 이것은 SQL 표준에서 "simple case"라고 불린다:


```sql
CASE n WHEN 1 then 'one' WHEN 2 THEN 'two' ELSE 'i cannot count that high' END
```


이 구문은 NULL과 비교하는 통상적인 경고를 이용하여 내포적 특질 비교를 이용한다.

오라클 SQL 구문에서 후자는 `DECODE` 구문으로 축약될 수 있다:


```oracle8
SELECT DECODE(n, 1, "one", 2, "two", "i cannot count that high") FROM some_table;
```


마지막 값은 default이다; 아무것도 지정되지 않으면, `NULL`이 기본값이 된다. 그러나 표준 "simple case"와는 달리 오라클의 `DECODE`는 2개의 `NULL`을 서로 동일한 것으로 간주한다.

## 자료형

SQL 테이블에서 각 컬럼은 컬럼이 포함하는 자료형(data type)을 선언한다. ANSI SQL은 다음과 같은 데이터형을 포함하고 있다.

#### 문자열
* `CHARACTER(<var>n</var>)` 또는 `CHAR(<var>n</var>)`: 고정폭 n-문자열, (필요한만큼 공백으로 채워진다.)
* `CHARACTER VARYING(<var>n</var>)` 또는 `VARCHAR(<var>n</var>)`: 가변폭 문자열 (n 문자의 최대 크기를 가진)
* `NATIONAL CHARACTER(<var>n</var>)` 또는 `NCHAR(<var>n</var>)`: 국제 문자셋을 지원하는 고정폭 문자열
* `NATIONAL CHARACTER VARYING(<var>n</var>)` 또는 `NVARCHAR(<var>n</var>)`: 가변폭 `NCHAR` 문자열

#### 비트 열
* `BIT(<var>n</var>)`: n 비트의 배열
* `BIT VARYING(<var>n</var>)`: n 비트까지의 배열

#### 수
* `INTEGER` 와 `SMALLINT`
* `FLOAT`, `REAL` 과 `DOUBLE PRECISION`
* `NUMERIC(<var>precision</var>, <var>scale</var>)` 또는 `DECIMAL(<var>precision</var>, <var>scale</var>)`

예를 들어, 숫자 123.45는 5라는 precision(정밀도, 자리값)과 2라는 scale(소수점 이하 자릿수)을 포함하고 있다. precision은 특정 진법(이진법 또는 십진법)에서 중요한 10자리수를 결정하는 양의 정수값이다. scale은 음이 아닌 정수이다. 0의 scale은 그 수가 정수임을 지시하는 숫자이다. S 자릿수를 가진 10진법에서, 정확한 숫자값은 10S로 나눈 중요한 10진법 정수값이다.

SQL은 숫자, 날짜를 반올림해주는 `TRUNC` (인포믹스, DB2, PostgreSQL, 오라클 그리고 MySQL에서) 또는 `ROUND` (인포믹스, SQLite, Sybase, Oracle, PostgreSQL and Microsoft SQL Server) 함수를 제공한다.

#### 날짜와 시간
* `DATE`: 날짜 값 (예, `2011-05-03`)
* `TIME`: 시간 값 (예, `15:51:36`). 시간 값은 보통 *tick* (100 nanoseconds)이다.
* `TIME WITH TIME ZONE` or `TIMETZ`: `TIME`과 같지만, 해당 지역의 시간대 정보를 포함하고 있다.
* `TIMESTAMP`: 이것은 `DATE` 와 `TIME`이 하나의 변수로 결합된 것이다. (예, `2011-05-03 15:51:36`).
* `TIMESTAMP WITH TIME ZONE` or `TIMESTAMPTZ`: `TIMESTAMP`와 동일하지만, 해당 지역의 시간대에 대한 상세 정보를 포함하고 있다.

SQL은 날짜 / 시간 변수를 생성하는 여러 개의 함수를 date / time 열 (`TO_DATE`, `TO_TIME`, `TO_TIMESTAMP`)로부터 제공한다. 또한 그러한 각각의 변수 항목 (예를 들면, 초)을 통해 추출할 수도 있다. 현재 데이터베이스 서버 시스템의 날짜 / 시간은 `NOW`와 같은 함수를 통해 호출할 수 있다.

## SQL 기타
### 동적 SQL
동적 SQL은 일반적으로 SQL문을 RDBMS에 보낼 때마다 데이터베이스 엔진에서 실행 가능한 내부 중간 코드로 번역하는 작업을 미리 수행하여 변환된 SQL 코드를 재사용하여, SQL 분석 오버헤드를 줄이고, SQL 문을 소스 코드로 고정하지 않고 데이터베이스에 액세스할 때마다 구문을 다시 할 경우 유용하다. 데이터 조작 언어(DML)도 물론 수행할 수 있지만, 데이터 정의 언어 (DDL)와 같이 데이터베이스 제품의 기능 업데이트에 의해 새로운 명령이 추가되는 것은 전처리 해당 작업이 부담이 되기 때문에, 대부분의 데이터베이스 제품에서는 DDL 문은 동적 SQL에서 실행하는 것이 일반적이다.
* PREPARE (문자열로 준 SQL 문을 해석, 번역)
* EXECUTE (PREPARE로 번역한 SQL 문을 실행)

### 임베디드 SQL
임베디드 SQL(또는 내장 SQL)은 원래 커서가 포함된 SQL에서 호스트 언어에서 결과 집합을 얻기 위해 더 편리한 방법으로 고안된 것이다. 데이터베이스와 통신하기 위한 자원 할당 확보와 개방한 줄에 호스트 언어의 반복으로 가져 오기위한 명령 (FETCH) 등이 있다.
* ALLOCATE (DEALLOCATE) DESCRIPTOR (데이터베이스 및 호스트 언어 간 통신 영역의 확보와 개방)
* WHENEVER (오류 발생시의 동작을 정의)
* SQLSTATE (SQL 문 실행 후 상태가 저장되는 영역)

### 3값 논리
SQL에서 사용되는 논리값은 컴퓨터 세계에서 가장 널리 이용되는 ‘2값 논리’(TRUE, FALSE) 대신 ‘3값 논리’(TRUE, FALSE, UNKNOWN)이 있다.

## 언어 요소
* 절(clauses)
* 식(expressions)
* 술어(predicates)
* 질의(queries)
* 문(statements)

## 표준화
SQL 표준은 다음과 같은 많은 개정을 거쳤다:

### 표준 구조
* ISO/IEC 9075-1:2011 Part 1: 프레임워크 (SQL/Framework)
* ISO/IEC 9075-2:2011 Part 2: 파운데이션 (SQL/Foundation)
* ISO/IEC 9075-3:2008 Part 3: 호출 수준 인터페이스 (SQL/CLI)
* ISO/IEC 9075-4:2008 Part 4: 지속 저장 모듈 (SQL/PSM)
* ISO/IEC 9075-9:2008 Part 9: 외부 데이터 관리 (SQL/MED)
* ISO/IEC 9075-10:2008 Part 10: 오브젝트 언어 결합 (SQL/OLB)
* ISO/IEC 9075-11:2011 Part 11: 정보 및 정의 스키마 (SQL/Schemata)
* ISO/IEC 9075-13:2008 Part 13: 자바 프로그래밍 언어를 이용한 SQL 루틴 및 형식(SQL/JRT)
* ISO/IEC 9075-14:2011 Part 14: XML 관련 규격 (SQL/XML)
ISO/IEC 9075은 ISO/IEC 13249 SQL 멀티미디어 및 응용 프로그램 패키지로 보충된다.
* ISO/IEC 13249-1:2007 Part 1: 프레임워크
* ISO/IEC 13249-2:2003 Part 2: 전문(Full-Text)
* ISO/IEC 13249-3:2011 Part 3: 공간
* ISO/IEC 13249-5:2003 Part 5: 정적 이미지
* ISO/IEC 13249-6:2006 Part 6: 데이터 마이닝
* ISO/IEC 13249-8:xxxx Part 8: 메타데이터 등록 (MDR) (진행 중)

## 같이 보기

* 관계대수
* NoSQL

## 참조


## 외부 링크
* ''1995 SQL Reunion: People, Projects, and Politics'', by Paul McJones (ed.): transcript of a reunion meeting devoted to the personal history of relational databases and SQL.
* American National Standards Institute. X3H2 Records, 1978–1995 Charles Babbage Institute Collection documents the H2 committee's development of the NDL and SQL standards.
* Oral history interview with Donald D. Chamberlin Charles Babbage Institute In this oral history Chamberlin recounts his early life, his education at Harvey Mudd College and 스탠퍼드 대학교, and his work on relational database technology. Chamberlin was a member of the System R research team and, with Raymond F. Boyce, developed the SQL database language. Chamberlin also briefly discusses his more recent research on XML query languages.
* Comparison of Different SQL Implementations This comparison of various SQL implementations is intended to serve as a guide to those interested in porting SQL code between various RDBMS products, and includes comparisons between SQL:2008, PostgreSQL, DB2, MS SQL Server, MySQL, Oracle, and Informix.


분류:선언형 프로그래밍 언어
분류:데이터베이스
분류:질의 언어
분류:관계형 데이터베이스 관리 시스템
분류:데이터베이스 관리 시스템
분류:데이터 모델링 언어
분류:데이터 중심 프로그래밍 언어
분류:ISO 표준 프로그래밍 언어