SQL(/ˈɛs kjuː ˈɛl/,[1] 또는 /ˈsiːkwəl/, Structured Query Language[2][3][4][5], 구조화 질의어, S-Q-L[6])은 관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계한 특수 목적의 프로그래밍 언어이다. 관계형 데이터베이스 관리 시스템에서 자료의 검색과 관리, 데이터베이스 스키마 생성과 수정, 데이터베이스 객체 접근 조정 관리를 위해 고안되었다. 많은 수의 데이터베이스 관련 프로그램들에서 SQL을 표준으로 채택하고 있다.
SQL은 IBM에서 1970년대 초에 도널드 D. 챔벌린과 레이먼드 F. 보이스가 처음 개발하였다. 초기에는 SEQUEL(Structured English Query Language, 구조 영어 질의어)라는 이름으로 시작하였으며, IBM의 준 관계형 데이터베이스 관리 시스템 시스템 R에 저장된 데이터를 조작하고 수신하기 위해 고안하였다.[7] 초기 명칭인 SEQUEL이 영국의 호커 시들리 항공사의 상표[8]와 동일하였기에 SQL로 변경해야 했다.
SQL은 관계형 모델과 그것의 튜플 해석이라는 이론적 기초로부터 파생되었다. 해당 모델에서 테이블은 튜플의 집합이지만, SQL에서는 테이블과 쿼리 결과는 행(row)의 목록이다. 같은 행은 여러 번 발생할 수 있고 행의 순서는 쿼리에 의해 나타난다. (예: LIMIT 절)
데이터베이스 언어 SQL 문법의 종류는 다음 세 가지로 대별된다.
기타 이러한 명령의 적용 범위를 보완하기 위한 기능으로 SQL 문을 실행 시에 해석하는 "동적 SQL"과 내장 SQL에 대한 지침이 포함되어 있다. 관계형 데이터베이스 관리시스템(RDBMS) 이전의 데이터베이스 관리 시스템(DBMS)에서 이들은 반드시 동일한 언어가 아니었다. 데이터 정의 언어는 존재하지 않고, 모든 전용 명령에 매개 변수를 사용하여 실행하는 구현도 존재했다.
데이터 정의 언어는 테이블과 인덱스 구조를 관리한다. DDL의 가장 기본적인 요소는 CREATE, ALTER, RENAME, DROP과 TRUNCATE 구문이다:
CREATE는 데이터베이스에서 객체(예, 테이블)를 생성한다. 예를 들어:
CREATE TABLE My_table( my_field1 INT, my_field2 VARCHAR(50), my_field3 DATE NOT NULL, PRIMARY KEY (my_field1, my_field2) );
ALTER
ALTER TABLE My_table ADD my_field4 NUMBER(3) NOT NULL;
TRUNCATE
TRUNCATE TABLE My_table;
DROP
DROP TABLE My_table;
‘커서’는 SELECT 문장 등에 의한 데이터베이스 검색에 의한 검색 실행 결과를 한 줄씩 검색하고, 처리하기 위해 데이터베이스 서버 측의 결과 집합과 행 획득 위치를 나타내는 개념을 말한다. 커서의 정의와 그 작업은 주로 응용 프로그램 등의 절차적 언어에서의 SQL 실행시 사용한다.
SQL은 case/when/then/else/end 표현을 가지고 있으며, 이것은 SQL-92에서 도입되었다. 일반적인 형식에서, 이것은 SQL 표준에서 "searched case"라고 불리며, 다른 프로그램 언어에서 else if와 같은 역할을 수행한다:
case/when/then/else/end
CASE WHEN n > 0 THEN 'positive' WHEN n < 0 THEN 'negative' ELSE 'zero' END
WHEN 조건은 소스에서 등장하는 순서에서 시험된다. 아무런 ELSE 표현식이 지정되지 않으면, ELSE NULL을 기본값으로 하게 된다. switch statement을 미러링하는 약어 구문도 존재한다. 이것은 SQL 표준에서 "simple case"라고 불린다:
WHEN
ELSE
ELSE NULL
CASE n WHEN 1 then 'one' WHEN 2 THEN 'two' ELSE 'i cannot count that high' END
이 구문은 NULL과 비교하는 통상적인 경고를 이용하여 내포적 특질 비교를 이용한다.
오라클 SQL 구문에서 후자는 DECODE 구문으로 축약될 수 있다:
DECODE
SELECT DECODE(n, 1, "one", 2, "two", "i cannot count that high") FROM some_table;
마지막 값은 default이다; 아무것도 지정되지 않으면, NULL이 기본값이 된다. 그러나 표준 "simple case"와는 달리 오라클의 DECODE는 2개의 NULL을 서로 동일한 것으로 간주한다.[9]
NULL
SQL 테이블에서 각 컬럼은 컬럼이 포함하는 자료형(data type)을 선언한다. ANSI SQL은 다음과 같은 데이터형을 포함하고 있다.[10]
CHARACTER(n)
CHAR(n)
CHARACTER VARYING(n)
VARCHAR(n)
NATIONAL CHARACTER(n)
NCHAR(n)
NATIONAL CHARACTER VARYING(n)
NVARCHAR(n)
NCHAR
BIT(n)
BIT VARYING(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]
TRUNC
ROUND
DATE
2011-05-03
TIME
15:51:36
TIME WITH TIME ZONE
TIMETZ
TIMESTAMP
2011-05-03 15:51:36
TIMESTAMP WITH TIME ZONE
TIMESTAMPTZ
SQL은 날짜 / 시간 변수를 생성하는 여러 개의 함수를 date / time 열 (TO_DATE, TO_TIME, TO_TIMESTAMP)로부터 제공한다. 또한 그러한 각각의 변수 항목 (예를 들면, 초)을 통해 추출할 수도 있다. 현재 데이터베이스 서버 시스템의 날짜 / 시간은 NOW와 같은 함수를 통해 호출할 수 있다.
TO_DATE
TO_TIME
TO_TIMESTAMP
NOW
동적 SQL은 일반적으로 SQL문을 RDBMS에 보낼 때마다 데이터베이스 엔진에서 실행 가능한 내부 중간 코드로 번역하는 작업을 미리 수행하여 변환된 SQL 코드를 재사용하여, SQL 분석 오버헤드를 줄이고, SQL 문을 소스 코드로 고정하지 않고 데이터베이스에 액세스할 때마다 구문을 다시 할 경우 유용하다. 데이터 조작 언어(DML)도 물론 수행할 수 있지만, 데이터 정의 언어 (DDL)와 같이 데이터베이스 제품의 기능 업데이트에 의해 새로운 명령이 추가되는 것은 전처리 해당 작업이 부담이 되기 때문에, 대부분의 데이터베이스 제품에서는 DDL 문은 동적 SQL에서 실행하는 것이 일반적이다.
임베디드 SQL(또는 내장 SQL)은 원래 커서가 포함된 SQL에서 호스트 언어에서 결과 집합을 얻기 위해 더 편리한 방법으로 고안된 것이다. 데이터베이스와 통신하기 위한 자원 할당 확보와 개방한 줄에 호스트 언어의 반복으로 가져 오기위한 명령 (FETCH) 등이 있다.
SQL에서 사용되는 논리값은 컴퓨터 세계에서 가장 널리 이용되는 ‘2값 논리’(TRUE, FALSE) 대신 ‘3값 논리’(TRUE, FALSE, UNKNOWN)이 있다.
SQL 표준은 다음과 같은 많은 개정을 거쳤다:
ISO/IEC 9075은 ISO/IEC 13249 SQL 멀티미디어 및 응용 프로그램 패키지로 보충된다.