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 : 

  1. SQL 

  2. Curso de SQL 

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.

Obs:  Você pode usar consultas criar tabela para arquivar registros, fazer cópias de backup das tabelas ou fazer cópias para exportar para um outro banco de dados, ou para usar como base para relatórios que exibam dados sobre um determinado período de tempo.

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.

UPDATE é útil para alterar vários registros ou quando os registros que você deseja alterar estão em várias tabelas

Tarefa 5

Você possui uma tabela Alunos e precisa recuperar as seguintes informações sobre os alunos:

  1. O número de alunos
  2. O aluno mais novo
  3. O aluno mais Velho
  4. A média das notas dos 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)