Noções
da linguagem SQL para consultas
Objetivos:
Neste tutorial serão apresentados os principais elementos
da linguagem SQL (Structured Query Language). Serão apresentados
diversos exemplos práticos de utilização da
linguagem SQL.
Pré-requisitos: Para acompanhar esta lição
você deve dominiar os conceitos apresentados nos seguintes
treinamento:
"Curso
Básico de Access" e no tutorial
"Consultas
Avançadas no Microsoft Access".
Nota: Este tutorial foi retirado da apostila da
Semana 2, do Curso de Excel Avançado e VBA. Você pode
adquirir os três arquivos, com todo o conteúdo deste
curso, por apenas R$ 10,00. Para saber como adquirir este curso,
Clique
Aqui.
Introdução:
O SQL foi desenvolvido para ser uma linguagem padrão para
operações com Banco de Dados. A lingüagem SQL
foi elaborada para ser independente de hardware ou do software.
Ao usar o SQL, você não precisa saber a respeito do
software de banco de dados ou do hardware envolvido em uma operação.
Tudo o que você precisa conhecer são os comandos/instruções
SQL padrão para solicitar informações, que
obrigatoriamente é o mesmo em todos os sistemas que utilizam
o SQL.
Nota: Na prática existem pequenas diferenças
entre o SQL dos diferentes bancos de dados, como o Microsoft Access,
Microsoft SQL Server 2000, ORACLE, etc.
Você usa operações SQL quando trabalha com o
Microsoft Access, mas o programa, na verdade, oculta a linguagem
SQL do usuário. Por exemplo, todas as operações
de consulta são realizadas usando-se SQL, mas você
vê apenas a parte gráfica (Modo Estrutura) onde a consulta
é definida.
Você pode ser muito produtivo no Microsoft Access sem saber
nada de SQL. Um conhecimento básico de SQL, no entanto, melhora
significativamente o seu uso do Microsoft Access, principalmente
no uso de técnicas avançadas em Formulários
e Relatórios e na criação de rotinas de programação.
Quando você constrói uma consulta no modo estrutura,
na verdade o Microsoft Access está definindo uma instrução
SQL, a partir dos campos, critérios e opções
de filtragem que você definiu na consulta. A título
de exemplo, vamos acessar a instrução SQL da consulta
"Totais por Pedido", fornecida com o arquivo Semana2.mdb,
o qual faz parte dos arquivos de exemplos do
Curso
de Access Avançado.
Nota: Você pode acompanhar este exemplo utiliando
o arquivo Northwind.mdb, o qual faz parte do Access e acessando
o SQL de qualquer uma das consultas disponíveis.
Abra o banco de dados Semana2.mdb
Vá para a Guia Consultas
Dê um clique na consulta Totais por Pedido
Dê um clique no botão Estrutura
Selecione o comando Exibir -> Modo SQL. Seré exibido
o comando SQL indicado a seguir:
SELECT Pedidos.NúmeroDoPedido,
Sum(([Quantidade]*[PreçoUnitário])*(1-[Desconto]))
AS TotalPorPedido
FROM Pedidos
INNER JOIN
[Detalhes do Pedido]
ON
Pedidos.NúmeroDoPedido = [Detalhes do Pedido].NúmeroDoPedido
GROUP BY Pedidos.NúmeroDoPedido;
Nota: Se você não tiver disponível
a consulta Totais por Pedido, utilize qualquer outra consulta disponível.
Na prática é esta Instrução SQL que
o Microsoft Access grava ao salvar uma consulta e também
é esta Instrução SQL que é utilizada
para selecionar os registros, aplicando os critérios especificados.
Embora possa parecer um pouco complexa, veremos que a linguagem
SQL é extremamente simples e intuitiva. Neste tópico
veremos alguns aspectos básicos sobre o SQL, bem como os
locais na Ajuda do Microsoft Access onde podem ser encontradas informações
mais detalhadas sobre o SQL.
Uma Instrução SQL descreve o conjunto de dados que
você deseja recuperar (quais campos, de quais tabelas, quais
critérios, classificação, expressões
Calculadas, etc).
Todas as instruções SQL são conduzidas com
um único comando que contém uma descrição
completa da informação exigida. Ao escrever uma instrução
SQL, você não deve se preocupar em como os dados são
recuperados, mas somente com o conteúdo do conjunto de dados.
Esse é o principal benefício do método SQL.
Em muitas operações do Microsoft Access, você
pode usar instruções SQL, no lugar de expressões
normais para inserir um conjunto de dados em um objeto. Por exemplo,
todos os formulários e relatórios possuem uma propriedade
RecordSource. Essa propriedade normalmente é o nome de uma
tabela ou consulta, mas também pode ser uma instrução
SQL.
Lembre-se que o SQL é um padrão genérico para
expressões de consulta em banco de dados. Embora a maior
parte das versões do SQL compartilhe elementos básicos,
elas não são idênticas. O Access SQL usa algumas
palavras-chave que você não encontra em outras versões
do SQL.
Veremos através de exemplos a utilização das
principais palavras chaves do SQL para a construção
de expressões SQL para pesquisa em banco de dados.
SELECT
Esta com certeza é a instrução SQL mais importante,
não existe pesquisa que não utilize esta instrução,
vamos conhecê-la em detalhes.
A Instrução Select é utilizada para especificar
"Quais os Campos" de "Quais tabelas" farão
parte da consulta, quais os critérios de pesquisa que serão
utilizados, qual a ordem de classificação, etc.
A sintaxe da instrução está indicada a seguir:
SELECT [predicado] {
* | tabela.* | [tabela.]campo1 [AS alias1] [, [tabela.]campo2
[AS alias2] [, ...]]}
FROM tabelaexpression [, ...] [IN externaldatabase]
[WHERE... ]
[GROUP BY... ]
[HAVING... ]
[ORDER BY... ]
[WITH OWNERACCESS OPTION]
Onde nós temos os seguintes elementos:
| Elemento |
Descrição |
| predicado |
Um dos seguintes: ALL, DISTINCT, DISTINCTROW ou TOP. Você
usa um predicado para restringir o número de Registros
que é retornado pela consulta. Se nenhum for especificado
o padrão é ALL |
| * |
Especifica que todos os campos de uma
determinada tabela ou consulta devem ser selecionados. Por
exemplo: Select * from Pedidos - Retorna
todos os campos da tabela Pedidos. |
| Tabela |
O nome da tabela ou consulta de onde são selecionados
os campos. Por exemplo, Select Pedidos.NúmeroDoPedido,
Pedidos.DataDoPedido from Pedidos - Seleciona os
Campos NúmeroDoPedido e DataDoPedido, da tabela Pedidos.
|
| Campo1, Campo2 |
O Nome dos campos a serem selecionados.
|
| Alias 1, Alias2 |
Um "apelido" para o campo. Na Folha de Dados o
apelido aparece como o título da coluna. Por exemplo,
Select Pedidos.NúmeroDoPedido As Número
from Pedidos, faz com que a coluna NúmeroDoPedido
tenha o nome Número a ela associado. |
| tabelaexpression |
O nome da tabela de onde os campos serão
selecionados |
| externaldatabase |
O nome do Bando de Dados que contem a tabela, caso não
seja o banco de dados atual. |
| where |
Utilizado para especificar critérios
na consulta. Por exemplo, Where Pedidos.PaísDeDestino="Brasil" |
| group by |
O mesmo que Agrupar Por no modo estrutura da consulta, na
linha Total |
| having |
Especifica critérios quando utilizamos
Agrupar Por. |
| order by |
Utilizado para classificação dos registros
em ordem crescente ou descendente de um determinado campo. |
| WITH OWNERACCESS OPTION |
Em um ambiente multiusuários com
um grupo de trabalho seguro, use esta declaração
com uma consulta para conceder ao usuário que executa
a consulta as mesmas permissões que as do proprietário
da consulta.
Sintaxe
instrução sql
WITH OWNERACCESS OPTION
A declaração WITH OWNERACCESS OPTION é
opcional.
O exemplo a seguir permite que o usuário visualize
informações sobre salários (mesmo que,
de outra forma, o usuário não tenha permissão
para visualizar a tabela FolhaDePagamento), desde que o proprietário
da consulta tenha essa permissão:
SELECT Sobrenome,
Nome, Salário
FROM Funcionários
ORDER BY Sobrenome
WITH OWNERACCESS OPTION;
Se de alguma outra forma o usuário for impedido de
criar ou adicionar a uma tabela, você pode usar WITH
OWNERACCESS OPTION para permitir que ele execute uma consulta
criar tabela ou consulta acréscimo.
Se você deseja impor configurações de
segurança de grupo de trabalho e permissões
de usuários, não inclua a declaração
WITH OWNERACCESS OPTION.
Essa opção requer que você tenha acesso
ao arquivo System.mdw associado ao banco de dados. É
realmente útil somente nas implementações
de multiusuários com segurança. |
Vejamos alguns exemplos práticos para exemplificar o uso
da instrução Select:
Criar uma instrução SQL que retorne o campo
NúmeroDoPedido, o campo DataDoPedido, o campo Frete e
o campo PaísDeDestino da tabela Pedidos.
SELECT Pedidos.NúmeroDoPedido,
Pedidos.DataDoPedido, Pedidos.PaísDeDestino, Pedidos.Frete
FROM
Pedidos;
Toda Instrução SQL deve ser terminada com um ponte
e vírgula (;), conforme indicado acima. Esta instrução
SQL pode ser gerada a partir do modo estrutura da consulta. Basta
você criar uma nova consulta baseada na tabela pedidos, adicionar
os campos indicado e depois dar uma olhada no modo SQL. Um detalhe
interessante é que se você fizer qualquer alteração
no modo SQL, as alterações se refletem no modo estrutura
e vice-versa. Isso acontece porque o modo estrutura da consulta,
é simplesmente uma representação gráfica
para facilitar a construção de expressões SQL.
Alterar a instrução SQL anterior para que os
registros sejam classificados em ordem crescente pelo valor
do Frete.
SELECT Pedidos.NúmeroDoPedido,
Pedidos.DataDoPedido, Pedidos.PaísDeDestino, Pedidos.Frete
FROM
Pedidos
ORDER BY Pedidos.Frete;
Observe a utilização da cláusula
ORDER
BY Pedidos.Frete para classificar os registros em ordem
Crescente. A classificação em ordem crescente á
o padrão no Microsoft Access. Quando formos classificar em
ordem decrescente, precisamos especificar a palavra
DESC,
conforme indicado abaixo:
SELECT Pedidos.NúmeroDoPedido,
Pedidos.DataDoPedido, Pedidos.PaísDeDestino, Pedidos.Frete
FROM
Pedidos
ORDER BY Pedidos.Frete DESC;
Alterar a instrução SQL anterior para que sejam
exibidos somente os pedidos cujo PaísDeDestino seja Brasil.
SELECT Pedidos.NúmeroDoPedido,
Pedidos.DataDoPedido, Pedidos.PaísDeDestino, Pedidos.Frete
FROM
Pedidos
WHERE (((Pedidos.PaísDeDestino)="Brasil"))
ORDER BY Pedidos.Frete;
Observe a utilização da Cláusula
WHERE
para filtrar somente os pedidos cujo PaísDeDestino seja Brasil.
Como o campo PaísDeDestino é um campo do tipo texto,
o valor do critério (Brasil) tem que vir entre aspas. Se
fosse um campo do tipo Data, o valor do critério teria que
vir delimitado pelo sinal #. Por exemplo #01/01/1995#. Vamos trabalhar
um pouco mais com a cláusula WHERE.
Altere a instrução SQL anterior para que sejam
exibidos somente os pedidos para o Brasil ou Alemanha como PaísDeDestino.
SELECT Pedidos.NúmeroDoPedido,
Pedidos.DataDoPedido, Pedidos.PaísDeDestino, Pedidos.Frete
FROM
Pedidos
WHERE (((Pedidos.PaísDeDestino)="Brasil"
OR
(Pedidos.PaísDeDestino)="Alemanha"))
ORDER BY Pedidos.Frete;
Observe a utilização da Cláusula
OR
ligando os dois Critérios. Lembre que a cláusula
OR
retorna um registro se o PaísDeDestino atender um dos dois
critérios, isto é, se for Brasil ou se for argentina,
o Registro será selecionado, que é exatamente o que
desejamos, ou seja, todos os Pedidos para o Brasil mais os pedidos
para Argentina.
Altere a instrução SQL anterior, retirando o
critério para PaísDeDestino. Adicione um critério
para NúmeroDoPedido maior do que 10500, retire a classificação
do campo Frete a classifique pelo campo NúmeroDoPedido.
SELECT Pedidos.NúmeroDoPedido,
Pedidos.DataDoPedido, Pedidos.PaísDeDestino, Pedidos.Frete
FROM
Pedidos
WHERE (((Pedidos.NúmeroDoPedido)>10500))
ORDER BY Pedidos.NúmeroDoPedido;
Observe a cláusula
WHERE utilizando o operador
de comparação maior do que (>) e a classificação
através da cláusula
ORDER BY no campo
NúmeroDoPedido. Observe também, que no Microsoft Access,
nas instruções SQL sempre aparece a identificação
completa do campo no seguinte formato:
NomeTabela.NomeCampo.
Por exemplo
Pedidos.NúmeroDoPedido para
indicar o campo NúmeroDoPedido da tabela Pedidos.
Podemos ver, através dos exemplos, que a linguagem SQL não
é tão difícil como pode parecer a primeira
vista. Observe que a sintaxe da linguagem é bastante intuitiva
e orientada a extração de dados através das
consultas.
Vamos continuar vendo exemplos de aplicação da linguagem
SQL com a utilização de recursos mais avançados.
Alterar a instrução SQL anterior, e adicionar
um critério de tal maneira que somente sejam exibidos
os pedidos para o Ano de 1995. Tirar o critério do campo
Número do Pedido.
SELECT Pedidos.NúmeroDoPedido,
Pedidos.DataDoPedido, Pedidos.PaísDeDestino, Pedidos.Frete
FROM
Pedidos
WHERE ((Year([DataDoPedido])=1995))
ORDER BY Pedidos.NúmeroDoPedido;
Observe a utilização da função Ano (Year)
para extrairmos apenas o Ano do campo DataDoPedido a fim de especificarmos
como critério o Ano=1995. Também a cláusula
Order By foi mantida, classificando a listagem em ordem crescente
pelo número do pedido. A utilização de funções
junto com os comando SQL nos fornece inúmeras possibilidades
de refinamento em nossas consultas.
Alterar a instrução SQL anterior, para que sejam
exibidos somente os pedidos no Período de 01/01/1995
até 31/07/1995 e que tenham como PaísDeDestino
Brasil, Argentina, Alemanha ou Canadá.
SELECT Pedidos.NúmeroDoPedido,
Pedidos.DataDoPedido, Pedidos.PaísDeDestino, Pedidos.Frete
FROM
Pedidos
WHERE (((Pedidos.DataDoPedido) Between #1/1/95#
And #8/31/95#)
AND
(Pedidos.PaísDeDestino) In ("Brasil","Argentina","Alemanha","Canadá")))
ORDER BY Pedidos.NúmeroDoPedido;
Observe a utilização de vários critérios
em diferentes campos. Colocamos critérios nos campos
DataDoPedido
e
PaísDeDestino. Conforme descrito anteriormente
os critérios de dois ou mais campos são ligados através
do operador
AND, indicando que um registro deve
atender ambos os critérios para ser selecionado. Também
temos a utilização dos operadores Between (Entre)
para selecionar as datas dentre de um determinado intervalo e do
operador In (Em) para selecionar o campo PaísDeDestino que
seja igual a um dos valores apresentados na lista. Observe também
, que os valores de data vem delimitados pelos marcadores #, conforme
descrito anteriormente.
Criar uma instrução SQL que retorne o campo
NúmeroDoPedido, o campo DataDoPedido, o campo DataDeEntrega,
o campo Frete e o campo PaísDeDestino da tabela Pedidos.
Criar uma coluna adicional que calcula o número de dias
entre a DataDeEntrega e a DataDoPedido. Chamar esta coluna de
Dias_Ped_Entr.
SELECT Pedidos.NúmeroDoPedido,
Pedidos.DataDoPedido, Pedidos.DataDeEntrega, Pedidos.PaísDeDestino,
Pedidos.Frete, [DataDeEntrega]-[DataDoPedido]
AS Dias_Ped_Entr
FROM
Pedidos
WHERE (((Pedidos.DataDoPedido) Between #1/1/95#
And #8/31/95#)
AND
((Pedidos.PaísDeDestino) In ("Brasil","Argentina","Alemanha","Canadá")))
ORDER BY Pedidos.NúmeroDoPedido;
Veja que a coluna calculada está junto com a listagem dos
campos no início da instrução
Select.
Além disso foi utilizada a palavra
AS para
atribuir um nome (apelido) para esta coluna calculada. Este nome
é o que irá aparecer como título da coluna
no modo Folha de Dados. Quando você constrói uma expressão,
este é o nome que vem antes dos dois pontos, por exemplo:
Dias_Ped_Entr: [DataDeEntrega]-[DataDoPedido].
Você também pode classificar a listagem em ordem crescente
ou decrescente de um campo calculado. Por exemplo, se você
quisesse classificar a listagem do ítem anterior, em ordem
crescente, do número de dias entre a DataDeEntrega e a DataDoPedido,
bastaria utilizar a seguinte instrução SQL:
SELECT Pedidos.NúmeroDoPedido,
Pedidos.DataDoPedido, Pedidos.DataDeEntrega, Pedidos.PaísDeDestino,
Pedidos.Frete, [DataDeEntrega]-[DataDoPedido] AS Dias_Ped_Entr
FROM
Pedidos
WHERE (((Pedidos.DataDoPedido) Between #1/1/95#
And #8/31/95#)
AND
((Pedidos.PaísDeDestino) In ("Brasil","Argentina","Alemanha","Canadá")))
ORDER BY [DataDeEntrega]-[DataDoPedido];
Alterar a instrução SQL anterior, eliminando
os critérios para a DataDoPedido e para o PaísDeDestino.
Colocar um novo critério para PaísDeDestino, onde
sejam exibidos apenas os pedidos cujo PaísDeDestino tem
a Primeira Letra na faixa de A até M. Utilize o operador
Like.
SELECT Pedidos.NúmeroDoPedido,
Pedidos.DataDoPedido, Pedidos.DataDeEntrega, Pedidos.PaísDeDestino,
Pedidos.Frete, [DataDeEntrega]-[DataDoPedido] AS Dias_Ped_Entr
FROM
Pedidos
WHERE (((Pedidos.PaísDeDestino) Like
"[A-M]*"))
ORDER BY Pedidos.PaísDeDestino;
Observe a utilização do Operador Like ("Como")
como critério de Pesquisa para esta consulta. Nunca é
demais salientar que a utilização das Instruções
SQL juntamente com as funções e operadores do Microsoft
Access, nos fornece um amplo conjunto de possibilidades.
Até agora utilizamos exemplos com Instruções
que selecionam registros de uma única tabela. Porém
é bastante comum criarmos Consultas baseadas em duas ou mais
tabelas. Quando criamos instruções SQL que buscam
dados em duas ou mais tabelas, dizemos que está sendo feito
um
Join entre as duas tabelas. Normalmente este
"Join" (ou ligação) é feito através
de um campo comum as duas tabelas. Por exemplo,
NúmeroDoPedido
na tabela
Pedidos e
NúmeroDoPedido
na tabela
Detalhes do Pedido. Outro exemplo,
CódigoDoCliente
na tabela
Pedidos e
CódigoDoCliente
na tabela
Clientes. Pode acontecer de termos consultas
que trabalham com três ou mais Tabelas, neste caso teremos
diversos Joins.
Agora passaremos e explorar, na Prática, através de
exemplos a construção de Instruções
SQL que trabalham com duas ou mais tabelas. Sempre lembrando que
estas consultas podem ser construídas diretamente no modo
estrutura das consultas e depois simplesmente vamos para o modo
SQL e observamos o código gerado. Porém o conhecimento
da linguagem SQL é útil em diversas situações,
conforme veremos ao estudarmos Técnicas Avançadas
em Formulários e Técnicas Avançadas em Relatórios.
Criar uma instrução SQL que selecione os seguintes
campos:
NúmeroDoPedido da tabela Pedidos
DataDoPedido da tabela Pedidos
PaísDeDestino da tabela Pedidos
Frete da tabela Pedidos
CódigoDoProduto, PreçoUnitário
e Quantidade da tabela Detalhes do Pedido
As tabelas
Pedidos e
Detalhes do Pedido
estão relacionadas através do campo NúmeroDoPedido.
Classificar a listagem em ordem crescente do campo NúmeroDoPedido.
SELECT Pedidos.NúmeroDoPedido,
Pedidos.DataDoPedido, Pedidos.PaísDeDestino, Pedidos.Frete,
[Detalhes do Pedido].CódigoDoProduto, [Detalhes do Pedido].PreçoUnitário,
[Detalhes do Pedido].Quantidade
FROM
Pedidos
INNER JOIN
[Detalhes do Pedido]
ON
Pedidos.NúmeroDoPedido = [Detalhes do Pedido].NúmeroDoPedido
ORDER BY Pedidos.NúmeroDoPedido;
Observe a instrução que está em vermelho. Nela
temos a utilização da cláusula INNER JOIN,
ligando as tabelas Pedidos e Detalhes do Pedido, através
do campo NúmeroDoPedido, conforme especificado após
o
ON. UM Join deste tipo é bastante comum.
Observe que está listagem irá trazer vários
registros para cada Pedido, tantos quantos forem os ítens
de cada pedido. Por exemplo, o Pedido Número 10248 apresenta
três registros, um para cada um dos seus ítens. Um
para o Produto 42, outro para o produto 72 e um para o produto cujo
código é 11.
Mas se ao invés do CódigoDoProduto, nos quiséssemos
que fosse exibida a
Descrição do Produto.
Em primeiro lugar esta informação encontra-se na tabela
Produtos, logo teremos que adicionar a Tabela Produtos
a nossa consulta, a qual ira se ligar a tabela
Detalhes
Do Pedido através do campo
CódigoDoProduto,
logo teremos mais um Join.
Após adicionar a tabela Produtos e substituir o campo CódigoDoProduto
pelo campo NomeDoProduto, a nossa instrução SQL deve
ficar conforme indicado abaixo:
SELECT Pedidos.NúmeroDoPedido,
Pedidos.DataDoPedido, Pedidos.PaísDeDestino, Pedidos.Frete,
Produtos.NomeDoProduto,[Detalhes do Pedido].PreçoUnitário,
[Detalhes do Pedido].Quantidade
FROM
Produtos
INNER JOIN
(Pedidos
INNER JOIN [Detalhes do Pedido]
ON
Pedidos.NúmeroDoPedido=[Detalhes do Pedido].NúmeroDoPedido)
ON
Produtos.CódigoDoProduto = [Detalhes do Pedido].CódigoDoProduto
ORDER BY Pedidos.NúmeroDoPedido;
Observe que neste caso temos um INNER JOIN dentro do outro. Dentro
do parênteses é feita a ligação entre
as tabelas
Pedidos e
Detalhes Do Pedido,
através do campo
NúmeroDoPedido,
e externamente é feita a ligação entre as tabelas
Produtos e Detalhes do Pedido, através do campo
NúmeroDoPedido.
Posso utilizar diversos níveis de INNER JOIN, embora esta
não seja uma prática recomendada, pois se aumentarmos
muito os níveis de
INNER JOIN, posso ter
como resultado pesquisas mais lentas em conseqüência
do aumento da complexidade das consultas. Até 3 ou 4 níveis
é considerado normal, acima disso preciso repensar a maneira
de construir a consulta.
Alterar a instrução SQL do ítem anterior
para que somente sejam exibidos os pedidos para os produtos
cujo NomeDoProduto inicie com uma letra na faixa de A até
J. Tirar a classificação do campo NúmeroDoPedido
e classificar em ordem crescente do campo NomeDoProduto.
SELECT Pedidos.NúmeroDoPedido,
Pedidos.DataDoPedido, Pedidos.PaísDeDestino, Pedidos.Frete,
Produtos.NomeDoProduto, [Detalhes do Pedido].PreçoUnitário,
[Detalhes do Pedido].Quantidade
FROM
Pedidos
INNER JOIN (Produtos INNER JOIN [Detalhes
do Pedido]
ON
Produtos.CódigoDoProduto = [Detalhes do Pedido].CódigoDoProduto)
ON
Pedidos.NúmeroDoPedido = [Detalhes do Pedido].NúmeroDoPedido
WHERE (((Produtos.NomeDoProduto) Like "[A-J]*"))
ORDER BY Produtos.NomeDoProduto;
Observe, além dos dois INNER JOIN, a utilização
da cláusula WHERE em conjunto com Operador LIKE para especificar
o critério desejado.
Até este momento estivemos construindo Instruções
SQL que correspondem as consultas de
Seleção.
Especificamos quais campos serão exibidos, critérios
de filtragem para estes campos e uma ordem de classificação.
A partir de agora aprenderemos a utilizar Instruções
SQL para a construção de outros tipos de Consulta
: Criar Tabela, Consulta anexação, Consulta de tabela
de referência cruzada, Consulta exclusão e Consulta
atualização. Vamos começar criando uma consulta
do tipo Criação de Tabela e observar as diferenças
na instrução SQL.
Construir uma instrução SQL que selecione o
NúmeroDoPedido, DataDoPedido, PaísDeDestino e
Frete. Colocar um critério para selecionar apenas os
registros cuja DataDoPedido tenha caído no mês
de Junho ou Julho de qualquer ano. A consulta deverá
ser do tipo Criar tabela e o nome da tabela será "Pedidos
de Junho e Julho".
SELECT Pedidos.NúmeroDoPedido,
Pedidos.DataDoPedido, Pedidos.PaísDeDestino, Pedidos.Frete
INTO [Pedidos de Junho e Julho]
FROM Pedidos
WHERE ((Month([DataDoPedido]) In (6,7)));
Observe a utilização da instrução
INTO
[Pedidos de Junho e Julho]. Ao invés de utilizarmos
um
SELECT FROM, utilizamos um
SELECT INTO,
que é a instrução SQL utilizada para criar
uma nova tabela com os registros retornados pela consulta. O Nome
da nova tabela vem depois da instrução
INTO.
Como o nome da tabela possui espaços em branco, o nome deve
ser colocado entre colchetes. Também utilizamos, na cláusula
WHERE, o operador In , juntamente com a função Month,
para especificar que o mês da DataDoPedido deve ser um dos
valores definidos na cláusula In (6=Junho, 7=Julho).
A Instrução SELECT INTO, informa ao Microsoft Access
que é para "pegar" os registros rertornados pela
consulta e inseri-los em uma nova tabela. Caso a tabela já
exista o Microsoft Access avisa que a tabela será excluída
e uma nova tabela será criada.
Criar uma instrução SQL que aumento o PreçoUnitário
em 20% na tabela Detalhes do Pedido, devido
a um ajuste na moeda e uma desvalorização em relação
ao Dólar.
UPDATE [Detalhes do Pedido]
SET [Detalhes do Pedido].PreçoUnitário
= [PreçoUnitário]*1.2;
Observe a simplicidade da instrução SQL. Utilizamos
uma instrução
UPDATE, seguida do
nome da tabela onde será feita a atualização.
Em seguida uma instrução SET com a expressão
de atualização para aumentar em 20% o PreçoUnitário.
Importante: Se você executar mais do que
uma vez, uma consulta de atualiazação, os dados serão
repetidamente atualizados. Por exemplo: da primeira vez que a consulta
for executada os dados do campo PreçoUnitário serão
aumentados em 20% (por exemplo, um produto com preço Unitário
de R$ 100,00 passará para R$120). Se você executar
a consulta novamente será aplicado um novo acréscimo
de 20%, sobre os novos valores - o produto de R$120,00 passará
para R$144,00 e assim sucessivamente.
Vamos alterar essa instrução para incluir um critério
na consulta de atualização.
Alterar a instrução SQL do ítem anterior
para que somente sejam aumentados os registros cujo PreçoUnitário
for maior ou igual a R$ 20,00.
UPDATE [Detalhes do Pedido]
SET [Detalhes do Pedido].PreçoUnitário = [PreçoUnitário]*1.2
WHERE ((([Detalhes do Pedido].PreçoUnitário)>=20));
Foi adicionada uma cláusula
WHERE, para
atualizar apenas os registros cujo
PreçoUnitário
seja maior do que R$ 20,00.
Aqui podemos fazer alguns comentários sobre a utilização
prática de Instruções SQL. Como exemplo poderíamos
citar um Formulário para atualização de Preços.
Poderíamos colocar um campo onde o usuário digita
o valor do aumento (10%, 15%, etc) e um botão
Atualizar.
Esse botão
Atualizar tem associado ao evento
Ao Clicar, uma Instrução SQL que
atualiza os registros desejados. Isso aumenta em muito a nossa flexibilidade,
evitando que o usuário tenha que se deslocar para a Guia
Consultas e executar uma consulta de Atualização.
Juntamente com a instrução
UPDATE,
poderíamos utilizar Operadores e Funções do
Microsoft Access . Também podemos utilizar critérios
em outros campos além do campo que está sendo atualizado.
A título de exemplo, vamos alterar a instrução
SQL anterior.
Alterar a instrução SQL do ítem anterior
para que somente sejam aumentados os registros cujo PreçoUnitário
for maior ou igual a R$ 20,00 E cujo NúmeroDoPedido seja
menor do que 10500.
UPDATE [Detalhes do Pedido]
SET [Detalhes do Pedido].PreçoUnitário = [PreçoUnitário]*1.2
WHERE ((([Detalhes do Pedido].PreçoUnitário)>=20)
AND
(([Detalhes do Pedido].NúmeroDoPedido)<10500));
Observe que utilizamos critérios em dois campos (
PreçoUnitário
e
NúmeroDoPedido) e que estes critérios
estão ligados por um operador
E, o que significa
que um registro, somente será atualizado se ele atender aos
dois critérios ao mesmo tempo (PreçoUnitário
maior ou igual a 20 e NúmeroDoPedido menor do que 10500).
Se o registro atender a apenas uma das condições,
o mesmo não terá o seu PreçoUnitário
atualizado.
Vamos refinar um pouco mais a nossa consulta de atualização.
Vamos fazer com que somente sejam atualizados os Pedidos para o
ano da DataDoPedido igual a 1995, e ainda iremos manter os critérios
adicionados até agora.
Alterar a instrução SQL anterior para incluir
um critério para que o Ano da DataDoPedido seja 1995.
Você terá que incluir a tabela Pedidos,
uma vez que o campo DataDoPedido, encontra-se
nesta tabela.
UPDATE Pedidos
INNER JOIN [Detalhes do Pedido]
ON
Pedidos.NúmeroDoPedido = [Detalhes do Pedido].NúmeroDoPedido
SET [Detalhes do Pedido].PreçoUnitário
= [PreçoUnitário]*1.2
WHERE ((([Detalhes do Pedido].PreçoUnitário)>=20)
AND
(([Detalhes do Pedido].NúmeroDoPedido)<10500)
AND
(Year([DataDoPedido])=1995));
Temos diversos detalhes interessantes a observar nesta instrução
SQL. Primeiro um
INNER JOIN relacionando as tabelas
Pedidos e
Detalhes Do Pedido,
através do campo
NúmeroDoPedido.
Isso mostra que é perfeitamente possível, utilizar
um
INNER JOIN dentro de uma consulta de atualização.
Segundo: Temos a utilização da função
Year para extrair apenas o ano do campo DataDoPedido e compará-lo
com o critério 1995.
Novamente vale a pena comentar que a utilização de
Operadores e Funções, nos fornece uma grande flexibilidade
em termos de construção de nossas consultas.
Agora vamos passar a analisar as Instruções SQL para
consultas do tipo Tabela de referência cruzada. Veremos alguns
exemplos, e os detalhes a respeito de cada instrução.
Criar uma instrução SQL que liste o total de
compras pelo NomeDaEmpresa e por ano da DataDoPedido. Classificar
a listagem em ordem crescente do NomeDaEmpresa.
TRANSFORM
Sum(([PreçoUnitário]*[Quantidade])*(1-[Desconto]))
AS Expr2
SELECT Clientes.NomeDaEmpresa
FROM (Clientes
INNER JOIN Pedidos
ON
Clientes.CódigoDoCliente = Pedidos.CódigoDoCliente)
INNER JOIN [Detalhes do Pedido]
ON
Pedidos.NúmeroDoPedido = [Detalhes do Pedido].NúmeroDoPedido
GROUP BY Clientes.NomeDaEmpresa
ORDER BY Clientes.NomeDaEmpresa
PIVOT Year([DataDoPedido]);
Temos diversos detalhes a observar nesta instrução
SQL. Primeiro a instrução
TRANSFORM,
que calcula o valor de cada ítem (usando a fórmula
([PreçoUnitário]*[Quantidade])*(1-[Desconto])) e a
função Sum para somar todos os ítens de um
determinado cliente. A instrução
TRANSFORM
equivale ao elemento
Valor da Referência
Cruzada. Este valor calculado é que irá formar os
valores da nossa referência cruzada. Temos também,
a utilização de dois
INNER JOIN,
um ligando Pedidos com Detalhes do Pedido, através do campo
NúmeroDoPedido, e outro ligando Pedidos com Clientes, através
do campo CódigoDoCliente, uma vez que precisamos de informações
destas três tabelas.
A Cláusula
GROUP BY agrupa a soma de todos
os Pedidos de um determinado cliente, definido pelo campo NomeDaEmpresa.
Os diferentes clientes, formarão as diferentes linhas da
nossa referência cruzada.
E por último, a utilização da palavra
PIVOT,
juntamente com a função Year, indicando que os diferentes
Anos da DataDoPedido irão compor as colunas da nossa referência
cruzada.
Veja o que diz a Ajuda do Microsoft Access sobre a instrução
TRANSFORM:
Cria uma consulta tabela de referência
cruzada.
Sintaxe TRANSFORM funçãoagrg
instruçãoselect
PIVOT campocentral [IN (valor1[, valor2[, ...]])]
A instrução TRANSFORM possui as partes a seguir:
| Parte |
Descrição |
| funçãoagrg |
Uma função agregada SQL que opera
sobre os dados selecionados. |
| instruçãoselect |
Uma instrução SELECT. |
| campocentral |
O campo ou expressão que você quer
usar para criar títulos de coluna no conjunto de
resultados da consulta. |
| valor1, valor2 |
Valores fixos usados para criar títulos
de colunas. |
Comentários:
Quando resume dados utilizando uma consulta tabela de referência
cruzada, você seleciona valores de campos ou expressões
especificadas como títulos de colunas para poder visualizar
os dados em um formato mais compacto do que com uma consulta seleção.
A instrução TRANSFORM é opcional, mas quando
for incluída será a primeira instrução
em uma seqüência SQL. Ela antecede uma instrução
SELECT que especifica os campos usados como títulos de
linhas e uma cláusula GROUP BY que especifica o agrupamento
de linhas. Opcionalmente, você pode incluir outras cláusulas,
como WHERE, que especifiquem critérios adicionais de seleção
ou de classificação. Você pode também
usar subconsultas como atributos — especificamente, aqueles
em uma cláusula WHERE — em uma consulta tabela de
referência cruzada.
Os valores retornados em campocentral são usados como títulos
de colunas no conjunto de resultados da consulta. Por exemplo,
articular os números das vendas no mês da venda em
uma consulta tabela de referência cruzada criaria 12 colunas.
Você pode restringir campocentral para criar títulos
a partir de valores fixos (valor1, valor2) relacionados na cláusula
IN opcional. Você pode também incluir valores fixos
para os quais não existam dados para criar colunas adicionais.
Criar uma instrução SQL que gere uma Consulta
de tabela de referência cruzada. As linhas
deverão ser formadas pelo PaísDeDestino
da tabela Clientes. As colunas serão
formadas pelo número do mês da DataDoPedido
e os valores serão formados pela contagem de pedidos.
Adicionar um critério de tal forma que somente sejam
exibidos os registros para Brasil ou Alemanha.
TRANSFORM Count(Pedidos.NúmeroDoPedido)
AS ContarDeNúmeroDoPedido
SELECT Clientes.PaísDeDestino
FROM
Clientes
INNER JOIN Pedidos
ON
Clientes.CódigoDoCliente = Pedidos.CódigoDoCliente
WHERE (((Clientes.PaísDeDestino)
In ("Brasil","Alemanha")))
GROUP BY Clientes.PaísDeDestino
PIVOT Month([DataDoPedido]);
Utilizamos a função
Count para contar
o número de Pedidos por PaísDeDestino e por Mês.
Também utilizamos um
INNER JOIN para relacionar
as tabelas
Clientes e
Pedidos,
através do campo
CódigoDoCliente.
A utilização da cláusula
WHERE,
juntamente com o operador IN para limitar o PaísDeDestino
a Brasil ou Alemanha. O
GROUP BY indicando que
o campo PaísDeDestino formará as linhas da referência
cruzada. Finalmente a utilização de
PIVOT
com a função
Month (Mês) indicando
que os meses da
DataDoPedido formarão as
colunas da referência cruzada.
Agora vamos aprender a construir instruções SQL para
consultas de exclusão. Veremos que a simplicidade da linguagem
SQL facilita em muito o entendimento e a aprendizagem destas instruções.
Faça uma cópia da tabela Pedidos. Chame a cópia
de CópiaDePedidos. Criar uma instrução
SQl que elimine todos os Pedidos da tabela CópiaDePedidos
cujo PaísDeDestino seja a Alemanha
DELETE CópiaDePedidos.PaísDeDestino
FROM
Pedidos
WHERE (((Pedidos.PaísDeDestino)="Alemanha"));
A instrução é tão simples, que praticamente
dispensa comentários. A única recomendação
importante é que não devemos utilizar uma instrução
DELETE, sem a utilização de uma cláusula
WHERE. Utilizar um
DELETE sem
uma cláusula
WHERE significa que estaremos
eliminando todos os registros da tabela.
Vamos criar instruções SQL com parâmetros (Consultas
Parametrizadas), que ao serem executadas solicitam ao usuário
que seja digitado um valor para o parâmetro.
Criar uma instrução SQL que selecione os campos
NúmeroDoPedido, DataDoPedido, Frete e PaísDeDestino
da tabela Pedidos. Fazer com que ao ser executada, a consulta
solicite que seja digitado o nome do País e que sejam
retornados apenas os Pedidos para o PaísDeDestino digitado.
SELECT Pedidos.NúmeroDoPedido,
Pedidos.DataDoPedido, Pedidos.Frete, Pedidos.PaísDeDestino
FROM
Pedidos
WHERE (((Pedidos.PaísDeDestino)=[Digite o País:]));
Na hora que esta instrução SQL é executada,
o Microsoft Access localiza na cláusula WHERE, após
o sinal de igual a expressão:
[Digite o País:].
Como esta expressão não é o nome de um campo
de uma das tabelas que fazem parte da consulta, o Microsoft Access
abre uma janela pedindo que seja digitado um valor, este valor substitui
a expressão. Por exemplo, ao executar esta consulta o Microsoft
Access pede que seja digitado o nome do País, se você
digitar Brasil, a cláusula WHERE fica da seguinte maneira:
WHERE (((Pedidos.PaísDeDestino="Brasil"))
, e somente serão listados os Pedidos cujo país de
Destino for igual a Brasil. As aspas são colocadas pelo Microsoft
Access, porque o campo PaísDeDestino é do tipo texto.
Alterar a instrução SQL do exemplo anterior
para que além do PaísDeDestino, seja solicitada
uma Data Inicial, uma Data Final. Somente devem ser listados
os registros para o País digitado e dentro do Período
especificado.
SELECT
Pedidos.NúmeroDoPedido, Pedidos.DataDoPedido,
Pedidos.Frete, Pedidos.PaísDeDestino
FROM
Pedidos
WHERE (((Pedidos.DataDoPedido) Between
[Data Inicial:] And [Data Final:]) AND
((Pedidos.PaísDeDestino)=[Digite o País:]));
Observe a utilização do operador
Between,
junto com os parâmetros
[Data Inicial:] e
[Data Final:]. Os parâmetros nos campos DataDoPedido
e PaísDeDestino estão ligados por um AND (Operador
E), conforme explicado anteriormente.
Existe uma série de detalhes sobre a utilização
do SQL. Existem, também, diversas situações
onde podemos utilizar uma instrução SQL para retornar
dados. Por exemplo, ao construir uma Caixa De Combinação
em um formulário, podemos utilizar uma Instrução
SQL para buscar dados em uma Tabela, dados estes que serão
exibidos na Caixa de Combinação. Podemos utilizar
instruções SQL, juntamente com Funções
de Domínio para exibir valores em formulários, como
por exemplo, a média de vendas para um determinado período,
o total de vendas para um determinado cliente, e assim por diante.
Uma pergunta que fica é: Onde posso
encontrar mais informações sobre o SQL?
Um bom ponto de partida é a Ajudo do Microsoft Access . Agora
indicaremos alguns locais na Ajuda do Microsoft Access, onde você
poderá encontrar informações sobre SQL.
Selecione o comando
Ajuda -> Ajuda do Microsoft Access
ou pressione a tecla F1. Clique na guia
Conteúdo.
Clique no sinal de + ao lado da opção "Trabalhar
com Consultas". Surgem as opções:
Criar consultas SQL.
Trabalhar com instruções SQL.
Estas opções estão indicadas na figura a seguir:
Através destas duas opções você encontra
muitas informações e exemplos sobre o uso da lingüagem
SQL no Microsoft Access.
Conclusão:
A lingüagem SQL apresenta um padrão de comando/instruções
para consultar, alterar e pesquisar tabelas de um banco de dados.
A implementação do SQL utilizada no Microsoft Access
segue grande parte do padrão definido pelo Ansi-92, mas apresenta
algumas inconsistências, como por exemplo:
Utiliza o * ao invés do % como caractere curinga
Utiliza “ ao invés de ‘ para critérios
do tipo texto
Muito pode ser feito no Access, sem conhecer a lingüagem SQL,
mas com certeza você terá muito mais recursos à
mão, conhecendo a lingüagem SQL.
Nota: Este tutorial foi retirado da apostila da
Semana 2, do Curso de Excel Avançado e VBA. Você pode
adquirir os três arquivos, com todo o conteúdo deste
curso, por apenas R$ 10,00. Para saber como adquirir este curso,
Clique
Aqui.
Clique aqui para voltar ao início
da página