Visitantes

Powered By Blogger

Pesquisar neste Blog

domingo, 22 de dezembro de 2019

SQL - Consultas SELECT

Parte II - Comandos de Consulta ao Esquema 

Devemos ressaltar que a linguagem SQL é utilizada tanto pelos profissionais responsáveis pelos dados, onde é ressaltada a figura do Administrador do Banco de Dados e dos Analistas de Dados, como também pelos desenvolvedores de Aplicações. 

Enquanto àqueles estão preocupados com o desempenho, integridade do Banco de Dados e utilizam toda gama de recusos disponíveis no SQL, estes estão preocupados apenas em "transformar dados em informações", portanto para os desenvolvedores costuma-se dizer que conhecer o "select" já basta.

Em nosso curso enfatizaremos a importância de TODOS os comandos do SQL, mas sabemos de antemão que os professores responsáveis pelas linguagens IDEO, Visual Basic e Delphi, ressaltarão a preponderância da instrução "select", que será apresentada a seguir: 

1) Seleção de todas os campos (ou colunas) da tabela de Departamentos. 
Resp: SELECT * FROM DEPT; 

O exemplo utiliza o coringa "*" para selecionar as colunas na ordem em que foram criadas. 

A instrução Select, como pudemos observar seleciona um grupo de registros de uma (ou mais) tabela(s). 

No caso a instrução From nos indica a necessidade de pesquisarmos tais dados apenas na tabela Dept. Where como base das Restrição de tuplas. 

A cláusula "where" corresponde ao operador restrição da álgebra relacional. Contém a condição que as tuplas devem obedecer a fim de serem listadas.  Ela pode comparar valores em colunas, literais, expressões aritméticas ou funções. 

A seguir apresentamos operadores lógicos e complementares a serem utilizados nas expressões apresentadas em where.

Operadores lógicos - significado: 
=  igual a 
>  maior que 
>=  maior que ou igual a 
<  menor que 
<=  menor que ou igual a 

Exemplos: 
SELECT EMPNOME, EMPSERV FROM EMP WHERE DEPNUME > 10; 
SELECT EMPNOME, EMPSERV FROM EMP WHERE EMPSERV = 'GERENTE'; 

O conjunto de caracteres ou datas devem estar entre apóstrofes (‘) na cláusula "where". 

2) Selecione todos os departamentos cujo orçamento mensal seja maior que 100000. 

Apresente o Nome de tal departamento e seu orçamento anual, que será obtido multiplicando-se o orçamento mensal por 12. 

Resp: Neste problema precisamos de uma expressão que é a combinação de um ou mais valores, operadores ou funções que resultarão em um valor. Esta expressão poderá conter nomes de colunas, valores numéricos, constantes e operadores aritméticos.

SELECT DEPNOME, DEPORCA * 12 FROM DEPT WHERE DEPORCA > 100000; 

3) Apresente a instrução anterior porém ao invés dos "feios" DepNome e DepOrca, os Títulos Departamento e Orçamento. 

Resp: Neste exemplo deveremos denominar colunas por apelidos. Os nomes das colunas mostradas por uma consulta, são geralmente os nomes existentes no Dicionário de Dado, porém geralmente estão armazenados na forma do mais puro "informatiquês", onde "todo mundo" sabe que CliCodi significa Código do Cliente. 

É possível (e provável) que o usuário desconheça estes símbolos, portanto devemos os apresentar dando apelidos às colunas "contaminadas" pelo informatiquês, que apesar de fundamental para os analistas, somente são vistos como enigmas para os usuários. 

SELECT DEPNOME "DEPARTAMENTO", DEPORCA * 12 "ORCAMENTO ANUAL" FROM DEPT WHERE DEPORCA > 100000; 

4) Apresente todos os salários existentes na empresa, porém omita eventuais duplicidades. 

Resp: A cláusula Distinct elimina duplicidades, significando que somente relações distintas serão apresentadas como resultado de uma pesquisa. 

SELECT DISTINCT EMPSERV FROM EMP; 

5) Apresente todos os dados dos empregados, considerando sua existência física diferente de sua existência lógica (ou seja devidamente inicializado). 

Resp: Desejamos um tratamento diferenciado para valores nulos. Qualquer coluna de uma tupla que não contenha informações é denominada de nula, portanto informação não existente. Isto não é o mesmo que "zero", pois zero é um número como outro qualquer, enquanto que um valor nulo utiliza um "byte" de armazenagem interna e são tratados de forma diferenciada pelo SQL. 

SELECT EMPNOME, EMPSALA + EMPCOMI FROM EMP; SELECT EMPNOME, NVL(EMPSALA,0) + NVL(EMPCOMI,0) FROM EMP; 

Observação: a função "NVL" é utilizada para converter valores nulos em zeros. 

6) Apresente os nomes e funções da cada funcionário contidos na tabela empresa, porém classificados alfabeticamente (A..Z) e depois alfabeticamente invertido (Z..A). 

Resp: A cláusula Order By modificará a ordem de apresentação do resultado da pesquisa (ascendente ou descendente). 

SELECT EMPNOME, EMPSERV FROM EMP ORDER BY EMPNOME; 
SELECT EMPNOME, EMPSERV FROM EMP ORDER BY EMPPNOME DESC; 

Nota: Também é possível fazer com que o resultado da pesquisa venha classificado por várias colunas. Sem a claúsula "order by" as linhas serão exibidas na sequência que o SGBD determinar. 

7) Selecione os Nomes dos Departamentos que estejam na fábrica. 

Resp: SELECT DEPNOME FROM DEPT WHERE DEPLOCA = "SAO PAULO"; 

O exemplo exigiu uma restrição (São Paulo) que nos obrigou a utilizar da instrução Where. Alguns analistas costumam afirmar em tom jocoso que SQL não passa de "Selecione algo De algum lugar Onde se verificam tais relações" Acreditamos que esta brincadeira pode ser útil ao estudante, na medida em que facilita sua compreensão dos objetivos elementares do SQL. 

Demais Operadores Operador Significado between ... and ... entre dois valores ( inclusive ) in ( .... ) lista de valores like com um padrao de caracteres is null é um valor nulo 

Exemplos: 

SELECT EMPNOME, EMPSALA FROM EMP WHERE EMPSALA BETWEEN 500 AND 1000; 

SELECT EMPNOME, DEPNUME FROM EMP WHERE DEPNUME IN (10,30); 

SELECT EMPNOME, EMPSERV FROM EMP WHERE EMPNOME LIKE 'F%'; 

SELECT EMPNOME, EMPSERV FROM EMP WHERE EMPCOMI IS NULL; 

O símbolo "%" pode ser usado para construir a pesquisa ("%" = qualquer sequência de nenhum até vários caracteres). Operadores Negativos operador descrição <> diferente not nome_coluna = diferente da coluna not nome_coluna > não maior que not between não entre dois valores informados not in não existente numa dada lista de valores not like diferente do padrao de caracteres informado is not null não é um valor nulo 

8) Selecione os Empregados cujos salários sejam menores que 1000 ou maiores que 3500. 

Resp: Necessitaremos aqui a utilização de expressão negativas. A seguir apresentamos operadores negativos. 

SELECT EMPNOME, EMPSALA FROM EMP WHERE EMPSALA NOT BETWEEN 1000 AND 3500; 

9) Apresente todos os funcionários com salários entre 200 e 700 e que sejam Vendedores. 

Resp: Necessitaremos de consultas com condições múltiplas. 

Operadores "AND" (E) e "OR" (OU). 

SELECT EMPNOME, EMPSALA, EMPSERV FROM EMP WHERE EMPSALA BETWEEN 700 AND 2000 AND EMPSERV = 'VENDEDOR'; 

10) Apresente todos os funcionários com salários entre 200 e 700 ou que sejam Vendedores. 

Resp: SELECT EMPNOME, EMPSALA, EMPSERV FROM EMP WHERE EMPSALA BETWEEN 700 AND 2000 OR EMPSERV = 'VENDEDOR'; 

11) Apresente todos os funcionários com salários entre 200 e 700 e que sejam Vendedores ou Balconistas. 

Resp: SELECT EMPNOME, EMPSALA, EMPSERV FROM EMP WHERE EMPSALA BETWEEN 700 AND 2000 AND ( EMPSERV = 'BALCONISTA' OR EMPSERV = 'VENDEDOR' ); 



SQL - CREATE DATABASE

PARTE I - Comandos de Modificações do Esquema e Criação de Banco de Dados


Os bancos de dados podem utilizar conjuntos de caracteres específicos dependendo da linguagem utilizada (idioma) sendo que, os mais utilizados são: Latin1 e UTF-8 (codificação de caracteres específicos: acentos, ç, etc.). 


Comando Create 

Este comando permite a criação de tabelas no banco de dados ou mesmo de sua criação. 


O primeiro comando para criação de um banco de dados em SQL é: CREATE DATABASE_Nome (nome sem espaços e caracteres especiais). 

Sintaxe: CREATE DATABASE < nome_db >; 

onde: nome_db - indica o nome do Banco de Dados a ser criado.

Sintaxe: CREATE TABLE < nome_tabela > ( nome_atributo1 < tipo > [ NOT NULL ], nome_atributo2 < tipo > [ NOT NULL ], ...... nome_atributoN < tipo > [ NOT NULL ] ) ; 

onde: 

nome_table - indica o nome da tabela a ser criada. 

nome_atributo - indica o nome do campo a ser criado na tabela. tipo - indica a definição do tipo de atributo ( integer(n), char(n), real(n,m), date... ). 

n- número de dígitos ou de caracteres m- número de casas decimais 

Agora vamos criar uma tabela. Use o editor para salvar em um arquivo ou digite na linha de comando do ISQL. 

CREATE TABLE CURSO_SQL 
(ID INT UNSIGNED NOT NULL AUTO_INCREMENT,
NOME VARCHAR(45) NOT NULL, 
ENDERECO VARCHAR(45) NOT NULL, 
EMAIL VARCHAR(45) NOT NULL, 
PRIMARY KEY (id) ) 
CHARACTER SET utf8 COLLATE utf8_general_ci; 


ATRIBUTOS 

• NULL / Not NULL – Permite ou não valores nulos 

• Unsigned / Signed – Permite ou não números negativos 

• Auto-increment – Gera sequencia de contadores (1, 2, 3, ...) 

Os tipos de dados char e varchar armazenam dados compostos do seguinte: 

• Caracteres maiúsculos e minúsculos, como a, b e c. 

• Numerais, como 1, 2 e 3. 

• Caracteres especiais, como arroba, (@), E comercial (&) e ponto de exclamação (!). 

VARCHAR - Tipo de dado que trabalha sem completar com espaços em branco a área não utilizada da string opostamente ao tipo VAR

CREATE DATABASE TRABALHO; 

O comando acima criou um Banco de Dados, porém este na verdade não passa de uma abertura no diretório, pois não conta com nenhuma tabela. 

Agora criaremos as tabelas que estarão contidas no Banco de Dados TRABALHO. 

A primeira Tabela será a de Departamentos (DEPT). Esta tabela conterá além dos campos também sua chave primária, suas chaves estrangeiras e também seus índices. 

A segunda tabela será a de Empregados (EMP), que também será criada. 

Não devemos esquecer de primeiramente abrirmos o Banco de Dados. Diferentemente do que ocorre em alguns aplicativos, em SQL o fato de criarmos um Banco de Dados, não significa que o banco recém criado já está preparado para utilização.  A instrução a seguir, providencia a abertura do Banco de Dados criado. 

OPEN DATABASE TRABALHO; 

Agora estamos prontos para criarmos as tabelas necessárias. 

Lembrando que o arquivo TABS.SQL, contém todas as instruções necessárias para criação do Banco de Dados Trabalho e de suas tabelas. 

Já o Arquivo DADOS.SQL irá popular estas tabelas. 

Para efeitos didáticos, criamos as tabelas de forma que sua população, em outras palavras os dados, sejam facilmente referenciáveis pelos estudantes. 

Assim sendo, na tabela de departamentos, contamos com 5 departamentos, cada um deles tendo seu gerente. 

Todos os “gerentes” tem nomes de cantoras brasileiras (Gal Costa, Marina Lima, etc), todos os “operários” tem nomes de jogadores de futebol, todas as vendedoras tem nomes de jogadoras de volei, todas as balconistas tem nome de jogadoras de basquete e o presidente da empresa exemplo, tem o mesmo nome do presidente do Brasil. 

Desta forma os testes devem resultar em grupos bastante definidos. 

Assim se você estiver listando Gerentes e aparecer um homônimo da Ana Paula (jogadora de volei), verifique sua query atentamente, pois muito provavelmente a mesma estará errada. 

A seguir código necessário a criação da tabela Departamento e seu índice: 

create table Dept ( DepNume integer(4) not null, 
DepNome char(20) not null, 
DepLoca char(20) not null, 
DepOrca integer(12,2), 
primary key (DepNume) ); 
create unique index DepNum on Dept (DepNume asc); 

Note-se que a chave primária já está definida juntamente com o registro da tabela. 

A criação do índice, que por razões óbvias deve ser criado após a tabela, naturalmente é um comando totalmente independente do primeiro create, que serviu para criar a tabela e suas característica básicas. 

Vamos analisar o código necessário para a criação da tabela de empregados, apresentado a seguir: 

create table Emp (EmpNume integer(5) not null, 
EmpNome char(30) not null, 
EmpGere integer(5) , 
EmpServ char(20) , 
DepNume integer(4) not null, 
EmpAdmi date not null, 
EmpSala integer(10,2), 
EmpComi integer(10,2), 
primary key (EmpNume), 
foreign key has (DepNume) references Dept on delete restrict on update cascade ); 
create unique index EmpNum on Emp (EmpNume asc); 
create index EmpDep on Emp (DepNume asc); 

A Tabela de Empregados não poderia ter sido criada antes da Tabela de Departamento, pois contém uma referência direta àquela tabela. 

Quando declaramos que DepNume é chave estrangeira, promovemos de fato a ligação do cadastro de empregados como o cadastro de departamentos. 

Ao restringirmos as exclusões, permitimos a existência de funcionários não alocados a nenhum departamento. Apesar desta prática ser contrária a tese de que devemos possuir apenas tuplas perfeitamente relacionáveis em nossas tabelas, podemos deixar esta pequena abertura, pois um usuário que excluísse inadivertidamente determinado departamento, acabaria por excluir também uma grande quantidade de funcionários, que estivessem ligados a este departamento. 

Já a atualização em cascata dos códigos de departamento é uma boa providência, na medida em que teremos, uma vez alterado algum código de departamento, a atualização imediata de todos os funcionários pertencentes ao departamento cujo código foi modificado. 

Observações: 

1- Observar que os índices são parte intrínseca das tabelas. 

2- A integridade relacional é garantida pelo Banco de Dados e não pelo aplicativo. 

3- Exclusões ou Alterações em Chaves Primárias, podem acarretar exclusões, anulações ou até mesmo perda de integridade nas tabelas onde esta chave primária existir como chave estrangeira. 

Portanto é imprescindível muito cuidado quando da elaboração do Banco de Dados. 

Uma tentação muito comum ao estudante é começar criando as tabelas do Banco de Dados sem prévia Normalização. 

Este talvez seja o melhor caminho para perder-se tempo em vão, pois quando você terminar de projetar suas telas de entrada de dados, notará "que nada funciona!". 

======================================================================

Comando Drop 

Este comando elimina a definição da tabela, seus dados e referências. 

Sintaxe: DROP TABLE < nome_tabela > ; 
Exemplo: DROP TABLE EMP; 

===============================================

Comando Alter 

Este comando permite inserir/eliminar atributos nas tabelas já existentes. 

Comando: ALTER TABLE ADD / DROP (nome_atributo1 < tipo > [NOT NULL], nome_atributoN [NOT NULL] ) ; 

Não existe nenhum comando SQL que permita eliminar algum atributo de uma relação já definida. 

Assim caso você desejar eliminar uma chave primária devidamente referenciada em outra tabela como chave estrangeira, ao invés de obter a eliminação do campo, obterá apenas um erro. Além do comando DROP que poderá eliminar uma tabela e suas relações, também podemos criar uma relação que tenha os atributos que se deseja, copiar-se a relação antiga sobre a nova e apagando-se então a relação que originalmente desejávamos eliminar. 

Exemplo: ALTER TABLE DEPT ( ADD DEPSALA DECIMAL (10,2) ); 


SQL - Structured Query Language


SQL - Structured Query Language


Introdução 

Quando os Bancos de Dados Relacionais estavam sendo desenvolvidos, foram criadas linguagens destinadas à sua manipulação. 

SQL - Linguagem Estruturada de Consulta, foi desenvolvida nos laboratórios do departamento de pesquisas da IBM, que desenvolveu a SQL como forma de interface para o sistema de banco de dados relacional denominado SYSTEM R, no início da década de 70, e  atualmente é o padrão adotado em banco de dados mundialmente. 

Em 1986 o American National Standard Institute (ANSI), publicou um padrão SQL.  O SQL estabeleceu-se como linguagem padrão de Banco de Dados Relacional. 

O SQL se diferencia das outras linguagens utilizadas para bancos de dados por especificar a forma do resultado e não o “caminho” para se chegar a ele é uma linguagem declarativa em oposição a outras linguagens procedurais. 


Os recursos disponibilizados pelo SQL são agrupados em cinco funcionalidades: 

DDL (Data Definition Language) = Linguagem de Definição de Dados, por meio dela podemos definir estruturas do banco tais como: tabelas, visões, sequenciais e outras estruturas. 

Comandos da DDL: CREATE (criação de estrutura), ALTER (alterar estrutura) e DROP (permite remover ou excluir uma estrutura). 

DDL (Data Definition Language) do SQL apresenta uma série de comandos que permitem a definição dos dados, composta pelos comandos. Como exemplo de comandos da classe DDL temos os comandos Create, Alter e Drop. 

O Comando Create, é destinado a criação do Banco de Dados, a criação das Tabelas que o compõe, além da criação das relações existentes entre as tabelas.


DML (Data Manipulation Language) = Linguagem de Manipulação de Dados, permite inserir, alterar e excluir informações nos objetos construídos pela DDL. 

A DML possui três comandos: INSERT (inserir dados), UPDATE (alterar informações) e DELETE (excluir dados). 

Os comandos da série DML (Data Manipulation Language), são destinados a consultas, inserções, exclusões e alterações em um ou mais registros de uma ou mais tabelas de maneira simultânea. 
Como exemplo de comandos da classe DML temos os comandos Select, Insert, Update e Delete. 





DQL (Data Query Language) = Linguagem de Consulta de Dados, complementa e permite recuperar e ler dados na estrutura do banco de dados, comando utilizado: SELECT possibilita a ordenação e agrupamento dos dados, cálculos (funções aritméticas) e filtros de seleção. 


DCL (Data Control Language) = Linguagem de Controle de Dados, gerencia as permissões de quem pode acessar o banco de dados, o que cada usuário tem acesso, quem pode ou não alterar e remover dados, dentre outras operações, dispõe de comandos de controle como Grant e Revoke.

Comandos da DCL: GRANT (habilita acesso a dados e operações) e REVOKE (revoga o acesso a dados e operações). 


DTL (Data Transaction Language) = Linguagem de Transação de Dados, permite operações conjuntas sendo estas iniciadas pela START TRANSATION, seguidas pela COMMIT (concretiza a transação) que informa ao servidor que a transação foi concluída com sucesso ou ROLLBACK que anula a transação. 

START TRANSACTION* COMMIT ROLLBACK * 

No SQL Server o comando START deve ser substituído por BEGIN 

Outra característica muito importante disponível em SQL é sua capacidade de construção de visões, que são formas de visualizarmos os dados na forma de listagens independente das tabelas e organização lógica dos dados. 

Outra característica interessante na linguagem SQL é a capacidade que dispomos de cancelar uma série de atualizações ou de as gravarmos, depois de iniciarmos uma seqüência de atualizações. 

Os comandos Commit e Rollback são responsáveis por estas facilidades. Devemos notar que a linguagem SQL consegue implementar estas soluções, somente pelo fato de estar baseada em Banco de Dados, que garantem por si mesmo a integridade das relações existentes entre as tabelas e seus índices. 

O Ambiente SQL Dispomos na Ibero de dois softwares destinados a linguagem SQL o ISQL e o WinSQL. 

O ISQL faz parte do pacote Ideo e permite construirmos Banco de Dados e tabelas diretamente pelo interpretador SQL, bem como acessarmos as Bases de Dados construídas no Ideo. 

O ISQL pode gerar Banco de Dados em seu ambiente proprietário (Watcom, hoje pertencente a Symantech) ou ainda nos consagrados Banco de Dados Oracle, SyBase, Ingres (Computer Associates), DB/2 (IBM) e Informix. 

Devido as origens do Ideo, o Banco de Dados SQL Server da Microsoft não é suportado, pois este Banco de Dados originou-se na microinformática e somente recentemente a Sapiens migrou seu software dos Ambientes Mainframe e Unix.

Já o WinSQL é um ambiente inteiramente gráfico (ao contrário do ISQL que guarda fortes características do ambiente em Mainframe onde se originou), destinado ao aprendizado, portanto somente pode criar Banco de Dados em seu formato proprietário. 

Os comandos do WinSQL por serem visuais, não necessitam de maior esclarecimento além daqueles já contidos no Help. 

Já o ISQL apesar de possuir um Help bastante completo necessita, em nosso entender, de alguns esclarecimentos iniciais. Uma série de comandos do interpretador, que funciona de forma análoga àquela existente no dBase modo interativo, podem ser utilizados pelo usuário. 

Não obstante alguns comandos tenham nome idêntico a alguns comandos do DOS, devemos notar que muitas vezes sua sintaxe é bastante diversa daquele sistema operacional. 

Vamos destacar os seguintes comandos: 

\EDIT 
- Carrega o editor de bloco de notas do windows, o qual serve para a criação de arquivos para serem executados no Ideo. 
Exemplo: \edit teste.sql 

\CD 
- Mostra o diretório onde serão gravados os arquivos *.sql, *.dic *.dat. Permite alterar para determinado diretório (\CD DADO, fará com que o diretório corrente passe a ser C:\DADO, caso o diretório corrente fosse a raiz. 
Permite retornar ao diretório de nível inferior (\CD ..). 

Atenção este comando não é análogo ao Change Dir do DOS, na medida em que não permite a mudança direta de um subnível do diretório X para um diretório Y por exemplo. 

\DEFAULT 
- permite alterarmos o drive corrente. 
Exemplo: \DEFAULT F: \INCLUDE 
- Executa arquivos *.sql. 

O arquivo .sql deverá conter uma série de instruções SQL. 
Exemplo: \include teste.sql @< file > ; 
- Também executa arquivos *.sql. 

Exemplo: @teste.sql; 

EXIT;  
- Finaliza a sessão do ISQL. ou ( \QUIT ) 

COMMIT;  
- Confirma a transação. 

ROLLBACK; 
- Desfaz a transação. 

SHOW ; - Mostra os nomes das tabelas existentes em determinado banco de dados.  Exemplo: SHOW tables; 

SHOW FIELDS FOR
- Mostra os campos de determinada tabela. 
Exemplo: SHOW FIELDS FOR ATOR; 

SHOW INDEXES FOR
- Lista de indices da tabela. 

SHOW RELATIONSHIPS FOR
- Lista de relacionamentos da tabela. 

LIST
- Lista conteúdo da tabela.


Tabelas - Forma Normal


Tabelas - Forma Normal 

A disciplina Análise de Sistemas abordará detalhadamente esta importante metodologia para definição das tabelas que irão compor a base de dados, que aqui apenas citaremos. 

Primeira Forma Normal: 

Uma relação se encontra na primeira forma normal se todos os domínios de atributos possuem apenas valores atômicos (simples e indivisíveis), e que os valores de cada atributo na tupla seja um valor simples. Assim sendo todos os atributos compostos devem ser divididos em atributos atômicos. 

Segunda Forma Normal: 

Uma relação se encontra na segunda forma normal quando estiver na primeira forma normal e todos os atributos que não participam da chave primária são dependentes desta. 

Assim devemos verificar se todos os atributos são dependentes da chave primária e retirar-se da relação todos os atributos de um grupo não dependente que dará origem a uma nova relação, que conterá esse atributo como não chave. 

Desta maneira, na segunda forma normal evita inconsistências devido a duplicidades. 

Terceira Forma Normal: 

Uma relação estará na terceira forma normal, quando estiver na primeira forma norma e todos os atributos que não participam da chave primária são dependentes desta porém não transitivos. 

Assim devemos verificar se existe um atributo que não depende diretamente da chave, retirá-lo criando uma nova relação que conterá esse grupo de atributos, e defina com a chave, os atributos dos quais esse grupo depende diretamente. 

O processo de normalização deve ser aplicado em uma relação por vez, pois durante o processo de normalização vamos obtendo quebras, e por conseguinte, novas relações. 

No momento em que o sistema estiver satisfatório, do ponto de vista do analista, este processo iterativo é interrompido. 

De fato existem literaturas indicando quarta, quinta formas normais, que não nos parece tão importante, nem mesmo academicamente. 

A normalização para formas apoiadas em dependências funcionais evita inconsistências, usando para isso a própria construção da Base. 

Se a mesma consistência for passível de ser garantida pelo aplicativo, a normalização pode ser evitada com ganhos reais no desempenho das pesquisas. No caso da consistência não ser importante, também podemos não normalizar totalmente uma Base de Dados. 

Exemplo: Normalizar os seguintes atributos: 

Nº do Pedido, Nome do Cliente, Nome dos Produtos, Quantidades Nº do Pedido, Código do Cliente, Nome dos Produtos, Quantidades Código do Cliente, Nome do Cliente Nº do Pedido, Código do Cliente, Código dos Produtos, Quantidades Código do Cliente, Nome do Cliente Código do Produto, Nome do Produto Nº do Pedido, Código do Cliente Código do Cliente, Nome do Cliente Código do Produto, Nome do Produto Nº do Pedido, Código do Produto, Quantidade Cliente Pedido Item Produto CliCodi PedNume PedNume ProCodi CliNome CliCodi ProCodi ProNome IteQtde 

O esquema apresentado anteriormente poderia ser inferido diretamente, usando metodologia tipicamente apresentada em Organização e Método. 

Se soubermos, por hipótese, que um profissional habilitado desenhou o pedido da empresa, e que esta o está utilizando com sucesso, poderíamos basear nosso modelo de dados neste formulário. 

Devemos notar que muitos Analistas de Sistemas não adotam estes procedimentos, por preferirem os métodos convencionais para elaboração do Modelo de Dados. 

Considerando qualquer formulário de pedidos podemos notar que o Número do Pedido geralmente tem destaque e sempre é único, ou seja encontramos nossa chave primária da Tabela de Pedidos, como sabemos que um cliente pode fazer mais de uma compra, achamos nossa Tabela de Clientes, que pode ter um Código, portanto achamos sua chave primária, que por conseguinte será a chave estrangeira da Tabela de Pedidos. 

Um ponto delicado, diz respeito aos itens do pedido, que formam geralmente um espaço destacado dentro do formulário de pedidos. Geralmente, e este é um dos casos, estas áreas em separado dos formulários darão origem a tabelas filhas, como é o caso típico das duplicatas em notas fiscais, ou dos dependentes na ficha de funcionários. 

Portanto achamos nossa Tabela de Itens que será ligada à Tabela de Pedidos através do Número do Pedido, que é ao mesmo tempo chave primária e chave estrangeira para a Tabela de Itens. 

Finalmente podemos perceber, que da mesma forma como os clientes se repetem em relação a Tabela de Pedidos, os produtos podem se repetir na tabela de itens (observe que não obstante não termos nenhum pedido com o mesmo item grafado duas vezes, este item pode ser adquirido em outro pedido). 

Assim descobrimos nossa quarta tabela, a Tabela de Produtos e a chave primária Código do Produto.

SGDB - Tipos de Banco de Dados

SGBD  - Tipos de Banco de Dados

Introdução 

Podemos citar como tipos principais os Bancos de Dados Relacionais, os Hierárquicos, os de Rede, os Semânticos, os Orientados a Objetos e os Universais. 

Os Bancos de Dados alvo de nosso estudo serão os Relacionais, sendo que os demais tipos serão apenas citados superficialmente, por não serem parte integrante de nosso curso.

Banco de Dados Hierárquicos 

Seguem o estilo de um organograma empresarial (Diretoria-Divisão-Seção-Setor) ou de biblioteca (Exata-Matemática- Algebra Linear-Vetores). Este modelo é capaz de representar este tipo de organização de forma direta, mas apresenta inconvenientes quando esta situação não aparece claramente com relações de hierarquia.

Banco de Dados em Redes 

Neste modelos os dados são dispostos em registros, previamente classificados em classes que descrevem a estrutura de determinado tipo de registro. Os registros são descritos em relações de conjuntos onde são estabelecidas as ligações lógicas entre eles. 

Um confusão habitualmente verificada, diz respeito a confusão que existe entre o conceito do Modelo de Redes e o existente na matemática. 

No modelo de Redes temos sempre um elemento distinto, o registro base e a partir dele são dispostos os demais registros. 

Temos sempre tipos de conjunto, que dispõe de três elementos, a saber: nome, tipo de registro pai e tipo de registro filho. 

Supondo um Registro contido no Arquivo de Disciplinas ministradas na escola, este seria um registro pai, na medida em que conteria a referência aos seus registros filhos (os alunos cursando aquela disciplina). 

As restrições impostas pelo Modelo de Redes podem ser descritas como de ordem de Entrada e de Existência. 

Em relação as restrições de entrada citamos a obrigatoriedade de cada novo registro estar conectado (ou apontado) ao conjunto indicado. 

Em relação a restrições de Existência podemos dizer que um componente de um tipo de registro pode existir de forma independente de outros desde que esteja conectado a algum outro registro fazendo parte de algum conjunto, ou sendo base de um novo conjunto. 

A identificação de um conjunto pode ser verificada através do esquema de ligação entre o registro pai e o registro filho, assim sendo, cada instância de conjunto apresenta um elemento de distinção, o tal registro pai, e os registros filhos devidamente ordenados, e portanto passíveis de serem acessados pelos seus elementos.

Banco de Dados Orientados ao Objeto 

Representam os dados como coleções que obedecem propriedades. São modelos geralmente conceituais dispondo de pouquíssimas aplicações reais. 

Neste Modelo não seria interessante a existência de uma tabela de funcionários e dentro dela alguma referência para cada registro, de forma a podermos saber onde (em que departamento) o funcionário está alocado. 

Um conjunto de regras disponibilizaria em separado os funcionários da fábrica, que no entanto estariam agrupados aos demais, para o sistema de folha de pagamento. Banco de Dados Universal Usa fortemente o conceito dos bancos de dados relacionais (ainda a serem vistos), no que concerne ao tratamento da informação dita caracter e muito do Modelo Orientado ao Objeto, no tocante ao tratamento de Imagens e Sons. 

Banco de Dados Relacional 

O Modelo de Dados relacional representa os dados contidos em um Banco de Dados através de relações. Estas relações contém informações sobre as entidades representadas e seus relacionamentos. 

O Modelo Relacional, é claramente baseado no conceito de matrizes, onde as chamadas linhas (das matrizes) seriam os registros e as colunas (das matrizes) seriam os campos. 

Os nomes das tabelas e dos campos são de fundamental importância para nossa compreensão entre o que estamos armazenando, onde estamos armazenando e qual a relação existente entre os dados armazenados. 

Cada linha de nossa relação será chamada de TUPLA e cada coluna de nossa relação será chamada de ATRIBUTO. 

O conjunto de valores passíveis de serem assumidos por um atributo, será intitulado de DOMÍNIO. 

Estes tópicos serão estudados cuidadosamente na disciplina Análise de Sistemas, que se incumbirá de apresentar cuidadosamente regras e normas para elaboração destes modelos. 

O domínio consiste de um grupo de valores atômicos a partir dos quais um ou mais atributos retiram seus valores reais. 

Assim sendo Rio de Janeiro, Paraná e Pará são estados válidos para o Brasil, enquanto que Coreientes não é um estado válido (pertence a Argentina e não ao Brasil). 

O esquema de uma relação, nada mais são que os campos (colunas) existentes em uma tabela. Já a instância da relação consiste no conjunto de valores que cada atributo assume em um determinado instante. 

Portanto, os dados armazenados no Banco de Dados, são formados pelas instâncias das relações. As relações não podem ser duplicadas (não podem existir dois estados do Pará, no conjunto de estados brasileiros, por exemplo), a ordem de entrada de dados no Banco de Dados não deverá ter qualquer importância para as relações, no que concerne ao seu tratamento.  Os atributos deverão ser atômicos, isto é, não são níveis de novas divisões. 

Chamaremos de Chave Primária ao Atributo que definir um resgistro, dentre uma coleção de registros. 

Chave Secundária (Terceária, etc), serão chaves que possibilitarão pesquisas ou ordenações alternativas, ou seja, diferentes da ordem criada a partir da chave primária ou da ordenação natural (física) da tabela. 

Chamaremos de Chave Composta, aquela chave que contém mais de um atributo (Por exemplo um cadastro ordenado alfabeticamente por Estado, Cidade e Nome do Cliente, necessitaria de uma chave composta que contivesse estes três atributos). 

Chamaremos de Chave Estrangeira, aquela chave que permitir a ligação lógica entre uma tabela (onde ela se encontra) com outra na qual ele é chave primária.


Banco de Dados - Componentes


Componentes de um Banco de Dados 

Um Banco de Dados é composto pelas seguintes partes: 

1) Gerenciador de Acesso ao Disco:  O SGBD utiliza o Sistema Operacional para acessar os dados armazenados em disco, controlando o acesso concorrente às tabelas do Banco de Dados.  O Gerenciador controla todas as pesquisas queries) solicitadas pelos usuários no modo interativo, os acessos do compilador DML, os acessos feitos pelo Processador do Banco de Dados ao Dicionário de Dados e também aos próprios dados. 


2) O Compilador DDL (Data Definition Language) processa as definições do esquema do Banco de Dados, acessando quando necessário o Dicionário de Dados do Banco de Dados. 


3) O Dicionário de Dados contém o esquema do Banco de Dados, suas tabelas, índices, forma de acesso e relacionamentos existentes. 


4) O Processador do Banco de Dados manipula requisições à própria Base de Dados em tempo de execução. Ele é o responsável pelas atualizações e integridade da Base de Dados. 

5) O Processador de Pesquisas (queries) dos usuários, analisa as solicitações, e se estas forem consistentes, aciona o Processador do Banco de Dados para acesso efetivo aos dados. 

As aplicações fazem seus acessos ao pré-compilador DML da linguagem hospedeira, que os envia ao Compilador DML (Data Manipulation Language) onde são gerados os códigos de acesso ao Banco de Dados.


SGDB - Arquitetura


Arquitetura de um SGBD 

Estrutura 

Podemos dizer que o Banco de Dados tem um Nível Interno, onde é descrita a estrutura de armazenamento físico dos dados, um Nível Intermediário, onde temos a descrição lógica dos dados e um Nível Externo onde são descritas as visões para grupos de usuários. 

Não podemos deixar de lembrar ainda que o Banco de Dados garante a Independência Lógica e Física dos Dados, portanto podemos alterar o esquema conceitual dos dados, sem alterar as visões dos usuários ou mesmo alterar o esquema interno, sem contudo alterar seu esquema conceitual. 

Modelos de Dados 

O Modelo de Dados é basicamente um conjunto de conceitos utilizados para descrever um Banco de Dados. 

Não existe uma única forma de representação deste modelo, porém qualquer forma que permita a correta compreensão das estruturas de dados compreendidas no Banco de Dados, pode ser considerada adequada. 

Modelo Orientado ao Registro: 

São modelos que representam esquematicamente as estruturas das tabelas de forma bastante próxima a existente fisicamente. Basicamente são apresentados os registros de cada tabela (inclusive seus campos) e seus relacionamentos elementares. 

O Modelo Relacional, o Modelo de Rede e o Hierárquico são exemplos deste tipo de representação. 

Modelo Semântico: 

São modelos onde existe uma representação explícita das entidades e relacionamentos. 

O Modelo Entidade-Relacionamento e o Funcional, são exemplos deste tipo de abordagem. 

Modelo Orientado ao Objeto: 

São modelos que procuram representar as informações através dos concietos típicos da Programação Orientada ao Objeto, utilizando o conceito de Classes que irão conter os objetos. 

Citamos os Modelos O2 e o de Representação de Objetos como exemplos típicos desta abordagem. 

O conceito de instância, sempre muito presente, poderia ser definido como sendo o conjunto de dados que definem claramente um Banco de Dados em determinado instante. 

Devemos entender então o Banco de Dados como sendo não apenas um conjunto de dados digitados, mas também todo o esquema e regras armazenada e controladas pelo SGBD. 

Em outras palavras, podemos dizer que os SGBD, vieram para eliminar todo o trabalho que anteriormente um programador de aplicação realizava controlando o acesso, integridade e redundância dos dados.

SGDB - Características Gerais


Características Gerais de um SGBD 

Os SGBD tem sete características operacionais elementares sempre observadas, que passaremos a listar: 

Característica 1: Controle de Redundâncias

- A redundância consiste no armazenamento de uma mesma informação em locais diferentes, provocando inconsistências. Em um Banco de Dados as informações só se encontram armazenadas em um único local, não existindo duplicação descontrolada dos dados. Quando existem replicações dos dados, estas são decorrentes do processo de armazenagem típica do ambiente Cliente-Servidor, totalmente sob controle do Banco de Dados. 

Característica 2: Compartilhamento dos Dados

- O SGBD deve incluir software de controle de concorrência ao acesso dos dados, garantindo em qualquer tipo de situação a escrita/leitura de dados sem erros. 

Característica 3: Controle de Acesso

- O SGDB deve dispor de recursos que possibilitem selecionar a autoridade de cada usuário. Assim um usuário poderá realizar qualquer tipo de acesso, outros poderão ler alguns dados e atualizar outros e outros ainda poderão somente acessar um conjunto restrito de dados para escrita e leitura. 

Característica 4: Interfaceamento

- Um Banco de Dados deverá disponibilizar formas de acesso gráfico, em linguagem natural, em SQL ou ainda via menus de acesso, não sendo uma "caixa-preta" somente sendo passível de ser acessada por aplicações. 

Característica 5: Esquematização

- Um Banco de Dados deverá fornecer mecanismos que possibilitem a compreensão do relacionamento existentes entre as tabelas e de sua eventual manutenção. 

Característica 6: Controle de Integridade

-Um Banco de Dados deverá impedir que aplicações ou acessos pelas interfaces possam comprometer a integridade dos dados. 

Característica 7: Backups

- O SGBD deverá apresentar facilidade para recuperar falhas de hardware e software, através da existência de arquivos de "pré-imagem" ou de outros recursos automáticos, exigindo minimamente a intervenção de pessoal técnico. 

Existe a possibilidade de encontramos Bancos de Dados que não satisfaçam completamente todas as características acima, o que não o inválida como Banco de Dados. 

Na prática podemos encontrar situações onde a primeira característica não seja importante, pois podemos ter o Banco de Dados baseado totalmente em um único servidor, e as redundâncias podem ser aceitas em algumas situações sob controle da aplicação (algo não muito recomendado, mas passível de aceitação, em situações onde a existência do nome do cliente em um arquivo contendo duplicatas emitidas, possibilita o acesso a apenas uma tabela sem relacionamentos, e sabe-se de antemão que uma duplicata depois de emitida, não pode ter seu cliente alterado). 

A segunda característica (Compartilhamento dos Dados) pode ser desconsiderada principalmente em ambiente de desenvolvimento, ou ainda em aplicações remotas. 

O Controle de Acesso pode ser descartado em pequenas empresas, sendo que o aplicativo em questão, mais o software de rede, podem facilmente se incumbir desta característica, no caso de pequenas empresas, com reduzido número de pessoas na área operacional. 

O Interfaceamento e a Esquematização, são características sempre disponíveis, o que varia neste caso é qualidade destes componentes, que vai desde o sofrível até o estado da arte. 

É muito conveniente que esta característica seja muito boa em um Banco de Dados, onde estiverem em atuação mais de um Administrador de Banco de Dados e tivermos um número relativamente alto de sistemas desenvolvidos ou em desenvolvimento neste ambiente. 

De fato, quanto maior o número de pessoas envolvidas no desenvolvimento de aplicações e gerenciamento do Banco de Dados, mais importante tornam-se estas duas características, pois cada novo sistema desenvolvido precisará sempre estar adequado ao Banco de Dados da Empresa e aderente aos padrões de acesso utilizados nos sistemas concorrentes. 

O Controle de Integridade, é outra característica sempre presente nos Bancos de Dados, mas existem diferenças quando da implementação desta característica. 

Assim, é comum encontrarmos Bancos de Dados que suportam determinado acesso, enquanto outros não dispõe de recurso equivalente. 

O Backup em tempo de execução, é outra característica sempre disponível, porém temos aplicações que invariavelmente são comprometidas por falhas de hardware, e outras, que o mesmo tipo de falha não causa perda alguma de dados ou de integridade.

Novamente, cada Banco de Dados tem esta característica melhor ou pior implementada, cabendo ao Administrador de Banco de Dados escolher aquele que lhe oferecer mais segurança. 

Devemos ressaltar ainda, que podemos ter um Banco de Dados Modelo A, que respeite integralmente as regras básicas e disponha de todas as características apresentadas, enquanto um Modelo B que apesar de respeitar as regras básicas, não suporte uma ou outra característica desejável, mas tenha um desempenho excelente, enquanto o Modelo A seja apenas razoável no quesito desempenho, nos levará seguramente a escolher o Modelo B como sendo o ganhador para nossa instalação! 

Isto ocorre pois, na prática, todo usuário deseja um tempo de resposta muito pequeno. 

O chamado “prazo de entrega” muito comum em Bancos de Dados operando nos limites de sua capacidade, ou nos casos onde o hardware está muito desatualizado, é fonte de inúmeros problemas para o pessoal de informática. 

Neste caso é melhor abrirmos mão de uma Interface Amigável, de um Gerenciamento Automático de Backups ou ainda de outras características que não julgarmos fundamentais, para nos livrarmos do problema típico de ambiente extremamente comprometido, por má performance do Banco de Dados. 

A escolha do Banco de Dados da empresa, portanto é uma decisão muito delicada, na medida em que está irá acarretar troca de aplicativos e troca de hardware. 

Os investimentos diretamente aplicados no Banco de Dados, costumam ser infinitamente menores do que aqueles a serem aplicados na empresa, visando sua perfeita adequação ao novo SGBD. 

Esta decisão, sempre que possível, deve ser tomada por especialistas em Banco de Dados, com profundos conhecimentos de Análise de Sistemas, de Banco de Dados e de Software de Gerenciamento de Bases de Dados, de forma a evitar que a empresa escolha um Banco de Dados inadequado aos seus propósitos, e que pouco tempo depois, seja obrigada a perder todos investimento realizado em Software e Hardware.