Propaganda

O Microsoft Access é sem dúvida a ferramenta mais poderosa em todo o pacote do Microsoft Office, mas confunde (e às vezes assusta) os usuários avançados do Office. Com uma curva de aprendizado mais íngreme que o Word ou o Excel, como alguém deve entender o uso dessa ferramenta? Esta semana, Bruce Epper veremos alguns dos problemas suscitados por essa pergunta por um de nossos leitores.

Um leitor pergunta:

Estou com problemas para escrever uma consulta no Microsoft Access.

Eu tenho um banco de dados com duas tabelas de produtos que contêm uma coluna comum com um código numérico e um nome de produto associado.

Quero descobrir quais produtos da Tabela A podem ser encontrados na Tabela B. Quero adicionar uma coluna denominada Resultados que contenha o nome do produto da Tabela A, se existir, e o nome do produto da Tabela B, quando não existir na Tabela A.

Você tem algum conselho?

Resposta de Bruce:

O Microsoft Access é um sistema de gerenciamento de banco de dados (DBMS) projetado para uso em máquinas Windows e Mac. Ele utiliza o mecanismo de banco de dados Jet da Microsoft para processamento e armazenamento de dados. Ele também fornece uma interface gráfica para usuários, que praticamente elimina a necessidade de entender o SQL (Structured Query Language).

instagram viewer

SQL é a linguagem de comando usada para adicionar, excluir, atualizar e retornar informações armazenadas no banco de dados, bem como modificar os principais componentes do banco de dados, como adicionar, excluir ou modificar tabelas ou índices.

Ponto de partida

Se você ainda não tem alguma familiaridade com o Access ou outro RDBMS, sugiro que você comece com estes recursos antes de continuar:

  • Então, o que é um banco de dados? Então, o que é um banco de dados, afinal? [MakeUseOf explica]Para um programador ou um entusiasta da tecnologia, o conceito de banco de dados é algo que realmente pode ser dado como garantido. No entanto, para muitas pessoas, o conceito de banco de dados em si é um pouco estranho ... consulte Mais informação onde Ryan Dube usa o Excel para mostrar o básico de bancos de dados relacionais.
  • Um guia rápido para começar a usar o Microsoft Access 2007 Um guia rápido para começar a usar o Microsoft Access 2007 consulte Mais informação que é uma visão geral de alto nível do Access e dos componentes que compõem um banco de dados do Access.
  • Um tutorial rápido sobre tabelas no Microsoft Access 2007 Um tutorial rápido sobre tabelas no Microsoft Access 2007 consulte Mais informação analisa a criação de seu primeiro banco de dados e tabelas para armazenar seus dados estruturados.
  • Um tutorial rápido sobre consultas no Microsoft Access 2007 Um tutorial rápido sobre consultas no Microsoft Access 2007 consulte Mais informação examina os meios para retornar partes específicas dos dados armazenados nas tabelas do banco de dados.

Ter um entendimento básico dos conceitos fornecidos nesses artigos facilitará a digestão a seguir.

Normalização e relações com o banco de dados

Imagine que você está administrando uma empresa que vende 50 tipos diferentes de widgets em todo o mundo. Você tem uma base de clientes de 1.250 e, em média, vende 10.000 widgets para esses clientes. No momento, você está usando uma única planilha para rastrear todas essas vendas - efetivamente uma única tabela de banco de dados. E todo ano adiciona milhares de linhas à sua planilha.

mesa plana-1mesa-2-plana

As imagens acima fazem parte da planilha de rastreamento de pedidos que você está usando. Agora diga que esses dois clientes compram widgets de você várias vezes por ano, para que você tenha muito mais linhas para os dois.

Se Joan Smith se casa com Ted Baines e leva seu sobrenome, todas as linhas que contêm o nome dela precisam ser alteradas. O problema é agravado se você tiver dois clientes diferentes com o nome "Joan Smith". Tornou-se muito mais difícil manter os dados de vendas consistentes devido a um evento bastante comum.

Usando um banco de dados e normalizando os dados, podemos separar itens em várias tabelas, como estoque, clientes e pedidos.

normalização

Apenas olhando a parte do cliente do nosso exemplo, removeríamos as colunas para Nome do cliente e Endereço do cliente e as colocaríamos em uma nova tabela. Na imagem acima, também expliquei melhor as coisas para obter um acesso mais granular aos dados. A nova tabela também contém uma coluna para uma Chave Primária (ClientID) - um número que será usado para acessar cada linha nesta tabela.

Na tabela original em que removemos esses dados, adicionamos uma coluna para uma chave estrangeira (ClientID), que é o link para a linha apropriada que contém as informações para esse cliente específico.

Agora, quando Joan Smith muda seu nome para Joan Baines, a alteração precisa ser feita apenas uma vez na tabela Client. Todas as outras referências das tabelas unidas obterão o nome apropriado do cliente e um relatório que está analisando o que Joan comprou para os últimos 5 anos receberão todos os pedidos sob os nomes de solteira e de solteira, sem precisar alterar a forma como o relatório é gerado.

Como um benefício adicional, isso também reduz a quantidade geral de armazenamento consumido.

Tipos de junção

O SQL define cinco tipos diferentes de junções: INTERNA, ESQUERDA EXTERNA, DIREITA EXTERNA, COMPLETA EXTERNA e CRUZ. A palavra-chave OUTER é opcional na instrução SQL.

O Microsoft Access permite o uso de INTERNO (padrão), ESQUERDO EXTERIOR, DIREITO EXTERIOR e CRUZ. O EXTERIOR COMPLETO não é suportado como tal, mas, usando ESQUERDO EXTERNO, UNION ALL e DIREITO EXTERNO, pode ser falsificado ao custo de mais ciclos de CPU e operações de E / S.

A saída de uma junção CROSS contém todas as linhas da tabela esquerda emparelhadas com todas as linhas da tabela direita. A única vez que vi uma junção CROSS usada é durante o teste de carga de servidores de banco de dados.

Vamos dar uma olhada em como as junções básicas funcionam e depois as modificaremos para atender às nossas necessidades.

Vamos começar criando duas tabelas, ProdA e ProdB, com as seguintes propriedades de design.

access-table-defs

O Número Automático é um número inteiro longo incrementado automaticamente atribuído às entradas conforme elas são adicionadas à tabela. A opção Texto não foi modificada; portanto, ela aceitará uma sequência de texto com até 255 caracteres.

Agora, preencha-os com alguns dados.

tabelas de acesso

Para mostrar as diferenças de funcionamento dos três tipos de junção, excluí as entradas 1, 5 e 8 do ProdA.

Em seguida, crie uma nova consulta acessando Criar> Design de Consulta. Selecione as duas tabelas na caixa de diálogo Mostrar tabela e clique em Adicionar, então Fechar.

nova consulta

Clique em ProductID na tabela ProdA, arraste-o para ProductID na tabela ProdB e solte o botão do mouse para criar o relacionamento entre as tabelas.

design_view

Clique com o botão direito do mouse na linha entre as tabelas que representam o relacionamento entre os itens e selecione Associar propriedades.

join_properties

Por padrão, o tipo de associação 1 (INTERNO) está selecionado. A opção 2 é uma junção externa esquerda e 3 é uma junção externa direita.

Examinaremos primeiro a associação INNER, então clique em OK para fechar a caixa de diálogo.

No designer de consulta, selecione os campos que queremos ver nas listas suspensas.

design-view-2

Quando executamos a consulta (o ponto de exclamação vermelho na faixa de opções), ela mostrará o campo ProductName das duas tabelas com o valor da tabela ProdA na primeira coluna e ProdB na segunda.

junção interna

Observe que os resultados mostram apenas valores em que ProductID é igual nas duas tabelas. Mesmo que exista uma entrada para ProductID = 1 na tabela ProdB, ela não aparece nos resultados, pois ProductID = 1 não existe na tabela ProdA. O mesmo se aplica ao ProductID = 11. Existe na tabela ProdA, mas não na tabela ProdB.

fita de design

Usando o botão Exibir na faixa de opções e alternando para o SQL View, você pode ver a consulta SQL gerada pelo designer usada para obter esses resultados.

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA INNER JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Voltando ao Design View, altere o tipo de junção para 2 (ESQUERDA EXTERIOR). Execute a consulta para ver os resultados.

left_outer_join

Como você pode ver, todas as entradas na tabela ProdA são representadas nos resultados, enquanto apenas as do ProdB que possuem uma entrada de ProductID correspondente na tabela ProdB são exibidas nos resultados.

O espaço em branco na coluna ProdB.ProductName é um valor especial (NULL), pois não há um valor correspondente na tabela ProdB. Isso será importante mais tarde.

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA ESQUERDA JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Tente a mesma coisa com o terceiro tipo de junção (RIGHT OUTTER).

right_outer_join

Os resultados mostram tudo da tabela ProdB enquanto mostra valores em branco (conhecidos como NULL) em que a tabela ProdA não possui um valor correspondente. Até agora, isso nos aproxima dos resultados desejados na pergunta do leitor.

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA DIREITA JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Usando funções em uma consulta

Os resultados de uma função também podem ser retornados como parte de uma consulta. Queremos que uma nova coluna chamada "Resultados" apareça em nosso conjunto de resultados. Seu valor será o conteúdo da coluna ProductName da tabela ProdA se ProdA tiver um valor (não é NULL), caso contrário, ela deve ser retirada da tabela ProdB.

A função Immediate IF (IIF) pode ser usada para gerar esse resultado. A função usa três parâmetros. A primeira é uma condição que deve ser avaliada como um valor Verdadeiro ou Falso. O segundo parâmetro é o valor a ser retornado se a condição for True e o terceiro parâmetro é o valor a ser retornado se a condição for False.

A construção de função completa para nossa situação é assim:

IIF (ProdA.ProductID É Nulo, ProdB.ProductName, ProdA.ProductName)

Observe que o parâmetro de condição não verifica a igualdade. Um valor nulo em um banco de dados não possui um valor que possa ser comparado a qualquer outro valor, incluindo outro valor nulo. Em outras palavras, Nulo não é igual a Nulo. Sempre. Para superar isso, verificamos o valor usando a palavra-chave "É".

Também poderíamos ter usado 'Não é nulo' e alterado a ordem dos parâmetros True e False para obter o mesmo resultado.

Ao colocar isso no Query Designer, você deve digitar a função inteira na entrada Campo:. Para criar a coluna "Resultados", você precisa usar um alias. Para fazer isso, anteceda a função com 'Resultados:', como visto na captura de tela a seguir.

design de resultados com alias externos à direita

O código SQL equivalente para fazer isso seria:

SELECT ProdA.ProductName, ProdB.ProductName, IIF (ProdA.ProductID é nulo, ProdB.ProductName, ProdA.ProductName) COMO RESULTADOS DO DIREITO DE PRODA JUNTAR ProdB ON ProdA.ProductID = ProdB.ProductID;

Agora, quando executarmos essa consulta, ela produzirá esses resultados.

right_outer_with_aleased_results

Aqui, vemos para cada entrada em que a tabela ProdA tem um valor, esse valor é refletido na coluna Resultados. Se não houver uma entrada na tabela ProdA, a entrada do ProdB aparecerá em Results, exatamente o que nosso leitor pediu.

Para mais recursos para aprender o Microsoft Access, confira Joel Lee's Como aprender o Microsoft Access: 5 recursos online gratuitos Como aprender o Microsoft Access: 5 recursos online gratuitosVocê precisa gerenciar uma grande quantidade de dados? Você deve procurar no Microsoft Access. Nossos recursos gratuitos de estudo podem ajudá-lo a começar e aprender as habilidades para projetos mais complexos. consulte Mais informação .

Bruce brinca com eletrônica desde os anos 70, computadores desde o início dos anos 80 e responde com precisão a perguntas sobre tecnologia que ele não usou nem viu o tempo todo. Ele também se irrita ao tentar tocar violão.