Anda di halaman 1dari 15

Sbado, 26 de Junho de 2004

Noes da linguagem SQL para consultas


Por Jlio Cesar Fabris Battisti Objetivos: Neste tutorial sero apresentados os principais elementos da linguagem SQL (Structured Query Language). Sero apresentados diversos exemplos prticos de utilizao da linguagem SQL. Pr-requisitos: Para acompanhar esta lio voc deve dominiar os conceitos apresentados nos seguintes treinamento: "Curso Bsico de Access" e no tutorial "Consultas Avanadas no Microsoft Access". Nota: Este tutorial foi retirado da apostila da Semana 2, do Curso de Excel Avanado e VBA. Voc pode adquirir os trs arquivos, com todo o contedo deste curso, por apenas R$ 10,00. Para saber como adquirir este curso, Clique Aqui. Introduo: O SQL foi desenvolvido para ser uma linguagem padro para operaes com Banco de Dados. A linguagem SQL foi elaborada para ser independente de hardware ou do software. Ao usar o SQL, voc no precisa saber a respeito do software de banco de dados ou do hardware envolvido em uma operao. Tudo o que voc precisa conhecer so os comandos/instrues SQL padro para solicitar informaes, que obrigatoriamente o mesmo em todos os sistemas que utilizam o SQL. Nota: Na prtica existem pequenas diferenas entre o SQL dos diferentes bancos de dados, como o Microsoft Access, Microsoft SQL Server 2000, ORACLE, etc. Voc usa operaes SQL quando trabalha com o Microsoft Access, mas o programa, na verdade, oculta a linguagem SQL do usurio. Por exemplo, todas as operaes de consulta so realizadas usando-se SQL, mas voc v apenas a parte grfica (Modo Estrutura) onde a consulta definida. Voc pode ser muito produtivo no Microsoft Access sem saber nada de SQL. Um conhecimento bsico de SQL, no entanto, melhora significativamente o seu uso do Microsoft Access, principalmente no uso de tcnicas avanadas em Formulrios e Relatrios e na criao de rotinas de programao. Quando voc constri uma consulta no modo estrutura, na verdade o Microsoft Access est definindo uma instruo SQL, a partir dos campos, critrios e opes de filtragem que voc definiu na consulta. A ttulo de exemplo, vamos acessar a instruo SQL da consulta "Totais por Pedido", fornecida com o arquivo Semana2.mdb, o qual faz parte dos arquivos de exemplos do Curso de Access Avanado.

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 disponveis. Abra o banco de dados Semana2.mdb V para a Guia Consultas D um clique na consulta Totais por Pedido D um clique no boto Estrutura Selecione o comando Exibir -> Modo SQL. Ser exibido o comando SQL indicado a seguir:

SELECT Pedidos.NmeroDoPedido, Sum(([Quantidade]*[PreoUnitrio])*(1-[Desconto])) AS TotalPorPedido FROM Pedidos INNER JOIN [Detalhes do Pedido] ON Pedidos.NmeroDoPedido = [Detalhes do Pedido].NmeroDoPedido GROUP BY Pedidos.NmeroDoPedido;

Nota: Se voc no tiver disponvel a consulta Totais por Pedido, utilize qualquer outra consulta disponvel. Na prtica esta Instruo SQL que o Microsoft Access grava ao salvar uma consulta e tambm esta Instruo SQL que utilizada para selecionar os registros, aplicando os critrios especificados. Embora possa parecer um pouco complexa, veremos que a linguagem SQL extremamente simples e intuitiva. Neste tpico veremos alguns aspectos bsicos sobre o SQL, bem como os locais na Ajuda do Microsoft Access onde podem ser encontradas informaes mais detalhadas sobre o SQL. Uma Instruo SQL descreve o conjunto de dados que voc deseja recuperar (quais campos, de quais tabelas, quais critrios, classificao, expresses Calculadas, etc). Todas as instrues SQL so conduzidas com um nico comando que contm uma descrio completa da informao exigida. Ao escrever uma instruo SQL, voc no deve se preocupar em como os dados so recuperados, mas somente com o contedo do conjunto de dados. Esse o principal benefcio do mtodo SQL. Em muitas operaes do Microsoft Access, voc pode usar instrues SQL, no lugar de expresses normais para inserir um conjunto de dados em um objeto. Por exemplo, todos os formulrios e relatrios possuem uma propriedade RecordSource. Essa propriedade normalmente o nome de uma tabela ou consulta, mas tambm pode ser uma instruo SQL. Lembre-se que o SQL um padro genrico para expresses de consulta em banco de dados. Embora a maior parte das verses do SQL compartilhe elementos bsicos, elas no so idnticas. O Access SQL usa algumas palavras-chave que voc no encontra em outras verses do SQL. Veremos atravs de exemplos a utilizao das principais palavras chaves do SQL para a construo de expresses SQL para pesquisa em banco de dados. SELECT Esta com certeza a instruo SQL mais importante, no existe pesquisa que no utilize esta instruo, vamos conhec-la em detalhes. A Instruo Select utilizada para especificar "Quais os Campos" de "Quais tabelas" faro parte da consulta, quais os critrios de pesquisa que sero utilizados, qual a ordem de classificao, etc.

A sintaxe da instruo 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 nos temos os seguintes elementos:


Elemento predicado * Tabela Descrio Um dos seguintes: ALL, DISTINCT, DISTINCTROW ou TOP. Voc usa um predicado para restringir o nmero de Registros que retornado pela consulta. Se nenhum for especificado o padro 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. O nome da tabela ou consulta de onde so selecionados os campos. Por exemplo, Select Pedidos.NmeroDoPedido, Pedidos.DataDoPedido from Pedidos - Seleciona os Campos NmeroDoPedido e DataDoPedido, da tabela Pedidos. O Nome dos campos a serem selecionados. Um "apelido" para o campo. Na Folha de Dados o apelido aparece como o ttulo da coluna. Por exemplo, Select Pedidos.NmeroDoPedido As Nmero from Pedidos, faz com que a coluna NmeroDoPedido tenha o nome Nmero a ela associado. O nome da tabela de onde os campos sero selecionados O nome do Bando de Dados que contem a tabela, caso no seja o banco de dados atual. Utilizado para especificar critrios na consulta. Por exemplo, Where Pedidos.PasDeDestino="Brasil" O mesmo que Agrupar Por no modo estrutura da consulta, na linha Total Especifica critrios quando utilizamos Agrupar Por. Utilizado para classificao dos registros em ordem crescente ou descendente de um determinado campo. Em um ambiente multiusurios com um grupo de trabalho seguro, use esta declarao com uma consulta para conceder ao usurio que executa a consulta as mesmas permisses que as do proprietrio da consulta. Sintaxe instruo sql WITH OWNERACCESS OPTION A declarao WITH OWNERACCESS OPTION opcional. O exemplo a seguir permite que o usurio visualize informaes sobre salrios (mesmo que, de outra forma, o usurio no tenha permisso para visualizar a tabela FolhaDePagamento), desde que o proprietrio da consulta tenha essa permisso: SELECT Sobrenome, Nome, Salrio FROM Funcionrios ORDER BY Sobrenome

Campo1, Campo2 Alias 1, Alias2

tabelaexpression externaldatabase Where group by Having order by WITH OWNERACESS OPTION

WITH OWNERACCESS OPTION; Se de alguma outra forma o usurio 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 acrscimo. Se voc deseja impor configuraes de segurana de grupo de trabalho e permisses de usurios, no inclua a declarao WITH OWNERACCESS OPTION. Essa opo requer que voc tenha acesso ao arquivo System.mdw associado ao banco de dados. realmente til somente nas implementaes de multiusurios com segurana.

Vejamos alguns exemplos prticos para exemplificar o uso da instruo Select: Criar uma instruo SQL que retorne o campo NmeroDoPedido, o campo DataDoPedido, o campo Frete e o campo PasDeDestino da tabela Pedidos.
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino, Pedidos.Frete FROM Pedidos;

Toda Instruo SQL deve ser terminada com um ponte e vrgula (;), conforme indicado acima. Esta instruo 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 alterao no modo SQL, as alteraes se refletem no modo estrutura e vice-versa. Isso acontece porque o modo estrutura da consulta, simplesmente uma representao grfica para facilitar a construo de expresses SQL. Alterar a instruo SQL anterior para que os registros sejam classificados em ordem crescente pelo valor do Frete.
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino, Pedidos.Frete FROM Pedidos ORDER BY Pedidos.Frete;

Observe a utilizao da clusula ORDER BY Pedidos.Frete para classificar os registros em ordem Crescente. A classificao em ordem crescente o padro no Microsoft Access. Quando formos classificar em ordem decrescente, precisamos especificar a palavra DESC, conforme indicado abaixo:
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino, Pedidos.Frete FROM Pedidos ORDER BY Pedidos.Frete DESC;

Alterar a instruo SQL anterior para que sejam exibidos somente os pedidos cujo PasDeDestino seja Brasil.

SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino, Pedidos.Frete FROM Pedidos WHERE (((Pedidos.PasDeDestino)="Brasil")) ORDER BY Pedidos.Frete;

Observe a utilizao da Clusula WHERE para filtrar somente os pedidos cujo PasDeDestino seja Brasil. Como o campo PasDeDestino um campo do tipo texto, o valor do critrio (Brasil) tem que vir entre aspas. Se fosse um campo do tipo Data, o valor do critrio teria que vir delimitado pelo sinal #. Por exemplo #01/01/1995#. Vamos trabalhar um pouco mais com a clusula WHERE. Altere a instruo SQL anterior para que sejam exibidos somente os pedidos para o Brasil ou Alemanha como PasDeDestino.
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino, Pedidos.Frete FROM Pedidos WHERE (((Pedidos.PasDeDestino)="Brasil" Or (Pedidos.PasDeDestino)="Alemanha")) ORDER BY Pedidos.Frete;

Observe a utilizao da Clusula OR ligando os dois Critrios. Lembre que a clusula OR retorna um registro se o PasDeDestino atender um dos dois critrios, 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 instruo SQL anterior, retirando o critrio para PasDeDestino. Adicione um critrio para NmeroDoPedido maior do que 10500, retire a classificao do campo Frete a classifique pelo campo NmeroDoPedido.
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino, Pedidos.Frete FROM Pedidos WHERE (((Pedidos.NmeroDoPedido)>10500)) ORDER BY Pedidos.NmeroDoPedido;

Observe a clusula WHERE utilizando o operador de comparao maior do que (>) e a classificao atravs da clusula ORDER BY no campo NmeroDoPedido. Observe tambm, que no Microsoft Access, nas instrues SQL sempre aparece a identificao completa do campo no seguinte formato: NomeTabela.NomeCampo. Por exemplo Pedidos.NmeroDoPedido para indicar o campo NmeroDoPedido da tabela Pedidos. Podemos ver, atravs dos exemplos, que a linguagem SQL no to difcil como pode parecer a primeira vista. Observe que a sintaxe da linguagem bastante intuitiva e orientada a extrao de dados atravs das consultas. Vamos continuar vendo exemplos de aplicao da linguagem SQL com a utilizao de recursos mais avanados.

Alterar a instruo SQL anterior, e adicionar um critrio de tal maneira que somente sejam exibidos os pedidos para o Ano de 1995. Tirar o critrio do campo Nmero do Pedido.
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino, Pedidos.Frete FROM Pedidos WHERE ((Year([DataDoPedido])=1995)) ORDER BY Pedidos.NmeroDoPedido;

Observe a utilizao da funo Ano (Year) para extrairmos apenas o Ano do campo DataDoPedido a fim de especificarmos como critrio o Ano=1995. Tambm a clusula Order By foi mantida, classificando a listagem em ordem crescente pelo nmero do pedido. A utilizao de funes junto com os comando SQL nos fornece inmeras possibilidades de refinamento em nossas consultas. Alterar a instruo SQL anterior, para que sejam exibidos somente os pedidos no Perodo de 01/01/1995 at 31/07/1995 e que tenham como PasDeDestino Brasil, Argentina, Alemanha ou Canad.
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino, Pedidos.Frete FROM Pedidos WHERE (((Pedidos.DataDoPedido) Between #1/1/95# And #8/31/95#) AND (Pedidos.PasDeDestino) In ("Brasil","Argentina","Alemanha","Canad"))) ORDER BY Pedidos.NmeroDoPedido;

Observe a utilizao de vrios critrios em diferentes campos. Colocamos critrios nos campos DataDoPedido e PasDeDestino. Conforme descrito anteriormente os critrios de dois ou mais campos so ligados atravs do operador AND, indicando que um registro deve atender ambos os critrios para ser selecionado. Tambm temos a utilizao dos operadores Between (Entre) para selecionar as datas dentre de um determinado intervalo e do operador In (Em) para selecionar o campo PasDeDestino que seja igual a um dos valores apresentados na lista. Observe tambm , que os valores de data vem delimitados pelos marcadores #, conforme descrito anteriormente. Criar uma instruo SQL que retorne o campo NmeroDoPedido, o campo DataDoPedido, o campo DataDeEntrega, o campo Frete e o campo PasDeDestino da tabela Pedidos. Criar uma coluna adicional que calcula o nmero de dias entre a DataDeEntrega e a DataDoPedido. Chamar esta coluna de Dias_Ped_Entr.
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.DataDeEntrega, Pedidos.PasDeDestino, Pedidos.Frete, [DataDeEntrega]-[DataDoPedido] AS Dias_Ped_Entr FROM Pedidos WHERE (((Pedidos.DataDoPedido) Between #1/1/95# And #8/31/95#) AND ((Pedidos.PasDeDestino) In ("Brasil","Argentina","Alemanha","Canad"))) ORDER BY Pedidos.NmeroDoPedido;

Veja que a coluna calculada est junto com a listagem dos campos no incio da instruo Select. Alm disso foi utilizada a palavra AS para atribuir um nome (apelido) para esta coluna calculada. Este nome o que

ir aparecer como ttulo da coluna no modo Folha de Dados. Quando voc constri uma expresso, este o nome que vem antes dos dois pontos, por exemplo: Dias_Ped_Entr: [DataDeEntrega]-[DataDoPedido]. Voc tambm 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 nmero de dias entre a DataDeEntrega e a DataDoPedido, bastaria utilizar a seguinte instruo SQL:
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.DataDeEntrega, Pedidos.PasDeDestino, Pedidos.Frete, [DataDeEntrega]-[DataDoPedido] AS Dias_Ped_Entr FROM Pedidos WHERE (((Pedidos.DataDoPedido) Between #1/1/95# And #8/31/95#) AND ((Pedidos.PasDeDestino) In ("Brasil","Argentina","Alemanha","Canad"))) ORDER BY [DataDeEntrega]-[DataDoPedido];

Alterar a instruo SQL anterior, eliminando os critrios para a DataDoPedido e para o PasDeDestino. Colocar um novo critrio para PasDeDestino, onde sejam exibidos apenas os pedidos cujo PasDeDestino tem a Primeira Letra na faixa de A at M. Utilize o operador Like.
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.DataDeEntrega, Pedidos.PasDeDestino, Pedidos.Frete, [DataDeEntrega]-[DataDoPedido] AS Dias_Ped_Entr FROM Pedidos WHERE (((Pedidos.PasDeDestino) Like "[A-M]*")) ORDER BY Pedidos.PasDeDestino;

Observe a utilizao do Operador Like ("Como") como critrio de Pesquisa para esta consulta. Nunca demais salientar que a utilizao das Instrues SQL juntamente com as funes e operadores do Microsoft Access, nos fornece um amplo conjunto de possibilidades. At agora utilizamos exemplos com Instrues que selecionam registros de uma nica tabela. Porm bastante comum criarmos Consultas baseadas em duas ou mais tabelas. Quando criamos instrues SQL que buscam dados em duas ou mais tabelas, dizemos que est sendo feito um Join entre as duas tabelas. Normalmente este "Join" (ou ligao) feito atravs de um campo comum as duas tabelas. Por exemplo, NmeroDoPedido na tabela Pedidos e NmeroDoPedido na tabela Detalhes do Pedido. Outro exemplo, CdigoDoCliente na tabela Pedidos e CdigoDoCliente na tabela Clientes. Pode acontecer de termos consultas que trabalham com trs ou mais Tabelas, neste caso teremos diversos Joins. Agora passaremos e explorar, na Prtica, atravs de exemplos a construo de Instrues SQL que trabalham com duas ou mais tabelas. Sempre lembrando que estas consultas podem ser construdas diretamente no modo estrutura das consultas e depois simplesmente vamos para o modo SQL e observamos o cdigo gerado. Porm o conhecimento da linguagem SQL til em diversas situaes, conforme veremos ao estudarmos Tcnicas Avanadas em Formulrios e Tcnicas Avanadas em Relatrios. Criar uma instruo SQL que selecione os seguintes campos: NmeroDoPedido da tabela Pedidos

DataDoPedido da tabela Pedidos PasDeDestino da tabela Pedidos Frete da tabela Pedidos CdigoDoProduto, PreoUnitrio e Quantidade da tabela Detalhes do Pedido

As tabelas Pedidos e Detalhes do Pedido esto relacionadas atravs do campo NmeroDoPedido. Classificar a listagem em ordem crescente do campo NmeroDoPedido.
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino, Pedidos.Frete, [Detalhes do Pedido].CdigoDoProduto, [Detalhes do Pedido].PreoUnitrio, [Detalhes do Pedido].Quantidade FROM Pedidos INNER JOIN [Detalhes do Pedido] ON Pedidos.NmeroDoPedido = [Detalhes do Pedido].NmeroDoPedido ORDER BY Pedidos.NmeroDoPedido;

Observe a instruo que est em vermelho. Nela temos a utilizao da clusula INNER JOIN, ligando as tabelas Pedidos e Detalhes do Pedido, atravs do campo NmeroDoPedido, conforme especificado aps o ON. UM Join deste tipo bastante comum. Observe que est listagem ir trazer vrios registros para cada Pedido, tantos quantos forem os tens de cada pedido. Por exemplo, o Pedido Nmero 10248 apresenta trs registros, um para cada um dos seus tens. Um para o Produto 42, outro para o produto 72 e um para o produto cujo cdigo 11. Mas se ao invs do CdigoDoProduto, nos quisssemos que fosse exibida a Descrio do Produto. Em primeiro lugar esta informao 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 atravs do campo CdigoDoProduto, logo teremos mais um Join. Aps adicionar a tabela Produtos e substituir o campo CdigoDoProduto pelo campo NomeDoProduto, a nossa instruo SQL deve ficar conforme indicado abaixo:
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino, Pedidos.Frete, Produtos.NomeDoProduto,[Detalhes do Pedido].PreoUnitrio, [Detalhes do Pedido].Quantidade FROM Produtos INNER JOIN (Pedidos INNER JOIN [Detalhes do Pedido] ON Pedidos.NmeroDoPedido=[Detalhes do Pedido].NmeroDoPedido) ON Produtos.CdigoDoProduto = [Detalhes do Pedido].CdigoDoProduto ORDER BY Pedidos.NmeroDoPedido;

Observe que neste caso temos um INNER JOIN dentro do outro. Dentro do parnteses feita a ligao entre as tabelas Pedidos e Detalhes Do Pedido, atravs do campo NmeroDoPedido, e externamente feita a ligao entre as tabelas Produtos e Detalhes do Pedido, atravs do campo NmeroDoPedido. Posso utilizar diversos nveis de INNER JOIN, embora esta no seja uma prtica recomendada, pois se aumentarmos muito os nveis de INNER JOIN, posso ter como resultado pesquisas mais lentas em

conseqncia do aumento da complexidade das consultas. At 3 ou 4 nveis considerado normal, acima disso preciso repensar a maneira de construir a consulta. Alterar a instruo 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 classificao do campo NmeroDoPedido e classificar em ordem crescente do campo NomeDoProduto.
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino, Pedidos.Frete, Produtos.NomeDoProduto, [Detalhes do Pedido].PreoUnitrio, [Detalhes do Pedido].Quantidade FROM Pedidos INNER JOIN (Produtos INNER JOIN [Detalhes do Pedido] ON Produtos.CdigoDoProduto = [Detalhes do Pedido].CdigoDoProduto) ON Pedidos.NmeroDoPedido = [Detalhes do Pedido].NmeroDoPedido WHERE (((Produtos.NomeDoProduto) Like "[A-J]*")) ORDER BY Produtos.NomeDoProduto;

Observe, alm dos dois INNER JOIN, a utilizao da clusula WHERE em conjunto com Operador LIKE para especificar o critrio desejado. At este momento estivemos construindo Instrues SQL que correspondem as consultas de Seleo. Especificamos quais campos sero exibidos, critrios de filtragem para estes campos e uma ordem de classificao. A partir de agora aprenderemos a utilizar Instrues SQL para a construo de outros tipos de Consulta : Criar Tabela, Consulta anexao, Consulta de tabela de referncia cruzada, Consulta excluso e Consulta atualizao. Vamos comear criando uma consulta do tipo Criao de Tabela e observar as diferenas na instruo SQL. Construir uma instruo SQL que selecione o NmeroDoPedido, DataDoPedido, PasDeDestino e Frete. Colocar um critrio para selecionar apenas os registros cuja DataDoPedido tenha cado no ms 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.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino, Pedidos.Frete INTO [Pedidos de Junho e Julho] FROM Pedidos WHERE ((Month([DataDoPedido]) In (6,7)));

Observe a utilizao da instruo INTO [Pedidos de Junho e Julho]. Ao invs de utilizarmos um SELECT FROM, utilizamos um SELECT INTO, que a instruo SQL utilizada para criar uma nova tabela com os registros retornados pela consulta. O Nome da nova tabela vem depois da instruo INTO. Como o nome da tabela possui espaos em branco, o nome deve ser colocado entre colchetes. Tambm utilizamos, na clusula WHERE, o operador In , juntamente com a funo Month, para especificar que o ms da DataDoPedido deve ser um dos valores definidos na clusula In (6=Junho, 7=Julho). A Instruo 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 excluda e uma nova tabela ser criada. Criar uma instruo SQL que aumento o PreoUnitrio em 20% na tabela Detalhes do

Pedido, devido a um ajuste na moeda e uma desvalorizao em relao ao Dlar.


UPDATE [Detalhes do Pedido] SET [Detalhes do Pedido].PreoUnitrio = [PreoUnitrio]*1.2;

Observe a simplicidade da instruo SQL. Utilizamos uma instruo UPTADE, seguida do nome da tabela onde ser feita a atualizao. Em seguida uma instruo SET com a expresso de atualizao para aumentar em 20% o PreoUnitrio. Importante: Se voc executar mais do que uma vez, uma consulta de atualiazao, os dados sero repetidamente atualizados. Por exemplo: da primeira vez que a consulta for executada os dados do campo PreoUnitrio sero aumentados em 20% (por exemplo, um produto com preo Unitrio de R$ 100,00 passar para R$120). Se voc executar a consulta novamente ser aplicado um novo acrscimo de 20%, sobre os novos valores - o produto de R$120,00 passar para R$144,00 e assim sucessivamente. Vamos alterar essa instruo para incluir um critrio na consulta de atualizao. Alterar a instruo SQL do tem anterior para que somente sejam aumentados os registros cujo PreoUnitrio for maior ou igual a R$ 20,00.
UPDATE [Detalhes do Pedido] SET [Detalhes do Pedido].PreoUnitrio = [PreoUnitrio]*1.2 WHERE ((([Detalhes do Pedido].PreoUnitrio)>=20));

Foi adicionada uma clusula WHERE, para atualizar apenas os registros cujo PreoUnitrio seja maior do que R$ 20,00. Aqui podemos fazer alguns comentrios sobre a utilizao prtica de Instrues SQL. Como exemplo poderamos citar um Formulrio para atualizao de Preos. Poderamos colocar um campo onde o usurio digita o valor do aumento (10%, 15%, etc) e um boto Atualizar. Esse boto Atualizar tem associado ao evento Ao Clicar, uma Instruo SQL que atualiza os registros desejados. Isso aumenta em muito a nossa flexibilidade, evitando que o usurio tenha que se deslocar para a Guia Consultas e executar uma consulta de Atualizao. Juntamente com a instruo UPDATE, poderamos utilizar Operadores e Funes do Microsoft Access . Tambm podemos utilizar critrios em outros campos alm do campo que est sendo atualizado. A ttulo de exemplo, vamos alterar a instruo SQL anterior. Alterar a instruo SQL do tem anterior para que somente sejam aumentados os registros cujo PreoUnitrio for maior ou igual a R$ 20,00 E cujo NmeroDoPedido seja menor do que 10500.
UPDATE [Detalhes do Pedido] SET [Detalhes do Pedido].PreoUnitrio = [PreoUnitrio]*1.2 WHERE ((([Detalhes do Pedido].PreoUnitrio)>=20) AND (([Detalhes do Pedido].NmeroDoPedido)<10500));

Observe que utilizamos critrios em dois campos (PreoUnitrio e NmeroDoPedido) e que estes critrios esto ligados por um operador E, o que significa que um registro, somente ser atualizado se ele atender aos dois critrios ao mesmo tempo (PreoUnitrio maior ou igual a 20 e NmeroDoPedido menor do que 10500). Se o registro atender a apenas uma das condies, o mesmo no ter o seu PreoUnitrio

atualizado. Vamos refinar um pouco mais a nossa consulta de atualizao. Vamos fazer com que somente sejam atualizados os Pedidos para o ano da DataDoPedido igual a 1995, e ainda iremos manter os critrios adicionados at agora. Alterar a instruo SQL anterior para incluir um critrio 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.NmeroDoPedido = [Detalhes do Pedido].NmeroDoPedido SET [Detalhes do Pedido].PreoUnitrio = [PreoUnitrio]*1.2 WHERE ((([Detalhes do Pedido].PreoUnitrio)>=20) AND (([Detalhes do Pedido].NmeroDoPedido)<10500) AND (Year([DataDoPedido])=1995));

Temos diversos detalhes interessantes a observar nesta instruo SQL. Primeiro um INNER JOIN relacionando as tabelas Pedidos e Detalhes Do Pedido, atravs do campo NmeroDoPedido. Isso mostra que perfeitamente possvel, utilizar um INNER JOIN dentro de uma consulta de atualizao. Segundo: Temos a utilizao da funo Year para extrair apenas o ano do campo DataDoPedido e compar-lo com o critrio 1995. Novamente vale a pena comentar que a utilizao de Operadores e Funes, nos fornece uma grande flexibilidade em termos de construo de nossas consultas. Agora vamos passar a analisar as Instrues SQL para consultas do tipo Tabela de referncia cruzada. Veremos alguns exemplos, e os detalhes a respeito de cada instruo. Criar uma instruo SQL que liste o total de compras pelo NomeDaEmpresa e por ano da DataDoPedido. Classificar a listagem em ordem crescente do NomeDaEmpresa.
TRANSFORM Sum(([PreoUnitrio]*[Quantidade])*(1-[Desconto])) AS Expr2 SELECT Clientes.NomeDaEmpresa FROM (Clientes INNER JOIN Pedidos ON Clientes.CdigoDoCliente = Pedidos.CdigoDoCliente) INNER JOIN [Detalhes do Pedido] ON Pedidos.NmeroDoPedido = [Detalhes do Pedido].NmeroDoPedido GROUP BY Clientes.NomeDaEmpresa ORDER BY Clientes.NomeDaEmpresa PIVOT Year([DataDoPedido]);

Temos diversos detalhes a observar nesta instruo SQL. Primeiro a instruo TRANSFORM, que calcula o valor de cada tem (usando a frmula ([PreoUnitrio]*[Quantidade])*(1-[Desconto])) e a funo Sum para somar todos os tens de um determinado cliente. A instruo TRANSFORM equivale ao elemento Valor da Referncia Cruzada. Este valor calculado que ir formar os valores da nossa referncia cruzada.

Temos tambm, a utilizao de dois INNER JOIN, um ligando Pedidos com Detalhes do Pedido, atravs do campo NmeroDoPedido, e outro ligando Pedidos com Clientes, atravs do campo CdigoDoCliente, uma vez que precisamos de informaes destas trs tabelas. A Clusula GROUP BY agrupa a soma de todos os Pedidos de um determinado cliente, definido pelo campo NomeDaEmpresa. Os diferentes clientes, formaro as diferentes linhas da nossa referncia cruzada. E por ltimo, a utilizao da palavra PIVOT, juntamente com a funo Year, indicando que os diferentes Anos da DataDoPedido iro compor as colunas da nossa referncia cruzada. Veja o que diz a Ajuda do Microsoft Access sobre a instruo TRANSFORM: Cria uma consulta tabela de referncia cruzada. Sintaxe TRANSFORM funoagrg instruoselect PIVOT campocentral [IN (valor1[, valor2[, ...]])]

A instruo TRANSFORM possui as partes a seguir:


Parte funoagrg instruoselect campocentral valor1, valor2 Descrio Uma funo agregada SQL que opera sobre os dados selecionados. Uma instruo SELECT. O campo ou expresso que voc quer usar para criar ttulos de coluna no conjunto de resultados da consulta. Valores fixos usados para criar ttulos de colunas.

Comentrios: Quando resume dados utilizando uma consulta tabela de referncia cruzada, voc seleciona valores de campos ou expresses especificadas como ttulos de colunas para poder visualizar os dados em um formato mais compacto do que com uma consulta seleo. A instruo TRANSFORM opcional, mas quando for includa ser a primeira instruo em uma seqncia SQL. Ela antecede uma instruo SELECT que especifica os campos usados como ttulos de linhas e uma clusula GROUP BY que especifica o agrupamento de linhas. Opcionalmente, voc pode incluir outras clusulas, como WHERE, que especifiquem critrios adicionais de seleo ou de classificao. Voc pode tambm usar subconsultas como atributos especificamente, aqueles em uma clusula WHERE - em uma consulta tabela de referncia cruzada. Os valores retornados em campocentral so usados como ttulos de colunas no conjunto de resultados da consulta. Por exemplo, articular os nmeros das vendas

no ms da venda em uma consulta tabela de referncia cruzada criaria 12 colunas. Voc pode restringir campocentral para criar ttulos a partir de valores fixos (valor1, valor2) relacionados na clusula IN opcional. Voc pode tambm incluir valores fixos para os quais no existam dados para criar colunas adicionais. Criar uma instruo SQL que gere uma Consulta de tabela de referncia cruzada. As linhas devero ser formadas pelo PasDeDestino da tabela Clientes. As colunas sero formadas pelo nmero do ms da DataDoPedido e os valores sero formados pela contagem de pedidos. Adicionar um critrio de tal forma que somente sejam exibidos os registros para Brasil ou Alemanha.
TRANSFORM Count(Pedidos.NmeroDoPedido) AS ContarDeNmeroDoPedido SELECT Clientes.PasDeDestino FROM Clientes INNER JOIN Pedidos ON Clientes.CdigoDoCliente = Pedidos.CdigoDoCliente WHERE (((Clientes.PasDeDestino) In ("Brasil","Alemanha"))) GROUP BY Clientes.PasDeDestino PIVOT Month([DataDoPedido]);

Utilizamos a funo Count para contar o nmero de Pedidos por PasDeDestino e por Ms. Tambm utilizamos um INNER JOIN para relacionar as tabelas Clientes e Pedidos, atravs do campo CdigoDoCliente. A utilizao da clusula WHERE, juntamente com o operador IN para limitar o PasDeDestino a Brasil ou Alemanha. O GROUP BY indicando que o campo PasDeDestino formar as linhas da referncia cruzada. Finalmente a utilizao de PIVOT com a funo Month (Ms) indicando que os meses da DataDoPedido formaro as colunas da referncia cruzada. Agora vamos aprender a construir instrues SQL para consultas de excluso. Veremos que a simplicidade da linguagem SQL facilita em muito o entendimento e a aprendizagem destas instrues. Faa uma cpia da tabela Pedidos. Chame a cpia de CpiaDePedidos. Criar uma instruo SQl que elimine todos os Pedidos da tabela CpiaDePedidos cujo PasDeDestino seja a Alemanha
DELETE CpiaDePedidos.PasDeDestino FROM Pedidos WHERE (((Pedidos.PasDeDestino)="Alemanha"));

A instruo to simples, que praticamente dispensa comentrios. A nica recomendao importante que no devemos utilizar uma instruo DELETE, sem a utilizao de uma clusula WHERE. Utilizar um DELETE sem uma clusula WHERE significa que estaremos eliminando todos os registros da tabela. Vamos criar instrues SQL com parmetros (Consultas Parametrizadas), que ao serem executadas solicitam ao usurio que seja digitado um valor para o parmetro. Criar uma instruo SQL que selecione os campos NmeroDoPedido, DataDoPedido, Frete e PasDeDestino da tabela Pedidos. Fazer com que ao ser executada, a consulta solicite que seja digitado o nome do Pas e que sejam retornados apenas os Pedidos para o PasDeDestino digitado.

SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.Frete, Pedidos.PasDeDestino FROM Pedidos WHERE (((Pedidos.PasDeDestino)=[Digite o Pas:]));

Na hora que esta instruo SQL executada, o Microsoft Access localiza na clusula WHERE, aps o sinal de igual a expresso: [Digite o Pas:]. Como esta expresso no 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 expresso. Por exemplo, ao executar esta consulta o Microsoft Access pede que seja digitado o nome do Pas, se voc digitar Brasil, a clusula WHERE fica da seguinte maneira: WHERE (((Pedidos.PasDeDestino="Brasil")) E somente sero listados os Pedidos cujo pas de Destino for igual a Brasil. As aspas so colocadas pelo Microsoft Access, porque o campo PasDeDestino do tipo texto. Alterar a instruo SQL do exemplo anterior para que alm do PasDeDestino, seja solicitada uma Data Inicial, uma Data Final. Somente devem ser listados os registros para o Pas digitado e dentro do Perodo especificado.
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.Frete, Pedidos.PasDeDestino FROM Pedidos WHERE (((Pedidos.DataDoPedido) Between [Data Inicial:] And [Data Final:]) AND ((Pedidos.PasDeDestino)=[Digite o Pas:]));

Observe a utilizao do operador Between, junto com os parmetros [Data Inicial:] e [Data Final:]. Os parmetros nos campos DataDoPedido e PasDeDestino esto ligados por um AND (Operador E), conforme explicado anteriormente. Existe uma srie de detalhes sobre a utilizao do SQL. Existem, tambm, diversas situaes onde podemos utilizar uma instruo SQL para retornar dados. Por exemplo, ao construir uma Caixa De Combinao em um formulrio, podemos utilizar uma Instruo SQL para buscar dados em uma Tabela, dados estes que sero exibidos na Caixa de Combinao. Podemos utilizar instrues SQL, juntamente com Funes de Domnio para exibir valores em formulrios, como por exemplo, a mdia de vendas para um determinado perodo, o total de vendas para um determinado cliente, e assim por diante. Uma pergunta que fica : Onde posso encontrar mais informaes 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 informaes sobre SQL. Selecione o comando Ajuda -> Ajuda do Microsoft Access ou pressione a tecla F1. Clique na guia Contedo. Clique no sinal de + ao lado da opo "Trabalhar com Consultas". Surgem as opes: Criar consultas SQL. Trabalhar com instrues SQL.

Estas opes esto indicadas na figura a seguir:

Atravs destas duas opes voc encontra muitas informaes e exemplos sobre o uso da lingagem SQL no Microsoft Access. Concluso: A lingagem SQL apresenta um padro de comando/instrues para consultar, alterar e pesquisar tabelas de um banco de dados. A implementao do SQL utilizada no Microsoft Access segue grande parte do padro definido pelo Ansi-92, mas apresenta algumas inconsistncias, como por exemplo: Utiliza o * ao invs do % como caractere curinga Utiliza " ao invs de ' para critrios do tipo texto Muito pode ser feito no Access, sem conhecer a lingagem SQL, mas com certeza voc ter muito mais recursos mo, conhecendo a lingagem SQL.
Nota: Este tutorial foi retirado da apostila da Semana 2, do Curso de Excel Avanado e VBA. Voc pode adquirir os trs arquivos, com todo o contedo deste curso, por apenas R$ 10,00. Para saber como adquirir este curso, Clique Aqui.
Copyright 2001-2003 Codeline Tecnologia em Informtica Ltda. | Poltica de privacidade | Poltica de uso | Fale conosco

..........................................................................................................................................

Anda mungkin juga menyukai