Sintaxe SQL para a qual há suporteAs seguintes litas de sintaxe SQL são suportadas pelo mecanismo de banco de dados SQL Adobe AIR. Essas listagens estão divididas em explicações de tipos de instrução e cláusula diferentes, expressões, funções internas e operadores. São abordados os tópicos a seguir:
Sintaxe SQL geralAlém da sintaxe específica de várias instruções e expressões, estão são as regras gerais da sintaxe SQL:
Instruções para manipulação de dadosAs instruções para manipulação de dados são as instruções SQL mais usadas. Elas são usadas para recuperar, adicionar, modificar e remover dados das tabelas de banco de dados. Estas são as instruções para manipulação de dados para as quais há suporte: SELECT, INSERT, UPDATE e DELETE. SELECT A instrução SELECT é usada para consultar o banco de dados. O resultado de uma instrução SELECT é zero ou mais linhas de dados em que cada uma tem um número de colunas fixo. O número de colunas no resultado é especificado pelo nome da coluna result ou pela lista de expressão entre as palavras-chave SELECT e as opcionais 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 Qualquer expressão arbitrária pode ser usada como resultado. Caso uma expressão de resultado seja *, todas as colunas de todas as tabelas serão substituídas por essa expressão. Caso a expressão seja o nome de uma tabela seguido de .*, o resultado será igual a todas as colunas nessa única tabela. A palavra-chave DISTINCT faz com que um subconjunto de linhas de resultado seja retornado, no qual cada linha de resultado é diferente. Valores NULL não são tratados como distintos entre si. O comportamento padrão é de que todas as linhas de resultado sejam retornadas, as quais podem ser explicitadas com a palavra-chave ALL. A consulta é executada em uma ou mais tabelas especificadas após a palavra-chave FROM. Caso vários nomes de tabela estejam separados por vírgulas, a consulta usa a junção cruzada das várias tabelas. A sintaxe JOIN também pode ser usada para especificar como as tabelas são unidas. O único tipo de junção externa para o qual há suporte é LEFT OUTER JOIN. A expressão da cláusula ON em join-args deve ser resolvida como um valor booleano. Uma subconsulta entre parênteses pode ser usada como uma tabela na cláusula FROM. Toda a cláusula FROM pode ser omitida, no caso de o resultado ser uma única linha com os valores da lista de expressões result. A cláusula WHERE é usada para limitar o número de linhas recuperadas pela consulta. As expressões de cláusula WHERE devem ser resolvidas como um valor booleano. Como a filtragem de cláusula WHERE é realizada antes de qualquer agrupamento, as expressões de cláusula WHERE talvez não incluam funções agregadas. A cláusula GROUP BY faz com que uma ou mais linhas do resultado sejam combinadas com uma única linha de saída. Uma cláusula GROUP BY é especialmente útil quando o resultado contém funções agregadas. As expressões na cláusula GROUP BY não precisam ser expressões exibidas na lista de expressões SELECT. A cláusula HAVING é semelhante a WHERE ao limitar as linhas retornadas pela instrução. No entanto, a cláusula HAVING se aplica após a ocorrência de qualquer agrupamento especificado por uma cláusula GROUP BY. Consequentemente, a expressão HAVING pode se referir a valores que incluem funções agregadas. Uma expressão de cláusula HAVING não precisa ser exibida na lista SELECT. Assim como uma expressão WHERE, uma expressão HAVING deve ser resolvida como um valor booleano. A cláusula ORDER BY faz com que as linhas de saída sejam classificadas. O argumento sort-expr-list da cláusula ORDER BY é uma lista de expressões usadas como chave da classificação. As expressões não precisam fazer parte do resultado de uma simples SELECT, mas em uma SELECT composta (uma SELECT usando um dos operadores compound-op), cada expressão de classificação deve corresponder exatamente a uma das colunas de resultado. Cada expressão de classificação pode ser seguida de uma cláusula sort-order que consiste na palavra-chave COLLATE e no nome de uma função de intercalação usada para classificar o texto e/ou a palavra-chave ASC ou DESC para especificar a ordem de classificação (crescente ou decrescente). A sort-order pode ser omitida e o padrão (ordem crescente) é usado. Para obter uma definição da cláusula COLLATE e das funções de intercalação, consulte COLLATE. A sort-order pode ser omitida e o padrão (ordem crescente) é usado. Para obter uma definição da cláusula COLLATE e das funções de intercalação, consulte COLLATE. A cláusula LIMIT coloca um limite superior sobre o número de linhas retornadas no resultado. Uma LIMIT negativa não indica nenhum limite superior. A OFFSET opcional que segue LIMIT especifica quantas linhas ignorar no início do conjunto de resultados. Em uma consulta SELECT composta, a cláusula LIMIT talvez só seja exibida após a instrução SELECT final, e o limite é aplicado a toda a consulta. Observe que, caso a palavra-chave OFFSET seja usada na cláusula LIMIT, o limite é o primeiro inteiro e a distância é o segundo inteiro. Caso seja usada uma vírgula no lugar da palavra-chave OFFSET, a distância é o primeiro número e o limite, o segundo. Essa contradição aparente é intencional — ela maximiza a compatibilidade com sistemas de banco de dados SQL herdados. Uma SELECT composta é formada por duas ou mais instruções SELECT simples conectadas por um dos operadores UNION, UNION ALL, INTERSECT ou EXCEPT. Em uma SELECT composta, todas as instruções SELECT constituintes devem especificar o mesmo número de colunas de resultado. Só pode haver uma única cláusula ORDER BY após a instrução SELECT final (e antes da única cláusula LIMIT, caso haja uma especificada). Os operadores UNION e UNION ALL integram os resultados das instruções SELECT anterior e posterior em uma única tabela. A diferença é que na UNION, todas as linhas de resultado são distintas, mas em UNION ALL talvez haja cópias. O operador INTERSECT usa a intersecção dos resultados das instruções SELECT anterior e posterior. EXCEPT usa o resultado da SELECT anterior após a remoção dos resultados da SELECT seguinte. Quando três ou mais instruções SELECT estão conectadas a uma composta, elas são agrupadas da primeira à última. Para obter uma definição das expressões permitidas, consulte Expressões A partir do AIR 2.5, o operador SQL CAST conta com suporte durante a leitura para converter dados BLOB em objetos ByteArray do ActionScript. Por exemplo, o código a seguir lê dados brutos que não estão armazenados no formato AMF e os armazena em um objeto 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; INSERTA instrução INSERT acompanha duas formas básicas, sendo usada para preencher tabelas com dados.
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 A primeira forma (com a palavra-chave VALUES) cria uma única linha nova em uma tabela existente. Caso nenhuma column-list seja especificada, o número de valores deve ser igual ao número de colunas na tabela. Caso uma column-list seja especificada, o número de valores deve corresponder ao número de colunas especificadas. As colunas da tabela que não são exibidas na lista são preenchidas com o valor definido padrão quando a tabela é criada, ou com NULL caso nenhum valor padrão seja definido. A segunda forma da instrução INSERT usa os dados de uma instrução SELECT. O número de colunas no resultado da SELECT deve corresponder exatamente ao número de colunas na tabela caso column-list não esteja especificada, ou deve corresponder ao número de colunas nomeadas na column-list. É criada uma nova entrada na tabela para todas as linhas do resultado de SELECT. A SELECT pode ser simples ou composta. Para obter uma definição das instruções SELECT permitidas, consulte SELECT. A conflict-algorithm opcional permite a especificação de um algoritmo para resolução de conflitos de restrição a ser usado durante esse comando único. Para obter uma explicação e definição do conflito de algoritmos, consulte Instruções especiais e cláusulas. As duas formas REPLACE INTO da instrução são equivalentes ao uso da forma INSERT [OR conflict-algorithm] padrão com o algoritmo de conflito REPLACE (ou seja, a forma INSERT OR REPLACE...). As duas formas REPLACE INTO da instrução são equivalentes ao uso da forma INSERT [OR conflict-algorithm] padrão com o algoritmo de conflito REPLACE (ou seja, a forma INSERT OR REPLACE...). UPDATEO comando update altera os registros existentes em uma tabela. sql-statement ::= UPDATE [database-name.] table-name SET column1=value1, column2=value2,... [WHERE expr] O comando consiste na palavra-chave UPDATE seguida do nome do tabela cujos registros você deseja atualizar. Depois da palavra-chave SET, forneça o nome da coluna e o valor para o qual a coluna deve ser alterada, como uma lista separada por vírgulas. A expressão da cláusula WHERE indica a linha ou linhas em que os registros são atualizados. DELETEO comando de exclusão é usado para remover registros de uma tabela.
sql-statement ::= DELETE FROM [database-name.] table-name [WHERE expr] O comando consiste nas palavras-chave DELETE FROM seguidas do nome da tabela da qual os registros devem ser removidos. Sem uma cláusula WHERE, todas as linhas da tabela são removidas. Caso uma cláusula WHERE seja fornecida, apenas essas linhas correspondentes à expressão são removidas. A expressão da cláusula WHERE deve ser resolvida como um valor booleano. Para obter uma definição das expressões permitidas, consulte Expressões Instruções para definição de dados
As instruções para definição dos dados são usadas para criar, modificar e remover objetos de banco de dados como tabelas, exibições, índices e disparadores. Estas são as instruções para definição de dados para as quais há suporte:
CREATE TABLEUma instrução CREATE TABLE consiste nas palavras-chave CREATE TABLE seguidas do nome da nova tabela e, em seguida, de uma lista das definições e restrições da coluna (entre parênteses). O nome da tabela pode ser um identificador ou uma string.
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]* Cada definiçăo de coluna é o nome da coluna seguido do tipo de dados da coluna e, em seguida, de uma ou mais restriçőes de coluna opcionais. O tipo de dados da coluna restringe quais dados podem ser armazenados nessa coluna. Se for feita uma tentativa de armazenar um valor em uma coluna com um tipo de dados diferente, o tempo de execuçăo converterá o valor no tipo apropriado, se possível, ou apresentará um erro. Consulte Suporte ao tipo de dados para obter detalhes. A restrição de coluna NOT NULL indica que a coluna não pode conter valores NULL. Uma restrição UNIQUE faz com que seja criado um índice na(s) coluna(s) especificada(s). Esse índice deve conter chaves exclusivas — duas linhas não podem conter valores duplicados ou combinações de valores para a(s) coluna(s) especificada(s). Uma instrução CREATE TABLE pode ter várias restrições UNIQUE, inclusive várias colunas com uma restrição UNIQUE na definição da coluna e/ou várias restrições UNIQUE no nível da tabela. Uma restrição CHECK define uma expressão avaliada e que deve ser verdadeira para que os dados de uma linha sejam inseridos ou atualizados. A expressão CHECK deve ser resolvida como um valor booleano. A expressão CHECK deve ser resolvida como um valor booleano. Por padrão, a função de intercalação BINARY é usada. Para obter detalhes sobre a cláusula COLLATE e as funções de intercalação, consulte COLLATE. A restriçăo DEFAULT especifica um valor padrăo a ser usado com INSERT. O valor pode ser NULL, uma constante de string ou um número. O valor padrăo também pode ser uma das palavras-chave especiais que năo diferenciam maiúsculas de minúsculas CURRENT_TIME, CURRENT_DATE ou CURRENT_TIMESTAMP. Caso o valor seja NULL, uma constante de string, ou um número, ele é literalmente inserido na coluna sempre que uma instruçăo INSERT năo especificar um valor da coluna. Caso o valor seja CURRENT_TIME, CURRENT_DATE ou CURRENT_TIMESTAMP, a data e/ou hora UTC atual é inserida na coluna. Em CURRENT_TIME, o formato é HH:MM:SS. Em CURRENT_DATE, o formato é YYYY-MM-DD. O formato de CURRENT_TIMESTAMP é YYYY-MM-DD HH:MM:SS. Especificar uma PRIMARY KEY normalmente apenas cria um índice UNIQUE na(s) coluna(s) correspondente(s). No entanto, caso a restriçăo PRIMARY KEY esteja em uma única coluna cujo tipo de dados seja INTEGER (ou um de seus sinônimos, tais como int), essa coluna será usada pelo banco de dados como a chave primária real da tabela. Isso significa que a coluna só pode manter valores de inteiro exclusivos. (Observe que, em muitas implementaçőes do SQLite, apenas o tipo de coluna INTEGER faz com que a coluna sirva como chave primária interna, mas, no Adobe AIR, os sinônimos de INTEGER, como int, também especificam esse comportamento). Se uma tabela năo tiver uma coluna INTEGER PRIMARY KEY, uma chave de inteiro será gerada automaticamente quando uma linha for inserida. A chave primária de uma linha pode ser sempre acessada usando um dos nomes especiais ROWID, OID ou _ROWID_. Esses nomes podem ser usados independentemente da declaraçăo explícita de INTEGER PRIMARY KEY ou de um valor gerado internamente. Entretanto, caso a tabela tenha uma INTEGER PRIMARY KEY explícita, o nome da coluna nos dados de resultados é o nome real da coluna e năo o nome especial. Uma coluna INTEGER PRIMARY KEY também pode incluir a palavra-chave AUTOINCREMENT. Quando a palavra-chave AUTOINCREMENT for usada, o banco de dados gera automaticamente e insere uma chave inteira incrementada sequencialmente na coluna INTEGER PRIMARY KEY quando executa uma instruçăo INSERT que năo especifica um valor explícito para a coluna. Só pode haver uma restriçăo PRIMARY KEY em uma instruçăo CREATE TABLE. Ela pode fazer parte da definiçăo de uma coluna ou de uma restriçăo PRIMARY KEY única no nível da tabela. Implicitamente, uma coluna de chave primária é NOT NULL. A conflict-clause opcional que segue muitas restriçőes permite a especificaçăo de um algoritmo para resoluçăo de conflitos de restriçăo padrăo alternativo para essa restriçăo. O padrão é ABORT. Restriçőes diferentes dentro da mesma tabela podem ter algoritmos para resoluçăo de conflitos padrăo diferentes. Caso uma instruçăo INSERT ou UPDATE especifique um algoritmo para resoluçăo de conflitos diferente, esse algoritmo é usado em lugar do especificado na instruçăo CREATE TABLE. Consulte a seção ON CONFLICT de Instruções especiais e cláusulas para obter informações adicionais. Restriçőes adicionais como, por exemplo, FOREIGN KEY năo resultam em erro, mas o tempo de execuçăo as ignora. Caso ocorra palavra-chave TEMP ou TEMPORARY entre CREATE e TABLE, a tabela criada permanece visível apenas dentro da mesma conexăo de banco de dados (ocorręncia de SQLConnection). Ela é excluída automaticamente quando a conexăo de banco de dados é fechada. Todos os índices criados em uma tabela temporária também săo temporários. As tabelas e os índices temporários săo armazenados em um arquivo separado distinto do arquivo de banco de dados principal. Caso o prefixo opcional database-name seja especificado, a tabela é criada em um banco de dados nomeado (um banco de dados conectado ŕ instância de SQLConnection pela chamada do método attach() com o nome do banco de dados especificado). É um erro especificar um prefixo database-name e a palavra-chave TEMP, a menos que o prefixo database-name seja temp. Caso nenhum nome de banco de dados seja especificado e a palavra-chave TEMP năo esteja presente, a tabela é criada no banco de dados principal (o banco de dados conectado ŕ instância de SQLConnection usando o método open() ou openAsync()). Năo há nenhum limite arbitrário quanto ao número de colunas ou ao número de restriçőes em uma tabela. Também năo existe nenhum limite arbitrário quanto ŕ quantidade de dados em uma linha. A forma CREATE TABLE AS define a tabela como o conjunto de resultados de uma consulta. Os nomes das colunas da tabela săo os nomes das colunas no resultado. Caso a cláusula opcional IF NOT EXISTS esteja presente e já haja outra tabela com o mesmo nome, o banco de dados ignora o comando CREATE TABLE. Uma tabela pode ser removida usando a instruçăo DROP TABLE, e alteraçőes limitadas podem ser feitas usando a instruçăo ALTER TABLE. ALTER TABLEO comando ALTER TABLE permite ao usuário renomear ou adicionar uma nova coluna a uma tabela existente. Năo é possível remover uma coluna de uma tabela. sql-statement ::= ALTER TABLE [database-name.] table-name alteration alteration ::= RENAME TO new-table-name alteration ::= ADD [COLUMN] column-def A sintaxe RENAME TO é usada para renomear a tabela identificada por [database-name.] table-name para new-table-name. Esse comando năo pode ser usado para mover uma tabela entre bancos de dados anexados, e sim apenas para renomear uma tabela dentro do mesmo banco de dados. Caso a tabela que está sendo renomeada tenha disparadores ou índices, eles permanecem anexados ŕ tabela depois que ela é renomeada. No entanto, caso haja alguma definiçăo ou instruçăo de exibiçăo executada por disparadores referente ŕ tabela que está sendo renomeada, eles năo serăo modificados automaticamente para usar o novo nome da tabela. Caso uma tabela renomeada tenha exibiçőes ou disparadores, vocę deve ignorar e recriar manualmente os disparadores ou as definiçőes de exibiçăo usando o novo nome da tabela. A sintaxe ADD [COLUMN] é usada para adicionar uma nova coluna a uma tabela existente. A nova coluna sempre é acrescentada ao final da lista de colunas existentes. A cláusula column-def pode assumir qualquer uma das formas permitidas em uma instruçăo CREATE TABLE, com as seguintes restriçőes:
O momento da execuçăo da instruçăo ALTER TABLE năo afetado pela quantidade de dados na tabela. DROP TABLEA instruçăo DROP TABLE remove uma tabela adicionada com uma instruçăo CREATE TABLE. A tabela com a table-name especificada é a tabela ignorada. Ela é totalmente removida do banco de dados e do arquivo em disco. Ela năo pode ser recuperada. Todos os índices associados ŕ tabela também săo excluídos.
sql-statement ::= DROP TABLE [IF EXISTS] [database-name.] table-name Por padrăo, a instruçăo DROP TABLE năo reduz o tamanho do arquivo de banco de dados. O espaço livre no banco de dados é mantido e usado em operaçőes INSERT subsequentes. Para remover o espaço livre no banco de dados, use o método SQLConnection.clean(). Caso o parâmetro autoClean esteja definido como true quando o banco de dados for criado inicialmente, o espaço é automaticamente liberado. A cláusula IF EXISTS opcional suprime o erro que normalmente aconteceria se a tabela năo existisse. CREATE INDEXO comando CREATE INDEX consiste nas palavras-chave CREATE INDEX seguidas do nome do novo índice, a palavra-chave ON, o nome de uma tabela criada anteriormente a ser indexada e uma lista entre paręnteses dos nomes das colunas na tabela cujos valores săo usados na chave de índice. 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] Cada nome de coluna pode ser seguido das palavras-chave ASC ou DESC para indicar a ordem de classificaçăo, embora a designaçăo da ordem de classificaçăo seja ignorada pelo tempo de execuçăo. A classificaçăo é sempre feita na ordem crescente. A cláusula COLLATE que segue cada nome de coluna define uma sequęncia de intercalaçăo usada nos valores de texto da coluna. A sequęncia de intercalaçăo padrăo é a definida para a coluna na instruçăo CREATE TABLE. Caso nenhuma seja especificada, é usada a sequęncia de intercalaçăo BINARY. Para obter uma definição da cláusula COLLATE e das funções de intercalação, consulte COLLATE. Năo há limites arbitrários quanto ao número de índices que podem ser anexados a uma única tabela. Também năo existem limites para o número de colunas em um índice. DROP INDEXA instruçăo drop index remove um índice adicionado com a instruçăo CREATE INDEX. O índice especificado é removido completamente do arquivo de banco de dados. A única forma de recuperar o índice é digitar novamente o comando CREATE INDEX apropriado. sql-statement ::= DROP INDEX [IF EXISTS] [database-name.] index-name Por padrăo, a instruçăo DROP INDEX năo reduz o tamanho do arquivo de banco de dados. O espaço livre no banco de dados é mantido e usado em operaçőes INSERT subsequentes. Para remover o espaço livre no banco de dados, use o método SQLConnection.clean(). Caso o parâmetro autoClean esteja definido como true quando o banco de dados for criado inicialmente, o espaço é automaticamente liberado. CREATE VIEWO comando CREATE VIEW atribui um nome a uma instruçăo SELECT predefinida. Esse novo nome pode ser usado em uma cláusula FROM de outra instruçăo SELECT em lugar do nome de uma tabela. As exibiçőes costumam ser usadas para simplificar as consultas, integrando um conjunto complexo (e muito usado) de dados a uma estrutura que pode ser usada em outras operaçőes. sql-statement ::= CREATE [TEMP | TEMPORARY] VIEW [IF NOT EXISTS] [database-name.] view-name AS select-statement Caso ocorra a palavra-chave TEMP ou TEMPORARY entre CREATE e VIEW, a exibiçăo criada só permanece visível para a ocorręncia de SQLConnection que abriu o banco de dados, sendo excluída automaticamente quando ele é fechado. Caso seja especificada uma [database-name], a exibiçăo é criada no banco de dados nomeado (um banco de dados conectado ŕ instância de SQLConnection usando o método attach(), com o argumento name especificado). É um erro especificar uma [database-name] e a palavra-chave TEMP, a menos que [database-name] seja temp. Caso nenhum nome de banco de dados seja especificado e a palavra-chave TEMP năo esteja presente, a exibiçăo é criada no banco de dados principal (o banco de dados conectado ŕ instância de SQLConnection usando o método open() ou openAsync()). As exibiçőes săo somente leitura. Uma instruçăo DELETE, INSERT ou UPDATE năo pode ser usada em uma exibiçăo, a menos que haja pelo menos um disparador do tipo associado (INSTEAD OF DELETE, INSTEAD OF INSERT, INSTEAD OF UPDATE) definido. CREATE TRIGGER Uma exibiçăo é removida de um banco de dados usando a instruçăo DROP VIEW. DROP VIEWA instruçăo DROP VIEW remove uma exibiçăo criada por uma instruçăo CREATE VIEW. sql-statement ::= DROP VIEW [IF EXISTS] view-name A view-name especificada é o nome da exibiçăo a ser ignorada. Ela é removida do banco de dados, mas nenhum dado nas tabelas subjacentes é modificado. CREATE TRIGGERA instruçăo create trigger é usada para adicionar disparadores ao esquema do banco de dados. Um disparador é uma operaçăo do banco de dados (a trigger-action) que é realizada automaticamente quando ocorre um evento de banco de dados especificado (o database-event). 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]* O acionamento de um disparador é especificado sempre que ocorre uma DELETE, INSERT ou UPDATE em uma determinada tabela de banco de dados, ou sempre que uma UPDATE de uma ou mais colunas especificadas de uma tabela săo atualizadas. Os disparadores săo permanentes, a menos que a palavra-chave TEMP ou TEMPORARY seja usada. Nesse caso, o disparador é removido quando a conexăo de banco de dados principal da instância de SQLConnection é fechada. Caso nenhum tempo seja especificado (BEFORE ou AFTER), o disparador assume o padrăo BEFORE. Como só há suporte para disparadores FOR EACH ROW, o texto FOR EACH ROW é opcional. Com um disparador FOR EACH ROW, as instruçőes trigger-step săo executadas para todas as linhas do banco de dados inserido, atualizado ou excluído pela instruçăo que faz com que o disparador seja acionado, caso a expressăo de cláusula WHEN seja avaliada como true. Caso uma cláusula WHEN seja fornecida, as instruçőes SQL especificadas como etapas do disparador só săo executadas em linhas para as quais a cláusula WHEN é verdadeira. Caso nenhuma cláusula WHEN seja fornecida, as instruçőes SQL săo executadas em todas as linhas. No corpo de um disparador, (a cláusula trigger-action) os valores anteriores e posteriores ŕ alteraçăo da tabela afetada estăo disponíveis usando os nomes de tabela especiais OLD e NEW. A estrutura das tabelas OLD e NEW corresponde ŕ estrutura da tabela na qual o disparador é criado. A tabela OLD contém todas as linhas modificadas ou excluídas pela instruçăo de acionamento, no estado anterior ŕs operaçőes da instruçăo de acionamento. A tabela NEW contém todas as linhas modificadas ou criadas pela instruçăo de acionamento, no estado posterior ŕs operaçőes da instruçăo de acionamento. A cláusula WHEN e as instruçőes trigger-step podem acessar valores na linha que está sendo inserida, excluída ou atualizada usando referęncias da forma NEW.column-name e OLD.column-name, em que column-name é o nome de uma coluna da tabela ŕ qual o disparador está associado. A disponibilidade das referęncias de tabela OLD e NEW depende do tipo de database-event tratado pelo disparador:
O tempo especificado (BEFORE, AFTER ou INSTEAD OF) determina quando as instruçőes trigger-step săo executadas em relaçăo ŕ inserçăo, ŕ modificaçăo ou ŕ remoçăo da linha associada. Uma cláusula ON CONFLICT pode ser especificada como parte de uma instruçăo UPDATE ou INSERT em uma trigger-step. No entanto, caso uma cláusula ON CONFLICT seja especificada como parte da instruçăo, o que faz com que o disparador seja acionado, é usada essa política de tratamento de conflitos. Além dos disparadores de tabela, um disparador INSTEAD OF pode ser criado em uma exibiçăo. Caso um ou mais disparadores INSTEAD OF INSERT, INSTEAD OF DELETE ou INSTEAD OF UPDATE sejam definidos em uma exibiçăo, isso năo é considerado erro para executar o tipo associado de instruçăo (INSERT, DELETE ou UPDATE) na exibiçăo. Nesse caso, executar uma INSERT, DELETE ou UPDATE na exibiçăo faz com que os disparadores associados sejam acionados. Como o disparador é INSTEAD OF, as tabelas subjacentes ŕ exibiçăo năo săo modificadas pela instruçăo que faz com que o disparador seja acionado. No entanto, os disparadores podem ser usados para realizar operaçőes de modificaçăo nas tabelas subjacentes. Há algo importante para se ter em mente durante a criaçăo de um disparador em uma tabela com uma coluna INTEGER PRIMARY KEY. Caso um disparador BEFORE modifique a coluna INTEGER PRIMARY KEY de uma linha a ser atualizada pela instruçăo que faz com que o disparador seja acionado, a atualizaçăo năo ocorre. Uma soluçăo é criar a tabela com uma coluna PRIMARY KEY e năo uma coluna INTEGER PRIMARY KEY. Um disparador pode ser removido usando a instruçăo DROP TRIGGER. Quando uma tabela ou exibiçăo é ignorada, todos os disparadores associados também săo ignorados automaticamente. Funçăo RAISE()Uma funçăo SQL RAISE() especial pode ser usada em uma instruçăo trigger-step de um disparador. Essa funçăo tem a seguinte sintaxe: raise-function ::= RAISE ( ABORT, error-message ) | RAISE ( FAIL, error-message ) | RAISE ( ROLLBACK, error-message ) | RAISE ( IGNORE ) Quando uma das tręs primeiras formas é chamada durante a execuçăo do disparador, a açăo de processamento ON CONFLICT especificada (ABORT, FAIL ou ROLLBACK) é realizada, e a execuçăo da instruçăo atual é concluída. Como ROLLBACK é considerada uma falha na execuçăo da instruçăo, a instância de SQLStatement cujo método execute() estava sendo realizado despacha um evento error (SQLErrorEvent.ERROR). O objeto SQLError na propriedade error do objeto do evento despachado tem o conjunto de propriedades details definido como a error-message especificada na funçăo RAISE(). Quando RAISE(IGNORE) é chamada, o restante do disparador atual, a instruçăo que fez com que o disparador fosse executado e todos os disparadores subsequentes que seriam executados săo abandonados. Nenhuma alteraçăo feita no banco de dados é revertida. Caso a instruçăo que fez com que o disparador fosse executado seja ela própria parte de um disparador, esse programa disparador reinicia a execuçăo no início da próxima etapa. Para obter mais informações sobre os algoritmos para resolução de conflitos, consulte a seção ON CONFLICT (algoritmos em conflito). DROP TRIGGERA instruçăo DROP TRIGGER remove um disparador criado pela instruçăo CREATE TRIGGER. sql-statement ::= DROP TRIGGER [IF EXISTS] [database-name.] trigger-name O disparador é excluído do banco de dados. Observe que os disparadores săo ignorados automaticamente quando a tabela associada é ignorada. Instruções especiais e cláusulasEsta seçăo descreve várias cláusulas que săo extensőes do SQL fornecidas pelo tempo de execuçăo, bem como dois elementos de linguagem que podem ser usados em muitas instruçőes, comentários e expressőes. COLLATEA cláusula COLLATE é usada em instruçőes SELECT, CREATE TABLE e CREATE INDEX para especificar o algoritmo de comparaçăo usado durante a comparaçăo ou a classificaçăo dos valores. sql-statement ::= COLLATE collation-name collation-name ::= BINARY | NOCASE O tipo de intercalaçăo padrăo de colunas é BINARY. Quando a intercalaçăo BINARY é usada com valores da classe de armazenamento TEXT, a intercalaçăo binária é realizada comparando-se os bytes na memória que representam o valor, independentemente da codificaçăo do texto. A sequęncia de intercalaçăo NOCASE só é aplicada a valores da classe de armazenamento TEXT. Quando usada, a intercalaçăo NOCASE realiza uma comparaçăo sem diferenciaçăo entre maiúsculas e minúsculas. Nenhuma sequęncia de intercalaçăo é usada em classes de armazenamento do tipo NULL, BLOB, INTEGER ou REAL. Para usar um tipo de intercalaçăo que năo seja BINARY com uma coluna, uma cláusula COLLATE deve ser especificada como parte da definiçăo da coluna na instruçăo CREATE TABLE. Sempre que dois valores TEXT săo comparados, uma sequęncia de intercalaçăo é usada para determinar os resultados da comparaçăo de acordo com as seguintes regras:
EXPLAINO modificador de comando EXPLAIN é uma extensăo năo padrăo do SQL. sql-statement ::= EXPLAIN sql-statement Caso a palavra-chave EXPLAIN seja exibida antes de qualquer outra instruçăo SQL, em vez de efetivamente executar o comando, o resultado informa a sequęncia das instruçőes da máquina virtual que seriam usadas para executar o comando, se a palavra-chave EXPLAIN năo estivesse presente. O recurso EXPLAIN é um recurso avançado e permite aos desenvolvedores alterar o texto da instruçăo SQL em uma tentativa de otimizar o desempenho ou depurar uma instruçăo que năo parece estar funcionando corretamente. ON CONFLICT (algoritmos em conflito)A cláusula ON CONFLICT năo é um comando SQL separado. Trata-se de uma cláusula năo padrăo que pode ser exibida em muitos outros comandos SQL. conflict-clause ::= ON CONFLICT conflict-algorithm conflict-clause ::= OR conflict-algorithm conflict-algorithm ::= ROLLBACK | ABORT | FAIL | IGNORE | REPLACE A primeira forma da cláusula ON CONFLICT, usando as palavras-chave ON CONFLICT, é usada em uma instruçăo CREATE TABLE. Em uma instruçăo INSERT ou UPDATE, é usada a segunda forma, com ON CONFLICT substituída por OR para fazer a sintaxe parecer mais natural. Por exemplo, em vez de INSERT ON CONFLICT IGNORE, a instruçăo se torna INSERT OR IGNORE. Embora as palavras-chave sejam diferentes, o significado da cláusula é o mesmo nas duas formas. A cláusula ON CONFLICT especifica o algoritmo usado para resolver conflitos de restriçăo. Os cinco algoritmos săo ROLLBACK, ABORT, FAIL, IGNORE e REPLACE. O algoritmo padrăo é ABORT. A seguir, uma explicaçăo dos cinco algoritmos de conflito:
O algoritmo especificado na cláusula OR de uma instruçăo INSERT ou UPDATE substitui todos os algoritmos especificados em uma instruçăo CREATE TABLE. Caso nenhum algoritmo seja especificado na instruçăo CREATE TABLE ou na instruçăo INSERT ou UPDATE em execuçăo, é usado o algoritmo ABORT. REINDEXO comando REINDEX é usado para excluir e recriar um ou mais índices. Esse comando é útil quando a definiçăo de uma sequęncia de intercalaçăo é alterada. sql-statement ::= REINDEX collation-name sql-statement ::= REINDEX [database-name .] ( table-name | index-name ) Na primeira forma, todos os índices em todos os bancos de dados anexados que usam a sequęncia de intercalaçăo nomeada săo recriados. Na segunda forma, quando é especificada table-name, todos os índices associados ŕ tabela săo recriados. Caso uma index-name seja fornecida, apenas o índice especificado é excluído e recriado. COMMENTSComentários năo săo comandos SQL, mas podem ocorrer em consultas SQL. Eles săo tratados como espaço em brando pelo tempo de execuçăo. Eles podem começar em qualquer lugar onde haja um espaço em branco, inclusive dentro de expressőes que se estendam por várias linhas. comment ::= single-line-comment | block-comment single-line-comment ::= -- single-line block-comment ::= /* multiple-lines or block [*/] Um comentário com uma única linha é indicado por dois traços. Ele só se estende até o final da linha atual. Comentários em bloco podem se estender por um número variado de linhas ou ser incorporados a uma única linha. Caso năo haja nenhum delimitador de encerramento, um comentário em bloco se estende até o final da entrada. Essa situaçăo năo é tratada como um erro. Uma nova instruçăo SQL pode começar em uma linha após o término do comentário em bloco. Os comentários em bloco podem ser incorporados em qualquer lugar onde haja um espaço em branco, inclusive expressőes internas e no meio de outras instruçőes SQL. Os comentários em bloco năo săo aninhados. Comentários em linha única dentro de um comentário em bloco săo ignorados. EXPRESSIONSAs expressőes săo subcomandos dentro de outros blocos SQL. A seguir, a descriçăo da sintaxe válida de uma expressăo dentro de uma instruçăo 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 Uma expressăo é uma combinaçăo de valores e operadores que podem ser resolvidos como um valor único. As expressőes podem ser divididas em dois tipos gerais, dependendo de sua resoluçăo como um valor booleano (true ou false) ou como um valor năo booleano. Em várias situaçőes comuns, inclusive em uma cláusula WHERE, HAVING, a expressăo ON em uma cláusula JOIN e uma expressăo CHECK, a expressăo deve ser resolvida como um valor booleano. Os tipos de expressőes a seguir atendem a essa condiçăo:
Valores literaisUm valor numérico literal é escrito como um número inteiro ou um número de ponto flutuante. A notação científica é suportada. O quantificador . (ponto final) é sempre usado como a casa decimal. Uma string literal é indicada colocando a string entre aspas simples '. Para incluir uma aspa simples dentro de uma string, coloque duas aspas simples em sequęncia como este exemplo: Um literal booleano é indicado pelo valor true ou false. Os valores booleanos literais săo usados com o tipo de dados da coluna Booleana. Um literal de BLOB é uma string literal contendo dados hexadecimais e após um único caractere x ou X como, por exemplo, X'53514697465'. Um valor literal também pode ser o token NULL. Nome da colunaUm nome de coluna pode ser qualquer um dos nomes definidos na instruçăo CREATE TABLE ou em um dos seguintes identificadores especiais: Esses identificadores especiais descrevem a chave de inteiro aleatória exclusiva (a chave de linha) associada a todas as linhas de cada tabela. Os identificadores especiais só se referem ŕ chave de linha caso a instruçăo CREATE TABLE năo defina uma coluna real com o mesmo nome. As chaves de linha se comportam como colunas somente leitura. Uma chave de linha pode ser usada em qualquer lugar onde uma coluna normal possa ser usada, exceto pelo fato de năo ser possível alterar o valor de uma chave de linha em uma instruçăo UPDATE ou INSERT. A instruçăo SELECT * FROM table năo inclui a chave de linha no conjunto de resultados. Instrução SELECTUma instruçăo SELECT pode ser exibida em uma expressăo como o operando ŕ direita do operador IN, como quantidade escalar (um único valor de resultado), ou como o operando de um operador EXISTS. Quando usada como quantidade escalar ou o operando de um operador IN, a SELECT só pode ter uma única coluna no resultado. Uma instruçăo SELECT composta (conectada com palavras-chave como UNION ou EXCEPT) é permitida. Com o operador EXISTS, as colunas do conjunto de resultados de SELECT săo ignoradas e a expressăo retorna TRUE caso haja uma ou mais linhas e FALSE caso o conjunto de resultados seja vazio. Caso nenhum termo da expressăo SELECT se refira ao valor na consulta, a expressăo é avaliada uma vez antes de qualquer outro processamento e o resultado é reutilizado conforme necessário. Caso a expressăo SELECT năo contenha variáveis da consulta externa, conhecida como subconsulta correlacionada, a SELECT é reavaliada sempre que necessário. Quando uma SELECT for o operando ŕ direita do operador IN, o operador IN retorna TRUE caso o resultado do operando ŕ esquerda seja igual a qualquer um dos valores no conjunto de resultados da instruçăo SELECT. O operador IN pode ser precedido pela palavra-chave NOT para inverter o sentido do teste. Quando uma SELECT é exibida dentro de uma expressăo, mas năo é operando ŕ direita de um operador IN, a primeira linha do resultado da SELECT se torna o valor usado na expressăo. Caso a SELECT produza mais de uma linha de resultado, todas as linhas depois dela săo ignoradas. Caso a SELECT năo produza nenhuma linha, o valor da SELECT é NULL. Expressăo CASTUma expressăo CAST altera o tipo de dados do valor especificado para o especificado. O tipo especificado pode ser um nome de tipo năo vazio válido para o tipo em uma definiçăo de coluna de uma instruçăo CREATE TABLE. Suporte ao tipo de dados Elementos de expressăo adicionaisOs elementos SQL a seguir também podem ser usados em expressões:
Funçőes internasAs funçőes internas se encaixam em tręs categorias principais:
Além dessas funçőes, existe uma funçăo especial RAISE() usada para fornecer a notificaçăo de um erro na execuçăo de um disparador. Essa funçăo só pode ser usada no corpo de uma instruçăo CREATE TRIGGER. Para obter informações sobre a função RAISE(), consulte CREATE TRIGGER > RAISE(). Assim como todas as palavras-chave em SQL, os nomes da funçăo năo diferenciam maiúsculas de minúsculas. Funçőes agregadasAs funçőes agregadas realizam operaçőes em valores de várias linhas. Essas funçőes săo especialmente usadas em instruçőes SELECT com a cláusula GROUP BY.
Em qualquer uma das funçőes agregadas anteriores que usam um único argumento, esse argumento pode ser precedido pela palavra-chave DISTINCT. Nesse caso, os elementos duplicados săo filtrados antes de serem passados para a funçăo agregada. Por exemplo, a chamada de funçăo COUNT(DISTINCT x) retorna o número de valores distintos da coluna X e năo o número total de valores que năo sejam NULL na coluna x. Funçőes escalaresAs funçőes escalares funcionam em valores uma linha por vez.
Funçőes de formataçăo de data e horaAs funçőes de formataçăo de data e hora săo um grupo de funçőes escalares usadas para criar dados de data e hora formatados. Observe que essas funçőes operam e retornam valores de string e número. Essas funçőes năo devem ser usadas com o tipo de dados DATE. Caso vocę use essas funçőes nos dados de uma coluna cujo tipo de dados declarado é DATE, elas năo se comportam como esperado.
Formatos de horaUma string de hora pode estar em qualquer um dos seguintes formatos:
O caractere V nesses formatos é um caractere literal "T" que separa a data e a hora. Os formatos que só incluem uma hora pressupõem a data 2001-01-01. ModificadoresA string de hora pode ser seguida de zero ou mais modificadores que alteram a data ou a interpretaçăo da data. Os modificadores disponíveis săo os seguintes:
OperadoresSQL oferece suporte a uma ampla seleçăo de operadores, inclusive operadores comuns existentes na maior parte das linguagens de programaçăo, bem como vários operadores exclusivos do SQL. Operadores comunsOs seguintes operadores binários săo permitidos em um bloco SQL, estando listados da maior para a menor precedęncia: * / % + - << >> & | < >= > >= = == != <> IN AND OR Os operadores de prefixo unários para os quais há suporte săo: ! ~ NOT O operador COLLATE pode ser considerado um operador de sufixo unário. O operador COLLATE apresenta a maior precedęncia. Ele sempre é mais vinculado do que qualquer operador unário de prefixo ou operador binário. Observe que existem duas variaçőes dos operadores de igualdade e de năo-igualdade. A igualdade pode ser = ou ==. O operador de não-igualdade pode ser != ou <>.= ou <>. O operador || é o operador de concatenação da string—ele une as duas strings dos operandos. O operador % fornece o restante do módulo do operando ŕ esquerda no operando ŕ direita. O resultado de qualquer operador binário é um valor numérico, exceto pelo operador de concatenaçăo || que fornece um resultado de string. Operadores SQLLIKE O operador LIKE realiza uma comparaçăo de padrőes. expr ::= (column-name | expr) LIKE pattern pattern ::= '[ string | % | _ ]' O operando ŕ direita do operador LIKE contém o padrăo e o operando ŕ esquerda contém a string de acordo com o padrăo. Um símbolo de porcentagem (%) no padrão é um caractere curinga—ele corresponde a qualquer sequência de zero ou mais caracteres na string. Um sublinhado (_) no padrăo corresponde a um único caractere da string. Qualquer outro caractere se compara ou o equivalente em maiúsculas/minúsculas, ou seja, săo feitas as correspondęncias de maneira sem diferenciaçăo de maiúsculas e minúsculas. o mecanismo de banco de dados só compreende maiúsculas/minúsculas em caracteres Latinos de 7 bits. Consequentemente, o operador LIKE diferencia maiúsculas e minúsculas para caracteres iso8859 de 8 bits ou caracteres UTF-8. Por exemplo, a expressão 'a' LIKE 'A' é TRUE, mas 'æ' LIKE 'Æ' é FALSE). A diferenciaçăo entre maiúsculas e minúsculas para caracteres Latin pode ser alterada usando a propriedade SQLConnection.caseSensitiveLike. Caso a cláusula opcional ESCAPE esteja presente, a expressăo após a palavra-chave ESCAPE deve ser avaliada como uma string que consiste em um único caractere. Esse caractere pode ser usado no padrăo LIKE para corresponder aos caracteres de porcentagem literal ou sublinhado. O caractere de escape seguido de um símbolo de porcentagem, sublinhado ou ele próprio compara um símbolo de porcentagem, sublinhado ou caractere de escapa na string, respectivamente. GLOB O operador GLOB é semelhante a LIKE, mas usa a sintaxe globbing do arquivo Unix nos curingas. Diferentemente de LIKE, GLOB diferencia maiúsculas de minúsculas. IN O operador IN calcula se o operando ŕ esquerda é igual a um dos valores no operando ŕ direita (um conjunto de valores entre paręnteses). 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]* O operando ŕ direita pode ser um conjunto de valores literais separados por vírgulas ou o resultado de uma instruçăo SELECT. Consulte as instruçőes SELECT em expressőes para obter uma explicaçăo e saber as limitaçőes quanto ao uso de uma instruçăo SELECT como operando ŕ direita do operador IN. BETWEEN...AND O operador BETWEEN...AND equivale ao uso de duas expressőes com os operadores >= e <=. Por exemplo, a expressăo x BETWEEN y AND z é equivalente a x >= y AND x <= z. NOT NOT é um operador de negaçăo. Os operadores GLOB, LIKE, e IN podem ser precedidos pela palavra-chave NOT para inverter o sentido do teste (em outras palavras, para verificar se um valor não corresponde ao padrão indicado). ParâmetrosUm parâmetro especifica um alocador de espaço na expressão para um valor literal preenchido durante o tempo de execução atribuindo um valor à matriz associativa SQLStatement.parameters. Os parâmetros podem ter três formas:
Recursos SQL para os quais não há suporteEsta é uma lista dos elementos SQL padrăo para os quais năo há suporte no Adobe AIR:
Há suporte aos seguintes elementos SQL e os recursos do SQLite em algumas implementaçőes de SQLite, mas năo no Adobe AIR. Grande parte dessa funcionalidade está disponível por meio de métodos da classe SQLConnection:
A seguinte funcionalidade é diferente em relaçăo ŕs muitas implementaçőes do SQLite e do Adobe AIR:
Recursos SQL adicionaisOs seguintes tipos de afinidade de colunas năo podem ser usados por padrăo no SQLite, mas săo reconhecidos pelo Adobe AIR (perceba que, como todas as palavras-chaves do SQL, esses nomes de tipos de dados năo fazem distinçăo entre maiúsculas e minúsculas):
Por padrăo, năo há suporte aos valores literais no SQLite, embora haja no Adobe AIR:
|
![]() |