Sei sulla pagina 1di 4

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 para expressar restries envolvendo uma ou mais tabelas, e no para conectar tabelas, embora seja comum fazermos isso. O mtodo apropriado para vincular tabelas a operao JOIN. 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 estrangeira, a chave primria da tabela DEPENDENTES seria a concatenao de idfuncinario + nome. Sendo que a tabela DEPENDESTES tabela fraca de FUNCIONARIOS ( isso quer dizer que s existe um registro em Dependentes a partir da tabela funcionrio, isso tambm ocorre 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 caso o funcionrio tenha dependente retornamos tambm. A consulta com WHERE ficaria assim 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 ( permite vrios telefones) por isso foi criado uma tabela somente para os telefones. Bem neste caso temos o mesmo problema os funcionrios sem telefone no iriam ser retornados usando a clausula WHERE. A operao JOIN combina colunas de duas tabelas se as linhas possurem campos de correspondncia. 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 retries 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 INNER 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 cada 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.Cod_cliente

Pedido

ON

Cliente.Cod_cliente

Problema: Mostre os clienter (ordenados) que tm prazo de entrega maior que 15 dias 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 superior 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 pedidos 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

Potrebbero piacerti anche