SQL - Eu tenho a força...!!?
Eu aposto que você já cansou de ouvir que a SQL é uma ótima opção para acessar e gerenciar uma aplicação Visual Basic que usa banco de dados. Neste site mesmo temos diversos artigos sobre o assunto. Dentre eles , apenas para citar os básicos, temos :
Mas você esta convencido ? Se ainda não está , neste artigo , minha missão é convencê-lo... Missão Impossível ???
Tarefa 1
Em um banco de dados - Escola.mdb - você possui três tabelas : Alunos , Materias , Notas com a seguinte estrutura :
Tabela Alunos: estrutura
Campo | Tipo | Tamanho |
CodigoAluno | AutoNumeração | |
NomeAluno | Texto | 50 |
EnderecoAluno | Texto | 50 |
Cidade | Texto | 40 |
Bairro | Texto | 40 |
Nascimento | Data/Hora | |
Filial | Texto | 2 |
Classe | Texto | 5 |
Tabela Materias : estrutura
Campo | Tipo | Tamanho |
CodigoMateria | AutoNumeração | |
NomeMateria | Texto | 150 |
DescricaoMateria | Memorando | |
Creditos | Double |
Tabela Notas : estrutura
Campo | Tipo | Tamanho |
CodigoNota | AutoNumeração | |
CodigoAluno | Inteiro Longo | |
CodigoMateria | Inteiro Longo | |
Nota | Single |
Apenas para você ter uma ideia abaixo exibimos alguns dados hipotéticos para cada tabela:
Tabela Alunos : Dados
Tabela Materias: Dados
tabela Notas : Dados
Você recebeu a tarefa de criar um conjunto de dados com a estrutura abaixo , tem somente 30 minutos para fazer e já se passaram 10 minutos ... : Como você faria para obter a seguinte estrutura de dados ???
Matéria | Matéria | Matéria | |
nome do aluno 1 | média | média | média |
nome do aluno 2 | média | média | média |
nome do aluno 3 | média | média | média |
Pense bem ... Você tem que exibir os dados que estão em três tabelas ( lembrando que deverá calcular a média) . Pode fazer esta tarefa via código ou usar SQL . E então ? Veja abaixo a solução SQL:
TRANSFORM Avg(notas.Nota) AS Media SELECT Alunos.nomeAluno AS Nome FROM Alunos INNER JOIN (materias INNER JOIN notas ON materias.CodigoMateria = notas.CodigoMateria) ON Alunos.CodigoAluno = notas.CodigoAluno GROUP BY Alunos.CodigoAluno, Alunos.nomeAluno PIVOT materias.NomeMateria; |
O resultado:
Para você entender:
Acabamos de ver um exemplo de uma consulta cruzada , onde , agrupamos dados em duas dimensões de uma vez só. As consultas cruzadas são suportadas no Access e no SQL Server mas não fazem partem da ANSI SQL. Sua sintaxe é:
TRANSFORM funçaoagregada
instruçãoselect
PIVOT campopivot [IN (valor1[, valor2[,
...]])]
Onde temos três partes principais :
Parte | Descrição |
---|---|
Funçãoagregada | Uma função agregada SQL que opera sobre os dados selecionados. |
Instruçãoselect | Uma instrução SELECT. |
Campopivot | O campo ou expressão que você deseja usar para criar cebeçalhos de coluna no conjunto de resultados da consulta. |
valor1, valor2 | Valores fixos usados para criar cabeçalhos de colunas. |
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 cabeçalhos 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ê também pode usar subconsultas como predicados — especificamente, os de uma cláusula WHERE — em uma consulta tabela de referência cruzada.
Os valores retornados em campopivot são usados como cabeçalhos de colunas no conjunto de resultados da consulta.
Você pode restringir campopivot 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.
Tarefa 2
Você acabou de implantar o seu sistema VB em uma empresa e vai ter que importar os dados do cadastro de clientes que antes era feito no Word/WordStar ( pasmem...!) para sua tabela Clientes. Após terminar a importação dos 20.000 registros ( vinte mil !!! ) e abrir a tabela você constatou que havia dezenas , centenas , milhares de registros duplicados. Você tem que identificar e excluir os registros duplicados. ( Vai fazer na mão ou vai usar SQL !!! )
Abaixo exibimos uma suposta tabela clientes ( simplificada ) em sua estrutura e uma visão dos registros duplicados:
A solução SQL :
1-) Primeiro vamos gerar uma tabela com os registros duplicados , assim :
SELECT DISTINCTROW [Clientes].[Codigo], [Clientes].[Nome] INTO Clientes_Duplicados FROM Clientes GROUP BY [Clientes].[Codigo], [Clientes].[Nome] HAVING (((Clientes.Nome) In (SELECT [Nome] FROM [Clientes] As Tmp GROUP BY [Nome] HAVING Count(*)>1 ))) ORDER BY [Clientes].[Nome]; |
Esta consulta irá criar a tabela Clientes_Duplicados contendo os registros duplicados na tabela Clientes. A sintaxe para uma consulta criar tabela é:
SELECT campo1[, campo2[,
...]] INTO tabelanova [IN bancodadosext]
FROM fonte
A instrução SELECT...INTO tem estas partes:
Parte | Descrição |
---|---|
campo1, campo2 | Os nomes dos campos a serem copiados na nova tabela. |
Tabelanova | O nome da tabela a ser criada. Se o nome tabelanova for o mesmo de uma tabela existente, ocorrerá um erro. |
Bancodadosext | O caminho para um banco de dados externo. Para obter uma descrição do caminho, consulte a cláusula IN. |
origem | O nome da tabela existente a partir da qual os registros são selecionados. Podem ser tabelas únicas ou múltiplas ou uma consulta. |
Nota: Não confundir com a instrução INSERT INTO que adiciona um registro ou múltiplos registros a uma tabela. Neste caso temos uma consulta chamada de consulta acréscimo.
A cláusual GROUP BY permite agrupar dados em uma consulta e a cláusula HAVING para as consultas agrupadas é semelhante a cláusula WHERE.
ORDER BY permite ordenar o resultado gerado pela consulta.
Veja o resultado da consulta após sua execução:
2-) A seguir vamos excluir os registros duplicados, usando SQL é claro. A consulta SQL é a seguinte:
Tarefa 3
Você precisa criar uma cópia de suas tabelas em um banco de dados diferente do seu banco de dados de trabalho. O seu banco de dados de trabalho é chamado Estoque.mdb e ele contém a tabela clientes . Como copiar a tabela clientes para outro banco de dados chamado Copia.mdb. ?
Visualizando o cenário:
1- Você possui dois Banco de dados : Estoque.mdb
e Copia.mdb
2- Quer copiar a tabela clientes ( dados e estrutura ) para a tabela Clientes_Copia.
|
A solução SQL :
INSERT INTO clientes_copia IN 'COPIA.MDB' SELECT * FROM clientes; |
A tabela clientes será copiada para o banco de dados COPIA.MDB com o nome Clientes_Copia.
Usamos uma consulta anexação cuja sintaxe é:
INSERT INTO destino [(campo1[,
campo2[, ...]])] [IN bancodadosext]
SELECT [origem.]campo1[, campo2[,
...]
FROM expressãotabela
Parte | Descrição |
---|---|
destino | O nome da tabela ou consulta à qual acrescentar os registros. |
campo1, campo2 | Nomes dos campos aos quais os dados serão acrescentados. |
Bancodadosext | O caminho para um banco de dados externo. Usamos o nome entre aspas simples |
Origem | O nome da tabela ou consulta a partir da qual os registros serão copiados. |
Expressãotabela | O nome da(s) tabela(s) da(s) qual(is) os registros são inseridos. |
valor1, valor2 | Os valores a serem inseridos nos campos específicos do novo registro. Cada valor é inserido no campo que corresponde à posição do valor na lista: valor1 é inserido no campo1 do novo registro, valor2 no campo2, e assim por diante. Você deve separar os valores com uma vírgula e colocar os campos de texto entre aspas (' '). |
Tarefa 4
Você possui em seu banco de dados Estoque.mdb a tabela Produtos e precisa atualizar o preço de mais de 20.000 itens da tabela. Para complicar mais um pouco , somente os itens com valores superiores a R$ 5,00 devem ser atualizados em 20% .
A solução SQL :
UPDATE produtos SET valor = valor * 1.2 WHERE valor > 5 |
O cenário
Antes de executar a consulta SQL | Depois da execução da consulta |
Usamos uma consulta atualização cuja sintaxe é:
UPDATE tabela
SET valornovo
WHERE critérios
Parte | Descrição |
---|---|
tabela | O nome da tabela contendo os dados que você deseja modificar. |
valornovo | Uma expressão que determina o valor a ser inserido em um campo específico dos registros atualizados. |
critérios | Uma expressão que determina quais registros serão atualizados. Apenas os registros que satisfaçam à expressão são atualizados. |
Tarefa 5
Você possui uma tabela Alunos e precisa recuperar as seguintes informações sobre os alunos:
para complicar estas informações devem se ater ao período de 01/01/1950 a 31/12/1970. A estrutura da sua tabela é a seguinte:
A solução SQL :
SELECT Count(*) AS [Numero de Alunos], Min(datanascimento) AS [Mais Velho], Max(datanascimento) AS [Mais Novo], Avg(Nota) AS Media FROM Alunos WHERE datanascimento BETWEEN #1/1/1950# AND #31/12/1970#; |
Após executar iremos obter:
Usamos as funções agregadas da SQL . A sintaxe para destas funções na cláusula SELECT é:
<<nome da função>> (nome da coluna/campo) AS << nome saida do resultado >>
As principais funções agregadas da SQL São:
Função Agregada | Retorna |
Sum | A soma dos valores de um campo numérico |
Avg | A média dos valores não Null num campo numérico |
Count | Contagem de valores não Null em um campo definido |
Min | O valor mínimo de um campo |
Max | O valor máximo de um campo |
First | O Valor de um campo no primeiro registro da seleção |
Last | O valor de um campo no último registro da seleção |
StDev | Amostra do desvio padrão dos valores não Null |
Var | Amostra da variação dos valores não Null |
VarP | Variação das quantidades de valores não Null |
Obs: Quando um campo não contém valores, contém um valor Nulo ("Null") ou, tratando-se de um campo Texto ou Memorando contém um valor Nulo ou uma seqüência de comprimento zero(" "). Se existirem valores Nulos em um campo, estes poderão afetar os valores da consulta. Null é diferente de (" ").
- A cláusula AS permite que criar um aliás para identificar o resultado de saida da consulta.
- A cláusula BETWEEN permite selecionar entre dois critérios de data ( para o caso )
Tarefa 6
Você precisa excluir de uma tabela Produtos todos os produtos com data de aquisição inferior a 1990. Supondo que sua tabela Produtos tenha a estrutura abaixo:
A solução SQL :
DELETE FROM produtos WHERE dataAquisicao <= #01/01/1990# |
Usamos uma consulta exclusão para deletar os registros da tabela produtos com data de aquisição inferior a 1990. a sintaxe da instrução DELETE é:
DELETE FROM <<nome da tabela>> WHERE <<criterio>>
Onde: <<nome da tabela>> é o nome da tabela na qual deseja excluir os registros , e critério é a condição para excluir o registro: Ex: Delete From Clientes Where Codigo > 1
Tarefa 6
Você precisa copiar o conteúdo de uma tabela para outra tabela. Via usar SQL ???
Solução SQL :
Para copiar os dados de uma tabela para outra tabela com a mesma estrutura use a instrução:
Insert Into Tabela2 Select * From Tabela1
Como exemplo ilustrativo abaixo temos o código para fazer isto em uma página ASP usando uma conexão ODBC com o banco de dados Teste.mdb
<% Set MyConn=Server.CreateObject("ADODB.Connection") MyConn.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=C:\Databases\Teste.mdb" SQL = "Insert Into Tabela2 Select * From Tabela1" MyConn.Execute(SQL) MyConn.Close Set MyConn = Nothing %> |
Obs: Para copiar um registro utilize uma condição que restrinja a cópia, assim :
INSERT INTO Tabela2 SELECT * FROM Tabela1 WHERE Codigo = 123456
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Veja os Destaques e novidades do SUPER DVD VB (sempre atualizado) : clique e confira ! Quer migrar para o VB .NET ? Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira... Quer aprender C# ??
Chegou o
Super DVD C# com exclusivo material de
suporte e vídeo aulas com curso básico sobre C# |
José Carlos Macoratti (2001)