 SQL - Eu tenho a força...!!?
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 Facebook
  
 Compartilhe no Twitter
 
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)