SQL은 IBM에서 1970년대 초에 도널드 D. 챔벌린과 레이먼드 F. 보이스가 처음 개발하였다. 초기에는 SEQUEL(Structured English Query Language, 구조 영어 질의어)라는 이름으로 시작하였으며, IBM의 준 관계형 데이터베이스 관리 시스템 시스템 R에 저장된 데이터를 조작하고 수신하기 위해 고안하였다.[7] 초기 명칭인 SEQUEL이 영국의 호커 시들리 항공사의 상표[8]와 동일하였기에 SQL로 변경해야 했다.
설계
SQL은 관계형 모델과 그것의 튜플 해석이라는 이론적 기초로부터 파생되었다. 해당 모델에서 테이블은 튜플의 집합이지만, SQL에서는 테이블과 쿼리 결과는 행(row)의 목록이다. 같은 행은 여러 번 발생할 수 있고 행의 순서는 쿼리에 의해 나타난다. (예: LIMIT 절)
기타 이러한 명령의 적용 범위를 보완하기 위한 기능으로 SQL 문을 실행 시에 해석하는 "동적 SQL"과 내장 SQL에 대한 지침이 포함되어 있다. 관계형 데이터베이스 관리시스템(RDBMS) 이전의 데이터베이스 관리 시스템(DBMS)에서 이들은 반드시 동일한 언어가 아니었다. 데이터 정의 언어는 존재하지 않고, 모든 전용 명령에 매개 변수를 사용하여 실행하는 구현도 존재했다.
ALTER는 다양한 방법으로 현존하는 객체의 구조를 변경한다. 예를 들어, 현재의 테이블에 컬럼을 추가하거나 제한을 추가한다. 예를 들면:
ALTERTABLEMy_tableADDmy_field4NUMBER(3)NOTNULL;
TRUNCATE는 테이블에서 모든 데이터를 빠르게 삭제한다. 내부 테이블의 데이터를 삭제하는 것이지, 테이블 자체를 삭제하는 것은 아니다. 이 과정은 보통 순차적인 COMMIT 연산을 내포한다. 예를 들어, 이것은 롤백되지 않는다. (DELETE와는 달리 이후 롤백을 위한 로그가 기록되지 않는다.).
TRUNCATETABLEMy_table;
DROP은 데이터베이스에서 객체를 삭제하며, 보통 롤백을 통해 복원할 수 없다. 예를 들어:
‘커서’는 SELECT 문장 등에 의한 데이터베이스 검색에 의한 검색 실행 결과를 한 줄씩 검색하고, 처리하기 위해 데이터베이스 서버 측의 결과 집합과 행 획득 위치를 나타내는 개념을 말한다. 커서의 정의와 그 작업은 주로 응용 프로그램 등의 절차적 언어에서의 SQL 실행시 사용한다.
DECLARE CURSOR (커서 정의)
OPEN (커서 열기)
FETCH (커서 포인터가 가리키는 위치의 행 데이터를 검색하고 포인터를 일행 분 진행)
UPDATE (커서 포인터가 가리키는 위치의 행 데이터 업데이트)
DELETE (커서 포인터가 가리키는 위치의 행 데이터 삭제)
CLOSE (커서 닫기)
연산자
연산자
설명
=
같음
<> 또는 !=
같지 않음
>
보다 큼
<
보다 작음
>=
보다 크거나 같음
<=
보다 작거나 같음
BETWEEN
일정 범위 사이
LIKE
패턴 검색
IN
컬럼의 여러 가능한 값들을 지정
조건 표현
SQL은 case/when/then/else/end 표현을 가지고 있으며, 이것은 SQL-92에서 도입되었다. 일반적인 형식에서, 이것은 SQL 표준에서 "searched case"라고 불리며, 다른 프로그램 언어에서 else if와 같은 역할을 수행한다:
SQL 테이블에서 각 컬럼은 컬럼이 포함하는 자료형(data type)을 선언한다. ANSI SQL은 다음과 같은 데이터형을 포함하고 있다.[10]
문자열
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) 함수를 제공한다.[11]
날짜와 시간
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)이 있다.
ISO/IEC 9075-14:2006은 XML과 결합되어 SQL이 사용되는 방법을 정의하고 있다. 여기에는 SQL 데이터베이스 내의 XML 데이터의 불러오기와 저장하는 방법을 정의하고 있으며, 데이터베이스 내에서 조작하여 XML 형식의 전통적 SQL 자료와 XML 형식 모두로 출력하는 방법을 제시한다. 게다가, 여기에서는 W3C에 의해 제안된 XML 쿼리 언어, Xquery를 이용하여 SQL 코드로 애플리케이션을 통합할 수 있도록 하여, 보통의 SQL 데이터와 XML 문서에 접근할 수 있게 한다.[12]
↑Encyclopedia Britannica. “SQL”. 2013년 4월 2일에 확인함.
↑From Oxford Dictionaries: "Definition of SQL - abbreviation, Structured Query Language, an international standard for database manipulation."
Oxford Dictionaries. “SQL”. 2016년 8월 3일에 원본 문서에서 보존된 문서. 2014년 2월 25일에 확인함.
↑From Microsoft: "Structured Query Language, invented at IBM in the 1970s. It is more commonly known by its acronym, SQL .."
Microsoft. “Structured Query Language (SQL)”.
↑Chamberlin, Donald D; Boyce, Raymond F (1974). “SEQUEL: A Structured English Query Language”(PDF). 《Proceedings of the 1974 ACM SIGFIDET Workshop on Data Description, Access and Control》 (Association for Computing Machinery): 249–64. 2018년 12월 25일에 원본 문서(PDF)에서 보존된 문서. 2007년 6월 9일에 확인함.
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.