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:
-
Quais campos(colunas) da tabela deseja obter
-
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 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 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 |
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 |
|