Principais comandos SQL ================================================== GERENCIANDO TABELAS: DDL - DATA DEFINITION LANGUAGE ** CRIANDO UMA TABELA CREATE TABLE EMPREGADOS (ID VARCHAR(4) NOT NULL, NOME VARCHAR(30) NOT NULL, PAGAMENTO DECIMAL(4,2) NOT NULL); ** DELETANDO UMA TABELA DROP TABLE EMPREGADOS; ** ALTERANDO UMA TABELA *** ADICIONANDO UMA NOVA COLUNA ALTER TABLE EMPREGADOS ADD COLUMN (TELEFONE VARCHAR(10) NOT NULL); *** MODIFICANDO UMA COLUNA ALTER TABLE EMPREGADOS MODIFY COLUMN (TELEFONE VARCHAR(12)); ** APAGANDO OS DADOS DE UMA TABELA, TORNANDO A TABELA NO ESTADO DE ORIGEM TRUNCATE TABLE EMPREGADOS; ================================================== MANIPULANDO DADOS: DML - DATA MAIPULATION LANGUAGE ** Inserindo dados INSERT INTO EMPREGADOS VALUES ('1111', 'Jo�o da Silva', 100.50); ** Alterando dados UPDATE EMPREGADOS SET PAGAMENTO = 120 WHERE ID = '1111'; ** Deletando dados DELETE FROM EMPREGADOS WHERE ID = '1111'; COMMIT; ROLLBACK; SAVEPOINT S1; ROLLBACK TO S1; ================================================== SELECIONANDO DADOS: DQL - DATA QUERY LANGUAGE SELECT column1, column2, ... FROM table1, table2, ... [ WHERE column1 = 'value1' AND column2 = 'value2' OR (column1 = 'value3' AND column2 = 'value4')] [GROUP BY column1, column2, ...] [HAVING function = 'value'] [ORDER BY column1, column2, ...]; SELECT COUNT(*) FROM EMPREGADOS; SELECT CIDADE, AVG(PAGAMENTO) FROM EMPREGADOS GROUP BY CIDADE
HAVING AVG(PAGAMENTO) > 100; SELECT E.NOME, PE.PAGAMENTO FROM EMPREGADOS E, PAGAMENTO_EMPREGADOS PE WHERE E.EID = PE.EID; SELECT ID, NOME FROM EMPREGADOS WHERE PAGAMENTO > (SELECT AVG(PAGAMENTO) FROM EMPREGADOS); ================================================== CONTROLANDO ACESSO AOS DADOS: DCL - DATA CONTROL LANGUAGE GRANT SELECT, INSERT, UPDATE, DELETE ON EMPREGADOS TD USER12; REVOKE DELETE ON EMPREGADOS FROM USER12; ================================================== GERENCIANDO �NDICES: DDL - DATA DEFINITION LANGUAGE CREATE INDEX EMPREGADOS_IDX ON EMPREGADOS(NOME); CREATE UNIQUE INDEX EMPREGADOS_IDX ON EMPREGADOS(NOME); CREATE INDEX EMPREGADOS_IDX ON EMPREGADOS(NOME, PAGAMENTO); DROP INDEX EMPREGADOS IDX; ================================================== GERENCIANDO VIS�ES (VIEWS): DDL - DATA DEFINITION LANGUAGE CREATE VIEW MAIOR_PAGAMENTO_EMPREGADOS AS SELECT FROM EMPREGADOS WHERE PAGAMENTO > 150; CREATE VIEW NOMES AS SELECT NOME FROM EMPREGADOS; DROP VIEW NOMES; ================================================== FUN��ES DE AGRAGA��O COUNT SUM AVG MAX MIN -
- Retorna Retorna a Retorna o Retorna o Retorna o
o n�mero de linhas soma de uma coluna espec�fica valor m�dio de uma coluna espec�fica valor m�ximo de uma coluna espec�fica valor m�nimo de uma coluna espec�fica
SELECT AVG(PAGAMENTO) FROM EMPREGADOS; SELECT COUNT(*) FROM EMPREGADOS; ================================================== OPERADORES L�GICOS IS NULL BETWEEN IN LIKE
EXISTS UNIQUE ALL and ANY CONTAINING SELECT * FROM EMPREGADOS WHERE PAGAMENTO BETWEEN 100 AND 150; SELECT NOME, PAGAMENTO FROM EMPREGADOS WHERE EID IN ('1111', '2222', '3333'); ================================================== NEGANDO CONDI��ES COM O OPERADOR NOT NOT NOT NOT NOT NOT NOT
EQUAL BETWEEN IN LIKE EXISTS UNIQUE
SELECT * FROM EMPREGADOS WHERE PAGAMENTO NOT BETWEEN 100 AND 150; SELECT NOME, PAGAMENTO FROM EMPREGADOS WHERE EID NOT IN ('1111', '2222', '3333'); SELECT NOME FROM EMPREGADOS WHERE NOME NOT LIKE 'S%'; ******************************************************************* Exemplos da Net /*Como retorna informa��es sobre as colunas de tabelas? Comando:*/ SELECT RDB$RELATION_CONSTRAINTS.RDB$RELATION_NAME AS TABELA, RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_NAME AS CHAVE, RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME AS INDICE_DA_CHAVE, RDB$INDEX_SEGMENTS.RDB$FIELD_NAME AS CAMPO, RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION AS POSICAO FROM RDB$RELATION_CONSTRAINTS, RDB$INDICES, RDB$INDEX_SEGMENTS WHERE RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY' AND RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME = RDB$INDICES.RDB$INDEX_NAME AND RDB$INDEX_SEGMENTS.RDB$INDEX_NAME = RDB$INDICES.RDB$INDEX_NAME ORDER BY RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_NAME, RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION /*Como resolver problema de arredondamento em colunas tipo Float? Se voce ainda n�o teve problemas com campos floats ... ex: voce cadastra 5,0 e vai ver na base ta 4,99999 ... ajuste seus campos para numeric(9.2) Esse script transforma todos os campos floats do seu GDB para numeric(9,2) */ UPDATE RDB$FIELDS SET RDB$FIELD_TYPE = 8,
RDB$FIELD_SCALE = -2 WHERE RDB$FIELD_NAME IN ( SELECT RDB$RELATION_FIELDS.RDB$FIELD_SOURCE FROM RDB$RELATION_FIELDS, RDB$FIELDS WHERE (RDB$RELATION_FIELDS.RDB$FIELD_SOURCE = RDB$FIELDS.RDB$FIELD_NAME) AND (RDB$FIELDS.RDB$FIELD_TYPE = 10 ) AND (RDB$FIELDS.RDB$SYSTEM_FLAG <> 1 ) ) /*Como alterar a posi��o de uma coluna sem recriar a tabela? Comando:*/ ALTER TABLE (TABELA) ALTER COLUMN (CAMPO) POSITION (POSICAO) /*Como obter a Hora do Servidor FB? Use nas aplica��es uma unica fonte de hora/data ... a do servidor � a melhor ideia ... Comando para buscar a hora/data do servidor...*/ SELECT CURRENT_TIMESTAMP AS DATETIME FROM RDB$DATABASE; /*Se voc� um dia prescisar buscar todas as tabelas do seu GDB e criar um script de "delete from" ...*/ SELECT DISTINCT 'DELETE FROM '||RDB$RELATION_FIELDS.RDB$RELATION_NAME||';' AS TABELAS FROM RDB$RELATION_FIELDS, RDB$FIELDS WHERE ( RDB$RELATION_FIELDS.RDB$FIELD_SOURCE = RDB$FIELDS.RDB$FIELD_NAME ) AND ( RDB$FIELDS.RDB$SYSTEM_FLAG <> 1 ) /*Adicionar uma constraint ckeck no campo da tabela que verifica outra tabela antes de gravar o registro ...*/ ALTER TABLE ADD CONSTRAINT CHECK ( IN ( SELECT FROM WHERE = ) ) /*Como fa�o para mudar o valor de um generator?*/ SET GENERATOR TO /*Como excluo um generator do meu Banco? No Interbase 6 � :*/ DELETE FROM RDB$GENERATORS WHERE RDB$GENERATOR_NAME = ; /*No FireBird 1.5 � :*/ DROP GENERATOR ; /*Qual o comando que devolve as restri��es definidas por CHECKs em uma determinada tabela ?*/ select r.rdb$constraint_name,r.rdb$constraint_type,t.rdb$trigger_source from rdb$relation_constraints r join rdb$check_constraints c on (r.rdb$constraint_name = c.rdb$constraint_name) join rdb$triggers t on (c.rdb$trigger_name = t.rdb$trigger_name) where (r.rdb$relation_name='NOME_DA_TABELA') /*Qual o comando que retorna o nome, a seq��ncia, o tipo e o status das triggers definidas para uma tabela?*/ select t.rdb$trigger_name,t.rdb$trigger_sequence,y.rdb$type_name,t.rdb$trigger_inactive from rdb$triggers t join rdb$types y on (t.rdb$trigger_type = y.rdb$type) where (t.rdb$relation_name = 'NOME_DA_TABELA') and (t.rdb$trigger_name not like 'CHECK%') and (y.rdb$field_name='RDB$TRIGGER_TYPE')
por romuloigor /*Qual o comando que retorna o nome, o tipo e o tamanho, "nulabilidade" e as checks de um determinado dom�nio?*/ select f.rdb$field_name,t.rdb$type_name,f.rdb$field_length,f.rdb$null_flag, f.rdb$default_source,f.rdb$validation_source from rdb$fields f join rdb$types t on (f.rdb$field_type = t.rdb$type) where (f.rdb$field_name='NOME_DO_DOMINIO') and (t.rdb$field_name='RDB$FIELD_TYPE') /*Qual o comando que retorna os �ndices definidos em um Banco de Dados?*/ select i.rdb$index_name,i.rdb$unique_flag,i.rdb$relation_name,s.rdb$field_name from rdb$indices i join rdb$index_segments s on (i.rdb$index_name = s.rdb$index_name) where i.rdb$index_name not like 'RDB$%'; /*Qual o comando que recupera as informa��es sobre os par�metros de uma stored procedure (nome, tipo, tamanho, entrada/sa�da) ?*/ select p.rdb$parameter_name,p.rdb$parameter_type,t.rdb$type_name,f.rdb$field_length from rdb$procedure_parameters p join rdb$fields f on (p.rdb$field_source = f.rdb$field_name) join rdb$types t on (f.rdb$field_type = t.rdb$type) where (p.rdb$procedure_name = 'NOME_DA_PROC') and (t.rdb$field_name = 'RDB$FIELD_TYPE') /*Qual o comando que recupera as informa��es sobre os par�metros de uma stored procedure (nome, tipo, tamanho, entrada/sa�da) ?*/ select p.rdb$parameter_name,p.rdb$parameter_type,t.rdb$type_name,f.rdb$field_length from rdb$procedure_parameters p join rdb$fields f on (p.rdb$field_source = f.rdb$field_name) join rdb$types t on (f.rdb$field_type = t.rdb$type) where (p.rdb$procedure_name = 'NOME_DA_PROC') and (t.rdb$field_name = 'RDB$FIELD_TYPE') /*Qual o comando que retorna o nome da exce��o, a mensagem e o tipo de objeto que utiliza a exce��o ?*/ select e.rdb$exception_name,e.rdb$message,d.rdb$dependent_name,t.rdb$type_name from rdb$exceptions e join rdb$dependencies d on (e.rdb$exception_name = d.rdb$depended_on_name) join rdb$types t on (d.rdb$dependent_type = t.rdb$type) where (rdb$field_name='RDB$OBJECT_TYPE'); /*Como retornar o nome da tabela, a chave primaria, indice e campos do indice de determinada tabela no FB? Comando:*/ SELECT RDB$RELATION_CONSTRAINTS.RDB$RELATION_NAME AS TABELA, RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_NAME AS CHAVE, RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME AS INDICE_DA_CHAVE, RDB$INDEX_SEGMENTS.RDB$FIELD_NAME AS CAMPO, RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION AS POSICAO FROM RDB$RELATION_CONSTRAINTS, RDB$INDICES, RDB$INDEX_SEGMENTS WHERE RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY'
AND RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME = RDB$INDICES.RDB$INDEX_NAME AND RDB$INDEX_SEGMENTS.RDB$INDEX_NAME = RDB$INDICES.RDB$INDEX_NAME ORDER BY RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_NAME, RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION /* Como alterar a coluna de caracteres tamanho? Voc� deve usar o ALTER TABLE. Vamos supor que voc� tem uma coluna c1 na tabela t1, que � do tipo CHAR (80) e que deseja que o aumento para 90 caracteres:*/ ALTER TABLE t1 ALTER c1 TYPE char(90); /*Renomear a coluna tempor�ria:*/ ALTER TABLE t1 ALTER c_temp TO c1; /*Voc� pode faz�-lo simplesmente por usar CAST. Primeiro crie uma string que cont�m uma data v�lida (ver FAQ # 137) e, em seguida, CAST que at� � data. Exemplo:*/ SELECT CAST(31 ||'.'|| 12 ||'.'|| 2007 AS DATE) FROM RDB$DATABASE /*Como converter a string BLOB? Convers�o direta n�o � poss�vel sem o uso de alguns UDF, mas voc� pode extrair texto utilizando SUBSTRING fun��o:*/ /*Observe que o comprimento m�ximo para VARCHAR � 32767 bytes (que poder� ser menor em caracteres multi-byte como conjuntos de caracteres UTF8).*/ DECLARE VARIABLE c1 VARCHAR(32000); SELECT SUBSTRING(blob1 FROM 1 FOR 32000) FROM t1 INTO c1; /* Como apagar registros duplicados (tabela quando n�o tem uma chave prim�ria coluna)? Voc� pode usar o "segredo" RDB$DB_KEY recurso do Firebird. RDB$DB_KEY � um 'escondidas' registro que identifica as linhas de cada comando SQL. Por exemplo, se voc� tiver uma tabela TABLE1 sem chave prim�ria e t�m colunas COL1 e COL2 que s�o os mesmos, voc� pode excluir os registros extra com a seguinte declara��o:*/ DELETE FROM TABLE1 t1 WHERE EXISTS ( SELECT 1 FROM TABLE1 t2 WHERE t1.COL1 = t2.COL1 and t1.COL2 = t2.COL2 AND t1.RDB$DB_KEY < t2.RDB$DB_KEY ); /*Voc� pode controlar se o registro � considerado duplicado por incluindo as colunas da tabela WHERE (na maioria dos casos, voc� deseja incluir todas as colunas).*/ /*espelho*/ CREATE SHADOW 1 'c:\bd\shadow.sdw'