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 asterístico (*) 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 Consulta SQL O retorno da Pesquisa
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  é:

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
INNER Somente registros com um registro correspondente na tabela da direita Somente registros com um registro correspondente na tabela da esquerda
LEFT Todos os Registros Somente registros com um registro correspondente na tabela da esquerda
RIGHT Somente registros com um registro correspondente na tabela da direita Todos os Registros

Retorna