You are on page 1of 20

script para a criao da base de dados drop table fornecedor; create table fornecedor (n_for number(5) not null

primary key , nome varchar2(15) not null , endereo varchar2(30) not null, cpf varchar2(14) not null , estrelas varchar2(1) not null , dt_atualiza date not null, vendas number(11,2) not null , comissoes number(11,2) not null, lucro number(11,2) not null); insert into fornecedor values (10,'renata', rua dos gusmes,'052.433.54582','3','10-042001',300.00,80.00,10.00); insert into fornecedor values (20,'paulo',rua b,'556.747.639-68','5','14-032001',800.00,90.00,20.00); insert into fornecedor values (30,'ana',rua diamantina,'078.876.42090','1','10-012001,1000.00,95.00,30.00); drop table conta; create table conta (n_contanumber(5) not null primary key , n_for number(5) not null , tipo varchar(1) not null , bloqueada varchar2(1) not null , saldo number(12,2) not null , dt_ult_limp date , dt_ult_lanc date not null, constraint fornec_fk foreign key (n_for) references fornecedor(n_for)); insert into conta values (1,20,'c','n',240000,'01-04-2001','22-04-2001'); insert into conta values (2,20,'p','n',210000,'01-03-2001','01-04-2001'); insert into conta values (3,10,'c','n',89000,'01-04-2001','20-04-2001'); insert into conta values (4,30,'c','n',11300,'01-04-2001','21-04-2001'); insert into conta values (5,30,'c','n',2500,'1503-2001','15-03-2001'); drop table lanc; create table lanc (dt_lanc date not null , n_conta number(5) not null , n_lanc number(5) not null primary key , valor number(12,2) not null , historico varchar2(30), constraint conta_fk foreign key (n_conta) references conta (n_conta)); insert into lanc values ('01-03-2001',2,106,2000000,'deposito inicial'); insert into lanc values ('15-03-2001',5,107,32500,'carto de crdito'); insert into lanc values ('01-042001',1,108,-100000,'saque'); insert into lanc values ('01-04-2001',2,109,100000,'deposito'); insert into lanc values ('20-04-2001',3,110,80000,'deposito'); insert into lanc values ('21-04-2001',4,111,-8700, 'conta de telefone');

insert into lanc values ('21-04-2001',1,112,-5000, 'saque p/ transferncia'); insert into lanc values ('21-04-2001',4,113,5000,'deposito de transferncia'); insert into lanc values ('22-04-2001',1,114,35000,'deposito'); drop table a_fazer; create table a_fazer (feito varchar2(1), data date not null , observ varchar2(60) not null); insert into a_fazer values ('s','14-03-2001','avisar ana: carto de credito = 32500'); insert into a_fazer values ('s','01-04-2001','enviar extrato da poupana 2 para renata'); insert into a_fazer values ('s','14-04-2001','enviar conta de telefone para ana'); drop table erro; create table erro (data date not null , descricao varchar2(60)); insert into erro values ('01-04-2001','saque de 12000 de conta 5 no realizado por falta de fundos'); drop table cliente; create table cliente (nome varchar2(15), endereo varchar2(30), estado varchar2(02), cep varchar2(08), vendas number(11,2), codigo number(05), primary key (codigo), data_nasc date, parcelas number(05), status varchar2(01), valor_nota number(11,2), emissao_nota date); drop table titulo; create table titulo (codigo number(05) not null, foreign key (codigo) references cliente (codigo), num_titulo number(05) not null, primary key (num_titulo), valor_titulo number(11,2) not null, valor_juros number(11,2) not null, valor_desconto number(11,2) not null, valor_pago number(11,2) not null, data_emisso date, data_vencto date, data_pagto date); insert into cliente values(maria, rua dos trilhos,sp,03040010, 7500.00,00020,10-10-58 ,5,a,2000.00, 29-

09-05); insert into cliente values(antonio,rua matilde,sp,07050001,5000.00,00010,08-0860,8,a,3000.00, 01-1005 ); insert into cliente values(itamar, av. emilio ribas,sp,07050001, 6000.00,00030,01-0180,10,i,1000.00,0104-05 );

exerccios de pl-sql com variveis 1. alterar o valor de uma varivel, mostrando-a em seguida. - criar um bloco pl-sql para calcular o valor do novo salrio mnimo que dever ser de 25% em cima do atual, que de r$ 240.00, no qual este valor dever ser constante dentro do bloco, informando em seguida.. 2. fazer clculos usando variveis, mostrando-a em seguida. - criar um bloco pl-sql para calcular o valor em reais de 45 dlares, sendo que o valor do cmbio a ser considerado de 2,98, no qual estes valores devero ser constantes dentro do bloco. 3. alterar o valor de uma varivel, sendo que a mesma dever ser informada em tempo de execuo - criar um bloco pl-sql para calcular o valor do novo salrio mnimo que dever ser 25% em cima do atual, no qual o salrio dever ser informado em tempo de execuo. 4. fazer clculo usando variveis, sendo que a mesma dever ser informada em tempo de execuo - criar um bloco pl-sql para converter em reais os dlares informados, sendo que o valor do cmbio a ser considerado de 2,98, no qual o valor dos dlares devero ser informados em tempo de execuo. 5. fazer clculo das parcelas da compra de um carro clculando juros - criar um bloco pl-sql para calcular o valor das parcelas de uma compra de um carro, nas seguintes condies: observao: 1 - parcelas para aquisio em 10 pagamentos. 2 - o valor da compra dever ser informado em tempo de execuo. 3 o valor total dos juros de 3% e dever ser aplicado sobre o montante financiado 4 no final informar o valor de cada parcela 6. fazer clculo das parcelas da compra de um carro com vrias condies de pagamento criar um bloco pl-sql para calcular o valor de cada parcela de uma compra de um carro, nas

seguintes condies: (2.0). - parcelas para aquisio em 6 pagamentos. - parcelas para aquisio em 12 pagamentos. - parcelas para aquisio em 18 pagamentos. observao: 1 - o valor da compra dever ser informado em tempo de execuo. 2 dever ser dada uma entrada de 20% do valor da compra. 3 dever ser aplicada uma taxa juros, no saldo restante, nas seguintes condies: a pagamento em 6 parcelas: 10%. b pagamento em 12 parcelas: 15%. c pagamento em 18 parcelas: 20%. 4 no final informar o valor das parcelas para as 3 formas de pagamento, com o valor de aquisio de 10.000 7. inserir dados em uma tabela, informando o valor em variveis - criar um bloco pl-sql para adicionar na tabela fornecedor as seguintes informaes: : nmero do fornecedor. : nome do fornecedor. : endereo do fornecedor. : cpf do fornecedor. : estrelas do fornecedor. : data de atualizao = dever ser sysdate. : vendas do fornecedor. : comisses do fornecedor. 8. alterar dados em tabelas, com valor informado constante - criar um bloco pl-sql para aumentar o valor das vendas em r$ 3000,00 de todos os fornecedores que tenham mais que 3 estrelas, sendo que o valor de r$ 3000 dever ser informado em tempo de execuo. 9. deletar dados em tabelas, com o valor a ser deletado informado - criar um bloco pl-sql para deletar da tabela fornecedores o fornecedor de numero 30, no qual o numero do fornecedor dever ser informado em tempo de execuo. 10. acessar na tabela fornecedor o endereo e as vendas, sendo que o valor do fornecedor dever ser constante - criar um bloco pl-sql para acessar, na tabela fornecedores, o endereo e as vendas do fornecedor cujo nmero dever ser informado na tela, mostrando em seguida o nmero do fornecedor, o endereo e as vendas. 11. acessar tabela fornecedor, cujo cdigo dever ser informado na tela e alterar o valor da comisso, nas condies abaixo. - criar um bloco pl-sql para acessar, na tabela fornecedores, o fornecedor informado na tela. caso no encontre dar a mensagem fornecedor no informado. caso encontre dever fazer a seguinte atualizao na comisso. se as vendas forem maiores que 6000

a comisso dever ser 15% do valor das vendas caso contrrio a comisso dever ser de 5% do valor das vendas no final dar uma mensagem do valor calculado da comisso. 12. acessar tabela conta e inserir na tabela a fazer. - criar um bloco pl-sql para recuperar o numero da conta com saldo inferior a 1000 em uma varivel e inserir na tabela a-fazer uma tarefa pedindo para enviar uma correspondncia para aquela conta. 13. inserir dados na tabela lanamentos, usando a opo de loop com um nmero fixo de vezes. - criar um bloco pl/sql para inserir na tabela de lanamentos, lanamentos de deposito de r$ 100,00, partindo do lanamento 150 at o lanamento 160, para a conta 4, data de lanamento sysdate, e histrico deposito em conta corrente. obs: usar opo loop com um nmero fixo de 10 vezes e informar totais de lanamento. 14. inserir contas na tabela contas - criar um bloco pl/sql para inserir contas na tabela contas, de acordo com as condiles abaixo: - acessar o fornecedor 30 - se as vendas forem menor que 500 - inserir as contas 6 a 10 com: . tipo = b . bloqueada = n . saldo inicial de 50,00 e ir aumentando de 10,00 em 10,00 . dt_ult_limp e lanc = sysdate - se as vendas forem maior ou igual a 500 - inserir as contas 11 a 15 com: . tipo = c . bloqueada = n . saldo inicial de 100,00 e ir aumentando de 20,00 em 20,00 . dt_ult_limp e lanc = sysdate - no final atualizar a dt_atualiza do fornecedor para sysdate e informar que o processo foi ok. 15. seleo de fornecedor tratando o codigo e mensagem de erro - criar uma pl/sql para selecionar da tabela fornecedor o fornecedor informado na tela, caso no encontre dever informar o cdigo e menagem de erro fornecido pelo oracle (sqlcode e sqlmerrm) 16. seleo de fornecedor usando a opo raise - criar uma pl/sql para selecionar da tabela fornecedor o fornecedor informado na tela, caso no encontre dever dar uma mensagem de erro utilizando a opo raise 17. seleo de fornecedor usando a opo raise_aplication_error criar uma pl/sql para selecionar da tabela fornecedor o fornecedor informado na tela, caso no encontre dever dar uma mensagem de erro utilizando a opo raise_aplication_error

18. criao de ttulos com base nas notas emitidas dos clientes - criar uma pl-sql para incluir ttulos na tabela ttulos para todos os clientes ativos da tabela cliente, com as seguintes condies: . codigo = codigo do cliente . numero do titulo = sequencial a partr de 1, para cada cliente selecionado. . valor do titulo = valor da compra dividido pelo nmero de parcelas . valor dos juros = 0 . valor dos descontos = 0 . valor pago = 0 . data de emisso = emisso da nota fiscal do cliente . data de vencto = dever ser de 30 em 30 dias a partir da emisso , para cada ttulo . data de pagamento = nulo

Sub-consultas SQL Uma sub-consulta uma instruo SELECT aninhada dentro de outra instruo SELECT, INSERT, DELETE ou UPDATE. Veja abaixo alguns exemplos de sintaxe: Comparao [ANY|SOME|ALL] (instruo sql) Expresso [NOT] IN (instruo sql) Expresso [NOT] EXISTS (instruo sql) Os predicados ANY e SOME, sinnimos, so utilizados para recuperar registro na consulta principal que satisfaam a comparao com qualquer registro da subconsulta. Tabela A XY 1 5 2 9 3 10 4 6 Tabela B X Y 10 4 20 3 30 11 40 9 Exemplo: Listagem 11: Exemplo de subconsulta 1SELECT * FROM A 2WHERE Y > ANY (SELECT Y FROM B WHERE X>20) Resultado: XY 3 10 Os registros da tabela A que forem maior do que qualquer registro do resultado da sub-consulta sero selecionados. Repare que nenhum registro da tabela A maior do que 11, no entanto, o terceiro registro maior do que 9. Vamos a outro exemplo: Listagem 12: Exemplo de subconsulta com o operador ANY 1SELECT * FROM A WHERE Y > ANY (SELECT Y FROM B WHERE X < 40) Resultado: XY 1 5 2 9 3 10 4 6 Todos os registros foram selecionados porque o valor de y no resultado da subconsulta assume 3, que menor do que todos os valores de y da tabela A. Se utilizarmos o ANY com sinal de igualdade teremos o mesmo resultado da clusula IN. Exemplo: Listagem 13: Exemplo com o operador ANY e sinal de igualdade 1SELECT * FROM A WHERE Y = ANY (SELECT Y FROM B) Resultado: XY 2 9 Listagem 17: Outro exemplo de select com operador ANY 1SELECT * FROM A WHERE Y > ALL (SELECT Y FROM B WHERE X > 30) Resultado:

XY 3 10 O uso de != ALL equivale a NOT IN. Listagem 18: Subconsulta com operador ALL 1SELECT * FROM A WHERE Y != ALL (SELECT Y FROM B) Resultado: XY 1 5 3 10 4 6 O predicado IN utilizado para recuperar apenas os registros na consulta principal que contm equivalncia na sub-consulta. o mesmo que =ANY. Listagem 19: Consulta com operador IN 1SELECT * FROM A WHERE Y IN(SELECT Y FROM B) Resultado: XY 2 9 No cdigo a seguir retornamos os empregados que venderam um montante maior que R$ 50.000,00. Listagem 20: Select com operador IN utilizando HAVING 1SELECT * FROM EMPREGADO WHERE CODIGO IN 2(SELECT CODEMPREGADO FROM VENDAS 3GROUPY BY CODEMPREGADO 4HAVING MAX(VALORTOTAL) > 50000) De maneira contrria, NOT IN pode ser utilizado para recuperar apenas os registros na consulta principal para os quais no exista equivalncia na sub-consulta. Listagem 21: Select com operador NOT IN 1SELECT * FROM A WHERE Y NOT IN(SELECT Y FROM B) Resultado: XY 1 5 3 10 4 6 O predicado EXISTS determina se a sub-consulta retorna algum registro. Esta clusula produz resultados semelhantes ao uso de IN. Veja exemplo: Listagem 22: Consulta com operador EXISTS 1SELECT * FROM EMPREGADO WHERE EXISTS 2(SELECT * FROM PEDIDOS 3 WHERE EMPREGADO.CODIGO = PEDIDOS.CODEMPREGADO 4 GROUP BY PEDIDOS.CODEMPREGADO 5 HAVING MAX(PEDIDOS.VALOR_TOTAL) > 50000) Neste comando so retornados o nome e o departamento dos funcionrios cuja soma de vendas ultrapassaram R$ 50.000,00. O predicado NOT EXISTS tambm pode ser utilizado produzindo o efeito contrrio: Listagem 23: Consulta com operador NOT EXISTS 1SELECT * FROM EMPREGADO WHERE NOT EXISTS 2(SELECT * FROM PEDIDOS 3WHERE EMPREGADO.CODIGO = PEDIDOS.EMPREGADO)

Sintaxe do comando SELECT

SELECT FROM WHERE GROUP BY HAVING ORDER BY

[DISTINCT] {*, coluna [pseudnimo], ... } tabela condio(es) coluna(s) condio(es) {coluna, expr} [ASC|DESC];

SELECT - selecciona pelo menos uma coluna. A sua ordem de execuo segue a sequncias das clusulas apresentadas acima; Pseudnimo - usado como nome alternativo em colunas do select; * - designa todas as colunas; DISTINCT - utilizado para eliminar linhas duplicadas (se as houver); FROM tabela - designa a tabela de onde provm as colunas; WHERE condio - limita a consulta s linhas que satisfazem a condio; GROUP BY - recebe as linhas seleccionadas anteriormente (com ou sem WHERE) e agrupa por coluna. Se forem indicadas vrias colunas usa a segunda para desempatar a primeira (faz quebra); HAVING - s utilizada quando h GROUP BY. Permite excluir grupos formados por GROUP BY ORDER BY - recebe as linhas seleccionadas anteriormente e ordena por uma ou mais colunas. Sempre a ultima clusula; ASC - ordem crescente de ordenao; a opo por omisso; DESC - ordem decrescente de ordenao;

drop table cliente cascade constraint; drop table titulo cascade constraint; drop table locacao cascade constraint;

create table cliente ( cd_cliente nm_cliente endereco telefone ); number primary key, varchar2(30), varchar2(100), number(8)

insert into cliente values (1,'ClienteA','Endereo ClienteA',11111111);

insert into cliente values (2,'ClienteB','Endereo ClienteB',11112222); insert into cliente values (3,'ClienteC','Endereo ClienteC',11113333); insert into cliente values (4,'ClienteD','Endereo ClienteD',11114444); insert into cliente values (5,'ClienteE','Endereo ClienteE',11115555); insert into cliente values (6,'ClienteF','Endereo ClienteF',11116666);

create table titulo ( cd_titulo nm_titulo number primary key, varchar2(100),

valor_locacao number(15,2), sinopse ); varchar2(500)

insert into titulo values (1,'TituloA',10,'SinopseA - blablablablablabla'); insert into titulo values (2,'TituloB',15,'SinopseB - blablablablablabla'); insert into titulo values (3,'TituloC',15,'SinopseC - blablablablablabla'); insert into titulo values (4,'TituloD',10,'SinopseD - blablablablablabla'); insert into titulo values (5,'TituloE',10,'SinopseE - blablablablablabla'); insert into titulo values (6,'TituloF',15,'SinopseF - blablablablablabla'); insert into titulo values (7,'TituloG',10,'SinopseG - blablablablablabla'); insert into titulo values (8,'TituloH',5,'SinopseH - blablablablablabla'); insert into titulo values (9,'TituloI',5,'SinopseI - blablablablablabla'); insert into titulo values (10,'TituloJ',10,'SinopseJ - blablablablablabla');

create table locacao (

cd_titulo cd_cliente dt_saida

number, number, date,

dt_devolucao date );

alter table locacao add constraint loc_tit_fk foreign key (cd_titulo) references titulo(cd_titulo); alter table locacao add constraint loc_cli_fk foreign key (cd_cliente) references cliente(cd_cliente);

insert into locacao values (1, 1, '09/10/2010','10/10/2010'); insert into locacao values (1, 2, '08/11/2009','09/11/2009'); insert into locacao values (1, 3, '09/03/2009','10/03/2009'); insert into locacao values (1, 4, '08/04/2010','09/04/2010'); insert into locacao values (2, 5, '09/07/2010','10/07/2010'); insert into locacao values (3, 1, '10/06/2010','11/06/2010'); insert into locacao values (4, 2, '20/09/2010','21/09/2010'); insert into locacao values (5, 3, '30/05/2010','01/05/2010'); insert into locacao values (6, 4, '10/02/2009','11/02/2009'); insert into locacao values (7, 5, '20/02/2009','21/02/2009'); insert into locacao values (8, 1, '28/02/2009','01/02/2009'); insert into locacao values (9, 1, '10/02/2009','11/02/2009'); insert into locacao values (8, 2, '11/02/2009','12/02/2009'); insert into locacao values (9, 2, '15/11/2009','16/11/2009'); insert into locacao values (8, 4, '23/11/2009','24/11/2009'); insert into locacao values (5, 3, '04/11/2009','05/11/2009'); insert into locacao values (4, 5, '05/11/2009','07/11/2009');

commit;

-----------------------------------------------------------------------------------CONSULTAS --

----------------------------------------------------------------------------------SELECT * (ASTERISCO) uma tabela FROM ALIAS e tabelas : : comando utilizado identificar a(s) coluna(s) comando utilizado para retornar todos os campos de

: :

comando utilizado para identificar a(s) tabela(s) apelido, codinome que pode ser utilizado para colunas

----------------------------------------------------------------------------------------------------------------------------------------------------------------------clausulas WHERE consulta DISTINCT ORDER BY DESC GROUP BY de agregao HAVING OPERADORES LGICOS : utilizado juntamente com a clausula WHERE and as condies forem verdadeiras or uma das condies forem verdadeiras retorna verdadeiro se retorna verdadeiro se : agrupa o resultado do select, mas necessita de funes : comando (clasula sql) utilizado para definir o filtro da RESTRIGINDO CONSULTAS

: :

elimina linhas duplicadas ordena o resultado do select pode ser ASC (asc)ou

igual a clausula WHERE

not condio for falsa OPERADORES DE COMPARAO :

retorna verdadeiro se a

utilizados juntamente com a clausula WHERE = > >= igual a maior que maior ou igual

que < <= que <> ou != OUTROS OPERADORES : between..and.. entre dois valores (inclusive) in(lista) valores like caracteres is null um valor nulo satifaz um padro de satisfaz uma lista de diferente menor que menor ou igual

----------------------------------------------------------------------------------------------------------------------------------------------------------------------SUM COUNT AVG MAX MIN : : : : : soma os valores das coluna conta a quantidade de registros existentes na tabela calcula a mdia de valores existente na coluna retorna o maior valor existente na coluna retorna o menor valor existente na coluna FUNO DE AGREGAO

-COUNT - Retorna o total de linhas de uma consulta. SELECT COUNT(*) FROM produtos Resultado: 5 --AVG - Retorna o valor mdio de uma coluna. SELECT AVG(valor) FROM produtos Resultado: 2.726 --MAX - Retorna o valor mais alto. SELECT MAX(valor) FROM produtos Resultado: 5.55 --MIN - Retorna o valor mais baixo SELECT MIN(valor) FROM produtos Resultado: 1.59 --SUM - Retorna a soma da coluna. SELECT SUM(qtdDisponivel) FROM produtos Resultado: 47 --UPPER - Converte para maisculo SELECT UPPER('Code Break') Resultado: CODE BREAK --LOWER - Converte para misculo SELECT LOWER('Code Break') Resultado: code break --REVERSE - Retorna o valor invertido

SELECT REVERSE('Code Break') Resultado: kaerB edoC --LEN - Retorna o COUNT SELECT LEN('Code Break') Resultado: 10 --ROUND Retorna o valor arredondado, ROUND(valor, decimais) SELECT ROUND('2.55',0) Resultado: 3 --SUBSTRING - Retorna parte da string, SUBSTRING(coluna, inicio, quantidade) SELECT SUBSTRING('Code Break', 1, 4) Resultado: Code --LEFT - Retornas os caracteres esquerda, LEFT(coluna, numero de caracteres) SELECT LEFT('Code Break', 4) Resultado: Code --RIGHT - Retornas os caracteres direita, RIGHT(coluna, numero de caracteres) SELECT RIGHT('Code Break', 5) Resultado: Break --LTRIM - Remove espaos esquerda. SELECT '-' + LTRIM(' Code Break') + '-' Resultado: -Code Break--RTRIM - Remove espaos direita. SELECT '-' + RTRIM('Code Break Resultado: -Code Break--REPLACE - substituir algum valor SELECT REPLACE('Code Break', 'Break', 'ABC') ') + '-'

Resultado: Code ABC --CAST - Converte um valor especifico. SELECT CAST(123 AS VARCHAR(10)) Resultado: 123 --CONVERT - Converte um valor especifico. SELECT CONVERT(VARCHAR(12),GETDATE(),103) Resultado: 19/08/2011 --CHARINDEX - Posio de caracteres em uma string

SELECT CHARINDEX ( 'Break','Code Break') Resultado: 6 --ISNULL - Substitui quando for NULL por algum valor predefinido SELECT ISNULL(NULL, 'Sem nome') Retorna: Sem nome --ISNUMERIC - Quando for int, float, money ou decimal retorna 1, quando nao for, retorna 0 SELECT ISNUMERIC(123) Retorna: 1 --NEWID - Gera um identificador nico (uniqueidentifier) SELECT NEWID() Retorna: 7F6D84B6-7B55-489B-9558-3BE8F369E1E1 --GETDATE - Data e hora atual do sistema SELECT GETDATE() Retorna: 2011-08-17 19:00:55.023 --DATEADD - Adicionar dias=dd, minutos=mi, segundos=s, millisegundos=ms SELECT DATEADD(dd,1,GETDATE()) Resultado: 2011-08-18 19:01:32.227

Outros exemplos teis de SQL: --ROW_NUMBER() - Cria uma coluna com ordenao SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS ordem FROM produtos --Listar tabelas temporarias SELECT * FROM tempdb.sys.tables --Listar todas as tabelas do banco de dados SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES --Selecionar nome das colunas de uma tabela SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'tabela' --Selecionar o nome de todos bancos de dados SELECT name FROM sys.sysdatabases --Pegar ID da sessao SELECT @@SPID

Unio de tabelas Para realizar a unio de tabelas, basta acrescentarmos aps a clusula FROM do comando SELECT as tabelas que queremos unir. Devemos colocar na clusula WHERE a condio de unio das tabelas, ou seja, as respectivas chaves primria e estrangeira. Sintaxe:

SELECT Tabela1.coluna1, Tabela1.coluna2, Tabela2.coluna1, Tabela2.coluna2 FROM Tabela1, Tabela2 WHERE Tabela1.chave_primaria = Tabela2.chave_estrangeira

Note que opcional colocar a identificao da tabela antes do nome das colunas na lista de campo do comando SELECT. Contudo, essa uma prtica recomendada para facilitar o entendimento do comando. Essa regra s no vlida quando estivermos querendo mostrar uma coluna que tenha o mesmo nome em ambas as tabelas normalmente o que acontece com as chaves primria e estrangeira. Nesse caso necessrio indicar de qual tabela se quer a informao ainda que, de fato, o dado seja igual nas duas tabelas. Considere que na maior parte dos bancos de dados, informar em qual tabela est a coluna facilita o trabalho do banco de dados. Essa prtica leva a maior agilidade na recuperao da informao.

Unio regular

Denomina-se unio regular as unies que tm a clusula WHERE unindo a chave primria estrangeira das tabelas afetadas pelo comando SELECT. Exemplo:

SELECT PEDIDO.CODIGO, PEDIDO.CODCLIENTE, PEDIDO.DATA, CLIENTES.NOME FROM PEDIDO, CLIENTES WHERE PEDIDO.CODCLIENTE = CLIENTES.CODCLIENTE;

Desta maneira o select trar todos os registros em que o cdigo do cliente seja igual ao cdigo do pedido, o interessante aqui, que ele traz tambm o nome do cliente na tabela Pedido, sabendo claro que no h este campo na tabela pedido.

Podemos tambm fazer a unio utilizando Join, veja como ficaria no exemplo a seguir: SELECT PEDIDO.CODIGO, PEDIDO.CODCLIENTE, PEDIDO.DATA, CLIENTES.NOME FROM PEDIDO JOIN CLIENTES ON PEDIDO.CODCLIENTE = CLIENTES.CODCLIENTE;

Para evitar que o comando fique extremamente extenso, possvel atribuir apelidos s tabelas utilizadas no comando SELECT. Devemos fazer isso, colocando o apelido aps o nome da tabela na clusula FROM. Dessa forma, o seguinte comando teria o mesmo efeito do comando anterior:

SELECT a.CODIGOCLIENTE, a.CODVENDA, b.NOMECLIENTE FROM PEDIDO a, CLIENTE b WHERE a.CODIGOCLIENTE = b.CODIGOCLIENTE;

Unio de mais de duas tabelas

Frequentemente necessrio unir mais de duas tabelas para fornecer uma informao relevante do banco de dados. No Nosso caso, suponha que se queira saber o quais foram os produtos comprados por um determinado cliente, na tabela de itens do pedido no h o cdigo do cliente, a regra : na tabela de pedido tem o codigo de cliente e na tabela de itens tem o codigo da venda, veja como fica essa instruo:

SELECT a.CODVENDA, a.CODCLIENTE, b.CODCLIENTE, b.NOMECLIENTE, c.CODVENDA, c.PRODUTO FROM PEDIDO a, CLIENTES b, ITENS c WHERE a.CODCLIENTE = b.CODCLIENTE AND a.CODVENDA = c.CODVENDA;

Concluso: Como podemos ver neste artigo, a unio de tabela algo bastante usado nas instrues SQls, ela bastante usada quando precisamos fazer Viwes, Stored Procedures e at triggers, no prximo artigo estarei falando de Funes de agrupamento, at l.

You might also like