     Selecionando os registros de suas tabelas.

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

O comando SELECT.

Provavelmente este será o comando que mais você utilizará em suas
instruções SQL. Na verdade cerca de 70 a 80 % de suas instruções SQL
utilizarão o comando SELECT.

Estaremos trabalhando com o banco de dados Access e a sintaxe que usaremos
para nossas instruções SQL será a suportada pelo Access. Lembre-se que
para as instruções SQL atuarem é necessário que o arquivo esteja aberto.
Iremos utilizar o banco de dados Escola.mdb e as tabelas criadas no artigo
- Criando Tabelas .

A instrução SELECT retornará um conjunto de registros , recordset, do tipo
Dynaset/Table.

Basicamente você deverá fornecer duas informações básicas:

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

Assim uma instrução 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 cláusula FROM indica de onde os dados serão extraídos.

Para selecionar os campos nome e endereço da tabela tblalunos , faremos:

 SELECT nome, endereco FROM tblalunos

 - Os nomes dos campos e das tabelas podem ser indicados sem colchêtes []
 , quando não existir espaços ou pontuação, e são separados por vírgulas.

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

 SELECT [Nome Aluno], [Endereço Aluno] FROM [Tabela Alunos]

Nomeando e Criando Campos Calculados
Um campo calculado pode resultar de uma operação aritmética sobre campos
numéricos ou pode ser resultado de operações de strings sobre campos
textos. Para campos numéricos você pode qualquer operador padrão (
+,-,*,/,^) e para strings o operador de concatenação ( & ), além de poder
usar as funções do Visual Basic .Ex: UCASE$, MID$ , SQR ,

 Vejamos um exemplo onde temos uma tabela chamada Produtos com os
 seguintes campos: Produto,Nome , Preço e noutra tabela chamada Estoque os
 campos: Produto, quantidade
Vamos extrair através de um comando SELECT o nome do produto, e o valor
total em estoque.
Note que não temos a informação valor total , para isto vamos criar um
campo calculado com o nome de Valor Total e esse campo será resultante da
multiplicação do preço do produto pela quantidade do mesmo em estoque.
SELECT produtos.nome, [preço]*[quantidade] AS [valor total]
FROM estoque INNER JOIN produtos ON estoque.produto = produtos.produto;
Criamos o campo calculado [preço]*[quantidade] e o nomeamos como valor
total. A cláusula AS define o nome desejado.

Outro exemplo seria a criação de um campo nome pela junção dos campos nome
e sobrenome de uma tabela clientes:
SELECT nome & ', ' & sobrenome AS nome FROM clientes
Se a cláusula AS não for utilizada será criado automaticamente um nome
Expr1001 para o primeiro campo , e assim por diante.

Usando a cláusula WHERE para definir critérios.
Se você precisar usar um determinado critério para selecionar os dados
pode utilizar a cláusula WHERE.

A sintaxe básica é a seguinte:

 SELECT <nome dos campos> FROM <nome da tabela> WHERE <critério>

Para extrair uma relação com o nome dos alunos da 1 série, faremos:

 SELECT nome FROM tblalunos WHERE serie="1"

Note que usamos o número entre aspas, pois o campo serie é definido como
do tipo Texto, se fosse numérico teríamos que escrever:
 SELECT nome FROM tblalunos WHERE serie=1

Supondo que você desse a opção ao usuário de informar a série 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 não usamos o nome da tabela na especificação dos campos pois o
campo esta presente na tabela de origem dos dados.

Cuidado quando for trabalhar com datas como critério de seleção 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 opção ao usuário de informa a data e usando um
MaskeditBox(Maskdata) para receber a informacão 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

Atenção !!! cuidado com o Apóstrofo - Se tiver um apóstrofo 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
cláusula ORDER BY e o nome do campo pelo qual desejamos a ordenação. Por
padrão 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º série por nome e em ordem crescente
faríamos assim:

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

para ordernar em ordem de teríamos:

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

Usando a cláusula LIKE
As vezes os dados que você está desejando filtrar não têm uma ocorrência
exata, ou você pretende realizar uma busca mais irrestrita. Para isso
devemos usar a cláusula LIKE. Supondo que desejamos filtrar todos os
alunos que tenham o nome começado pelas letrar Jos, Através da cláusula
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 possíveis 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 ocorrências :

 Tipo de ocorrência      Padrão utilizado na ConsultaO retorno da Pesquisa
                                     SQL
 Múltiplos caracteres                b*b             bb, bBb, bccccB
 Caractere especial                 b[*]b            b*b
 Múltiplos caracteres                ab*             abcdefg, abc
 Caractere único                     b?b             bbb, b1b,bNb
 Dígito único                        b#b             b0b,b1b,b4b
 Intervalo de caracteres            [b-h]            c,d,e,f,g
 Não dígito                         [!0-9]           A,a, %, P

Definindo o relacionamento entre as Tabelas: JOIN
Com frequência você vai ser obrigado a obter dados de diversas tabelas,
pois trabalhando com o modelo relacional de banco de dados , durante a
normalização os dados serão colocados em tabelas diferentes para evitar a
repetição de informações.
Para selecionar campos de várias 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 não temos essas
 informações 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ê têm um vínculo entre duas tabelas poderá usar a palavra chave
INNER JOIN na cláusula FROM de uma instrução 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 instrução 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 três 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 diferença entre a utilização da cláusula WHERE e da JOIN para reunir
dados de múltiplas tabelas é que a cláusula WHERE produz um recordset
somente de leitura. Para criar um recordset atualizável devemos usar JOIN

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

Temos 3 opções de cláusulas 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]
