지원되는 SQL 구문

다음은 Adobe AIR SQL 데이터베이스 엔진에서 지원되는 SQL 구문 목록입니다. 이러한 목록은 다양한 명령문 및 절 유형, 표현식, 내장 함수 및 연산자에 대한 설명으로 구분되어 있습니다. 여기에서 다루는 항목은 다음과 같습니다.
  • 일반적인 SQL 구문

  • 데이터 조작 명령문(SELECT, INSERT, UPDATE, DELETE)

  • 데이터 정의 명령문(테이블, 인덱스, 뷰, 트리거에 대한 CREATE, ALTER 및 DROP 문)

  • 특수 명령문 및 절

  • 내장 함수(집계, 스칼라 및 날짜/시간 형식 함수)

  • 연산자

  • 매개 변수

  • 지원되지 않는 SQL 기능

  • 추가 SQL 기능

일반적인 SQL 구문

다양한 명령문 및 표현식에 대한 구체적인 구문 이외에 SQL 구문의 일반적인 규칙은 다음과 같습니다.
대/소문자 구분
객체 이름을 포함하여 SQL 명령문은 대/소문자를 구분하지 않습니다. 그러나 SQL 명령문의 SQL 키워드는 대문자로 작성하는 경우가 많으며, 이 문서에서는 이러한 규칙을 따릅니다. SQL 구문에서는 대/소문자가 구분되지 않지만 SQL의 리터럴 텍스트 값에서는 대/소문자가 구분되며, 비교 및 정렬 작업에서도 열 또는 작업에 정의된 데이터 정렬 시퀀스에 따라 대/소문자가 구분될 수 있습니다. 자세한 내용은 COLLATE를 참조하십시오.

공백
빈 칸, 탭, 개행 문자 등의 공백 문자를 사용하여 SQL 명령문의 개별 단어를 분리해야 합니다. 그러나 단어와 심볼 사이에서는 공백 문자를 생략할 수 있습니다. SQL 명령문에서 공백 문자의 종류와 개수는 중요하지 않습니다. 들여쓰기 및 줄 바꿈 등의 공백을 사용하여 SQL 명령문을 읽기 쉽도록 서식을 지정할 수 있으며, 이때 명령문의 의미에는 영향이 없습니다.

데이터 조작 명령문

데이터 조작 명령문은 가장 자주 사용되는 SQL 명령문입니다. 이러한 명령문을 사용하여 데이터베이스 테이블에서 데이터를 검색, 추가, 수정 및 제거할 수 있습니다. SELECT, INSERT, UPDATE, DELETE 등의 데이터 조작 명령문이 지원됩니다.

SELECT

SELECT 문은 데이터베이스를 쿼리하는 데 사용됩니다. SELECT의 결과는 0개 이상의 데이터 행이며 각 행에 고정된 개수의 열이 있습니다. 결과의 열 수는 SELECT와 선택적 키워드인 FROM 사이에서 결과 열 이름이나 표현식 목록으로 지정됩니다.

sql-statement   ::=  SELECT [ALL | DISTINCT] result 
                     [FROM table-list] 
                     [WHERE expr] 
                     [GROUP BY expr-list] 
                     [HAVING expr] 
                     [compound-op select-statement]* 
                     [ORDER BY sort-expr-list] 
                     [LIMIT integer [( OFFSET | , ) integer]] 
result          ::=  result-column [, result-column]* 
result-column   ::=  * | table-name . * | expr [[AS] string] 
table-list      ::=  table [ join-op table join-args ]* 
table           ::=  table-name [AS alias] | 
                     ( select ) [AS alias] 
join-op         ::=  , | [NATURAL] [LEFT | RIGHT | FULL] [OUTER | INNER | CROSS] JOIN 
join-args       ::=  [ON expr] [USING ( id-list )] 
compound-op     ::=  UNION | UNION ALL | INTERSECT | EXCEPT 
sort-expr-list  ::=  expr [sort-order] [, expr [sort-order]]* 
sort-order      ::=  [COLLATE collation-name] [ASC | DESC] 
collation-name  ::=  BINARY | NOCASE

임의의 표현식을 결과로 사용할 수 있습니다. 결과 표현식이 *이면 모든 테이블의 모든 열이 해당 표현식 하나로 대체됩니다. 표현식으로 테이블 이름 뒤에 .*를 사용하면 결과는 해당 테이블 하나의 모든 열입니다.

DISTINCT 키워드를 사용하면 결과 행 중 서로 다른 행만 반환됩니다. NULL 값은 서로 같은 것으로 간주됩니다. 기본 비헤이비어는 모든 결과 행을 반환하는 것이며, ALL 키워드를 사용하여 이를 명시적으로 지정할 수 있습니다.

쿼리는 FROM 키워드 뒤에 지정된 하나 이상의 테이블에 대해 실행됩니다. 여러 테이블 이름을 쉼표로 구분하여 지정하면 쿼리에서 여러 테이블의 크로스 조인을 사용합니다. JOIN 구문을 사용하여 테이블을 조인하는 방법을 지정할 수도 있습니다. 지원되는 유일한 외부 조인 유형은 LEFT OUTER JOIN입니다. join-args의 ON 절 표현식은 부울 값으로 확인되어야 합니다. 괄호로 묶은 하위 쿼리를 FROM 절에서 테이블로 사용할 수 있습니다. 전체 FROM 절을 생략할 수도 있으며 이 경우 결과는 결과 표현식 목록의 값으로 구성된 단일 행입니다.

WHERE 절은 쿼리에서 검색하는 행 수를 제한하는 데 사용됩니다. WHERE 절 표현식은 부울 값으로 확인되어야 합니다. WHERE 절 필터링이 모든 그룹화 이전에 수행되므로 WHERE 절 표현식에는 집계 함수가 포함될 수 없습니다.

GROUP BY 절을 사용하면 하나 이상의 결과 행이 단일 출력 행으로 결합됩니다. GROUP BY 절은 결과에 집계 함수가 들어 있는 경우에 특히 유용합니다. GROUP BY 절의 표현식은 SELECT 표현식 목록에 나타나는 표현식이 아니어도 됩니다.

HAVING 절은 명령문에서 반환하는 행을 제한한다는 점에서 WHERE와 비슷합니다. 그러나 HAVING 절은 GROUP BY 절에 지정된 그룹화가 모두 수행된 후에 적용됩니다. 따라서 HAVING 표현식은 집계 함수가 포함된 값을 참조할 수 있습니다. HAVING 절 표현식은 SELECT 목록에 나타나지 않아도 됩니다. WHERE 표현식과 마찬가지로 HAVING 표현식도 부울 값으로 확인되어야 합니다.

ORDER BY 절을 사용하면 출력 행이 정렬됩니다. ORDER BY 절의 sort-expr-list 인수는 정렬 키로 사용되는 표현식 목록입니다. 단순 SELECT에서는 표현식이 결과에 포함되지 않을 수도 있지만 복합 SELECT(compound-op 연산자 중 하나를 사용하는 SELECT)에서는 각 정렬 표현식이 이러한 결과 열 중 하나와 정확히 일치해야 합니다. 각 정렬 표현식 뒤에 COLLATE 키워드와 텍스트 정렬에 사용되는 데이터 정렬 함수의 이름 및/또는 정렬 순서(오름차순 또는 내림차순)를 지정하는 ASC 또는 DESC 키워드로 구성된 sort-order 절을 추가할 수 있습니다. sort-order를 생략하고 기본값(오름차순)을 사용할 수도 있습니다. COLLATE 절의 정의 및 데이터 정렬 함수에 대한 자세한 내용은 COLLATE를 참조하십시오.

LIMIT 절은 결과에서 반환되는 행 수의 상한을 설정합니다. LIMIT가 음수이면 상한이 없는 것입니다. LIMIT 뒤에 오는 선택적 OFFSET은 결과 집합의 시작 부분에서 건너뛸 행 수를 지정합니다. 복합 SELECT 쿼리에서 LIMIT 절은 마지막 SELECT 문 뒤에만 올 수 있으며 전체 쿼리에 제한이 적용됩니다. LIMIT 절에 OFFSET 키워드를 사용한 경우 첫 번째 정수는 제한으로, 두 번째 정수는 오프셋으로 사용됩니다. OFFSET 키워드 대신 쉼표를 사용한 경우 첫 번째 숫자는 오프셋으로, 두 번째 숫자는 제한으로 사용됩니다. 이는 모순처럼 보이지만 레거시 SQL 데이터베이스 시스템과의 호환성을 최대화하기 위한 의도적인 조치입니다.

복합 SELECT는 UNION, UNION ALL, INTERSECT 또는 EXCEPT 연산자 중 하나로 둘 이상의 단순 SELECT 문을 연결하여 구성됩니다. 복합 SELECT를 구성하는 모든 SELECT 문은 동일한 개수의 결과 열을 지정해야 합니다. ORDER BY 절은 마지막 SELECT 문 뒤에 하나만 사용할 수 있으며 단일 LIMIT 절(지정된 경우) 앞에 와야 합니다. UNION 및 UNION ALL 연산자는 앞뒤 SELECT 문의 결과를 단일 테이블로 결합합니다. UNION에서는 모든 결과 행이 고유하지만 UNION ALL에서는 중복이 나타날 수 있다는 차이점이 있습니다. INTERSECT 연산자는 앞뒤 SELECT 문에서 나타난 결과의 교집합을 취합니다. EXCEPT는 앞에 있는 SELECT의 결과에서 뒤에 있는 SELECT의 결과를 제거합니다. 세 개 이상의 SELECT 문을 복합 명령문으로 연결하는 경우 앞에서 뒤로 그룹화됩니다.

허용되는 표현식의 정의는 표현식을 참조하십시오.

AIR 2.5부터 SQL CAST 연산자는 읽기 작업으로 BLOB 데이터를 ActionScript ByteArray 객체로 변환할 때 지원됩니다. 예를 들어 다음 코드에서는 AMF 형식으로 저장되지 않은 원시 데이터를 읽고 ByteArray 객체로 저장합니다.

stmt.text = "SELECT CAST(data AS ByteArray) AS data FROM pictures;"; 
stmt.execute(); 
var result:SQLResult = stmt.getResult(); 
var bytes:ByteArray = result.data[0].data;

INSERT

테이블을 데이터로 채우는 데 사용되는 INSERT 문에는 두 가지 기본 형태가 있습니다.
sql-statement  ::=  INSERT [OR conflict-algorithm] INTO [database-name.] table-name [(column-list)] VALUES (value-list) | 
                    INSERT [OR conflict-algorithm] INTO [database-name.] table-name [(column-list)] select-statement 
                    REPLACE INTO [database-name.] table-name [(column-list)] VALUES (value-list) | 
                    REPLACE INTO [database-name.] table-name [(column-list)] select-statement

VALUES 키워드가 사용된 첫 번째 형태는 기존 테이블에 새 행을 하나 만듭니다. column-list를 지정하지 않은 경우 값의 개수는 테이블의 열 수와 같아야 합니다. column-list를 지정한 경우에는 값의 개수가 지정된 열 수와 일치해야 합니다. 열 목록에 나타나지 않는 테이블의 열은 테이블이 만들어질 때 정의된 기본값으로 채워지며, 기본값이 정의되지 않은 경우 NULL로 채워집니다.

INSERT 문의 두 번째 형태는 SELECT 문에서 데이터를 가져옵니다. SELECT의 결과에 있는 열 수는 테이블의 열 수(column-list를 지정하지 않은 경우) 또는 column-list에 지정된 열 수와 정확히 일치해야 합니다. SELECT 결과에 있는 모든 행에 대해 테이블에 새 항목이 만들어집니다. SELECT는 단순 명령문일 수도 있고 복합 명령문일 수도 있습니다. 사용 가능한 SELECT 문의 정의는 SELECT를 참조하십시오.

선택적 conflict-algorithm을 사용하면 이 명령 하나를 실행할 때 사용할 대체 제약 조건 충돌 해결 알고리즘을 지정할 수 있습니다. 충돌 알고리즘에 대한 설명 및 정의는 특수 명령문 및 절 을 참조하십시오.

명령문의 두 가지 REPLACE INTO 형태는 REPLACE 충돌 알고리즘과 함께 표준 INSERT [OR conflict-algorithm] 형태(예: INSERT OR REPLACE... 형태)를 사용하는 것과 같습니다.

명령문의 두 가지 REPLACE INTO 형태는 REPLACE 충돌 알고리즘과 함께 표준 INSERT [OR conflict-algorithm] 형태(예: INSERT OR REPLACE... 형태)를 사용하는 것과 같습니다.

UPDATE

update 명령은 테이블의 기존 레코드를 변경합니다.

sql-statement  ::=  UPDATE [database-name.] table-name SET column1=value1, column2=value2,... [WHERE expr]

이 명령은 UPDATE 키워드와 레코드를 업데이트할 테이블의 이름으로 구성됩니다. SET 키워드 다음에 열의 이름과 해당 열이 변경될 값을 쉼표로 구분해 나열합니다. WHERE 절 표현식은 레코드가 업데이트될 행 또는 행들을 제공합니다.

DELETE

DELETE 명령은 테이블에서 레코드를 제거하는 데 사용됩니다.
sql-statement  ::=  DELETE FROM [database-name.] table-name [WHERE expr]

이 명령은 DELETE FROM 키워드와 레코드를 제거할 테이블의 이름으로 구성됩니다.

WHERE 절이 없으면 테이블의 모든 행이 제거됩니다. WHERE 절을 제공한 경우에는 표현식과 일치하는 행만 제거됩니다. WHERE 절 표현식은 부울 값으로 확인되어야 합니다. 허용되는 표현식의 정의는 표현식을 참조하십시오.

데이터 정의 명령문

데이터 정의 명령문은 테이블, 뷰, 인덱스 및 트리거 등의 데이터베이스 객체를 만들고 수정하고 제거하는 데 사용됩니다. 다음과 같은 데이터 정의 명령문이 지원됩니다.
  • 테이블:
    • CREATE TABLE

    • ALTER TABLE

    • DROP TABLE

  • 인덱스:
    • CREATE INDEX

    • DROP INDEX

  • 뷰:
    • CREATE VIEWS

    • DROP VIEWS

  • 트리거:
    • CREATE TRIGGERS

    • DROP TRIGGERS

CREATE TABLE

CREATE TABLE 문은 CREATE TABLE 키워드, 새 테이블 이름, 괄호로 묶은 열 정의 및 제약 조건 목록으로 구성됩니다. 테이블 이름은 식별자 또는 문자열일 수 있습니다.
sql-statement       ::=  CREATE [TEMP | TEMPORARY] TABLE [IF NOT EXISTS] [database-name.] table-name 
                         ( column-def [, column-def]* [, constraint]* ) 
sql-statement       ::=  CREATE [TEMP | TEMPORARY] TABLE [database-name.] table-name AS select-statement 
column-def          ::=  name [type] [[CONSTRAINT name] column-constraint]* 
type                ::=  typename | typename ( number ) | typename ( number , number ) 
column-constraint   ::=  NOT NULL [ conflict-clause ] | 
                         PRIMARY KEY [sort-order] [ conflict-clause ] [AUTOINCREMENT] | 
                         UNIQUE [conflict-clause] | 
                         CHECK ( expr ) | 
                         DEFAULT default-value | 
                         COLLATE collation-name 
constraint          ::=  PRIMARY KEY ( column-list ) [conflict-clause] | 
                         UNIQUE ( column-list ) [conflict-clause] | 
                         CHECK ( expr ) 
conflict-clause     ::=  ON CONFLICT conflict-algorithm 
conflict-algorithm  ::=  ROLLBACK | ABORT | FAIL | IGNORE | REPLACE 
default-value       ::=  NULL | string | number | CURRENT_TIME | CURRENT_DATE | CURRENT_TIMESTAMP 
sort-order          ::=  ASC | DESC 
collation-name      ::=  BINARY | NOCASE 
column-list         ::=  column-name [, column-name]*

각 열 정의에는 열 이름, 해당 열의 데이터 유형, 하나 이상의 선택적 열 제약 조건이 차례로 나옵니다. 열의 데이터 유형은 해당 열에 저장할 수 있는 데이터를 제한합니다. 열에 다른 데이터 유형의 값을 저장하려고 하면 런타임에서 가능한 경우 값을 적절한 유형으로 변환합니다. 변환할 수 없으면 오류가 발생합니다. 자세한 내용은 "데이터 유형 지원" 단원을 참조하십시오.

NOT NULL 열 제약 조건은 열에 NULL 값이 포함될 수 없음을 나타냅니다.

UNIQUE 제약 조건을 사용하면 지정된 하나 이상의 열에 인덱스가 만들어집니다. 이 인덱스에는 고유 키가 있어야 하며, 두 행에서 지정된 하나 이상의 열에는 중복된 값이나 값 조합이 포함될 수 없습니다. CREATE TABLE 문에는 여러 UNIQUE 제약 조건이 있을 수 있습니다. 여러 열의 정의에 UNIQUE 제약 조건이 있을 수도 있고 여러 테이블 수준 UNIQUE 제약 조건이 있을 수도 있습니다.

CHECK 제약 조건은 true로 평가되어야 행의 데이터를 삽입하거나 업데이트할 수 있는 표현식을 정의합니다. CHECK 표현식은 부울 값으로 확인되어야 합니다.

열 정의의 COLLATE 절은 열의 텍스트 항목을 비교할 때 사용할 텍스트 데이터 정렬 함수를 지정합니다. 기본적으로 BINARY 데이터 정렬 함수가 사용됩니다. COLLATE 절 및 데이터 정렬 함수에 대한 자세한 내용은 COLLATE를 참조하십시오.

DEFAULT 제약 조건은 INSERT를 수행할 때 사용할 기본값을 지정합니다. 이 값은 NULL, 문자열 상수 또는 숫자일 수 있습니다. 기본값은 대/소문자를 구분하지 않는 특수 키워드인 CURRENT_TIME, CURRENT_DATE 또는 CURRENT_TIMESTAMP 중 하나일 수도 있습니다. 값이 NULL, 문자열 상수 또는 숫자이면 INSERT 문에 열 값이 지정되지 않은 경우 해당 값이 열에 그대로 삽입됩니다. 값이 CURRENT_TIME, CURRENT_DATE 또는 CURRENT_TIMESTAMP이면 현재 UTC 날짜 및/또는 시간이 열에 삽입됩니다. CURRENT_TIME의 서식은 HH:MM:SS입니다. CURRENT_DATE의 서식은 YYYY-MM-DD입니다. CURRENT_TIMESTAMP의 서식은 YYYY-MM-DD HH:MM:SS입니다.

PRIMARY KEY를 지정하면 일반적으로 하나 이상의 해당 열에 단순히 UNIQUE 인덱스가 만들어집니다. 그러나 데이터 유형이 INTEGER(또는 int와 같은 동의어 중 하나)인 단일 열에 PRIMARY KEY 제약 조건을 지정하면 해당 열이 데이터베이스에서 테이블의 실제 기본 키로 사용됩니다. 즉, 해당 열은 고유 정수 값만 보유할 수 있습니다. 여러 SQLite 구현에서는 열 유형 INTEGER를 사용해야만 열이 내부 기본 키 역할을 하지만, Adobe AIR에서는 INTEGER의 동의어(예: int)도 해당 비헤이비어를 지정합니다.

테이블에 INTEGER PRIMARY KEY 열이 없으면 행이 삽입될 때 정수 키가 자동으로 생성됩니다. 특수 이름인 ROWID, OID 또는 _ROWID_ 중 하나를 사용하면 언제든지 행의 기본 키에 액세스할 수 있습니다. INTEGER PRIMARY KEY로 명시적으로 선언되었는지 또는 값이 내부적으로 생성되었는지 여부에 관계없이 이러한 이름을 사용할 수 있습니다. 그러나 테이블에 명시적인 INTEGER PRIMARY KEY가 있는 경우 결과 데이터의 열 이름은 특수 이름이 아니라 실제 열 이름입니다.

INTEGER PRIMARY KEY 열에 AUTOINCREMENT 키워드가 포함될 수도 있습니다. AUTOINCREMENT 키워드를 사용하면 열의 명시적인 값을 지정하지 않는 INSERT 문이 실행될 때 데이터베이스에서 순차적으로 증가하는 정수 키를 자동으로 생성하여 INTEGER PRIMARY KEY 열에 삽입합니다.

CREATE TABLE 문에는 PRIMARY KEY 제약 조건이 하나만 있을 수 있습니다. 이 제약 조건은 열 정의에 포함될 수도 있고 단일 테이블 수준 PRIMARY KEY 제약 조건일 수도 있습니다. 기본 키 열은 암시적으로 NOT NULL입니다.

제약 조건 뒤에 선택적 conflict-clause를 사용하면 해당 제약 조건의 대체 기본 제약 조건 충돌 해결 알고리즘을 지정할 수 있습니다. 기본값은 ABORT입니다. 같은 테이블 내의 여러 제약 조건에 서로 다른 기본 충돌 해결 알고리즘을 지정할 수 있습니다. INSERT 또는 UPDATE 문이 다른 충돌 해결 알고리즘을 지정하는 경우 해당 알고리즘이 CREATE TABLE 문에 지정된 알고리즘 대신 사용됩니다. 자세한 내용은 특수 명령문 및 절 의 ON CONFLICT 단원을 참조하십시오.

FOREIGN KEY 제약 조건 등의 추가 제약 조건은 오류를 발생시키지 않지만 런타임에서 무시됩니다.

CREATE와 TABLE 사이에 TEMP 또는 TEMPORARY 키워드를 사용하면 작성되는 테이블을 같은 데이터베이스 연결(SQLConnection 인스턴스)에서만 볼 수 있습니다. 데이터베이스 연결이 닫히면 테이블이 자동으로 삭제됩니다. 임시 테이블에 만들어진 인덱스도 임시적입니다. 임시 테이블과 인덱스는 주 데이터베이스 파일과 다른 별도의 파일에 저장됩니다.

선택적 접두어인 database-name을 지정하면 명명된 데이터베이스(지정된 데이터베이스 이름으로 attach() 메서드를 호출하여 SQLConnection 인스턴스에 연결된 데이터베이스)에 테이블이 만들어집니다. database-name 접두어가 temp가 아닌 경우 database-name 접두어와 TEMP 키워드를 모두 지정하면 오류가 발생합니다. 데이터베이스 이름이 지정되지 않았고 TEMP 키워드가 없으면 주 데이터베이스(open() 또는 openAsync()method 메서드를 사용하여 SQLConnection 인스턴스에 연결된 데이터베이스)에 테이블이 만들어집니다.

테이블의 열 수나 제약 조건 수에는 임의적인 제한이 없습니다. 행의 데이터 양에도 임의적인 제한이 없습니다.

CREATE TABLE AS 형태는 테이블을 쿼리의 결과 집합으로 정의합니다. 테이블 열의 이름은 결과 열의 이름입니다.

선택적 절인 IF NOT EXISTS가 있고 이름이 동일한 다른 테이블이 이미 있으면 데이터베이스에서 CREATE TABLE 명령을 무시합니다.

DROP TABLE 문을 사용하여 테이블을 제거할 수 있고, ALTER TABLE 문을 사용하여 제한적인 변경을 수행할 수 있습니다.

ALTER TABLE

ALTER TABLE 명령을 사용하여 기존 테이블의 이름을 바꾸거나 새 열을 추가할 수 있습니다. 테이블에서 열을 제거할 수는 없습니다.

sql-statement ::= ALTER TABLE [database-name.] table-name alteration 
alteration    ::= RENAME TO new-table-name 
alteration    ::= ADD [COLUMN] column-def

RENAME TO 구문은 [database-name.] table-name으로 식별된 테이블 이름을 new-table-name으로 바꾸는 데 사용됩니다. 이 명령을 사용하여 연결된 데이터베이스 간에 테이블을 이동할 수는 없으며, 같은 데이터베이스 내에서만 테이블의 이름을 바꿀 수 있습니다.

이름을 바꾸는 테이블에 트리거나 인덱스가 있으면 이름을 바꾼 후에도 트리거나 인덱스가 테이블에 연결된 상태로 유지됩니다. 그러나 이름을 바꾸는 테이블을 참조하는 트리거에서 실행하는 뷰 정의나 명령문은 새 테이블 이름을 사용하도록 자동으로 수정되지 않습니다. 이름을 바꾼 테이블에 뷰나 트리거가 연결되어 있는 경우 뷰나 트리거를 수동으로 삭제한 다음 새 테이블 이름을 사용하여 다시 만들어야 합니다.

ADD [COLUMN] 구문은 기존 테이블에 새 열을 추가하는 데 사용됩니다. 새 열은 항상 기존 열 목록의 끝에 추가됩니다. column-def 절은 CREATE TABLE 문에 허용되는 모든 형태를 취할 수 있지만 다음과 같은 제한 사항이 있습니다.

  • 열에 PRIMARY KEY 또는 UNIQUE 제약 조건이 없어야 합니다.

  • 열의 기본값이 CURRENT_TIME, CURRENT_DATE 또는 CURRENT_TIMESTAMP가 아니어야 합니다.

  • NOT NULL 제약 조건이 지정된 경우 열의 기본값은 NULL이 아니어야 합니다.

ALTER TABLE 문의 실행 시간은 테이블의 데이터 양과 관계가 없습니다.

DROP TABLE

DROP TABLE 문은 CREATE TABLE 문으로 추가된 테이블을 제거합니다. 지정된 table-name의 테이블이 삭제됩니다. 이 테이블은 데이터베이스와 디스크 파일에서 완전히 제거되며 복구할 수 없습니다. 테이블에 연결된 모든 인덱스도 삭제됩니다.
sql-statement  ::=  DROP TABLE [IF EXISTS] [database-name.] table-name

기본적으로 DROP TABLE 문은 데이터베이스 파일의 크기를 줄이지 않습니다. 빈 공간이 데이터베이스에 유지되며 이후 INSERT 작업에 사용됩니다. 데이터베이스의 여유 공간을 제거하려면 SQLConnection.clean() 메서드를 사용합니다. 초기에 데이터베이스를 만들 때 autoClean 매개 변수를 true로 설정하면 공간이 자동으로 해제됩니다.

선택적 절인 IF EXISTS를 사용하면 일반적으로 해당 테이블이 없을 때 발생하는 오류가 숨겨집니다.

CREATE INDEX

CREATE INDEX 명령은 CREATE INDEX 키워드, 새 인덱스의 이름, ON 키워드, 이전에 만든 인덱싱할 테이블의 이름, 해당 값을 인덱스 키로 사용할 테이블 열 이름을 괄호로 묶은 목록으로 구성됩니다.

sql-statement  ::=  CREATE [UNIQUE] INDEX [IF NOT EXISTS] [database-name.] index-name 
                    ON table-name ( column-name [, column-name]* ) 
column-name    ::=  name [COLLATE collation-name] [ASC | DESC]

각 열 이름 뒤에 정렬 순서를 지정하는 ASC 또는 DESC 키워드를 사용할 수 있지만 런타임은 지정된 정렬 순서를 무시하고 항상 오름차순으로 정렬합니다.

각 열 이름 뒤에 오는 COLLATE 절은 해당 열의 텍스트 값에 사용되는 데이터 정렬 시퀀스를 정의합니다. 기본 데이터 정렬 시퀀스는 CREATE TABLE 문에서 해당 열에 정의된 데이터 정렬 시퀀스입니다. 데이터 정렬 시퀀스를 지정하지 않은 경우 BINARY 데이터 정렬 시퀀스가 사용됩니다. COLLATE 절의 정의 및 데이터 정렬 함수에 대한 자세한 내용은 COLLATE를 참조하십시오.

단일 테이블에 연결할 수 있는 인덱스 수에는 임의적인 제한이 없습니다. 인덱스의 열 수에도 제한이 없습니다.

DROP INDEX

DROP INDEX 문은 CREATE INDEX 문으로 추가된 인덱스를 제거합니다. 지정된 인덱스는 데이터베이스 파일에서 완전히 제거됩니다. 인덱스를 복구하려면 적절한 CREATE INDEX 명령을 다시 입력해야 합니다.

sql-statement ::= DROP INDEX [IF EXISTS] [database-name.] index-name

기본적으로 DROP INDEX 문은 데이터베이스 파일의 크기를 줄이지 않습니다. 빈 공간이 데이터베이스에 유지되며 이후 INSERT 작업에 사용됩니다. 데이터베이스의 여유 공간을 제거하려면 SQLConnection.clean() 메서드를 사용합니다. 초기에 데이터베이스를 만들 때 autoClean 매개 변수를 true로 설정하면 공간이 자동으로 해제됩니다.

CREATE VIEW

CREATE VIEW 명령은 미리 정의된 SELECT 문에 이름을 할당합니다. 그런 다음 다른 SELECT 문의 FROM 절에서 새 이름을 테이블 이름 대신 사용할 수 있습니다. 뷰는 복잡하고 자주 사용되는 데이터 집합을 다른 작업에 사용할 수 있는 구조체로 결합하여 쿼리를 단순화하는 데 널리 사용됩니다.

sql-statement ::= CREATE [TEMP | TEMPORARY] VIEW [IF NOT EXISTS] [database-name.] view-name AS select-statement

CREATE와 VIEW 사이에 TEMP 또는 TEMPORARY 키워드를 사용하면 데이터베이스를 연 SQLConnection 인스턴스에서만 작성된 뷰를 볼 수 있고, 데이터베이스가 닫히면 뷰가 자동으로 삭제됩니다.

[database-name]을 지정하면 해당 데이터베이스(지정된 name 인수와 함께 attach() 메서드를 사용하여 SQLConnection 인스턴스에 연결된 데이터베이스)에 뷰가 만들어집니다. [database-name]이 temp가 아닌 경우 [database-name]과 TEMP 키워드를 모두 지정하면 오류가 발생합니다. 데이터베이스 이름이 지정되지 않았고 TEMP 키워드가 없으면 주 데이터베이스(open() 또는 openAsync() 메서드를 사용하여 SQLConnection 인스턴스에 연결된 데이터베이스)에 뷰가 만들어집니다.

뷰는 읽기 전용입니다. 뷰에 DELETE, INSERT 또는 UPDATE 문을 사용하려면 연결된 유형(INSTEAD OF DELETE, INSTEAD OF INSERT, INSTEAD OF UPDATE)의 트리거를 최소한 하나 이상 정의해야 합니다. 뷰에 대한 트리거를 만드는 방법은 CREATE TRIGGER를 참조하십시오.

뷰를 데이터베이스에서 제거하려면 DROP VIEW 문을 사용합니다.

DROP VIEW

DROP VIEW 문은 CREATE VIEW 문으로 만든 뷰를 제거합니다.

sql-statement ::= DROP VIEW [IF EXISTS] view-name

지정된 view-name은 삭제할 뷰의 이름입니다. 뷰가 데이터베이스에서 제거되지만 내부 테이블의 데이터는 수정되지 않습니다.

CREATE TRIGGER

CREATE TRIGGER 문은 데이터베이스 스키마에 트리거를 추가하는 데 사용됩니다. 트리거는 지정된 데이터베이스 이벤트(database-event)가 발생할 때 자동으로 수행되는 데이터베이스 작업(trigger-action)입니다.

sql-statement   ::=  CREATE [TEMP | TEMPORARY] TRIGGER [IF NOT EXISTS] [database-name.] trigger-name 
                     [BEFORE | AFTER] database-event 
                     ON table-name 
                     trigger-action 
sql-statement   ::=  CREATE [TEMP | TEMPORARY] TRIGGER [IF NOT EXISTS] [database-name.] trigger-name 
                     INSTEAD OF database-event 
                     ON view-name 
                     trigger-action 
database-event  ::=  DELETE | 
                     INSERT | 
                     UPDATE | 
                     UPDATE OF column-list 
trigger-action  ::=  [FOR EACH ROW] [WHEN expr] 
                     BEGIN 
                       trigger-step ; 
                       [ trigger-step ; ]* 
                     END 
trigger-step    ::=  update-statement | 
                     insert-statement | 
                     delete-statement | 
                     select-statement 
column-list     ::=  column-name [, column-name]*

트리거는 특정 데이터베이스 테이블에서 DELETE, INSERT 또는 UPDATE 문이 실행되거나 지정된 하나 이상의 테이블 열이 UPDATE 문으로 인해 업데이트될 때 발생하도록 지정됩니다. 트리거는 TEMP 또는 TEMPORARY 키워드가 사용되지 않은 경우 영구적입니다. 이러한 키워드가 사용된 경우에는 SQLConnection 인스턴스의 주 데이터베이스 연결이 닫힐 때 트리거가 제거됩니다. 타이밍(BEFORE 또는 AFTER)이 지정되지 않은 경우 트리거의 기본값은 BEFORE입니다.

FOR EACH ROW 트리거만 지원되므로 FOR EACH ROW 텍스트는 선택적입니다. FOR EACH ROW 트리거를 사용하면 WHEN 절 표현식이 true로 평가되는 경우 트리거를 발생시킨 명령문에서 삽입, 업데이트 또는 삭제한 각 데이터베이스 행에 대해 trigger-step 명령문이 실행됩니다.

WHEN 절을 지정하면 WHEN 절이 true인 행에 대해서만 trigger-steps로 지정된 SQL 명령문이 실행됩니다. WHEN 절을 지정하지 않으면 모든 행에 대해 SQL 명령문이 실행됩니다.

트리거 본문(trigger-action 절) 내에서는 특수 테이블 이름인 OLD 및 NEW를 사용하여 영향을 받는 테이블의 변경 전 및 변경 후 값을 참조할 수 있습니다. OLD 및 NEW 테이블의 구조는 트리거가 작성된 테이블의 구조와 일치합니다. OLD 테이블에는 트리거하는 명령문에서 수정하거나 삭제한 모든 행이 해당 명령문의 작업 이전 상태로 들어 있습니다. NEW 테이블에는 트리거하는 명령문에서 수정하거나 작성한 모든 행이 해당 명령문의 작업 이후 상태로 들어 있습니다. WHEN 절과 trigger-step 명령문 모두에서 NEW.column-name 및 OLD.column-name 형태의 참조를 사용하여 삽입, 삭제 또는 업데이트되는 행의 값에 액세스할 수 있습니다. 여기에서 column-name은 트리거가 연결된 테이블에 있는 열의 이름입니다. OLD 및 NEW 테이블 참조를 사용할 수 있는지 여부는 트리거에서 처리하는 database-event의 유형에 따라 다릅니다.

  • INSERT – NEW 참조를 사용할 수 있습니다.

  • UPDATE – NEW 및 OLD 참조를 사용할 수 있습니다.

  • DELETE – OLD 참조를 사용할 수 있습니다.

지정된 타이밍(BEFORE, AFTER 또는 INSTEAD OF)은 연결된 행의 삽입, 수정 또는 제거를 기준으로 trigger-step 명령문이 실행되는 시점을 결정합니다. trigger-step에서 UPDATE 또는 INSERT 문의 일부로 ON CONFLICT 절을 지정할 수 있습니다. 그러나 트리거를 발생시키는 명령문의 일부로 ON CONFLICT 절을 지정하면 해당 충돌 처리 정책이 대신 사용됩니다.

테이블 트리거뿐 아니라 INSTEAD OF 트리거도 뷰에 만들 수 있습니다. 뷰에 하나 이상의 INSTEAD OF INSERT, INSTEAD OF DELETE 또는 INSTEAD OF UPDATE 트리거를 정의하면 뷰에서 연결된 명령문 유형(INSERT, DELETE 또는 UPDATE)을 실행해도 오류로 간주되지 않습니다. 이러한 경우 뷰에서 INSERT, DELETE 또는 UPDATE를 실행하면 연결된 트리거가 발생합니다. 트리거가 INSTEAD OF 트리거이므로 트리거를 발생시킨 명령문에 의해 뷰의 내부 테이블이 수정되지 않습니다. 그러나 트리거를 사용하여 내부 테이블에서 수정 작업을 수행할 수는 있습니다.

INTEGER PRIMARY KEY 열이 있는 테이블에 트리거를 만들 때 고려해야 하는 중요한 문제가 있습니다. 트리거를 발생시키는 명령문으로 업데이트할 행의 INTEGER PRIMARY KEY 열이 BEFORE 트리거로 수정되면 업데이트가 발생하지 않습니다. 이 문제를 해결하려면 INTEGER PRIMARY KEY 열 대신 PRIMARY KEY 열이 있는 테이블을 만듭니다.

트리거를 제거하려면 DROP TRIGGER 문을 사용합니다. 테이블이나 뷰를 삭제하면 해당 테이블이나 뷰에 연결된 모든 트리거가 자동으로 함께 삭제됩니다.

RAISE() 함수

트리거의 trigger-step 명령문에서 특수 SQL 함수인 RAISE()를 사용할 수 있습니다. 이 함수의 구문은 다음과 같습니다.

raise-function  ::=  RAISE ( ABORT, error-message ) | 
                     RAISE ( FAIL, error-message ) | 
                     RAISE ( ROLLBACK, error-message ) | 
                     RAISE ( IGNORE )

트리거 실행 도중 처음 세 가지 형태 중 하나를 호출하면 지정된 ON CONFLICT 처리 작업(ABORT, FAIL 또는 ROLLBACK)이 수행되고 현재 명령문의 실행이 종료됩니다. ROLLBACK은 명령문 실행 실패로 간주되므로 execute() 메서드를 실행 중인 SQLStatement 인스턴스에서 오류(SQLErrorEvent.ERROR) 이벤트를 전달합니다. 전달된 이벤트 객체의 error 속성에 있는 SQLError 객체의 details 속성은 RAISE() 함수에 지정된 error-message로 설정됩니다.

RAISE(IGNORE)를 호출하면 현재 트리거의 나머지 부분, 트리거를 실행한 명령문, 실행될 예정인 후속 트리거가 모두 실행되지 않습니다. 데이터베이스 변경 내용은 롤백되지 않습니다. 트리거를 실행한 명령문 자체가 트리거의 일부이면 해당 트리거 프로그램의 실행이 다음 단계의 시작 부분부터 재개됩니다. 충돌 해결 알고리즘에 대한 자세한 내용은 "ON CONFLICT(충돌 알고리즘)" 단원을 참조하십시오.

DROP TRIGGER

DROP TRIGGER 문은 CREATE TRIGGER 문으로 만든 트리거를 제거합니다.

sql-statement  ::=  DROP TRIGGER [IF EXISTS] [database-name.] trigger-name

트리거가 데이터베이스에서 삭제됩니다. 연결된 테이블이 삭제되면 트리거가 자동으로 삭제됩니다.

특수 명령문 및 절

이 단원에서는 런타임에서 제공하는 SQL을 확장하는 몇 가지 절과 여러 명령문, 주석 및 표현식에 사용할 수 있는 두 가지 언어 요소에 대해 설명합니다.

COLLATE

COLLATE 절은 SELECT, CREATE TABLE 및 CREATE INDEX 문에 사용되며 값을 비교하거나 정렬할 때 사용되는 비교 알고리즘을 지정합니다.

sql-statement   ::=  COLLATE collation-name 
collation-name  ::=  BINARY | NOCASE

열의 기본 데이터 정렬 유형은 BINARY입니다. TEXT 저장소 클래스의 값에 BINARY 데이터 정렬을 사용하면 텍스트 인코딩에 관계없이 값을 나타내는 메모리 내 바이트를 비교하여 이진 데이터 정렬을 수행합니다.

NOCASE 데이터 정렬 시퀀스는 TEXT 저장소 클래스의 값에만 적용됩니다. NOCASE 데이터 정렬을 사용하면 대/소문자를 구분하지 않는 비교가 수행됩니다.

NULL, BLOB, INTEGER 또는 REAL 유형의 저장소 클래스에는 데이터 정렬 시퀀스가 사용되지 않습니다.

열에서 BINARY 이외의 데이터 정렬 유형을 사용하려면 CREATE TABLE 문에서 열 정의의 일부로 COLLATE 절을 지정해야 합니다. 두 TEXT 값을 비교할 때마다 다음 규칙에 따라 데이터 정렬 시퀀스를 사용하여 비교 결과를 결정합니다.

  • 이항 비교 연사자의 경우 피연산자 중 하나가 열이면 해당 열의 기본 데이터 정렬 유형에 따라 비교에 사용되는 데이터 정렬 시퀀스가 결정됩니다. 두 피연산자가 모두 열이면 왼쪽 피연산자의 데이터 정렬 유형에 따라 사용되는 데이터 정렬 시퀀스가 결정됩니다. 두 피연산자가 모두 열이 아니면 BINARY 데이터 정렬 시퀀스가 사용됩니다.

  • BETWEEN...AND 연산자는 >= 및 <= 연산자가 있는 두 표현식을 사용하는 것과 같습니다. 예를 들어 x BETWEEN y AND z 표현식은 x >= y AND x <= z와 동일합니다. 따라서 BETWEEN...AND 연산자는 위와 같은 규칙에 따라 데이터 정렬 시퀀스를 결정합니다.

  • IN 연산자는 =연산자와 같은 방법으로 사용할 데이터 정렬 시퀀스를 결정합니다. 예를 들어 IN (y, z) 표현식에 사용되는 데이터 정렬 시퀀스는 x가 열인 경우 x의 기본 데이터 정렬 유형입니다. 그렇지 않은 경우에는 BINARY 데이터 정렬이 사용됩니다.

  • SELECT 문에 포함된 ORDER BY 절에는 정렬 작업에 사용할 데이터 정렬 시퀀스를 명시적으로 할당할 수 있습니다. 이렇게 하면 명시적인 데이터 정렬 시퀀스가 항상 사용됩니다. 그렇지 않으면 ORDER BY 절에서 정렬하는 표현식이 열인 경우 해당 열의 기본 데이터 정렬 유형에 따라 정렬 순서가 결정됩니다. 표현식이 열이 아니면 BINARY 데이터 정렬 시퀀스가 사용됩니다.

EXPLAIN

EXPLAIN 명령 수정자는 표준이 아닌 SQL 확장입니다.

sql-statement  ::=  EXPLAIN sql-statement

다른 SQL 명령문 앞에 EXPLAIN 키워드를 사용하면 명령이 실제로 실행되는 대신 EXPLAIN 키워드가 없을 때 명령을 실행하는 데 사용될 가상 머신 명령의 시퀀스가 결과로 보고됩니다. EXPLAIN 기능은 개발자가 성능을 최적화하거나 제대로 작동하지 않는 명령문을 디버깅하기 위해 SQL 명령문 텍스트를 변경하는 데 사용할 수 있는 고급 기능입니다.

ON CONFLICT(충돌 알고리즘)

ON CONFLICT 절은 독립적인 SQL 명령이 아니며 다른 SQL 명령에 나타날 수 있는 표준이 아닌 절입니다.

conflict-clause     ::=  ON CONFLICT conflict-algorithm 
conflict-clause     ::=  OR conflict-algorithm 
conflict-algorithm  ::=  ROLLBACK | 
                         ABORT | 
                         FAIL | 
                         IGNORE | 
                         REPLACE

ON CONFLICT 키워드를 사용하는 ON CONFLICT 절의 첫 번째 형태는 CREATE TABLE 문에 사용됩니다. INSERT 또는 UPDATE 문에는 OR 대신 ON CONFLICT를 사용하여 구문을 자연스럽게 하는 두 번째 형태가 사용됩니다. 예를 들어 INSERT ON CONFLICT IGNORE 대신 INSERT OR IGNORE 문을 사용합니다. 두 형태의 키워드는 다르지만 절의 의미는 같습니다.

ON CONFLICT 절은 제약 조건 충돌을 해결하는 데 사용되는 알고리즘을 지정합니다. ROLLBACK, ABORT, FAIL, IGNORE 및 REPLACE라는 다섯 가지 알고리즘이 있으며 기본 알고리즘은 ABORT입니다. 다섯 가지 충돌 알고리즘에 대한 설명은 다음과 같습니다.

ROLLBACK
제약 조건 위반이 발생하면 즉시 ROLLBACK이 발생하고 현재 트랜잭션이 종료됩니다. 명령이 중단되고 SQLStatement 인스턴스에서 error 이벤트를 전달합니다. 모든 명령에서 만들어지는 암시적인 트랜잭션 이외에 활성 상태인 트랜잭션이 없으면 이 알고리즘은 ABORT와 동일하게 작동합니다.

ABORT
제약 조건 위반이 발생하면 명령에서 이전에 수행한 모든 변경 내용을 취소하고 SQLStatement 인스턴스에서 error 이벤트를 전달합니다. ROLLBACK은 실행되지 않으므로 트랜잭션 내에서 이전 명령의 변경 내용이 그대로 유지됩니다. ABORT가 기본 비헤이비어입니다.

FAIL
제약 조건 위반이 발생하면 명령이 중단되고 SQLStatement에서 error 이벤트를 전달합니다. 그러나 제약 조건 위반이 발생하기 전에 명령문에서 데이터베이스를 변경한 내용은 취소되지 않고 모두 유지됩니다. 예를 들어 UPDATE 문에서 업데이트를 시도한 100번째 행에서 제약 조건 위반이 발생한 경우 처음 99개 행의 변경 내용은 그대로 유지되고 100번째 행과 이후 행은 변경되지 않습니다.

IGNORE
제약 조건 위반이 발생하면 제약 조건 위반이 들어 있는 해당 행은 삽입되거나 변경되지 않습니다. 이 행을 무시하고 명령이 계속 정상적으로 실행됩니다. 제약 조건 위반이 들어 있는 행의 앞뒤에 있는 다른 행은 계속 정상적으로 삽입되거나 업데이트됩니다. 오류는 반환되지 않습니다.

REPLACE
UNIQUE 제약 조건 위반이 발생하면 제약 조건을 위반한 기존 행을 제거한 후 현재 행을 삽입하거나 업데이트합니다. 따라서 삽입이나 업데이트가 항상 수행되고 명령이 계속 정상적으로 실행됩니다. 오류는 반환되지 않습니다. NOT NULL 제약 조건 위반이 발생하면 NULL 값이 해당 행의 기본값으로 바뀝니다. 열에 기본값이 없으면 ABORT 알고리즘이 사용됩니다. CHECK 제약 조건 위반이 발생하면 IGNORE 알고리즘이 사용됩니다. 이 충돌 해결 전략에 따라 제약 조건을 만족하기 위해 행을 삭제하는 경우에는 해당 행에 대한 삭제 트리거가 발생하지 않습니다.

INSERT 또는 UPDATE 문의 OR 절에 지정된 알고리즘은 CREATE TABLE 문에 지정된 모든 알고리즘을 재정의합니다. CREATE TABLE 문이나 실행 중인 INSERT 또는 UPDATE 문에 지정된 알고리즘이 없으면 ABORT 알고리즘이 사용됩니다.

REINDEX

REINDEX 명령은 하나 이상의 인덱스를 삭제하고 다시 만드는 데 사용됩니다. 이 명령은 데이터 정렬 시퀀스의 정의가 변경되었을 때 유용합니다.

sql-statement  ::=  REINDEX collation-name 
sql-statement  ::=  REINDEX [database-name .] ( table-name | index-name )

첫 번째 형태에서는 연결된 모든 데이터베이스에서 지정된 데이터 정렬 시퀀스를 사용하는 모든 인덱스를 다시 만듭니다. table-name이 지정된 두 번째 형태에서는 특정 테이블에 연결된 모든 인덱스를 다시 만듭니다. index-name을 지정하면 해당 인덱스만 삭제하고 다시 만듭니다.

COMMENTS

주석은 SQL 명령이 아니지만 SQL 쿼리에 나타날 수 있습니다. 주석은 런타임에서 공백으로 간주하며, 여러 줄에 걸친 표현식 내부를 포함하여 공백을 사용할 수 있는 모든 위치에서 시작될 수 있습니다.

comment             ::=  single-line-comment | 
                         block-comment 
single-line-comment ::=  -- single-line 
block-comment       ::=  /* multiple-lines or block [*/]

한 줄 주석은 대시 두 개로 나타냅니다. 한 줄 주석은 현재 행의 끝까지만 확장될 수 있습니다.

블록 주석은 여러 행으로 확장되거나 한 줄에 포함될 수 있습니다. 종결 구분 기호가 없으면 블록 주석이 입력의 끝까지 확장됩니다. 이러한 경우는 오류로 간주되지 않습니다. 행에서 블록 주석이 끝난 위치에 새 SQL 명령문을 시작할 수 있습니다. 블록 주석은 표현식 내부 및 다른 SQL 명령문 중간을 비롯하여 공백을 사용할 수 있는 모든 위치에 포함될 수 있습니다. 블록 주석은 중첩되지 않습니다. 블록 주석 내에 있는 한 줄 주석은 무시됩니다.

EXPRESSIONS

표현식은 다른 SQL 블록 내의 하위 명령입니다. SQL 명령문 내에서 표현식의 유효한 구문은 다음과 같습니다.

expr            ::=  expr binary-op expr | 
                     expr [NOT] like-op expr [ESCAPE expr] | 
                     unary-op expr | 
                     ( expr ) | 
                     column-name | 
                     table-name.column-name | 
                     database-name.table-name.column-name | 
                     literal-value | 
                     parameter | 
                     function-name( expr-list | * ) | 
                     expr ISNULL | 
                     expr NOTNULL | 
                     expr [NOT] BETWEEN expr AND expr | 
                     expr [NOT] IN ( value-list ) | 
                     expr [NOT] IN ( select-statement ) | 
                     expr [NOT] IN [database-name.] table-name | 
                     [EXISTS] ( select-statement ) | 
                     CASE [expr] ( WHEN expr THEN expr )+ [ELSE expr] END | 
                     CAST ( expr AS type ) | 
                     expr COLLATE collation-name 
like-op         ::=  LIKE | GLOB 
binary-op       ::=  see Operators 
unary-op        ::=  see Operators 
parameter       ::=  :param-name | @param-name | ? 
value-list      ::=  literal-value [, literal-value]* 
literal-value   ::=  literal-string | literal-number | literal-boolean | literal-blob | literal-null 
literal-string  ::=  'string value' 
literal-number  ::=  integer | number 
literal-boolean  ::=  true | false 
literal-blob  ::=  X'string of hexadecimal data' 
literal-null  ::=  NULL

표현식은 단일 값으로 확인될 수 있는 값과 연산자의 모든 조합입니다. 부울(true 또는 false) 값으로 확인되는지 아니면 부울이 아닌 값으로 확인되는지에 따라 표현식을 두 가지 일반적인 유형으로 나눌 수 있습니다.

WHERE 절, HAVING 절, JOIN 절의 ON 표현식, CHECK 표현식을 비롯한 몇 가지 일반적인 경우 표현식은 부울 값으로 확인되어야 합니다. 이 조건에 맞는 표현식 유형은 다음과 같습니다.

  • ISNULL

  • NOTNULL

  • IN ()

  • EXISTS ()

  • LIKE

  • GLOB

  • 특정 함수

  • 특정 연산자(특히 비교 연산자)

리터럴 값

리터럴 숫자 값은 정수 또는 부동 소수점 숫자로 작성됩니다. 공학 표기법도 지원됩니다. 마침표(.) 문자가 항상 소수점으로 사용됩니다.

문자열 리터럴은 문자열을 작은따옴표(')로 묶어 나타냅니다. 문자열 안에 작은따옴표 하나를 포함하려면 ''와 같이 작은따옴표 두 개를 연속으로 추가합니다.

부울 리터럴은 true 또는 false 값으로 나타냅니다. 리터럴 부울 값은 부울 열 데이터 유형에 사용됩니다.

BLOB 리터럴은 16진수 데이터가 들어 있는 문자열 리터럴이며 X'53514697465'와 같이 앞에 x 또는 X 문자 하나가 옵니다.

리터럴 값이 NULL 토큰일 수도 있습니다.

열 이름

열 이름은 CREATE TABLE 문에 정의된 이름이거나 특수 식별자인 ROWID, OID 또는 _ROWID_ 중 하나일 수 있습니다. 이러한 특수 식별자는 모든 테이블의 모든 행에 연결된 고유 난수 정수 키("행 키")를 나타냅니다. 특수 식별자는 CREATE TABLE 문에 이름이 같은 실제 열이 정의되지 않은 경우에만 행 키를 참조합니다. 행 키는 읽기 전용 열처럼 작동합니다. 일반 열을 사용할 수 있는 모든 위치에 행 키를 사용할 수 있지만 UPDATE 또는 INSERT 문에서는 행 키의 값을 변경할 수 없습니다. SELECT * FROM table 문의 결과 집합에는 행 키가 포함되지 않습니다.

SELECT 문

표현식에서 SELECT 문은 IN 연산자의 오른쪽 피연산자, 스칼라 양(단일 결과 값) 또는 EXISTS 연산자의 피연산자로 나타날 수 있습니다. 스칼라 양이나 IN 연산자의 피연산자로 사용된 경우 SELECT의 결과에는 단일 열만 있을 수 있습니다. UNION 또는 EXCEPT 등의 키워드로 연결된 복합 SELECT 문도 사용할 수 있습니다. EXISTS 연산자를 사용하면 SELECT의 결과 집합에서 열이 무시되고 행이 하나 이상 있으면 표현식에서 TRUE를, 결과 집합이 비어 있으면 FALSE를 반환합니다. SELECT 표현식의 항목 중 포함하는 쿼리의 값을 참조하는 항목이 없으면 다른 내용이 처리되기 전에 해당 표현식이 가장 먼저 평가되고 결과가 필요에 따라 다시 사용됩니다. SELECT 표현식에 외부 쿼리(상관 하위 쿼리)의 변수가 들어 있으면 필요할 때마다 SELECT가 다시 평가됩니다.

SELECT가 IN 연산자의 오른쪽 피연산자인 경우 IN 연산자는 왼쪽 피연산자의 결과가 SELECT 문의 결과 집합에 있는 값 중 하나와 같으면 TRUE를 반환합니다. IN 연산자 앞에 NOT 키워드를 사용하면 정반대의 논리로 테스트할 수 있습니다.

SELECT가 표현식 내에 나오지만 IN 연산자의 오른쪽 피연산자가 아닌 경우 SELECT의 첫 번째 결과 행이 표현식에서 값으로 사용됩니다. SELECT가 결과 행을 둘 이상 반환하면 첫 번째 행 이후의 모든 행이 무시됩니다. SELECT에서 행을 반환하지 않으면 SELECT의 값이 NULL입니다.

CAST 표현식

CAST 표현식은 지정된 값의 데이터 유형을 다른 유형으로 변경합니다. 지정된 유형은 CREATE TABLE 문의 열 정의에서 유형으로 사용할 수 있는 비어 있지 않은 모든 유형 이름일 수 있습니다. 자세한 내용은 데이터 유형 지원을 참조하십시오.

추가 표현식 요소

다음 SQL 요소도 표현식에 사용할 수 있습니다.

  • 내장 함수: 집계 함수, 스칼라 함수, 날짜 및 시간 서식 지정 함수

  • 연산자

  • 매개 변수

내장 함수

내장 함수에는 세 가지 주요 범주가 있습니다.
  • 집계 함수

  • 스칼라 함수

  • 날짜 및 시간 함수

이러한 함수 외에도 트리거를 실행할 때 오류를 알리는 데 사용되는 RAISE()라는 특수 함수가 있습니다. 이 함수는 CREATE TRIGGER 문의 본문 내에서만 사용할 수 있습니다. RAISE() 함수에 대한 자세한 내용은 CREATE TRIGGER > RAISE()를 참조하십시오.

SQL의 모든 키워드와 마찬가지로 함수 이름에는 대/소문자가 구분되지 않습니다.

집계 함수

집계 함수는 여러 행의 값에 대해 작업을 수행합니다. 이러한 함수는 주로 SELECT 문에서 GROUP BY 절과 함께 사용됩니다.

AVG(X)

그룹 내에서 NULL이 아닌 모든 X의 평균 값을 반환합니다. 숫자로 인식할 수 없는 문자열 및 BLOB 값은 0으로 해석됩니다. 입력이 모두 정수인 경우에도 AVG()의 결과는 항상 부동 소수점 값입니다.

COUNT(X) COUNT(*)

첫 번째 형태는 그룹에서 X가 NULL이 아닌 횟수를 세어 반환합니다. * 인수가 있는 두 번째 형태는 그룹에 있는 행의 총 개수를 반환합니다.

MAX(X)

그룹에 있는 모든 값 중 최대값을 반환합니다. 일반적인 정렬 순서를 사용하여 최대값을 확인합니다.

MIN(X)

그룹에 있는 모든 값 중 NULL이 아닌 최소값을 반환합니다. 일반적인 정렬 순서를 사용하여 최소값을 확인합니다. 그룹의 모든 값이 NULL이면 NULL이 반환됩니다.

SUM(X)

TOTAL(X)

그룹에 있는 NULL이 아닌 모든 값의 숫자 합계를 반환합니다. 모든 값이 NULL이면 SUM()에서 NULL을, TOTAL()에서 0.0을 반환합니다. TOTAL()의 결과는 항상 부동 소수점 값입니다. NULL이 아닌 모든 입력이 정수이면 SUM()의 결과는 정수 값입니다. SUM()에 NULL이 아니며 정수가 아닌 입력이 하나라도 있으면 SUM()에서 부동 소수점 값을 반환합니다. 이 값은 실제 합계의 근사값일 수 있습니다.

인수 하나를 받는 위와 같은 집계 함수에서는 인수 앞에 DISTINCT 키워드를 사용할 수 있습니다. 이렇게 하면 중복 요소가 필터링된 후 집계 함수에 전달됩니다. 예를 들어 COUNT(DISTINCT x) 함수를 호출하면 x 열에 있는 NULL이 아닌 값의 총 개수 대신 X 열의 고유 값 개수가 반환됩니다.

스칼라 함수

스칼라 함수는 한 번에 한 행의 값을 계산합니다.

ABS(X)

인수 X의 절대값을 반환합니다.

COALESCE(X, Y, ...)

NULL이 아닌 첫 번째 인수의 복사본을 반환합니다. 모든 인수가 NULL이면 NULL이 반환됩니다. 인수는 최소한 두 개 이상이어야 합니다.

GLOB(X, Y)

이 함수는 X GLOB Y 구문을 구현하는 데 사용됩니다.

IFNULL(X, Y)

NULL이 아닌 첫 번째 인수의 복사본을 반환합니다. 두 인수가 모두 NULL이면 NULL이 반환됩니다. 이 함수의 비헤이비어는 COALESCE()와 같습니다.

HEX(X)

인수를 BLOB 저장소 유형 값으로 해석합니다. 결과는 이 값의 내용을 16진수로 렌더링한 것입니다.

LAST_INSERT_ROWID()

현재 SQLConnection을 통해 데이터베이스에 삽입된 마지막 행의 행 식별자(생성된 기본 키)를 반환합니다. 이 값은 SQLConnection.lastInsertRowID 속성이 반환하는 값과 동일합니다.

LENGTH(X)

X의 문자열 길이를 문자 수 단위로 반환합니다.

LIKE(X, Y [, Z])

이 함수는 SQL의 X LIKE Y [ESCAPE Z] 구문을 구현하는 데 사용됩니다. 선택적 절인 ESCAPE가 있으면 세 개의 인수를 사용하여 함수가 호출됩니다. 그렇지 않으면 두 인수만 사용하여 호출됩니다.

LOWER(X)

X 문자열의 모든 문자를 소문자로 변환한 복사본을 반환합니다.

LTRIM(X) LTRIM(X, Y)

X의 왼쪽에서 공백을 제거하여 구성한 문자열을 반환합니다. Y 인수를 지정하면 X의 왼쪽에서 Y에 있는 모든 문자를 제거합니다.

MAX(X, Y, ...)

최대값을 갖는 인수를 반환합니다. 인수는 숫자뿐 아니라 문자열일 수 있습니다. 정의된 정렬 순서에 따라 최대값을 결정합니다. MAX()는 인수가 2개 이상이면 단순 함수이지만 인수가 하나뿐이면 집계 함수입니다.

MIN(X, Y, ...)

최소값을 갖는 인수를 반환합니다. 인수는 숫자뿐 아니라 문자열일 수 있습니다. 정의된 정렬 순서에 따라 최소값을 결정합니다. MIN()은 인수가 2개 이상이면 단순 함수이지만 인수가 하나뿐이면 집계 함수입니다.

NULLIF(X, Y)

인수가 서로 다르면 첫 번째 인수를, 그렇지 않으면 NULL을 반환합니다.

QUOTE(X)

이 루틴은 다른 SQL 명령문에 포함할 수 있는 인수 값인 문자열을 반환합니다. 문자열은 작은따옴표로 묶이며 필요에 따라 내부에 있는 따옴표에 이스케이프가 추가됩니다. BLOB 저장소 클래스는 16진수 리터럴로 인코딩됩니다. 이 함수는 실행 취소/다시 실행 기능을 구현하는 트리거를 작성할 때 유용합니다.

RANDOM(*)

-9223372036854775808에서 9223372036854775807 사이의 의사 난수 정수를 반환합니다. 이 난수 값은 crypto-strong이 아닙니다.

RANDOMBLOB(N)

의사 난수 바이트가 들어 있는 N바이트 BLOB을 반환합니다. N은 양의 정수여야 합니다. 이 난수 값은 crypto-strong이 아닙니다. N 값이 음수이면 단일 바이트가 반환됩니다.

ROUND(X) ROUND(X, Y)

숫자 X를 소수점 오른쪽 Y자리로 반올림합니다. Y 인수를 생략하면 0이 사용됩니다.

RTRIM(X) RTRIM(X, Y)

X의 오른쪽에서 공백을 제거하여 구성한 문자열을 반환합니다. Y 인수를 지정하면 X의 오른쪽에서 Y에서 있는 모든 문자를 제거합니다.

SUBSTR(X, Y, Z)

입력 문자열 X에서 Y번째 문자로 시작되고 길이가 Z자인 부분 문자열을 반환합니다. X에서 가장 왼쪽에 있는 문자의 인덱스 위치는 1입니다. Y가 음수이면 왼쪽이 아닌 오른쪽부터 계산하여 부분 문자열의 첫 번째 문자를 찾습니다.

TRIM(X) TRIM(X, Y)

X의 오른쪽에서 공백을 제거하여 구성한 문자열을 반환합니다. Y 인수를 지정하면 X의 오른쪽에서 Y에서 있는 모든 문자를 제거합니다.

TYPEOF(X)

X 표현식의 유형을 반환합니다. 가능한 반환 값은 'null', 'integer', 'real', 'text' 및 'blob'입니다. 데이터 유형에 대한 자세한 내용은 데이터 유형 지원을 참조하십시오.

UPPER(X)

입력 문자열 X를 모두 대문자로 변환한 복사본을 반환합니다.

ZEROBLOB(N)

N바이트의 0x00이 들어 있는 BLOB을 반환합니다.

날짜 및 시간 형식 함수

날짜 및 시간 형식 함수는 형식이 지정된 날짜 및 시간 데이터를 만드는 데 사용되는 스칼라 함수 그룹입니다. 이러한 함수는 문자열 및 숫자 값을 계산하고 반환하며, DATE 데이터 유형에는 사용할 수 없습니다. 선언된 데이터 유형이 DATE인 열의 데이터에 대해 이러한 함수를 사용하면 정상적으로 작동하지 않습니다.

DATE(T, ...)

DATE() 함수는 YYYY-MM-DD 서식의 날짜가 들어 있는 문자열을 반환합니다. 첫 번째 매개 변수(T)는 시간 서식에 있는 서식의 시간 문자열을 지정합니다. 시간 문자열 뒤에 수정자를 개수에 제한 없이 지정할 수 있습니다. 수정자에 다양한 수정자가 나와 있습니다.

TIME(T, ...)

TIME() 함수는 HH:MM:SS 서식의 시간이 들어 있는 문자열을 반환합니다. 첫 번째 매개 변수(T)는 시간 서식에 있는 서식의 시간 문자열을 지정합니다. 시간 문자열 뒤에 수정자를 개수에 제한 없이 지정할 수 있습니다. 수정자에 다양한 수정자가 나와 있습니다.

DATETIME(T, ...)

DATETIME() 함수는 YYYY-MM-DD HH:MM:SS 서식의 날짜 및 시간이 들어 있는 문자열을 반환합니다. 첫 번째 매개 변수(T)는 시간 서식에 있는 서식의 시간 문자열을 지정합니다. 시간 문자열 뒤에 수정자를 개수에 제한 없이 지정할 수 있습니다. 수정자에 다양한 수정자가 나와 있습니다.

JULIANDAY(T, ...)

JULIANDAY() 함수는 기원전 4714년 11월 24일 그리니치 정오와 제공된 날짜 사이에 경과한 날짜 수를 나타내는 숫자를 반환합니다. 첫 번째 매개 변수(T)는 시간 서식에 있는 서식의 시간 문자열을 지정합니다. 시간 문자열 뒤에 수정자를 개수에 제한 없이 지정할 수 있습니다. 수정자에 다양한 수정자가 나와 있습니다.

STRFTIME(F, T, ...)

STRFTIME() 루틴은 첫 번째 인수인 F에 지정된 서식 문자열에 따라 서식이 지정된 날짜를 반환합니다. 서식 문자열에 다음과 같은 대체 문자를 사용할 수 있습니다.

%d - 날짜

%f - 분수 초 SS.SSS

%H - 시간 00-24

%j - 연중 날짜 001-366

%J - Julian 날짜 번호

%m -월 01-12

%M - 분 00-59

%s - 1970-01-01 이후 경과한 초

%S - 초 00-59

%w - 요일 0-6(일요일 = 0)

%W - 연중 주 00-53

%Y - 연도 0000-9999

%% - %

두 번째 매개 변수(T)는 시간 서식에 있는 서식의 시간 문자열을 지정합니다. 시간 문자열 뒤에 수정자를 개수에 제한 없이 지정할 수 있습니다. 수정자에 다양한 수정자가 나와 있습니다.

시간 형식

시간 문자열은 다음 형식 중 하나일 수 있습니다.

YYYY-MM-DD

2007-06-15

YYYY-MM-DD HH:MM

2007-06-15 07:30

YYYY-MM-DD HH:MM:SS

2007-06-15 07:30:59

YYYY-MM-DD HH:MM:SS.SSS

2007-06-15 07:30:59.152

YYYY-MM-DDTHH:MM

2007-06-15T07:30

YYYY-MM-DDTHH:MM:SS

2007-06-15T07:30:59

YYYY-MM-DDTHH:MM:SS.SSS

2007-06-15T07:30:59.152

HH:MM

07:30(날짜는 2000-01-01)

HH:MM:SS

07:30:59(날짜는 2000-01-01)

HH:MM:SS.SSS

07:30:59:152(날짜는 2000-01-01)

now

현재 날짜 및 시간(협정 세계시)

DDDD.DDDD

Julian 날짜 번호(부동 소수점 숫자)

이러한 형식의 T 문자는 날짜와 시간을 구분하는 리터럴 문자 "T"입니다. 시간만 포함되어 있는 형식에서는 날짜를 2001-01-01로 가정합니다.

수정자

시간 문자열 뒤에 날짜를 수정하거나 날짜를 다르게 해석하는 0개 이상의 수정자를 추가할 수 있습니다. 사용 가능한 수정자는 다음과 같습니다.

NNN days

시간에 추가할 날짜 수입니다.

NNN hours

시간에 추가할 시간 수입니다.

NNN minutes

시간에 추가할 분 수입니다.

NNN.NNNN seconds

시간에 추가할 초 및 밀리초 수입니다.

NNN months

시간에 추가할 개월 수입니다.

NNN years

시간에 추가할 연도 수입니다.

start of month

시간을 월초로 되돌립니다.

start of year

시간을 연초로 되돌립니다.

start of day

시간을 해당 날짜의 자정으로 되돌립니다.

weekday N

시간을 지정된 요일로 옮깁니다. 0 = 일요일, 1 = 월요일 등입니다.

localtime

날짜를 현지 시간으로 변환합니다.

utc

날짜를 협정 세계시로 변환합니다.

연산자

SQL에서는 대부분의 프로그래밍 언어에 있는 일반적인 연산자 및 SQL에만 사용되는 몇 가지 연산자를 비롯하여 매우 다양한 연산자를 지원합니다.

일반적인 연산자

SQL 블록에서 다음과 같은 이항 연산자를 사용할 수 있으며, 우선 순위가 높은 연산자부터 나열되어 있습니다.

*    /    % 
+    - 
<< >> &     | 
< >=   > >= 
=    ==   !=   <> IN 
AND 
OR

지원되는 단항 접두어 연산자는 다음과 같습니다.

 !    ~    NOT

COLLATE 연산자는 단항 접미어 연산자로 간주할 수 있습니다. COLLATE 연산자는 우선 순위가 가장 높습니다. 이 연산자는 항상 모든 접두어 단항 연산자 또는 이항 연산자보다 우선적으로 결합됩니다.

같음 연산자와 같지 않음 연산자에는 두 가지 변형이 있습니다. 같음 연산자는 = 또는 ==일 수 있습니다. 같지 않음 연산자는 != 또는 <>입니다.

|| 연산자는 피연산자인 두 문자열을 연결하는 문자열 결합 연산자입니다.

% 연산자는 왼쪽 피연산자를 오른쪽 피연산자로 나눈 나머지를 출력합니다.

결과가 문자열인 || 결합 연산자를 제외하고 모든 이항 연산자의 결과는 숫자 값입니다.

SQL 연산자

LIKE

LIKE 연산자는 패턴 일치 비교를 수행합니다.

expr     ::=  (column-name | expr) LIKE pattern 
pattern  ::=  '[ string | % | _ ]'

LIKE 연산자의 오른쪽 피연산자에는 패턴이 들어 있고 오른쪽 피연산자에는 패턴과 비교할 문자열이 들어 있습니다. 패턴의 백분율 심볼(%)은 문자열에서 0개 이상의 모든 문자 시퀀스와 일치하는 와일드카드 문자입니다. 패턴의 밑줄(_)은 문자열에서 모든 단일 문자와 일치합니다. 다른 문자는 모두 자신과 일치하거나 해당 소/대문자와 일치합니다. 즉, 대/소문자를 구분하지 않고 비교됩니다. 데이터베이스 엔진에서는 7비트 라틴 문자의 대/소문자만 인식합니다. 따라서 8비트 iso8859 문자나 UTF-8 문자의 경우 LIKE 연산자에서 대/소문자를 구분합니다. 예를 들어 'a' LIKE 'A' 표현식은 TRUE이지만 'æ' LIKE 'Æ' 표현식은 FALSE입니다. 라틴 문자의 대/소문자 구분 여부를 변경하려면 SQLConnection.caseSensitiveLike 속성을 사용합니다.

선택적 절인 ESCAPE가 있으면 ESCAPE 키워드 뒤에 오는 표현식이 단일 문자로 구성된 문자열로 평가되어야 합니다. LIKE 패턴에서 이 문자를 사용하여 리터럴 백분율 또는 밑줄 문자와 비교할 수 있습니다. 이스케이프 문자 뒤에 백분율 심볼, 밑줄 또는 이스케이프 문자 자체가 나오면 문자열에서 리터럴 백분율 심볼, 밑줄 또는 이스케이프 문자와 각각 일치합니다.

GLOB

GLOB 연산자는 LIKE와 비슷하지만 와일드카드에 Unix 파일 글로빙 구문이 사용됩니다. LIKE와는 달리 GLOB은 대/소문자를 구분합니다.

IN

IN 연산자는 왼쪽 피연산자가 오른쪽 피연산자(괄호로 묶은 값 집합)의 값 중 하나와 같은지 여부를 계산합니다.

in-expr         ::=  expr [NOT] IN ( value-list ) | 
                     expr [NOT] IN ( select-statement ) | 
                     expr [NOT] IN [database-name.] table-name 
value-list      ::=  literal-value [, literal-value]*

오른쪽 피연산자는 쉼표로 구분된 리터럴 값 집합이거나 SELECT 문의 결과일 수 있습니다. SELECT 문을 IN 연산자의 오른쪽 피연산자로 사용하는 방법 및 제한 사항은 SELECT 문을 참조하십시오.

BETWEEN...AND

BETWEEN...AND 연산자는 >= 및 <= 연산자가 있는 두 표현식을 사용하는 것과 같습니다. 예를 들어 x BETWEEN y AND z 표현식은 x >= y AND x <= z와 같습니다.

NOT

NOT 연산자는 부정 연산자입니다. GLOB, LIKE 및 IN 연산자 앞에 NOT 키워드를 추가하여 정반대의 논리로 테스트할 수 있습니다. 즉, 값이 지정된 패턴과 일치하지 않는지 확인할 수 있습니다.

매개 변수

매개 변수는 표현식에서 리터럴 값에 대한 자리 표시자를 지정하며, 이러한 자리 표시자는 런타임에 SQLStatement.parameters 연결 배열에 값을 할당하여 채워집니다. 매개 변수에는 다음과 같은 세 가지 형태가 있습니다.

?

물음표는 인덱싱된 매개 변수를 나타냅니다. 명령문에서 매개 변수의 순서에 따라 매개 변수에 0부터 시작하는 숫자 인덱스 값이 할당됩니다.

:AAAA

콜론 뒤에 식별자 이름을 추가하면 AAAA라는 이름으로 명명된 매개 변수가 사용됩니다. SQL 명령문에서의 순서에 따라 명명된 매개 변수에 번호를 매길 수도 있습니다. 혼동을 피하려면 명명된 매개 변수와 번호가 매겨진 매개 변수 중 하나만 사용하는 것이 좋습니다.

@AAAA

"at 기호"는 콜론과 같습니다.

지원되지 않는 SQL 기능

다음은 Adobe AIR에서 지원되지 않는 표준 SQL 요소의 목록입니다.
FOREIGN KEY 제약 조건
FOREIGN KEY 제약 조건은 파싱되지만 적용되지 않습니다.

트리거
FOR EACH STATEMENT 트리거는 지원되지 않으며 모든 트리거는 FOR EACH ROW여야 합니다. INSTEAD OF 트리거는 테이블에서 지원되지 않습니다. INSTEAD OF 트리거는 뷰에만 사용할 수 있습니다. 재귀 트리거(자신을 트리거하는 트리거)는 지원되지 않습니다.

ALTER TABLE
ALTER TABLE 명령의 RENAME TABLE 및 ADD COLUMN 변형만 지원됩니다. 다른 종류의 ALTER TABLE 작업(예: DROP COLUMN, ALTER COLUMN, ADD CONSTRAINT 등)은 무시됩니다.

중첩된 트랜잭션
단일 활성 트랜잭션만 사용할 수 있습니다.

RIGHT 및 FULL OUTER JOIN
RIGHT OUTER JOIN 또는 FULL OUTER JOIN은 지원되지 않습니다.

업데이트 가능한 뷰
뷰는 읽기 전용입니다. 뷰에 대해서는 DELETE, INSERT 또는 UPDATE 문을 실행할 수 없습니다. 뷰에 대해 DELETE, INSERT 또는 UPDATE를 시도할 때 발생하는 INSTEAD OF 트리거는 지원되며, 이를 통해 지원하는 테이블을 트리거 본문에서 업데이트할 수 있습니다.

GRANT 및 REVOKE
데이터베이스는 일반적인 디스크 파일이며 내부 운영 체제의 기본적인 파일 액세스 권한만 적용할 수 있습니다. 클라이언트/서버 RDBMS에서 자주 사용되는 GRANT 및 REVOKE 명령은 구현되지 않습니다.

다음과 같은 SQL 요소 및 SQLite 기능은 일부 SQLite 구현에서 지원되지만 Adobe AIR에서는 지원되지 않습니다. 이러한 기능은 대부분 SQLConnection 클래스의 메서드를 통해 사용할 수 있습니다.
트랜잭션 관련 SQL 요소(BEGIN, END, COMMIT, ROLLBACK)
이 기능은 SQLConnection 클래스의 트랜잭션 관련 메서드인 SQLConnection.begin(), SQLConnection.commit() 및 SQLConnection.rollback()을 통해 사용할 수 있습니다.

ANALYZE
이 기능은 SQLConnection.analyze() 메서드를 통해 사용할 수 있습니다.

ATTACH
이 기능은 SQLConnection.attach() 메서드를 통해 사용할 수 있습니다.

COPY
이 명령문은 지원되지 않습니다.

CREATE VIRTUAL TABLE
이 명령문은 지원되지 않습니다.

DETACH
이 기능은 SQLConnection.detach() 메서드를 통해 사용할 수 있습니다.

PRAGMA
이 명령문은 지원되지 않습니다.

VACUUM
이 기능은 SQLConnection.compact() 메서드를 통해 사용할 수 있습니다.

시스템 테이블에 액세스할 수 없음
SQL 명령문에서 "sqlite_" 접두어가 있는 sqlite_master 등의 시스템 테이블을 사용할 수 없습니다. 런타임에는 객체 지향 방식으로 스키마 데이터에 액세스할 수 있는 스키마 API가 포함되어 있습니다. 자세한 내용은 SQLConnection.loadSchema() 메서드를 참조하십시오.

일반 표현식 함수(MATCH() 및 REGEX())
이러한 함수는 SQL 명령문에서 사용할 수 없습니다.

다음과 같은 기능은 여러 SQLite 구현과 Adobe AIR 간에 차이점이 있습니다.

인덱싱된 명령문 매개 변수
여러 구현에서는 인덱싱된 명령문 매개 변수가 1부터 시작됩니다. 그러나 Adobe AIR의 인덱싱된 명령문 매개 변수는 0부터 시작됩니다. 즉, 첫 번째 매개 변수에는 인덱스 0이 지정되고 두 번째 매개 변수에는 인덱스 1이 지정되는 방식입니다.

INTEGER PRIMARY KEY 열 정의
여러 구현에서 정확하게 INTEGER PRIMARY KEY로 정의된 열만 테이블에 대한 실제 기본 키 열로 사용됩니다. 이러한 구현에서는 일반적으로 INTEGER의 동의어(예: int)인 다른 데이터 유형을 사용해도 열이 내부 기본 키로 사용되지 않습니다. 그러나 Adobe AIR에서는 int 데이터 유형과 INTEGER의 다른 동의어가 정확하게 INTEGER와 같은 것으로 간주됩니다. 따라서 int PRIMARY KEY로 정의된 열이 테이블에 대한 내부 기본 키로 사용됩니다. 자세한 내용은 "CREATE TABLE" 및 "열 선호도" 단원을 참조하십시오.

추가 SQL 기능

다음과 같은 열 선호도 유형은 SQLite에서 기본적으로 지원되지 않지만 Adobe AIR에서는 지원됩니다. SQL의 모든 키워드와 마찬가지로 이러한 데이터 유형 이름에는 대/소문자가 구분되지 않습니다.
부울
Boolean 클래스에 해당합니다.

DATE
Date 클래스에 해당합니다.

int
int 클래스에 해당합니다(INTEGER 열 선호도와 동일).

Number
Number 클래스에 해당합니다(REAL 열 선호도와 동일).

Object
Object 클래스 또는 AMF3을 사용하여 직렬화 및 비직렬화할 수 있는 모든 하위 클래스에 해당합니다. 여기에는 사용자 정의 클래스를 비롯한 대부분의 클래스가 포함되지만 표시 객체 및 표시 객체가 속성으로 포함되어 있는 일부 클래스는 제외됩니다.

String
String 클래스에 해당합니다(TEXT 열 선호도와 동일).

XML
ActionScript(E4X) XML 클래스에 해당합니다.

XMLList
ActionScript(E4X) XMLList 클래스에 해당합니다.

다음과 같은 리터럴 값은 SQLite에서 기본적으로 지원되지 않지만 Adobe AIR에서는 지원됩니다.

true
BOOLEAN 열에서 리터럴 부울 값인 true를 나타내는 데 사용됩니다.

false
BOOLEAN 열에서 리터럴 부울 값인 false를 나타내는 데 사용됩니다.