SQL
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
SQL은 1970년대 초 IBM에서 개발된 관계형 데이터베이스를 위한 질의 언어이다. SEQUEL로 시작하여 SQL로 명칭이 변경되었으며, ANSI 및 ISO 표준으로 채택되어 여러 차례 개정되었다. SQL은 데이터 정의, 조작, 제어 기능을 제공하며, DDL, DML, DCL과 같은 하위 언어로 세분화된다. SQL의 구문은 절, 표현식, 술어, 쿼리, 문 등으로 구성되며, 다양한 자료형과 연산자를 지원한다. SQL은 표준화 노력에도 불구하고 벤더 간 호환성 문제, 3값 논리 사용, 객체-관계형 임피던스 불일치 등의 비판을 받으며, .QL, 데이터로그, XQuery 등의 대안이 제시되기도 한다. 주요 SQL 구현체로는 MySQL, PostgreSQL, Oracle Database, Microsoft SQL Server 등이 있다. DRDA는 분산 SQL 처리를 위한 기술이다.
SQL은 1970년대 초 IBM에서 도널드 D. 챔벌린과 레이먼드 F. 보이스가 개발하였다.[54] 초기에는 '''SEQUEL'''(Structured English Query Language, 구조 영어 질의어)이라는 이름으로 시작하였으며, IBM의 준 관계형 데이터베이스 관리 시스템 시스템 R에 저장된 데이터를 조작하고 수신하기 위해 고안하였다.[54] 그러나 SEQUEL은 영국의 호커 시들리 항공사의 상표였기 때문에[55] SQL로 이름을 변경해야 했다.[24]
2. 역사
1970년대 후반, Relational Software, Inc.(현재 오라클사)는 SQL 기반 RDBMS를 개발하여 미국 해군, 중앙 정보국 등 미국 연방 정부 기관에 판매하고자 했다. 1979년 6월, Relational Software는 VAX 컴퓨터용 SQL의 최초 상용 구현 중 하나인 Oracle V2 (버전2)를 출시했다.
1986년 ANSI와 ISO 표준 그룹은 "데이터베이스 언어 SQL" 언어 정의를 공식적으로 채택했다.[5] 이후 1989년, 1992년, 1996년, 1999년, 2003년, 2006년, 2008년, 2011년,[5] 2016년, 그리고 2023년에 새로운 버전의 표준이 발표되었다.[6]
SQL 규격은 각 관계형 데이터베이스 관리 시스템(RDBMS) 벤더마다 다양하게 확장되었으며, ANSI와 ISO에서 언어 사양을 표준화했다. 제정된 연도별로 SQL86, SQL89, SQL92, SQL:1999, SQL:2003, SQL:2006, SQL:2008, SQL:2011, SQL:2016, SQL:2023 등의 규격이 있지만, 지원 정도는 벤더마다 다르다. 이는 표준 SQL 제정에 시간이 오래 걸려 비즈니스 현황에서 조기 기능 확장이 필요했던 벤더의 사정과, 독자적인 구문을 빈번하게 사용하던 이용자와 프로그래머에게 호환성 유지를 보장해야 할 필요가 있었기 때문이다.
SQL 표준 규격은 다음과 같다.연도 약칭 별칭 설명 규격 1986년 SQL86 SQL87 ANSI에 의해 발표된 최초의 규약. 1987년에 ISO에 의해 승인되었다. ANSI X3.135-1986
ISO 9075:1987
JIS X 3005:19871989년 SQL89 마이너 버전. ISO 9075:1989
ANSI X3.135-1989
JIS X 3005:19901992년 SQL2 메이저 버전. ISO/IEC 9075:1992
ANSI X3.135-1992
JIS X 3005:19951995년 SQL/CLI 콜 레벨 인터페이스 (Call Level Interface).
업계 표준이 된 ODBC API의 인터페이스에 해당하는 기능을 국제 표준화한 규격.| 1996년 SQL/PSM 영구 저장 모듈 (Persistent Storage Module).
일반적으로 저장 프로시저라고 불리는 기능을 국제 표준화한 규격.| 1999년 SQL3 RDBMS를 위한 완전한 언어가 되는 것을 목표로 한 사양. ISO/IEC 9075:1999
JIS X 3005-1:2002, JIS X 3005-2:20022003년 | 2008년 ISO/IEC 9075-2:2008
JIS X 3005-1:20142011년 ISO/IEC 9075-2:2011
JIS X 3005-2:20152016년 ISO/IEC 9075-2:2016 2023년 ISO/IEC 9075-2:2023
2. 1. 초기 역사 (1970년대)
SQL은 IBM에서 1970년대 초 도널드 D. 챔벌린과 레이먼드 F. 보이스가 에드거 F. 코드의 관계형 모델에 대한 연구를 바탕으로 개발하였다.[5][23] 초기에는 '''SEQUEL'''(Structured English Query Language, 구조 영어 질의어)이라는 이름으로 시작하였으며, IBM의 준 관계형 데이터베이스 관리 시스템 시스템 R에 저장된 데이터를 조작하고 수신하기 위해 고안하였다.[54]
챔벌린과 보이스가 처음 시도한 관계형 데이터베이스 언어는 SQUARE (Specifying Queries in A Relational Environment)였지만, 첨자/지수 표기법 때문에 사용하기 어려웠다. 1973년 산호세 연구소로 옮겨간 후, SQUARE의 후속 작업에 착수했다.[5]
영국의 호커 시들리 항공사의 상표[55]와 동일하여 초기 명칭인 SEQUEL을 SQL로 변경해야 했다.[24] SQL이라는 명칭은 이후 Structured Query Language의 약자로 사용되었다.
SQL의 유용성과 실용성을 판단하기 위해 고객 테스트 사이트에서 SQL을 테스트한 후, IBM은 System R 프로토타입을 기반으로 System/38, SQL/DS, IBM Db2를 포함한 상용 제품을 개발하기 시작했으며, 이 제품들은 각각 1979년, 1981년, 1983년에 상용화되었다.[25]
2. 2. 표준화 및 상용화 (1980년대 ~ 1990년대)
1970년대 후반, Relational Software, Inc.(현재의 오라클사)는 코드, 챔벌린, 보이스가 설명한 개념의 잠재력을 인식하고, 자체 SQL 기반 RDBMS를 개발하여 미국 해군, 중앙 정보국 등 미국 연방 정부 기관에 판매하고자 했다.[25] 1979년 6월, Relational Software는 VAX 컴퓨터용 SQL의 최초 상용 구현 중 하나인 Oracle V2 (버전2)를 출시했다.
1986년까지 ANSI와 ISO 표준 그룹은 "데이터베이스 언어 SQL" 언어 정의를 공식적으로 채택했다.[5] SQL은 1986년 ANSI에 의해 SQL-86[34]으로, 1987년 ISO에 의해 표준으로 채택되었다.[22] 1989년, 1992년에는 새로운 버전의 표준이 발표되었다.
SQL 규격은 1986년에 통일 표준 규격이 발표되기 전까지는 그 통일 표준 규격이 존재하지 않는 상황이었다. 따라서 각 관계형 데이터베이스 관리 시스템(RDBMS) 벤더마다 다양한 확장이 이루어졌다.
ANSI와 ISO에서 언어 사양의 표준화가 진행되었으며, 제정된 연도별로 SQL86, SQL89, SQL-92 등의 규격이 있지만, 지원 정도는 벤더마다 다르다. 이는 표준 SQL 제정에 시간이 너무 오래 걸린 탓에 비즈니스 현황에서 조기 기능 확장이 필요했던 벤더의 사정과, 독자적인 구문을 빈번하게 사용하던 이용자와 프로그래머에게 호환성 유지를 보장해야 할 필요가 있었기 때문이다.
1986년에 통일 표준 규격이 발표된 이후 여러 차례 개정이 이루어졌다. 주요 표준은 다음과 같다.
| 연도 | 약칭 | 별칭 | 설명 | 규격 |
|---|---|---|---|---|
| 1986년 | SQL86 | SQL87 | ANSI에 의해 발표된 최초의 규약. 1987년에 ISO에 의해 승인되었다. | ANSI X3.135-1986 ISO 9075:1987 JIS X 3005:1987 |
| 1989년 | SQL89 | - | 마이너 버전. | ISO 9075:1989 ANSI X3.135-1989 JIS X 3005:1990 |
| 1992년 | SQL-92 | SQL2 | 메이저 버전 | ISO/IEC 9075:1992 ANSI X3.135-1992 JIS X 3005:1995 |
2. 3. 기능 확장 및 현대화 (1999년 이후)
1986년 ANSI와 ISO 표준 그룹에서 "데이터베이스 언어 SQL" 언어 정의를 공식적으로 채택한 이후[5], SQL 표준은 여러 차례 개정되었다. 주요 개정 내용은 다음과 같다.
SQL 언어는 여러 언어 요소로 세분화된다.
SQL:1999에서는 객체 지향적 사고방식을 도입한 객체 관계형 데이터베이스(ORDB) 기술이 추가되었다.[5] 또한, 저장 프로시저 기능을 국제 표준화한 SQL/PSM 규격이 1996년에 발표되었다.
최근에는 빅데이터 및 NoSQL 데이터베이스와의 연동을 위한 SQL 표준 확장도 이루어지고 있다.
3. SQL 구문
SQL은 관계형 데이터베이스에 포함된 데이터를 쿼리하는 특정 목적을 위해 설계된 집합 기반의 선언형 프로그래밍 언어이다.
3. 1. 명령어 종류
SQL 명령어는 크게 세 가지 종류로 나눌 수 있다.
각 명령어의 종류와 역할은 다음과 같다.
| 명령어 종류 | 역할 | 주요 명령어 |
|---|---|---|
| 데이터 정의 언어(DDL) | 데이터베이스 객체 (테이블, 인덱스 등)를 생성, 삭제, 변경 | CREATE, DROP, ALTER |
| 데이터 조작 언어(DML) | 데이터를 삽입, 수정, 삭제, 조회 | INSERT, UPDATE, DELETE, SELECT |
| 데이터 제어 언어(DCL) | 데이터베이스 사용자에게 권한 부여 및 회수, 트랜잭션 제어 | GRANT, REVOKE, COMMIT, ROLLBACK |
데이터 조작 언어(DML)의 예시
- INSERT: 새로운 행(row) 데이터를 테이블에 삽입한다.
```sql
INSERT INTO 테이블명 (열1, 열2) VALUES (값1, 값2);
```
- UPDATE: 테이블 내의 기존 데이터를 수정한다.
```sql
UPDATE 테이블명 SET 열1 = 값1 WHERE 조건;
```
- DELETE: 테이블에서 조건에 맞는 행(row)을 삭제한다.
```sql
DELETE FROM 테이블명 WHERE 조건;
```
- SELECT: 테이블에서 조건에 맞는 데이터를 조회한다.
```sql
SELECT 열1, 열2 FROM 테이블명 WHERE 조건;
3. 2. 데이터 정의 언어 (DDL)
데이터 정의 언어는 테이블과 인덱스 구조를 관리한다. 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 TABLE My_table ADD my_field4 NUMBER(3) NOT NULL;
```
- TRUNCATE: 테이블에서 모든 데이터를 빠르게 삭제한다. (내부 테이블의 데이터를 삭제, 테이블 자체를 삭제하는 것은 아님) 이 과정은 보통 순차적인 COMMIT 연산을 내포한다. (예: 롤백되지 않음, DELETE와는 달리 이후 롤백을 위한 로그가 기록되지 않는다.)
```sql
TRUNCATE TABLE My_table;
```
- DROP: 데이터베이스에서 객체를 삭제하며, 보통 롤백을 통해 복원할 수 없다.
```sql
DROP TABLE My_table;
3. 3. 데이터 조작 언어 (DML)
SQL에서 데이터 조작 언어(DML)는 데이터를 조작하는 데 사용되는 명령어 집합이다. 여기에는 데이터를 삽입, 수정, 삭제, 검색하는 명령어가 포함된다.[26]| 명령어 | 설명 | 링크 |
|---|---|---|
| `INSERT INTO` | 행 데이터 또는 테이블 데이터를 삽입한다. | INSERT |
| `UPDATE ~ SET` | 테이블을 갱신한다. | UPDATE |
| `DELETE FROM` | 테이블에서 특정 행을 삭제한다. | DELETE |
| `SELECT ~ FROM ~ WHERE` | 테이블에서 데이터를 검색하여 결과 집합을 가져온다. | SELECT |
- `SELECT` 문에는 한 번 실행에 한 행의 결과를 가져오는 "단일 행 `SELECT` 문"과 커서를 사용하여 여러 행의 결과를 가져오는 "커서 `SELECT` 문"이 있다.
`INSERT` 문 예시
- 열 이름과 값을 쌍으로 지정하여 삽입:
```sql
INSERT INTO 표 이름(열 이름1, 열 이름2) VALUES(값1, 값2)
```
- 모든 열에 값을 저장하는 경우, 열 이름 생략 가능:
```sql
INSERT INTO 표 이름 VALUES (값1, 값2)
```
- 다른 테이블의 데이터를 검색하여 삽입:
```sql
INSERT INTO 표 이름1 SELECT 열 이름1, 열 이름2 FROM 표 이름2 ~
```
`UPDATE` 문 예시```sql
UPDATE 표 이름
SET 열 이름2=값2, 열 이름3=값3
WHERE 열 이름1=값1
```
`DELETE` 문 예시```sql
DELETE FROM 표 이름
WHERE 열 이름1=값1
```
`SELECT` 문 예시
- 1행 이상 검색:
```sql
SELECT *
FROM 표 이름
WHERE 열 이름1 BETWEEN 값1 AND 값2
ORDER BY 열 이름1
```
- 1행만 검색:
```sql
SELECT *
INTO 수신 변수
FROM 표 이름
WHERE 열 이름1=값1
```
- 가져올 행 수를 지정하여 검색:
```sql
SELECT *
FROM 표 이름
LIMIT 가져올 행 수
```
Oracle 9i 이후에는 `CONNECT BY` 구문을 통해 네트워크형 데이터 구조 처리가 간편해졌다. 이전에는 호스트 측에서 재귀 처리를 담당하여 데이터 서버와의 트래픽이 증가하고, 커밋될 때까지 다른 서버가 데이터 서버에 접근할 수 없는 문제가 있었다. 이를 해결하기 위해 데이터 서버 내에서 재귀 처리를 수행하는 방식이 시도되었지만, SQL로 재귀를 작성하는 프로그래머는 드물었다.
3. 4. 데이터 제어 언어 (DCL)
데이터 제어 언어(DCL)는 데이터베이스 사용자에게 특정 작업 수행 권한을 부여하거나 박탈하고, 트랜잭션을 관리하는 데 사용되는 SQL 명령어 집합이다.- GRANT: 특정 데이터베이스 사용자에게 특정 작업을 수행할 수 있는 권한을 부여한다.[26]
- REVOKE: 특정 데이터베이스 사용자에게서 이미 부여한 권한을 박탈한다.[26]
- SET TRANSACTION: 트랜잭션 모드를 설정한다. 예를 들어, 동시 트랜잭션 격리 수준(ISOLATION MODE)을 설정할 수 있다.[26]
- BEGIN: 트랜잭션을 시작한다.[26]
- COMMIT: 트랜잭션을 실행(확정)한다.[26]
- ROLLBACK: 트랜잭션을 취소한다.[26]
- SAVEPOINT: 롤백 지점을 임의로 설정한다.[26]
- LOCK: 테이블 등의 자원을 점유(Locking)한다.[26]
3. 5. 연산자
SQL에서 사용되는 연산자는 다음과 같다.| 연산자 | 설명 |
|---|---|
| = | 같음 |
| <> 또는 != | 같지 않음 |
| > | 보다 큼 |
| < | 보다 작음 |
| >= | 보다 크거나 같음 |
| <= | 보다 작거나 같음 |
| BETWEEN | 일정 범위 사이 |
| LIKE | 패턴 검색 |
| IN | 컬럼의 여러 가능한 값들을 지정 |
SQL 언어는 여러 언어 요소로 세분화된다.
- 절: 문과 쿼리의 구성 요소이다. (경우에 따라 선택 사항이다.)[26]
- 표현식: 스칼라 값이나 열과 행으로 구성된 테이블을 생성할 수 있다.
- 술어: SQL 3 값 논리(참/거짓/알 수 없음) 또는 부울 진리값으로 평가될 수 있는 조건을 지정하고, 문의 효과를 제한하거나 프로그램 흐름을 변경하는 데 사용된다.
- 쿼리: 특정 기준에 따라 데이터를 검색한다. 이것은 SQL의 중요한 요소이다.
- 문: 스키마 및 데이터에 지속적인 영향을 미치거나 트랜잭션, 프로그램 흐름, 연결, 세션 또는 진단을 제어할 수 있다.
- SQL 문에는 세미콜론 (";") 문 종결자도 포함된다. 모든 플랫폼에서 필요하지는 않지만 SQL 문법의 표준 부분으로 정의된다.
- 무의미한 공백은 일반적으로 SQL 문과 쿼리에서 무시되므로 SQL 코드를 읽기 쉽게 형식화할 수 있다.
3. 6. 조건 표현
SQL은 `case/when/then/else/end` 표현식을 사용하여 조건에 따라 다른 결과를 반환할 수 있다. 이는 SQL-92에서 도입되었다.일반적인 형식은 "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를 모방한 "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;
```
마지막 값은 기본값이며, 지정되지 않으면 `NULL`이 기본값이 된다. 그러나 표준 "simple case"와 달리 오라클의 `DECODE`는 두 개의 `NULL`을 동일하게 간주한다.[56]
3. 7. 커서
커서는 SELECT 문 등에 의한 데이터베이스 검색 결과에서 한 행씩 데이터를 가져와 처리하기 위해 사용되는 개념이다. 데이터베이스 서버 측에 결과 집합과 행 획득 위치를 나타낸다. 커서는 주로 응용 프로그램 등에서 절차적 언어로 SQL을 실행할 때 사용된다.커서 관련 명령어는 다음과 같다.
- '''DECLARE CURSOR''' (커서 정의)
- '''OPEN''' (커서 열기)
- '''FETCH''' (커서 포인터가 가리키는 위치의 행 데이터를 검색하고 포인터를 한 행만큼 이동)
- '''UPDATE''' (커서 포인터가 가리키는 위치의 행 데이터 업데이트)
- '''DELETE''' (커서 포인터가 가리키는 위치의 행 데이터 삭제)
- '''CLOSE''' (커서 닫기)[26]
3. 8. 동적 SQL
동적 SQL은 SQL 문을 실행할 때마다 데이터베이스 엔진이 실행 가능한 코드로 번역하는 대신, 미리 번역하여 재사용함으로써 SQL 분석 오버헤드를 줄이는 방법이다. 소스 코드에 SQL 문을 고정하지 않고 데이터베이스에 접근할 때마다 구문을 다시 작성할 수 있어 유용하다. 데이터 조작 언어(DML)뿐만 아니라, 데이터 정의 언어(DDL)도 동적 SQL로 실행하는 것이 일반적이다.동적 SQL은 다음과 같은 명령어를 사용한다.
- `PREPARE`: 문자열로 주어진 SQL 문을 분석하고 번역한다.
- `EXECUTE`: `PREPARE`로 번역된 SQL 문을 실행한다.
예시는 다음과 같다.
매개변수 없음```
PREPARE PRESQL FROM 'DELETE FROM TBL1 WHERE CLMA=1'
↓
EXECUTE PRESQL
```
매개변수 있음 (1회의 `PREPARE`로, `EXECUTE`를 반복 실행 가능)
```
PREPARE PRESQL FROM 'DELETE FROM TBL1 WHERE CLMA=? AND CLMB=?'
↓
EXECUTE PRESQL USING :XCLMA,:XCLMB
```
최근에는 한국어 자연어 질의를 SQL로 변환하는 기술도 연구되고 있다.[26]
3. 9. 임베디드 SQL
임베디드 SQL(내장 SQL)은 C, Java와 같은 다른 프로그래밍 언어(호스트 언어)의 소스 코드 안에 SQL 문을 포함시켜 데이터베이스와 상호작용하는 방식이다. 이는 데이터베이스 응용 프로그램 개발을 간편하게 만들어준다.[27]임베디드 SQL은 호스트 언어에서 데이터베이스와의 통신을 위한 자원 할당 및 해제, 오류 처리, 결과 집합 처리를 위한 편리한 방법을 제공한다. 주요 기능은 다음과 같다.
- ALLOCATE (DEALLOCATE) DESCRIPTOR: 데이터베이스와 호스트 언어 간 통신 영역을 확보하고 해제한다.
- WHENEVER: 오류 발생 시의 동작을 정의한다.
- SQLSTATE: SQL 문 실행 후 상태가 저장되는 영역이다.
임베디드 SQL을 사용하면, 호스트 언어의 반복문(루프)을 통해 결과 집합에서 데이터를 한 행씩 가져오는(FETCH) 등의 처리를 쉽게 할 수 있다.
다음은 임베디드 SQL의 예시이다.
```sql
EXEC SQL INCLUDE SQLCA END-EXEC.
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
77 XPARM PIC X(3).
01 XTBL1.
03 XCLMA PIC X(3).
03 XCLMB PIC X(10).
01 XTBL2.
03 XCLM1 PIC S9(5) COMP-3.
03 XCLM2 PIC S9(9) COMP.
EXEC SQL END DECLARE SECTION END-EXEC.
EXEC SQL
DECLARE CR1 CURSOR FOR
SELECT CLMA, CLMB FROM TBL1
WHERE CLMA>=:XPARM
ORDER BY CLMA
END-EXEC.
EXEC SQL WHENEVER SQLERROR GO TO ERR--PROC END-EXEC.
- SQL의 정적 실행(커서 조작 예)
MOVE 'ABC' TO XPARM.
EXEC SQL OPEN CR1 END-EXEC.
PERFORM TEST BEFORE
UNTIL SQLCODE NOT = ZERO
EXEC SQL
FETCH CR1 INTO :XCLMA, :XCLMB
END-EXEC
IF SQLCODE = ZERO
데이터 검색 시의 처리
END-IF
END-PERFORM.
IF SQLCODE = 100
EXEC SQL CLOSE CR1 END-EXEC
END-EXEC.
- SQL의 동적 실행(? 파라미터 사용)
EXEC SQL
PREPARE PRESQL FROM
'INSERT INTO TBL2 (CLM1, CLM2) VALUES(?, ?)'
END-EXEC.
MOVE ZERO TO XCLM2.
PERFORM TEST AFTER
VARYING XCLM1 FROM 1 BY 1
UNTIL XCLM1 >= 10
EXEC SQL
EXECUTE PRESQL USING :XCLM1, :XCLM2
END-EXEC
END-PERFORM.
GOBACK.
ERR--PROC.
예외 처리
```
이 외에도, 마이크로소프트의 ODBC나 표준화된 SQL/CLI와 같이 API 레벨에서 데이터베이스 조작을 지원하는 방식도 있다. LINQ를 사용하면 C#와 같은 프로그래밍 언어 내에서 SQL과 유사한 기술을 통해 데이터베이스를 조작할 수 있다.
3. 10. 3값 논리 (3VL)
SQL은 2값 논리(TRUE, FALSE) 대신 3값 논리(TRUE, FALSE, UNKNOWN)를 사용한다.[5] 3값 논리는 포트란(Fortran) 등 수치 계산에서 오래전부터 사용되어 왔다.SQL에서 Null은 3치 논리를 적용하는 특별한 개념이다.[5] Null은 값이 없음을 나타내며, 정수 열의 0이나 텍스트 열의 빈 문자열과는 다르다.
4. 자료형
SQL 테이블에서 각 컬럼은 자료형(data type)을 선언한다. ANSI SQL은 다음과 같은 데이터형을 포함하고 있다.[57]
- `CHARACTER(n)` 또는 `CHAR(n)`: 고정폭 n-문자열 (필요한 만큼 공백으로 채워진다.)
- `CHARACTER VARYING(n)` 또는 `VARCHAR(n)`: 가변폭 문자열 (n 문자의 최대 크기를 가진)
- `NATIONAL CHARACTER(n)` 또는 `NCHAR(n)`: 국제 문자셋을 지원하는 고정폭 문자열
- `NATIONAL CHARACTER VARYING(n)` 또는 `NVARCHAR(n)`: 가변폭 `NCHAR` 문자열
- `BIT(n)`: n 비트의 배열
- `BIT VARYING(n)`: n 비트까지의 배열
- `INTEGER` 와 `SMALLINT`
- `FLOAT`, `REAL` 과 `DOUBLE PRECISION`
- `NUMERIC(precision, scale)` 또는 `DECIMAL(precision, scale)`
예를 들어, 숫자 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) 함수를 제공한다.[58]
- `DATE`: 날짜 값 (예, `2011-05-03`)
- `TIME`: 시간 값 (예, `15:51:36`). 시간 값은 보통 ''tick'' (100 nanoseconds)이다.
- `TIME WITH TIME ZONE` 또는 `TIMETZ`: `TIME`과 같지만, 해당 지역의 시간대 정보를 포함하고 있다.
- `TIMESTAMP`: 이것은 `DATE` 와 `TIME`이 하나의 변수로 결합된 것이다. (예, `2011-05-03 15:51:36`).
- `TIMESTAMP WITH TIME ZONE` 또는 `TIMESTAMPTZ`: `TIMESTAMP`와 동일하지만, 해당 지역의 시간대에 대한 상세 정보를 포함하고 있다.
SQL은 날짜 / 시간 변수를 생성하는 여러 개의 함수를 date / time 열 (`TO_DATE`, `TO_TIME`, `TO_TIMESTAMP`)로부터 제공한다. 또한 그러한 각각의 변수 항목 (예를 들면, 초)을 통해 추출할 수도 있다. 현재 데이터베이스 서버 시스템의 날짜 / 시간은 `NOW`와 같은 함수를 통해 호출할 수 있다.
SQL 표준은 세 가지 종류의 데이터 형식을 정의한다(SQL/Foundation 4.1.1장):
- 미리 정의된 데이터 형식
- 구성된 형식
- 사용자 정의 형식
''구성된 형식''은 ARRAY, MULTISET, REF(참조) 또는 ROW 중 하나이다. ''사용자 정의 형식''은 객체 지향 언어의 클래스와 유사하며 자체 생성자, 옵저버, 변형자, 메서드, 상속, 오버로딩, 오버라이딩, 인터페이스 등을 갖는다. ''미리 정의된 데이터 형식''은 구현에 의해 본질적으로 지원된다.
| 자료형 종류 | 자료형 |
|---|---|
| 문자열 유형 | CHAR, VARCHAR, CLOB |
| 국가 문자열 유형 | NCHAR, NCHAR VARYING, NCLOB |
| 이진 유형 | BINARY, VARBINARY, BLOB |
| 숫자 유형 | NUMERIC, DECIMAL, SMALLINT, INTEGER, BIGINT, FLOAT, REAL, DOUBLE PRECISION, DECFLOAT |
| 날짜/시간 유형 | DATE, TIME, TIMESTAMP |
| 간격 유형 | INTERVAL |
| 기타 | 부울, XML (SQL/XML 참조)[14], JSON |
5. 표준화
SQL 표준은 미국 국립 표준 협회(ANSI)와 국제 표준화 기구(ISO)에 의해 관리되며, 여러 차례 개정을 거쳤다. SQL은 1970년대 초 IBM에서 에드거 F. 코드의 관계형 모델 연구를 바탕으로 개발되었다. 초기에는 SEQUEL (Structured English Query Language)로 불렸으나, 상표권 문제로 SQL로 변경되었다. 1986년 ANSI에 의해 SQL-86이 최초의 표준으로 채택되었고, 이후 ISO 표준으로도 채택되었다.[34][22]
SQL 표준은 다음과 같이 여러 번 개정되었다.
| 연도 | 명칭 | 별칭 | 설명 |
|---|---|---|---|
| 1986 | SQL-86 | SQL-87 | ANSI에 의해 최초로 표준화됨. |
| 1989 | SQL-89 | FIPS 127-1 | 마이너 개정, 무결성 제약 조건 추가. |
| 1992 | SQL-92 | SQL2, FIPS 127-2 | 메이저 개정. |
| 1999 | SQL:1999 | SQL3 | 정규 표현식 매칭, 재귀 쿼리, 데이터베이스 트리거 등 추가. |
| 2003 | SQL:2003 | - | XML 관련 특징 (SQL/XML), 윈도우 함수 등 도입. |
| 2006 | SQL:2006 | - | XQuery를 SQL 코드에 통합. |
| 2008 | SQL:2008 | - | INSTEAD OF 트리거, TRUNCATE 구문 추가. |
| 2011 | SQL:2011 | - | 임시 데이터베이스 지원 향상. |
| 2016 | SQL:2016 | - | 행 패턴 일치, JSON 추가. |
| 2019 | SQL:2019 | - | 다차원 어레이 추가. |
| 2023 | SQL:2023영어 | - | 데이터 유형 JSON (SQL/Foundation) 추가; Part 16, 속성 그래프 쿼리 (SQL/PGQ) 추가 |
SQL 표준은 ''ISO/IEC 9075''와 ''ISO/IEC 13249 SQL 멀티미디어 및 응용 프로그램 패키지'' 등으로 구성된다.
하지만 현실적으로 SQL 구현은 벤더 간에 완벽하게 호환되지 않으며, 표준을 완전히 따르지 않는 경우가 많다. 특히 날짜 및 시간 구문, 문자열 연결, `NULL` 처리, 대소문자 구분 등에서 차이가 발생한다. PostgreSQL과 Mimer SQL 등이 표준 준수를 위해 노력하지만, 일부 기능에서는 표준과 다른 동작을 보이기도 한다.
SQL 표준의 복잡성, 일부 영역에서의 모호성, 벤더의 기존 고객 기반 및 하위 호환성 유지, 벤더 종속성 문제, 성능 우선시 경향 등이 데이터베이스 시스템 간 이식성을 저해하는 요인으로 작용한다.
6. 비판 및 대안
SQL은 그 이론적 기반인 관계형 모델 및 튜플 관계 대수와 여러 면에서 차이가 있다. 관계형 모델에서 테이블은 튜플의 집합이지만, SQL 테이블과 쿼리 결과는 행의 리스트로, 동일한 행이 여러 번 나타날 수 있고, 행의 순서가 쿼리에 사용될 수 있다(예: LIMIT 절).[5]
비평가들은 SQL이 원래 기반으로 엄격하게 돌아가는 언어로 대체되어야 한다고 주장한다. 예를 들어, 휴 다윈과 C.J. 데이트의 ''The Third Manifesto''(2006)가 있다.
초기 SQL 명세는 기본 키와 같은 주요 기능을 지원하지 않았고, 결과 집합의 이름을 지정하거나 하위 쿼리를 정의할 수 없었다. 이러한 기능은 1992년에 추가되었다.[5]
합 타입의 부재는 SQL 사용자 정의 타입의 완전한 사용에 걸림돌이 된다고 묘사되어 왔다. 예를 들어, JSON 지원은 2016년에 새로운 표준에 의해 추가되어야 했다.[13]
Null 개념은 값의 부재를 나타내며, 정수 열의 0 또는 텍스트 열의 빈 문자열과는 구별되지만, 3치 논리 적용 등으로 인해 논쟁의 대상이 되기도 한다.[5]
또한 중복된 행을 허용하여 파이썬과 같은 언어와의 통합을 어렵게 만든다는 비판이 있다. 이는 기본 키 또는 고유 제약 조건을 선언하여 방지할 수 있다.
객체-관계형 임피던스 불일치와 유사하게, 선언적 언어인 SQL과 절차적 언어 사이에 불일치가 발생한다.
SQL 언어의 대안으로 제시된 관계형 언어는 다음과 같다.
7. 주요 SQL 구현체
SQL의 널리 사용되는 구현에는 다음과 같은 것들이 있다.
| 구현체 | 라이선스 | 운영체제 |
|---|---|---|
| MySQL | 오픈 소스 | 유닉스, 리눅스, 윈도우 |
| PostgreSQL | 오픈 소스 | 유닉스, 리눅스, 윈도우 |
| Ingres | 오픈 소스 | 유닉스, 리눅스, 윈도우, macOS |
| SQLite | 오픈 소스 (퍼블릭 도메인) | 표준 C 언어로 구현되어 재컴파일로 모든 환경 지원 |
| Firebird | 오픈 소스 | 리눅스, 윈도우, macOS, Solaris, HP-UX |
| Oracle Database | 독점 | 유닉스, 리눅스, 윈도우 |
| Microsoft SQL Server | 독점 | 윈도우 |
| IBM DB2 | 독점 | AS/400, z/OS, 유닉스, 리눅스, 윈도우 |
| IBM Informix Dynamic Server | 독점 | 유닉스, 리눅스, 윈도우 |
| Sybase Adaptive Server Enterprise | 독점 | 유닉스, 리눅스, 윈도우 |
| InterBase | 독점 | 리눅스, 윈도우, Solaris, macOS |
| SQL/DS | VSE, VM/CMS |
이러한 구현체들은 벤더 간에 서로 호환되지 않으며, 반드시 표준을 완전히 따르지는 않는다.[6] 특히 날짜 및 시간 구문, 문자열 연결, `NULL`, 비교 대소문자 구분 등은 벤더마다 다르다. PostgreSQL[29]과 Mimer SQL[30]은 표준 준수를 위해 노력하지만, 항상 표준을 따르는 것은 아니다.
널리 사용되는 SQL 구현체들은 `DATE` 또는 `TIME` 데이터 유형과 같은 표준 SQL의 기본적인 기능에 대한 지원을 생략하기도 한다. 가장 대표적인 예시는 Oracle(DATE가 DATETIME처럼 작동[31][32]하며, TIME 유형이 없음[33])과 MS SQL Server(2008 버전 이전)이다. 결과적으로 SQL 코드는 수정 없이는 데이터베이스 시스템 간에 거의 이식할 수 없다.
데이터베이스 시스템 간 이식성이 부족한 이유는 다음과 같다.
- SQL 표준의 복잡성과 방대함 (대부분의 구현체는 표준 전체를 지원하지 않음)
- SQL 표준에서 일부 중요한 영역(예: 인덱스, 파일 저장)의 데이터베이스 동작을 명시하지 않음
- SQL 표준은 명시적으로 이름이 지정되지 않은 결과 열의 이름을 지정하는 방법과 같은 일부 결정을 개별 구현체에 위임[9]
- SQL 표준 명세의 불명확성과 모호성
- 많은 데이터베이스 공급업체의 하위 호환성 유지 문제 (기존 고객 기반)
- 벤더 종속을 유도하려는 상업적 인센티브
- 데이터베이스 소프트웨어 평가 시 표준 준수보다 성능 등을 우선시하는 경향
SQL을 대화식으로 실행할 때는 관계형 데이터베이스 관리 시스템(RDBMS)에 부속된 명령줄 타입의 액세스 유틸리티를 이용하는 것이 일반적이다. SQL 문을 기술한 텍스트 파일을 스크립트로 실행하여 일괄적으로 실행하는 것도 가능하다. RDBMS마다 고유의 명령을 갖춘 것도 있어, 초심자가 데이터베이스 엔진이 해석하는 SQL 문법의 하나라고 잘못 이해하는 경우도 있다.
유틸리티 고유의 문법으로 오해하기 쉬운 예로는 데이터베이스에서 SQL 문장 끝에 지정하는 문자가 있다. 모든 데이터베이스 공통으로는 ";"이 있으며, Oracle Database의 SQL*Plus에서 저장 프로시저 정의나 익명 PL/SQL 블록을 발행할 때 문장 끝 행에 지정하는 "/"나, Sybase/SQL Server의 isql/osql에서는 모든 SQL 문장 끝 행에 지정하는 "GO" 등이 있다.
8. 분산 SQL 처리
분산 관계형 데이터베이스 아키텍처(DRDA)는 1988년부터 1994년까지 IBM 내의 워크그룹에 의해 설계되었다. DRDA는 네트워크로 연결된 관계형 데이터베이스가 SQL 요청을 처리하기 위해 협력할 수 있도록 한다.[11][12]
대화형 사용자나 프로그램은 로컬 RDB에 SQL 문을 발행하고 원격 RDB에서 데이터 테이블과 상태 표시기를 응답으로 받을 수 있다. SQL 문은 패키지로 컴파일되어 원격 RDB에 저장된 다음 패키지 이름으로 호출될 수도 있다. 이는 복잡하고 빈번한 쿼리를 발행하는 응용 프로그램의 효율적인 운영에 중요하다. 특히 액세스할 테이블이 원격 시스템에 있는 경우 더욱 중요하다.
DRDA의 메시지, 프로토콜 및 구조적 구성 요소는 분산 데이터 관리 아키텍처에 의해 정의된다. DRDA와 같은 분산 SQL 처리는 동시대의 분산 SQL 데이터베이스와는 구별된다.
참조
[1]
논문
Oral history interview with Donald D. Chamberlin
https://conservancy.[...]
2001-10-03
[2]
문서
SQL-92
[3]
서적
Structured Query Language By Example - Volume I: Data Query Language
https://books.google[...]
Lulu.com
[4]
웹사이트
Dynamic SQL, Plumbing, and the Internal API
https://www.ibphoeni[...]
[5]
논문
Early History of SQL
2012
[6]
웹사이트
ISO - ISO/IEC JTC 1/SC 32 - Data management and interchange
https://www.iso.org/[...]
2021-01-02
[7]
웹사이트
4.1. Lexical Structure
https://www.postgres[...]
2018
[8]
웹사이트
(Second Informal Review Draft) ISO/IEC 9075:1992, Database Language SQL, Section 5.2, syntax rule 11
http://www.contrib.a[...]
1992-07-30
[9]
서적
Relational Theory for Computer Professionals: What Relational Databases are Really All About
O'Reilly Media
2013
[10]
웹사이트
ISO/IEC 9075
https://www.iso.org/[...]
[11]
논문
Distributed database for SAA
1988
[12]
서적
Distributed Relational Database Architecture Reference
IBM Corp. SC26-4651-0
1990
[13]
웹사이트
Against SQL
https://scattered-th[...]
2021-07
[14]
웹사이트
SQL 2003 Standard Support in Oracle Database 10g
https://www.oracle.c[...]
Oracle Corporation
2003-11
[15]
웹사이트
A guided tour of the Microsoft Command Shell
https://arstechnica.[...]
2005-10-24
[16]
웹사이트
Media Type registration for application/sql
https://www.iana.org[...]
Internet Assigned Numbers Authority
2013-04-10
[17]
웹사이트
The application/sql Media Type, RFC 6922
http://tools.ietf.or[...]
Internet Engineering Task Force
2013-04
[18]
서적
Learning SQL
O'Reilly
2009-04
[19]
논문
A Relational Model of Data for Large Shared Data Banks
1970-06
[20]
뉴스
SQL Fundamentals
http://databases.abo[...]
About.com
[21]
웹사이트
Structured Query Language (SQL)
http://publib.boulde[...]
International Business Machines
2006-10-27
[22]
웹사이트
ISO 9075:1987: Information technology – Database languages – SQL – Part 1: Framework (SQL/Framework)
https://www.iso.org/[...]
1987-06-01
[23]
논문
SEQUEL: A Structured English Query Language
http://www.almaden.i[...]
Association for Computing Machinery
[24]
서적
Databases Demystified
http://www.mhprofess[...]
McGraw-Hill Osborne Media
2004-02-27
[25]
웹사이트
History of IBM, 1978
http://www-03.ibm.co[...]
IBM
2003-01-23
[26]
간행물
ANSI/ISO/IEC International Standard (IS). Database Language SQL—Part 2: Foundation (SQL/Foundation).
1999
[27]
웹사이트
PostgreSQL server programming
http://www.postgresq[...]
postgresql.org
[28]
웹사이트
Outer Joins in a Deductive Database System
http://lbd.udc.es/jo[...]
[29]
웹사이트
About PostgreSQL
http://www.postgresq[...]
PostgreSQL Global Development Group
[30]
웹사이트
Mimer SQL, Built on Standards
http://developer.mim[...]
Mimer Information Technology
[31]
서적
Oracle Database SQL Language Reference 11g Release 2 (11.2)
Oracle USA, Inc
2010-10
[32]
서적
Oracle Database SQL Language Reference 11g Release 2 (11.2)
Oracle USA, Inc
2010-10
[33]
서적
Oracle Database SQL Language Reference 11g Release 2 (11.2)
Oracle USA, Inc
2010-10
[34]
서적
X3H2 Records, 1978–95
American National Standards Institute
[35]
웹사이트
Is SQL a Standard Anymore?
http://articles.tech[...]
TechRepublic
2002-06-19
[36]
웹사이트
Pronouncing SQL: S-Q-L or Sequel?
http://patorjk.com/b[...]
2012-02-12
[37]
서적
Understanding the New SQL: A Complete Guide
https://archive.org/[...]
Morgan Kaufmann
[38]
서적
SQL/XML:2006 - Evaluierung der Standardkonformität ausgewählter Datenbanksysteme
Diplomica Verlag
[39]
웹사이트
SQL:2008 now an approved ISO international standard
https://web.archive.[...]
Sybase
2008-07
[40]
문서
SQL:1992 draft
http://www.contrib.a[...]
[41]
문서
SQL:2011 draft
https://www.wiscorp.[...]
Whitemarsh Information Systems Corporation
[42]
웹사이트
What's new in SQL:2011
https://sigmodrecord[...]
Oracle Corporation
[43]
저널
Temporal features in SQL:2011
http://cs.ulb.ac.be/[...]
2012-09
[44]
웹사이트
SQL とは - コトバンク
http://kotobank.jp/w[...]
2014-06-14
[45]
웹사이트
「SQL」の読み方論争に決着? 「しーくぇる」vs「えすきゅーえる」にPostgreSQLがケリ
https://forest.watch[...]
2024-04-13
[46]
웹사이트
SQL とは - コトバンク
http://kotobank.jp/w[...]
2014-06-14
[47]
웹사이트
SQL:2008 now an approved ISO International Standard
Sybase Blog - Glenn Paulley - Id Rather Play Golf
[48]
서적
Learning SQL
https://archive.org/[...]
O'Reilly
2009-04
[49]
웹사이트
SQL
http://www.britannic[...]
2013-04-02
[50]
웹사이트
SQL
http://oxforddiction[...]
2014-02-25
[51]
웹사이트
SQL Guide
http://publib.boulde[...]
[52]
웹사이트
Structured Query Language (SQL)
http://msdn.microsof[...]
[53]
서적
Learning SQL
https://archive.org/[...]
O'Reilly
2009-04
[54]
저널
SEQUEL: A Structured English Query Language
http://www.almaden.i[...]
Association for Computing Machinery
2007-06-09
[55]
서적
Databases Demystified
https://web.archive.[...]
McGraw-Hill Osborne Media
2011-05-12
[56]
웹사이트
http://docs.oracle.c[...]
[57]
저널
Information Technology: Database Language SQL
http://www.contrib.a[...]
CMU
[58]
서적
SQL Functions Programmer's Reference
Wiley
[59]
서적
SQL/XML:2006 - Evaluierung der Standardkonformität ausgewählter Datenbanksysteme
Diplomica Verlag
[60]
웹사이트
SQL:2008 now an approved ISO international standard
https://web.archive.[...]
Sybase
2011-06-28
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com