) Ex : INSERT INTO CLIENTES (ID,NOME) VALUES (1,’Nome do Cliente’); INSERT INTO VENDAS_OLD SELECT * FROM VENDAS WHERE DATA_VENDA = CURRENTE DATE;
MAX( )
Função que agrega e retorna o valor máximo de uma coluna.
Sintaxe :
MAX([ALL
| DISTINCT ) Ex : SELECT MAX(SALARIO) FROM FUNCIONARIOS;
MIN( )
Função que agrega e retorna o valor mínimo de uma coluna.
Sintaxe :
MIN([ALL
| DISTINCT ) Ex : SELECT MIN(SALARIO) FROM FUNCIONARIOS;
ROLLBACK Desfaz as mudanças ocorridas até o exato momento no Banco de Dados InterBase, sem que o comando COMMIT tenha sido executado. Este comando e o Commit fecham a transação aberta pela aplicação e ou ferramenta de gerenciamento as tabelas.
Sintaxe :
ROLLBACK
Ex : ROLLBACK;
SELECT
Este é o comando responsável pela obtenção dos dados da tabela, view´s e ou Stored Procedures.
Sintaxe :
SELECT [TRANSACTION transaction] [DISTINCT | ALL] {* | [, …]} [INTO :var [, :var …]] FROM [, …] [WHERE <search_condition>] [GROUP BY col [COLLATE collation] [, col [COLLATE collation] …] [HAVING <search_condition>] [UNION <select_expr> [ALL]] [PLAN <plan_expr>] [ORDER BY <order_list>] [FOR UPDATE [OF col [, col …]]]; = { col [<array_dim>] | :variable | | | | udf ([ [, …]]) | NULL | USER | RDB$DB_KEY |? } [COLLATE collation] [AS alias] <array_dim> = [[x:]y [, [x:]y …]] = num | 'string' | charsetname 'string' = COUNT (* | [ALL] | DISTINCT ) | SUM ([ALL] | DISTINCT ) | AVG ([ALL] | DISTINCT ) | MAX ([ALL] | DISTINCT ) | MIN ([ALL] | DISTINCT ) | CAST ( AS ) | UPPER () | GEN_ID (generator, ) = <joined_table> | table | view | procedure [( [, …])] [alias] <joined_table> = <join_type> JOIN ON <search_condition> | (<joined_table>)
Literal e String - No InterBase, você pode preencher colunas com valores Literais e ou String´s para colunas virtuais e ou colunas fixas da tabela de dados. Mostraremos para este exemplo, o que seria o preenchimento de uma literal em uma coluna virtual ou coluna fixa por literal e ou String.
Ex. Literal : SELECT 1 FROM TabFuncionarios
SELECT 1 as ID TabFuncionarios
Ex. String : SELECT ‘InterBase Brasil’ FROM TabFuncionarios
SELECT ‘InterBase Brasil’ as Nome FROM TabFuncionarios
Expressão || – A expressão conhecida para concatenação no InterBase é ||. Desta forma, você pode usa-la para concatenar colunas virtuais e ou colunas fixas. O operador "+" para o InterBase, é usado para cálculos matemáticos, desta forma, se precisar concatenar colunas, use o ||.
DISTINCT – Prevê a exclusão de linhas semelhantes do Result Set.
INTO:var[,:var.]] – Cláusula que transfere o valor de uma coluna para a variável indicada ao SELECT. Se o Result Set retornar mais de uma linha de dados, ocorrerá um erro, indicando que está clausula apenas poderá retornar uma linha de dados.
UDF([ [, ...]]) – O InterBase permite você criar funções definidas pelo usuário. E desta forma, você pode chamar está função em instruções SELECT
USER – Variável de ambiente do InterBase, indicando o ID do usuário de conexão com o InterBase.
Operadores que fazem parte da cláusula WHERE
BETWEEN – Este operador testa se o valor da coluna encontra-se no intervalo declarado.
IN – Verifica se valor está contido no Sub-Conjunto de dados na coluna declarada.
ALL – Verifica se uma valor é igual a todos os valores retornados em um SubQuery(*).
ANY e SOME – Verifica se um valor está contido em qualquer valor retornado num SubQuery(*).
EXISTS – Verifica se um valor existe e ou está presente em pelo menos uma linha no retorno do SubQuery(*). Está clausula pode conter também NOT EXISTS.
SINGULAR – Opera com semelhança ao EXISTS, com a diferença de que o valor tem que existir exatamente em uma ocorrência do SubQuery(*).
CONTAINING – Testa se o valor passado a coluna, contém em uma parte da string. Está clausula é CASE-SENSITIVE.
STARTING WITH- Testa se a coluna inicia exatamente como indicado pelo valor passado.
Clausula UNION
Executa a união de uma mais tabelas com o mesmo nome de colunas.
SUM( ) Função de Agregação que retorna a soma dos valores da coluna
Sintaxe :
SUM( [ALL | DISTINCT )
Ex : SELECT SUM(VALOR) FROM VENDAS;
UPDATE
Comando responsável pela atualização da tabela no Banco de Dados InterBase. Update trabalha de forma semelhante ao DELETE “é claro, com sua enorme diferença”, se não passarmos a cláusula WHERE, toda a coluna da tabela será atualizada.
Sintaxe :
UPDATE [TRANSACTION transaction] {table | view} SET col = [, col = …] [WHERE <search_condition> | WHERE CURRENT OF cursor];
Ex : UPDATE CLIENTE SET DATA_INCLUSAO = CURRENT DATE;
UPPER( )
Função que retorna uma string com todos os caracteres em maiúsculo.
Sintaxe :
UPPER(
); Ex : CREATE DOMAIM SEXO AS CHAR(01) ( CHECK VALUE = UPPER(VALUE));
SELECT UPPER(NOME) FROM CLIENTES;
encontram aspas duplas, tipos DATE, ou campos NUMERIC/DECIMAL com precisão maior que 9. Esse dialeto é utilizado para alertar o desenvolvedor para potenciais problemas durante a migração e não deve ser utilizado para uso normal no dia a dia. Para detectar áreas problemáticas na definição de um banco de dados que você está migrando, extraia a METADATA e rode-a através de um cliente utilizando o dialeto 2. Por exemplo :
isql -i v5metadata.sql
Lembre-se de NÃO utilizar o dialeto 2 para uso normal dos bancos de dados.
DIALETO 3
As seguintes características são específicas do DIALETO 3, e são incompatíveis com o dialeto 1 e todos os BDs e clientes antigos: Constantes alfanuméricas devem ser delimitadas por aspas simples (apóstrofe). Aspas duplas (") são usadas somente em identificadores delimitados. O tipo de dado DATE armazena somente a DATA. Dois novos tipos de dados estão disponíveis : TIME que armazena somente a informação de HORA, e TIMESTAMP que armazena ambos DATA e HORA. O tipo TIMESTAMP substitui a funcionalidade do tipo DATE das versões anteriores do IB. O Dialeto 3 também inclui os operadores funcionais CURRENT_DATE, CURRENT_TIME, e CURRENT_TIMESTAMP. Tipos DECIMAL e NUMERIC com precisão maior que 9 são gravados utilizando inteiros de 64 bits se forem criados no dialeto 3. Note que todas os campos desse tipo continuam sendo armazenados como float se o BD foi trazido de alguma versão anterior do IB.
Identificadores Delimitados SQL
O InterBase agora suporta identificadores delimitados. Esses identificadores são objetos do banco de dados cujos nomes são delimitados por aspas duplas, e são permitidos somente em bancos da versão 6 usando dialeto 3. No InterBase 6 Dialeto 3, uma constante alfanumérica é delimitada por aspas simples e um identificador por aspas duplas. Como o nome do identificador agora pode ser delimitado pelas aspas, o tamanho do nome de um identificador é maior possibilitando muito mais variações do que nas versões anteriores. Os nomes de um Objeto no Interbase agora podem: Ser uma palavra-chave Conter espaços (exceto espaços antes e depois do nome) Usar caracteres não ASCII Ser sensíveis à CAPS
Segurança com Usuários A segurança de usuários do InterBase, fica guardado dentro do próprio Banco de Dados. Desta forma, você usuário SYSDBA e ou outro usuário que tenha os direitos de Administrador, restringe o acesso e manutenção a tabelas do InterBase.
Existe dois comandos SQL responsável pelo direito de acesso a tabelas do Banco de Dados :
GRANT
Este é o comando responsável para dizer o que o usuário e ou grupo de usuários “X” podem ou não fazer na(s) tabela(s) em que o GRANT definiu para estes.
Sintaxe :
GRANT < privilegies> ON [TABLE] { tablename | viewname} TO { | | GROUP UNIX_group} |<role_granted> TO {PUBLIC | < role_grantee_list>}}; < privileges> = {ALL [PRIVILEGES] | < privilege_list>} < privilege_list>={ SELECT | DELETE | INSERT | UPDATE [( col [, col …])] | REFERENCES [(col [, col …])] [, < privilege_list>…]}}
={ PROCEDURE procname | TRIGGER trigname |VIEWviewname | PUBLIC [, …]} ={ [USER] username | rolename | UNIX_user} [, …] [WITH GRANT OPTION] < role_granted> = rolename [, rolename …] < role_grantee_list> = [USER] username [, [USER] username …] [WITH ADMIN OPTION] Ex :
GRANT ALL ON TAB_FORNECEDORES TO EDUARDO; GRANT SELECT ON TAB_FORNECEDORES TO AIRTON; GRANT SELECT,INSERT,UPDATE ON TAB_FORNECEDORES TO ANDREA;
Tipos de Dados do InterBase O InterBase 6 Dialect 3, suporta a maioria dos tipos de Dados do SQL. O InterBase, apenas não tem como tipo de dado, o tipo Boolean. Mas, isto não é uma falha do InterBase, outro SGDB´s também não tem este tipo de dado. Apesar de não ter este tipo de dado, podemos criar o nosso “tipo boolean” através de DOMAINS. Neste capitulo sobre tipo de dados, iremos utilizar um exemplo de como criar um tipo Boolean para o InterBase.
BLOB O tipo de Dado BLOB, tem o tamanho variável, isto é, não sabemos na hora da criação do campo BLOB qual será o seu tamanho realmente, mas, o limite do campo Blob que está na documentação do InterBase, é de 64k por segmento.
Este tipo de campo é o tipo indicado para armazenar Textos Grandes “Memos”, Fotos, Gráficos, Ícones, isto é, aparentemente não tem um tipo de dado que não possa ser armazenado no Campo Blob. Campos Blob´s não podem ser indexados.
Saber qual o sub-tipo correto utilizar é essencial para criar aplicativos que se utilizem dos campos BLOBs. Os BLOBs se apresentam em 3 versões :
Sub-tipo 0 - Armazena dados em formato binário – Fotos, etc. Sub-tipo 1 - Armazena dados em formato texto – Memos. Sub-tipos definidos pelo usuário.
Além dos 2 Sub-tipos pré-definidos, também existem os Sub-tipos definidos pelo usuário. Esses tipos são determinados com o uso de valores negativos logo após a palavra SUB_TYPE. O número utilizado é um inteiro determinado arbitrariamente pelo usuário de acordo com sua preferência, desde que seja negativo. O uso de -1 é funcionalmente equivalente ao uso de -2, -3, Tc...
A única consideração que deve ser tomada é a de se certificar de sempre armazenar o tipo pré-determinado de informação no respectivo sub-tipo de BLOB. O Interbase não faz nenhuma análise dos dados que estão sendo gravados, portanto essa é uma responsabilidade do aplicativo. Nenhum erro será retornado pelo Interbase se um tipo errado de dado for inserido em um BLOB de sub-tipo incorreto, mas um aplicativo pode ser prejudicado se ao recuperar as informações do BLOB, a mesma não corresponder ao formato esperado.
Sintaxe :
Estas declarações é na criação da tabela :
MEMO BLOB SUB_TYPE 1; FOTO BLOB SUB_TYPE 0;
Ex :
CREATE TABLE FUNCIONARIOS ( ID INTEGER NOT NULL PRIMARY KEY, NOME VARCHAR(50) NOT NULL, FOTO BLOB SUB_TYPE 0, EXPERIENCIA BLOB SUB_TYPE 1 SEGMENT SIZE 80, Dica :
Na criação da tabela acima, você verificou uma nova informação “SEGMENT”. Abaixo a explicação :
O tamanho de segmento (Segment Size), é um pequeno pedaço de informação, tipo um conselho, que é mantido com a definição de um Blob. Quando se abre um Blob, pode-se perguntar por segmentos de qualquer tamanho, mas para alguns Blobs um determinado tamanho é mais conveniente que um outro. Blobs que armazenam texto, por exemplo, freqüentemente utilizam segmentos de tamanho 80. O pré-processador e outros programas utilitários usam o tamanho do segmento para determinar o tamanho de buffers que são necessários para transferência de dados para e do Blob.
CHAR(n)
O tipo de Dado CHAR, tem o seu tamanho definido na hora da criação da tabela. Seu tamanho máximo é de 32767, 32k. Este tipo tem o seu tamanho fixo.
Ex :
CREATE TABLE FUNCIONARIOS ( ID INTEGER NOT NULL PRIMARY KEY, NOME VARCHAR(50) NOT NULL, ... SEXO CHAR(01) )
Este tipo de dado é usado quando você realmente souber o tamanho da coluna/campo a ser criada. Outro exemplo, é criar o coluna de CNPJ, DOMAIN BOLLEAN.
VARCHAR(n)
O tipo de Dado VARCHAR, tem o seu tamanho definido na hora da criação da tabela. Seu tamanho máximo é de 32767, 32k. Este tipo tem o seu tamanho variado na tabela. Isto é, se você criar uma coluna de 45 Caracteres, mas, a coluna tenha apenas 20 Caracteres gravados, o restante, os 25 Caracteres são descartados.
Ex :
CREATE TABLE FUNCIONARIOS ( ID INTEGER NOT NULL PRIMARY KEY, NOME VARCHAR(50) NOT NULL