지원되는 SQL 구문다음은 Adobe AIR SQL 데이터베이스 엔진에서 지원되는 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... 형태)를 사용하는 것과 같습니다. UPDATEupdate 명령은 테이블의 기존 레코드를 변경합니다. sql-statement ::= UPDATE [database-name.] table-name SET column1=value1, column2=value2,... [WHERE expr] 이 명령은 UPDATE 키워드와 레코드를 업데이트할 테이블의 이름으로 구성됩니다. SET 키워드 다음에 열의 이름과 해당 열이 변경될 값을 쉼표로 구분해 나열합니다. WHERE 절 표현식은 레코드가 업데이트될 행 또는 행들을 제공합니다. DELETEDELETE 명령은 테이블에서 레코드를 제거하는 데 사용됩니다.
sql-statement ::= DELETE FROM [database-name.] table-name [WHERE expr] 이 명령은 DELETE FROM 키워드와 레코드를 제거할 테이블의 이름으로 구성됩니다. WHERE 절이 없으면 테이블의 모든 행이 제거됩니다. WHERE 절을 제공한 경우에는 표현식과 일치하는 행만 제거됩니다. WHERE 절 표현식은 부울 값으로 확인되어야 합니다. 허용되는 표현식의 정의는 표현식을 참조하십시오. 데이터 정의 명령문데이터 정의 명령문은 테이블, 뷰, 인덱스 및 트리거 등의 데이터베이스 객체를 만들고 수정하고 제거하는 데 사용됩니다. 다음과 같은 데이터 정의 명령문이 지원됩니다.
CREATE TABLECREATE 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 TABLEALTER 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 문에 허용되는 모든 형태를 취할 수 있지만 다음과 같은 제한 사항이 있습니다.
ALTER TABLE 문의 실행 시간은 테이블의 데이터 양과 관계가 없습니다. DROP TABLEDROP 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 INDEXCREATE 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 INDEXDROP INDEX 문은 CREATE INDEX 문으로 추가된 인덱스를 제거합니다. 지정된 인덱스는 데이터베이스 파일에서 완전히 제거됩니다. 인덱스를 복구하려면 적절한 CREATE INDEX 명령을 다시 입력해야 합니다. sql-statement ::= DROP INDEX [IF EXISTS] [database-name.] index-name 기본적으로 DROP INDEX 문은 데이터베이스 파일의 크기를 줄이지 않습니다. 빈 공간이 데이터베이스에 유지되며 이후 INSERT 작업에 사용됩니다. 데이터베이스의 여유 공간을 제거하려면 SQLConnection.clean() 메서드를 사용합니다. 초기에 데이터베이스를 만들 때 autoClean 매개 변수를 true로 설정하면 공간이 자동으로 해제됩니다. CREATE VIEWCREATE 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 VIEWDROP VIEW 문은 CREATE VIEW 문으로 만든 뷰를 제거합니다. sql-statement ::= DROP VIEW [IF EXISTS] view-name 지정된 view-name은 삭제할 뷰의 이름입니다. 뷰가 데이터베이스에서 제거되지만 내부 테이블의 데이터는 수정되지 않습니다. CREATE TRIGGERCREATE 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의 유형에 따라 다릅니다.
지정된 타이밍(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 TRIGGERDROP TRIGGER 문은 CREATE TRIGGER 문으로 만든 트리거를 제거합니다. sql-statement ::= DROP TRIGGER [IF EXISTS] [database-name.] trigger-name 트리거가 데이터베이스에서 삭제됩니다. 연결된 테이블이 삭제되면 트리거가 자동으로 삭제됩니다. 특수 명령문 및 절이 단원에서는 런타임에서 제공하는 SQL을 확장하는 몇 가지 절과 여러 명령문, 주석 및 표현식에 사용할 수 있는 두 가지 언어 요소에 대해 설명합니다. COLLATECOLLATE 절은 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 값을 비교할 때마다 다음 규칙에 따라 데이터 정렬 시퀀스를 사용하여 비교 결과를 결정합니다.
EXPLAINEXPLAIN 명령 수정자는 표준이 아닌 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입니다. 다섯 가지 충돌 알고리즘에 대한 설명은 다음과 같습니다.
INSERT 또는 UPDATE 문의 OR 절에 지정된 알고리즘은 CREATE TABLE 문에 지정된 모든 알고리즘을 재정의합니다. CREATE TABLE 문이나 실행 중인 INSERT 또는 UPDATE 문에 지정된 알고리즘이 없으면 ABORT 알고리즘이 사용됩니다. REINDEXREINDEX 명령은 하나 이상의 인덱스를 삭제하고 다시 만드는 데 사용됩니다. 이 명령은 데이터 정렬 시퀀스의 정의가 변경되었을 때 유용합니다. 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 표현식을 비롯한 몇 가지 일반적인 경우 표현식은 부울 값으로 확인되어야 합니다. 이 조건에 맞는 표현식 유형은 다음과 같습니다.
리터럴 값리터럴 숫자 값은 정수 또는 부동 소수점 숫자로 작성됩니다. 공학 표기법도 지원됩니다. 마침표(.) 문자가 항상 소수점으로 사용됩니다. 문자열 리터럴은 문자열을 작은따옴표(')로 묶어 나타냅니다. 문자열 안에 작은따옴표 하나를 포함하려면 ''와 같이 작은따옴표 두 개를 연속으로 추가합니다. 부울 리터럴은 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 절과 함께 사용됩니다.
인수 하나를 받는 위와 같은 집계 함수에서는 인수 앞에 DISTINCT 키워드를 사용할 수 있습니다. 이렇게 하면 중복 요소가 필터링된 후 집계 함수에 전달됩니다. 예를 들어 COUNT(DISTINCT x) 함수를 호출하면 x 열에 있는 NULL이 아닌 값의 총 개수 대신 X 열의 고유 값 개수가 반환됩니다. 스칼라 함수스칼라 함수는 한 번에 한 행의 값을 계산합니다.
날짜 및 시간 형식 함수날짜 및 시간 형식 함수는 형식이 지정된 날짜 및 시간 데이터를 만드는 데 사용되는 스칼라 함수 그룹입니다. 이러한 함수는 문자열 및 숫자 값을 계산하고 반환하며, DATE 데이터 유형에는 사용할 수 없습니다. 선언된 데이터 유형이 DATE인 열의 데이터에 대해 이러한 함수를 사용하면 정상적으로 작동하지 않습니다.
시간 형식시간 문자열은 다음 형식 중 하나일 수 있습니다.
이러한 형식의 T 문자는 날짜와 시간을 구분하는 리터럴 문자 "T"입니다. 시간만 포함되어 있는 형식에서는 날짜를 2001-01-01로 가정합니다. 수정자시간 문자열 뒤에 날짜를 수정하거나 날짜를 다르게 해석하는 0개 이상의 수정자를 추가할 수 있습니다. 사용 가능한 수정자는 다음과 같습니다.
연산자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 연결 배열에 값을 할당하여 채워집니다. 매개 변수에는 다음과 같은 세 가지 형태가 있습니다.
지원되지 않는 SQL 기능다음은 Adobe AIR에서 지원되지 않는 표준 SQL 요소의 목록입니다.
다음과 같은 SQL 요소 및 SQLite 기능은 일부 SQLite 구현에서 지원되지만 Adobe AIR에서는 지원되지 않습니다. 이러한 기능은 대부분 SQLConnection 클래스의 메서드를 통해 사용할 수 있습니다.
다음과 같은 기능은 여러 SQLite 구현과 Adobe AIR 간에 차이점이 있습니다.
추가 SQL 기능다음과 같은 열 선호도 유형은 SQLite에서 기본적으로 지원되지 않지만 Adobe AIR에서는 지원됩니다. SQL의 모든 키워드와 마찬가지로 이러한 데이터 유형 이름에는 대/소문자가 구분되지 않습니다.
다음과 같은 리터럴 값은 SQLite에서 기본적으로 지원되지 않지만 Adobe AIR에서는 지원됩니다.
|
|