Banco de dados e SQL

Banco de dados e SQL

(Parte 7 de 8)

SELECT EMPNOME, EMPSERV FROMEMPA WHERE 300000IN(SELECT DEPORCA FROM DEPT WHERE DEPT.DEPNUME =A.DEPNUME );

Nota: Observe que a cláusula IN torna-se verdadeira quando o atributo indicado está presente no conjunto obtido através da subconsulta.

21) Relacione todos os departamentos que possuem empregados com remuneração maior que 3500. Resp:

SELECTDEPNOME FROMDEPTA WHERE EXISTS (SELECT * FROMEMP WHERE EMPSALA >3500 AND EMP.DEPNUME= A.DEPNUME');

Nota: Observe que a cláusula EXISTS indica se o resultado de uma pesquisa contém ou não tuplas. Observe também que poderemos verficar a não existência (NOT EXISTS) caso esta alternativa seja mais conveniente.

Uniões Podemos eventualmente unir duas linhas de consultas simplesmente utilizando a palavra reservada UNION.

2) Liste todos os empregados que tenham códigos > 10 ou Funcionários que trabalhem em departamentos com código maior que 10.

Resp: Poderíamos resolver esta pesquisa com um único Select, porém devido ao fato de estarmos trabalhando em nosso exemplo com apenas duas tabelas não consiguimos criar um exemplo muito adequado para utilização deste recurso.

(Select *

From Emp Where EmpNume > 10)

Union (Select *

From Emp Where DepNume > 10);

Inserções, Alterações e Exclusões

Uma linguagem direcionada a extração de informações de um conjunto de dados, em tese não deveria incorporar comandos de manipulação dos dados. Devemos observar contudo que a mera existência de uma linguagem padronizada para acesso aos dados "convidava" os desenvolvedores a aderirem a uma linguagem "padrão" de manipulação de tabelas. Naturalmente cada desenvolvedor coloca "um algo mais" em seu SQL (SQL PLUS, SQL *, ISQL, e toda sorte de nomenclaturas), por um lado desvirtuando os objetivos da linguagem (padronização absoluta), mas em contrapartida otimiza os acessos ao seu banco de dados e por maior que sejam estas mudanças, jamais são tão importantes que impeçam que um programador versado em SQL tenha grandes dificuldades em se adaptar ao padrão de determinada implementação. De fato as diferenças entre o SQL da Sybase, Oracle, Microsoft, são muito menores dos que as existentes entre o C, o BASIC e o Pascal, que são chamadas de linguagens "irmãs", pois todas originam-se conceitualmente no FORTRAN. Podemos observar que todas as três linguagens mencionadas possuem estruturas de controle tipo "para" (for), "enquanto" (while) e repita (do..while, repeat..until). Todas trabalham com blocos de instrução, todas tem regras semelhantes para declaração de variáveis e todas usam comandos de tomada decisão baseadas em instruções do tipo "se" ou "caso", porém apesar de tantas semelhanças (sic), é praticamente impossível que um programador excelente em uma linguagem consiga rapidamente ser excelente em outra linguagem do grupo. Poderíamos arriscar a dizer que um excelente programador C que utilize a implementação da Symantech terá que passar por um breve período de adaptação para adaptar-se ao C da Microsoft.

O que ocorreria então se este programador tiver que adaptar-se ao Delphi (Pascal) da Borland?

De forma alguma o mesmo ocorrerá com o especialista em SQL ao ter que migrar do Banco de Dados X para o Banco de Dados Y. Naturalmente existirá a necessidade de aprendizado, mas este programador poderá ir adaptando-se aos poucos sem precisar ser retreinado, o que é um aspecto extremamente vantajoso para as empresas.

Inserir (Insert) INSERT INTO <tabela> [<campos>] [VALUES <valores>]

Ex: INSERT INTO DEPT;

Possibilita a inserção de registros de forma interativa. INSERT INTO DEPT (DEPNUME,DEPNOME,DEPLOCA) VALUES (70,"PRODUCAO","RIO DE JANEIRO"); Possibilita a inserção de registros em tabelas sem digitação dos dados.

Atualizar (Update) UPDATE <tabela> SET <campo> = <expressão> [WHERE <condição>];

Ex: UPDATE EMP SETEMPSALA = EMPSALA* 1.2 WHERE EMPSALA< 1000;

Excluir (Delete) DELETE FROM <tabela> [WHERE <condição>];

Ex: DELETE FROM empWHERE EMPSALA > 5000;

Transações

Muitas vezes gostaríamos que determinado processo, caso fosse abortado por qualquer motivo, pudesse ser inteiramente cancelado. Imaginemos por exemplo um usuário digitando um pedido. Imaginemos ainda que o sistema possa reservar cada item solicitado de maneira "on line", ou seja ao mesmo tempo em que estou digitando a quantidade o sistema já "empenhe" uma quantidade equivalente no estoque. Imaginemos ainda que o sistema deve cancelar todas as operações se apenas um dos itens não puder ser atendido. Grande problema, caso não pudéssemos anular todos os processos a partir de determinada condição.

Vamos simular tal ocorrência com nosso banco de dados EMP. Imaginemos que ao invés de digitarmos DELETE FROM emp WHERE salario > 5000; tivéssemos digitado DELETE FROM emp WHERE salario > 500; Ao invés de eliminarmos 2 registros, praticamente teríamos eliminado o banco de dados todo. Para evitarmos que um erro de digitação, ou um processo iniciado porém sem condição de ser completado integralmente comprometa todos nossos dados podemos criar uma transação que nos assegurará que nossos testes sejam bem sucedidos ou cancelados sem comprometer nossos dados.

begin transaction; delete from emp where salario > 500; if SQL_RECORDCOUNT > 20 THEN; ROLLBACK TRASACTION; else COMMIT; endif; end transaction;

Visões

Uma visão consiste basicamente de uma tabela derivada de outras tabelas. Considerando o exemplo TRABALHO, poderíamos criar uma visão baseada na Tabela de Empregados (EMP) e na Tabela de Departamentos (DEPT) onde tivéssemos somente os Nomes dos Funcionários e os Departamenos nos quais estes trabalhassem. Teríamos algo assemelhado ao abaixo representado

Devemos observar que:

1- Uma visão definida sobre uma única tabela somente será atualizável se os atributos da tal visão contiverem a chave primária de tal tabela. 2- Visões sobre várias tabelas não são passíveis de atualizações. 3- Visões que se utilizam de funções de agrupamentos, também não poderão ser atualizadas.

PARTE I - Relatórios

Comando:

REPORT DISTINCT / UNIQUE [ atributo(s) ] REPORTTOP PAGETOP

FROM [ tabela(s) ] [ WHERE clausula-where ]

[ GROUP BY clausula-grupo ]

[ ORDER BY clausula-order by ];

Como exemplo converteremos um simples Select em um Report, temos:

SELECTEMPNOME FROMEMP WHERE DEPNUME=1000;

REPORT DETAILEMPNOME WHERE DEPNUME= 1000;

REPORT ON “RELAT.DAT”

Podemos direcionar a saida de um relatório tanto para um arquivo como para uma impressora. Para um arquivo:

REPORT ON LP:”

Para uma impressora:

Agora incrementando um report temos:

Onde:

PAGETOP-Impressoemcadatopodepagina.
TOP-ImpressoemcadaTopodoSort-Grupodorelatório.
DETAIL-Oqueseraimpressoemcadalinha.
NONE-Senãotiverresultadooselect,nãoseraimpressoorelatório.
BOTTOM-ImpressoemcadaBottomdoSort-Grupodorelatório

REPORTTOP - O que sera impresso no topo do relatório. PAGEBOTTOM - O que sera impresso no rodapé de cada pagina. REPORTBOTTOM - O que sera impresso no rodape do relatório.

Formatos:

%C - caracter %D - data y - ano, n - mes numérico, a - mes alfanumérico, d - dia, j - dia e ano juliano Exemplo: %D”d/m/y”

%I - inteiro %F - ponto flutuante

%FSZ onde: S - separador de 3 digitos e decimal point Z - zeros serão suprimidos

%Q - data %J - Hora h - hora, m - minutos, s - segundos

(Parte 7 de 8)

Comentários