Você está na página 1de 7

Programao de Banco de Dados - parte 4 Publicado em: 04/08/2004 Este o quarto artigo relacionado com programao de Banco de Dados,

, neste artigo vam os continuar abordar os comandos SQL. No terceiro falamos mais do comando SELECT agora vamos falar sobre os demais comandos fechando o assunto SQL. Achei que no terceiro artigo ficou faltando falar melhor na recuperao de dados de vrias tabelas (JOINS) vamos ento fechar o SELECT com esse assunto. JOINS A clusula WHERE permite que voc conecte duas ou mais tabelas, com base nos valores de duas colunas nas duas tabelas.A clusula WHERE, no entanto, deve ser usada par a expressar restries envolvendo uma ou mais tabelas, e no para conectar tabelas, em bora seja comum fazermos isso. O mtodo apropriado para vincular tabelas a operao JO IN. Vou citar 2 exemplos onde ocorre problemas ao usar a clausula WHERE em junes: Exemplo 1: Consideremos duas Tabelas uma Tabela FUNCIONARIOS (idfuncionario,nome ) e outra DEPENDENTES (idfuncionario,nome,grauparentesco). Onde o idfuncionario na tabela FUNCIONARIOS a chave primria e na tabela DEPENDENTES a chame estrangeir a, a chave primria da tabela DEPENDENTES seria a concatenao de idfuncinario + nome. Sendo que a tabela DEPENDESTES tabela fraca de FUNCIONARIOS ( isso quer dizer q ue s existe um registro em Dependentes a partir da tabela funcionrio, isso tambm oc orre quando na chave primaria da tabela participa a chave primria de outra tabela ), bem voltando ao caso, suponha que queremos retornar todos os funcionrios e cas o o funcionrio tenha dependente retornamos tambm. A consulta com WHERE ficaria ass im SELECT F.Idfuncionario , F.nome,D.Nome From FUNCIONARIOS as F, DEPENDENTES as D Where F.Idfuncionario= D.Idfuncionario Bem nesta consulta somente iria retornar os funcionrios que possuem dependentes, os que no tivessem dependentes ficaria de fora. Exemplo 2: Consideremos ainda a tabela FUNCIONARIO e outra tabela TELFUNCIONARIO (idfuncionario,numero), muito comum , pois o campo telefone multivalorado ( perm ite vrios telefones) por isso foi criado uma tabela somente para os telefones. Be m neste caso temos o mesmo problema os funcionrios sem telefone no iriam ser retor nados usando a clausula WHERE. A operao JOIN combina colunas de duas tabelas se as linhas possurem campos de corre spondncia. Sua sintaxe : FROM tabela1 INNER JOIN tabela2 ON tabela1.col = tabela2.col As duas colunas no precisam ser correspondidas com o operador igual, embora este seja o mtodo mais comum de correspondncia de vrias tabelas.Voc pode usar qualquer um dos operadores relacionais ( >,>=,<,<= e <>). Alm disso voc pode combinar vrias re tries com operadores lgicos.Por exemplo: FROM tabela1 INNER JOIN tabela2 ON tabela1.col1 = tabela2.col1 AND tabela1.col2 <> tabela2.col2 TIPOS DE JUNES O SQL suporta dois tipos de junes: INNER JOIN esta juno retorna todos os pares com correspondentes de linhas nas duas

tabelas e descartam as linhas sem correspondentes de ambas as tabelas. OUTER JOIN esta juno retorna todas as linhas normalmente retornadas pela operao INNE R JOIN, mas as linhas da tabela esquerda ou da direita que no atendam condio. CROSS JOIN inclumos cada uma das combinaes de todas as linhas entre as tabelas. Na sintaxe MS-SQL Server, so comparadas as tabelas por uma coluna especfica para c ada tabela (chave estrangeira), linha por linha, e so listadas as linhas em que a comparao verdadeira. INNER JOIN Considere as tabelas: CLIENTE: Cod_cliente, Nome,Endereo PEDIDO: Num_Pedido,Prazo_Entrega Cod_Cliente, Cod_Vendedor,Data ITEMPEDIDO: num_pedido,Cod_produto,Quantidade PRODUTO: Cd_produto,Descrio,Unidade,ValUnidade. VENDEDOR: Cd_Vendedor,Nome, Comisso,Salario Problema: ver os pedidos de cada cliente: SELECT Cliente.nome,Pedido.cod_cliente,pedido.num_pedido FROM Cliente INNER JOIN Pedido ON Cliente.Cod_cliente = Pedido.Cod_cliente Problema: Mostre os clienter (ordenados) que tm prazo de entrega maior que 15 dia s para o produto "ARROZ" e sejam do Rio de Janeiro. SELECT Cliente.Nome FROM Cliente INNER JOIN Pedido ON Cliente.Cod_cliente=Pedido.Cod_Cliente INNER JOIN ItemPedido ON pedido.num_pedido = itempedido.num_pedido INNER JOIN Produto ON itempedido.Cd_produto= Produto.Cod_Produto WHERE Pedido.Prazo_Entrega > 15 AND Produto.Descrio='ARROZ' AND Cliente.UF = 'RJ' ORDER BY Cliente.Nome Problema: Mostre todos os vendedores que venderam chocolate em quantidade superi or a 5 Kg. SELECT DISTINCT Vendedor.Nome FROM Vendedor INNER JOIN Pedido ON Vendedor.Cod_Vendedor=Pedido.Cod_Vendedor INNER JOIN ItemPedido ON pedido.num_pedido = itempedido.num_pedido INNER JOIN Produto ON itempedido.Cd_produto= Produto.Cod_Produto WHERE Quantidade > 5 AND Produto.Descrio='CHOCOLATE' ORDER BY Vendedor.Nome Problema: Quantos clientes da cidade do Rio de Janeiro e de Niteri tiveram seus p edidos tirados pelo vendedor 'PAULO' fez no ms de janeiro. SELECT cidade,COUNT (nome_cliente), FROM Cliente INNER JOIN Pedido ON Cliente.Cod_Cliente=Pedido.Cod_Cliente INNER JOIN Vendedor

ON pedido.Cd_Vendedor = vendedor.Cd_Vendedor WHERE Cidade In('Rio de Janeiro','Niteroi') AND Data BETWEEN #01/01/2004# AND #31/01/2004# GROUP BY Cidade OUTER JOIN a seleo em que so restritas as linhas que interessam em uma tabela, mas so considera das todas as linhas de outra tabela. Ou seja, queremos ver quais linhas de uma tabela esto relacionadas com a outra ta bela e quais as linhas no esto. Poderamos dizer, que queremos ver quais clientes tem pedidos e quais clientes no t em pedidos. Um OUTER JOIN somente pode ser realizado entre duas tabelas, no mais que duas tab elas. O Outer Join possui 3 tipos: LEFT OUTER JOIN - so incluidas todas as linhas da primeira tabela na expresso. RIGHT JOIN - so includas todas as linhas da segunda tabela na expresso. FULL OUTER JOIN - so incluidas todas as linhas de ambas as tabelas, as que satisf azem a expresso e as que no satisfazem. INSERT, UPDATE E DELETE Adicionado Registro na Tabela - INSERT Sintaxe: INSERT INTO nome Tabela (nome das colunas ) VALUES ( valores ) Exemplo: INSERT INTO Clientes (nome,endereco) VALUES ('LUCIANA', 'AV ATLANTICA'). Podemos omitir a lista dos nomes das colunas, neste caso a lista de valores deve estar na mesma ordem que na tabela no banco, e a tabela no pode ter nenhum campo AutoNumeric, pois no pode ser omitido nenhum valor. Outro mecanismo para passar valores de colunas para a instruo INSERT seleciona-las de outra tabela. Exemplo: INSERT INTO PhoneBook Select ContactName,Phone,Fax From Customers. Esse tipo de insero permite a incluso de vrias linhas de uma s vez. Alterando Registros - UPDATE Sintaxe: UPDATE nome_tabela SET coluna1=valor1, coluna2=valor2... Where condio Problema: Alterar o valor unitrio do produto 'parafuso' UPDATE Produto Set val_unit = 2.00 Where Descrio= 'parafuso' Problema: atualizar o salario fixo de todos os vendedores em 30% mais bonificao de 100

UPDATE Vendedor Set Salrio = (Salrio * 1.30) + 100 Neste comando no foi usado a clausula WHERE neste caso todos os registros da tabe la Vendedor foram atualizados. Problema: Acrescentar 2,5% ao preo dos produtos que estejam abaixo da mdia dos preo s. UPDATE Produto Set Val_Unit = Val_Unit * 1.25 Where Val_Unit < (Select AVG(Val_unit) From Produto) Apagando Registros - DELETE Sintaxe: DELETE From nome_tabela Where condio. Exemplo: DELETE FROM Cliente Where IdCliente = 1. Se omitir a clausula WHERE todos os registros da tabela so deletados. OBS: Tanto no comando UPDATE como no DELETE na clausula WHERE pode-se usar SELEC T com todos as suas possibilidades. Terminamos aqui de falar sobre os comandos DML, passaremos agora a abordar os co mandos DDL mais precisamente o comando CREATE TABLE. CRIAO DE TABELAS - CREATE TABLE Estruturas de dados que podem ser criadas com um SGBD. Estruturas de Dados Descrio Tabela Armazena dados. Viso Representa logicamente subconjuntos de dados de uma ou mais tabelas. Seqncia Gera valores de chaves primrias. ndice Melhora o desempenho de algumas consultas. Tabelas

Uma tabela pode ser criada a qualquer momento. No necessrio especificar seu tamanho, no momento da sua criao, embora seja possvel. A estrutura de uma tabela pode ser modificada a qualquer momento, sem a necessida de de se tirar o banco do ar. Quando uma tabela criada sua definio armazenada no dicionrio de dados. Para se poder criar tabelas preciso ter o privilgio de CREATE TABLE e o direito de utilizar algum espao em disco, alocado para o banco de dados. Quem concede estes direitos para os usurios do banco o Administrador de Banco de Dados. (DBA) Comando Create Table Exemplo: CREATE TABLE FORNECEDORES (NUMERO NUMBER(2) PRIMARY KEY, NOME VARCHAR2(25) NOT NULL, TELEFONE CHAR(7), ENDERECO VARCHAR2(20), VALOR_FORNEC NUMBER (8,2)); Observaes:

O nome de uma tabela deve comear por uma letra. Pode ter at 30 caracteres. Deve conter apenas: A-Z, a-z, 0-9, _, $ e #. No pode ter o mesmo nome de qualquer outro objeto existente no esquema do usurio

Tipos de Dados NUMBER NUMBER(p,s) DATE CHAR(s) VARCHAR2(s) LONG

Tipos de Constraints - PRIMARY KEY - FOREIGN KEY - NOT NULL - UNIQUE - CHECK Observaes: - possvel criar uma constraint aps a criao da tabela. - Uma constraint pode ser definida a nvel de coluna ou a nvel de tabela. - Constraints so armazenadas no Dicionrio de Dados e podem ser facilmente recupera das se possurem nomes razoveis. Como dar Nome s Constraints Exemplo 1: Constraints Primary Key e Not Null. CREATE TABLE FORNECEDORES (NUMERO NUMBER(2) CONSTRAINT FORNECEDORES_NUMERO_PK PRIMARY KEY, NOME VARCHAR2(25) CONSTRAINT FORNECEDORES_NOME_NN NOT NULL, TELEFONE CHAR(7) CONSTRAINT FORNECEDORES_TELEFONE_NN NOT NULL, ENDERECO VARCHAR2(20), VALOR_FORNEC NUMBER (8,2)); Exemplo 2: Constraints Primary Key e Not Null. CREATE TABLE DEPARTAMENTOS (NUMERO NUMBER(2) CONSTRAINT DEPARTAMENTOS_NUMBER_PK PRIMARY KEY, NOME VARCHAR2(14) CONSTRAINT DEPARTAMENTOS_NOME_NN NOT NULL, LOCAL VARCHAR2(13)); Exemplo 3: Constraint Check e Integridade Referecial com a prpria tabela de Empre gados e com a tabela de Departamentos. CREATE TABLE EMPREGADOS (NUMERO NUMBER(4) CONSTRAINT EMPREGADOS_NUMBER_PK PRIMARY KEY, NOME VARCHAR2(10), SOBRENOME VARCHAR2(10), CPF CHAR(11) CONSTRAINT EMPREGADOS_CPF_UN UNIQUE,

CARGO VARCHAR2(9), NUM_SUPERVISOR NUMBER(4) CONSTRAINT EMP_EMP_NUM_SUPERVISOR_FK REFERENCES EMPREGADOS (NUMERO), DT_ADMISSAO DATE, SALARIO NUMBER(7,2), PERC_COMISSAO NUMBER(4,2) CONSTRAINT EMPREGADOS_PERC_COMISSAO_CK CHECK (PERC_COMISSAO IN (10, 12.5, 15, 17.5, 20)), NUMERO_DEPT NUMBER(2) CONSTRAINT EMPR_DEPARTAMENTOS_NUMERO_DEPT_FK REFERENCES DEPARTAMENTOS (NUMERO) ON DELETE CASCADE); Exemplo 4: CREATE TABLE DEPENDENTES (NUMERO_EMP NUMBER(4) CONSTRAINT DEPENDENTES_EMP_NUMERO_EMP_FK REFERENCES EMPREGADOS (NUMERO), NUM_ORDEM NUMBER(2), NOME VARCHAR2(10), CONSTRAINT DEPENDENTES_NUM_EMP_NUM_ORD_PK PRIMARY KEY(NUMERO_EMP, NUM_ORDEM)); Observaes sobre a Constraint Primary Key: - A constraint Primary Key uma combinao das constraints Unique e Not Null. - Um ndice nico automaticamente criado. Observaes sobre a Constraint Unique: - Designa uma coluna ou uma combinao de colunas de tal forma que duas linhas no pos sam ter o mesmo valor. - Valores nulos so aceitos. - Automaticamente criado um ndice nico para a(s) coluna(s) especificada(s). Observaes sobre a Constraint Foreign Key:

- Estabelece um relacionamento com a chave primria ou nica da mesma ou de outra ta bela. - Deve referenciar um valor existente na tabela pai ou ser nulo. - Chaves estrangeiras so baseadas em dados e so puramente lgicas, isto , no so pontei os fsicos. - Uma chave estrangeira, parte de uma chave primria, no pode ser nula pois uma cha ve primria no pode ser nula, nem parcialmente nula. - Havendo a clusula ON DELETE CASCADE, uma deleo na tabela pai causa a deleo das linh as relacionadas na tabela filho. Outras Formas de se Validar uma Restrio de Integridade - Triggers - Procedimentos ou funes armazenados no servidor de banco de dados - Atravs do cdigo na prpria aplicao. Como Criar uma Tabela Atravs de uma Subconsulta CREATE TABLE EMPREGADOS_VENDAS AS SELECT * FROM EMPREGADOS WHERE CARGO = 'VENDEDOR'; Observao:

- A tabela Empregados_Vendas criada contendo todos os empregados no cargo de ven dedores. - Apenas a constraint NOT NULL copiada.

Bem o assunto SQL no termina aqui, no abordamos os comando DCL responsvel pelo aces so e permisso de usurios.Tambm no falamos sobre Trigers, Procedures, Function e View . Devido a pedidos para falarmos logo do componente ADO nos prximos artigos vamos "cair" em cima da prtica com acesso a banco de dados pelo ADO, com exemplos de cd igos realizando: consultas, inseres, delees, alteraes, transaes, carregamento de li controle de concorrncia, backup e etc, enfim tudo com exemplos e feito via cdigo, no usarei componentes para acesso como o Data Control, que considero muito ruim e limitado.At a prxima.