     Selecionando os registros de suas tabelas.

     -------------------------------------------

O comando SELECT.

Provavelmente este ser o comando que mais voc utilizar em suas
instrues SQL. Na verdade cerca de 70 a 80 % de suas instrues SQL
utilizaro o comando SELECT.

Estaremos trabalhando com o banco de dados Access e a sintaxe que usaremos
para nossas instrues SQL ser a suportada pelo Access. Lembre-se que
para as instrues SQL atuarem  necessrio que o arquivo esteja aberto.
Iremos utilizar o banco de dados Escola.mdb e as tabelas criadas no artigo
- Criando Tabelas .

A instruo SELECT retornar um conjunto de registros , recordset, do tipo
Dynaset/Table.

Basicamente voc dever fornecer duas informaes bsicas:

  1. Quais campos(colunas) da tabela deseja obter
  2. O nome da Tabela da qual voc quer obter os dados.

Assim uma instruo SELECT para selecionar todos os registros da tabela -
tblalunos - poder ser escrita como:

 SELECT * FROM tblalunos

 -O asterico ( * )  o curinga para indicar todos os campos da tabela

 -A clusula FROM indica de onde os dados sero extrados.

Para selecionar os campos nome e endereo da tabela tblalunos , faremos:

 SELECT nome, endereco FROM tblalunos

 - Os nomes dos campos e das tabelas podem ser indicados sem colchtes []
 , quando no existir espaos ou pontuao, e so separados por vrgulas.

 Assim para uma tabela de nome Tabela Alunos com os campos : Nome Aluno e
 Endereo Aluno seriamos obrigados a escrever:

 SELECT [Nome Aluno], [Endereo Aluno] FROM [Tabela Alunos]

Nomeando e Criando Campos Calculados
Um campo calculado pode resultar de uma operao aritmtica sobre campos
numricos ou pode ser resultado de operaes de strings sobre campos
textos. Para campos numricos voc pode qualquer operador padro (
+,-,*,/,^) e para strings o operador de concatenao ( & ), alm de poder
usar as funes do Visual Basic .Ex: UCASE$, MID$ , SQR ,

 Vejamos um exemplo onde temos uma tabela chamada Produtos com os
 seguintes campos: Produto,Nome , Preo e noutra tabela chamada Estoque os
 campos: Produto, quantidade
Vamos extrair atravs de um comando SELECT o nome do produto, e o valor
total em estoque.
Note que no temos a informao valor total , para isto vamos criar um
campo calculado com o nome de Valor Total e esse campo ser resultante da
multiplicao do preo do produto pela quantidade do mesmo em estoque.
SELECT produtos.nome, [preo]*[quantidade] AS [valor total]
FROM estoque INNER JOIN produtos ON estoque.produto = produtos.produto;
Criamos o campo calculado [preo]*[quantidade] e o nomeamos como valor
total. A clusula AS define o nome desejado.

Outro exemplo seria a criao de um campo nome pela juno dos campos nome
e sobrenome de uma tabela clientes:
SELECT nome & ', ' & sobrenome AS nome FROM clientes
Se a clusula AS no for utilizada ser criado automaticamente um nome
Expr1001 para o primeiro campo , e assim por diante.

Usando a clusula WHERE para definir critrios.
Se voc precisar usar um determinado critrio para selecionar os dados
pode utilizar a clusula WHERE.

A sintaxe bsica  a seguinte:

 SELECT <nome dos campos> FROM <nome da tabela> WHERE <critrio>

Para extrair uma relao com o nome dos alunos da 1 srie, faremos:

 SELECT nome FROM tblalunos WHERE serie="1"

Note que usamos o nmero entre aspas, pois o campo serie  definido como
do tipo Texto, se fosse numrico teramos que escrever:
 SELECT nome FROM tblalunos WHERE serie=1

Supondo que voc desse a opo ao usurio de informar a srie em uma caixa
de texto(Text1) , voc teria que escrever o seguinte:

 sql="SELECT nome FROM tblalunos WHERE serie=' " & text1.text & " ' "

 ou para o campo serie definido como tipo Numero.

 sql="SELECT nome FROM tblalunos WHERE serie= " & text1.text
Observe que no usamos o nome da tabela na especificao dos campos pois o
campo esta presente na tabela de origem dos dados.

Cuidado quando for trabalhar com datas como critrio de seleo pois a
data deve estar entre os caracteres # ( cerquilha) e no formato
mm/dd/yyyy.

Assim para selecionar os alunos que nasceram no dia 12 de agosto de 1986 -
12/08/1986 - devemos fazer:

 sql = "Select nome FROM tblalunos WHERE nascimento= #8/12/1986#"

Dando a opo ao usurio de informa a data e usando um
MaskeditBox(Maskdata) para receber a informaco teremos:

 sql="Select nome FROM tblalunos WHERE nascimento=" & "#" &
 Format(maskdata, "mm/dd/yyyy") & "#"
Note que tivemos que mudar o formato da data para mm/dd/yyyy

Ateno !!! cuidado com o Apstrofo - Se tiver um apstrofo dentro de uma
string de pesquisa , para evitar problemas voc deve delimitar a string de
pesquisa por aspas. Assim para pesquisar o nome Macdonald's voc de fazer
assim:
 sql="SELECT nome FROM tblempresas WHERE nome= " & " Macdolnad's"

Ordenando o resultado de sua Consulta - ORDER BY
Se quisermos ordernar o resultado de uma consulta podemos acrescentar a
clusula ORDER BY e o nome do campo pelo qual desejamos a ordenao. Por
padro ser retornado os dados na ordem crescente , se desejar na inverter
a ordem use a palavra chave DESC.

Assim para ordernarmos os alunos da 1 srie por nome e em ordem crescente
faramos assim:

 sql="SELECT nome FROM tblalunos WHERE serie=' " & text1.text & " ' "
 ORDER BY nome

para ordernar em ordem de teramos:

 sql="SELECT nome FROM tblalunos WHERE serie=' " & text1.text & " ' "
 ORDER BY nome DESC

Usando a clusula LIKE
As vezes os dados que voc est desejando filtrar no tm uma ocorrncia
exata, ou voc pretende realizar uma busca mais irrestrita. Para isso
devemos usar a clusula LIKE. Supondo que desejamos filtrar todos os
alunos que tenham o nome comeado pelas letrar Jos, Atravs da clusula
LIKE podemos inserir as letras desejadas e a SQL far uma busca parcial
pela string informada: Algo como:
 SELECT nome FROM tblalunos WHERE nome LIKE "Jos*"

Isto retornar os possveis nomes: Jos , Josu, Josimar, Josias, etc...

Note que usamos o asteristico (*) que funciona como um coringa ,
substituindo os demais caracteres.

A seguir listamos abaixo as principais ocorrncias :

 Tipo de ocorrncia      Padro utilizado na ConsultaO retorno da Pesquisa
                                     SQL
 Mltiplos caracteres                b*b             bb, bBb, bccccB
 Caractere especial                 b[*]b            b*b
 Mltiplos caracteres                ab*             abcdefg, abc
 Caractere nico                     b?b             bbb, b1b,bNb
 Dgito nico                        b#b             b0b,b1b,b4b
 Intervalo de caracteres            [b-h]            c,d,e,f,g
 No dgito                         [!0-9]           A,a, %, P

Definindo o relacionamento entre as Tabelas: JOIN
Com frequncia voc vai ser obrigado a obter dados de diversas tabelas,
pois trabalhando com o modelo relacional de banco de dados , durante a
normalizao os dados sero colocados em tabelas diferentes para evitar a
repetio de informaes.
Para selecionar campos de vrias tabelas , voc deve informar basicamente
o seguinte:
   * O nome de cada tabela na qual cada campo  selecionado
   * Os nomes dos campos dos quais voc est selecionando os dados
   * O relacionamento entre as tabelas
 Assim, supondo que voc deseja obter o nome e a nota de cada aluno do
 banco de dados Escola.mdb; se voc observar vai notar que no temos essas
 informaes em uma mesma tabela. Os dados que desejamos encontram-se em
 duas tabelas: Tblalunos ( o nome do aluno ) , TblNotas ( o codigo do
 curso e a nota)
 A sintaxe para o comando SQL extrair esses dados(nome e nota, ordenados
 pelo nome do aluno) :

         SELECT tblalunos.nome, tblnotas.nota
         FROM tblalunos INNER JOIN tblnotas ON tblalunos.codaluno =
         tblnotas.codaluno ORDER BY tblalunos.nome;

Quando voc tm um vnculo entre duas tabelas poder usar a palavra chave
INNER JOIN na clusula FROM de uma instruo SELECT para criar um conjunto
de registros com campos de ambas as tabelas
Naturalmente quanto maior a quantidade de tabelas das quais voc deseja
extrair os seus dados mais complexa a instruo se tornar.
Assim, para obter o nome ,curso e a nota de cada aluno do banco de dados
Escola.mdb; agora os dados que desejamos encontram-se em trs tabelas:
Tblalunos ( o nome do aluno ) , TblNotas ( o codigo do curso e a nota) e
TblCursos.

SELECT tblalunos.nome, tblcursos.nomecurso, tblnotas.nota
FROM tblcursos INNER JOIN (tblalunos INNER JOIN tblnotas ON
tblalunos.codaluno = tblnotas.codaluno) ON tblcursos.codcurso =
tblnotas.codcurso
ORDER BY tblalunos.nome;

A diferena entre a utilizao da clusula WHERE e da JOIN para reunir
dados de mltiplas tabelas  que a clusula WHERE produz um recordset
somente de leitura. Para criar um recordset atualizvel devemos usar JOIN

A sintaxe bsica para o JOIN e:
tabela 1 [INNER | LEFT | RIGHT ] JOIN tabela 2 ON
tabela1.chave1=tabela2.chave2

Temos 3 opes de clusulas usadas com JOIN e, o comportamento na maneira
de retornar os registros difere em cada caso:
 Tipos de
 JOIN    Registros da Tabela da Esquerda  Registros da Tabela da Direita
         Somente registros com um         Somente registros com um
 INNER   registro correspondente na       registro correspondente na
         tabela da direita                tabela da esquerda
                                          Somente registros com um
 LEFT    Todos os Registros               registro correspondente na
                                          tabela da esquerda
         Somente registros com um
 RIGHT   registro correspondente na       Todos os Registros
         tabela da direita

Continua...

------------------------------------------------------------------------

                                  Retorna

[Image]
