As consultas de seleção se utilizam para indicar ao motor de dados que devolva a informação dos bancos de dados, esta informação é devolvida em forma de conjunto de registros que podem se armazenar em um objeto recordset.Por Claudio
Publicado em: 06/9/07
Este conjunto de registros pode ser modificável.
Consultas básicas
A sintaxe básica de uma consulta de seleção é a seguinte:
SELECT
Campos
FROM
Tabela
Onde "campos" é a lista de campos que se deseja recuperar e "tabela" é a origem dos mesmos, por exemplo:
SELECT
Nombre, Telefone
FROM
Clientes
Esta sentença devolve um conjunto de resultados com o campo nome e telefone da tabela clientes.
Devolver Literais
Em determinadas ocasiões pode nos interessar incluir uma coluna com um texto fixo em uma consulta de seleção, por exemplo, suponhamos que temos uma tabela de empregados e desejamos recuperar as tarifas semanais dos eletricistas, poderíamos realizar a seguinte consulta:
SELECT
Empregados.Nome, 'Tarifa semanal: ', Empregados.TarifaHora * 40
FROM
Empregados
WHERE
Empleados.Cargo = 'Eletricista'
Ordenar los registros
Adicionalmente pode se especificar a ordem em que se deseja recuperar os registros das tabelas mediante a cláusula ORDER BY Lista de Campos. Em onde Lista de campos representa os campos a ordenar. Exemplo:
SELECT
CodigoPostal, Nome, Telefone
FROM
Clientes
ORDER BY
Nome
Esta consulta devolve os campos CodigoPostal, Nome, Telefone da tabela Clientes ordenados pelo campo Nome.
Pode-se ordenar os registros por mais de um campo, como por exemplo:
SELECT
CodigoPostal, Nome, Telefone
FROM
Clientes
ORDER BY
CodigoPostal, Nome
Inclusive pode-se especificar a ordem dos registros: ascendente mediante a cláusula (ASC - toma-se este valor padrão) ou descendente (DESC)
SELECT
CodigoPostal, Nome, Telefone
FROM
Clientes
ORDER BY
CodigoPostal DESC , Nome ASC
Uso de Índices das tabelas
Se desejarmos que a sentença SQL utilize um índice para mostrar os resultados se pode utilizar a palavra reservada INDEX da seguinte forma:
SELECT ... FROM Tabela (INDEX=Indice) ...
Normalmente os motores dos bancos de dados decidem que índice se deve utilizar para a consulta, para isso utilizam critérios de rendimento e sobretudo, os campos de busca especificados na cláusula WHERE. Se se deseja forçar a não utilizar nenhum índice utilizaremos a seguinte sintaxe:
SELECT ... FROM Tabela (INDEX=0) ...
Consultas com Predicado
O predicado se inclui entre a cláusula e o primeiro nome do campo a recuperar, os possíveis predicados são:
| Predicado | Descrição |
| ALL | Devolve todos os campos da tabela |
| TOP | Devolve um determinado número de registros da tabela |
| DISTINCT | Omite os registros cujos campos selecionados coincidam totalmente |
| DISTINCTOW | Omite os registros duplicados baseando-se na totalidade do registro e não só nos campos selecionados. |
ALL
Se não se inclui nenhum dos predicados se assume ALL. O Motor de banco de dados seleciona todos os registros que cumprem as condições da instrução SQL e devolve todos e cada um de seus campos. Não é conveniente abusar deste predicado já que obrigamos ao motor do banco de dados a analisar a estrutura da tabela para averiguar os campos que contém, é muito mais rápido indicar a lista de campos desejados.
SELECT ALL
FROM
Empregados
SELECT *
FROM
Empregados
TOP
Devolve um certo número de registros que entram entre ao princípio ou ao final de uma categoria especificada por uma cláusula ORDER BY. Suponhamos que queremos recuperar os nomes dos 25 primeiros estudantes do curso 1994:
SELECT TOP 25
Nome, Sobrenome
FROM
Estudantes
ORDER BY
Nota DESC
Se não se inclui a cláusula ORDER BY, a consulta devolverá um conjunto arbitrário de 25 registros da tabela de Estudantes. O predicado TOP não escolhe entre valores iguais. No exemplo anterior, se a nota média número 25 e a 26 são iguais, a consulta devolverá 26 registros. Pode-se utilizar a palavra reservada PERCENT para devolver uma certa porcentagem de registros que caem ao princípio ou ao final de uma categoria especificada pela cláusula ORDER BY. Suponhamos que no lugar dos 25 primeiros estudantes desejamos o 10 por cento do curso:
SELECT TOP 10 PERCENT
Nome, Sobrenome
FROM
Estudantes
ORDER BY
Nota DESC
O valor que vai a seguir de TOP deve ser um inteiro sem signo. TOP não afeta à possível atualização da consulta.
DISTINCT
Omite os registros que contém dados duplicados nos campos selecionados. Para que os valores de cada campo listado na instrução SELECT se incluam na consulta devem ser únicos. Por exemplo, vários empregados listados na tabela Empregados podem ter o mesmo sobrenome. Se dois registros contém Lopez no campo Sobrenome, a seguinte instrução SQL devolve um único registro:
SELECT DISTINCT
Sobrenome
FROM
Empregados
Com outras palavras o predicado DISTINCT devolve aqueles registros cujos campos indicados na cláusula SELECT possuam um conteúdo diferente. O resultado de uma consulta que utiliza DISTINCT não é atualizável e não reflete as mudanças subseqüentes realizadas por outros usuários.
DISTINCTROW
Este predicado não é compatível com ANSI. Que eu saiba no dia de hoje só funciona com ACCESS.
Devolve os registros diferentes de uma tabela; a diferença do predicado anterior que só se fixava no conteúdo dos campos selecionados, este o faz no conteúdo do registro completo independentemente dos campos indicados na cláusula SELECT.
SELECT DISTINCTROW
Sobrenome
FROM Empregados
Se a tabela empregados contém dois registros: Antonio Lopez e Marta Lopez o exemplo do predicado DISTINCT devolve um único registro com o valor Lopez no campo Sobrenome já que busca não duplicados em tal campo. Este último exemplo devolve dois registros com o valor Lopez no sobrenome já que se buscam não duplicados no registro completo.
ALIAS
Em determinadas circunstâncias é necessário atribuir um nome a alguma coluna determinada de um conjunto devolvido, outras vezes por simples capricho ou porque estamos recuperando dados de diferentes tabelas e acabam tendo um campo com igual nome. Para resolver todas elas, temos a palavra reservada AS que se encarrega de atribuir o nome que desejamos à coluna desejada. Tomado como referência o exemplo anterior podemos fazer a coluna devolvida pela consulta, ao invés de se chamar sobrenome (assim como o campo devolvido) se chame Empregado. Neste caso procederíamos da seguinte forma:
SELECT DISTINCTROW
Sobrenome AS Empregado
FROM Empregados
AS não é uma palavra reservada de ANSI, existem diferentes sistemas de atribuir os alias em função do motor de banco de dados. Em ORACLE para atribuir um alias a um campo há que fazer da seguinte forma:
SELECT
Sobrenome AS "Empregado"
FROM Empregados
Também podemos atribuir alias às tabelas dentro da consulta de seleção, neste caso há que ter em conta que em todas as referências que desejarmos fazer a tal tabela há que utilizar o alias ao invés do nome. Esta técnica será de grande utilidade mais adiante quando se estudarem as vinculações entre tabelas. Por exemplo:
SELECT
Apellido AS Empregado
FROM
Empregados AS Trabalhadores
Para atribuir alias às tabelas em ORACLE e SQL-SERVER os alias se atribuem escrevendo o nome da tabela, deixando um espaço em branco e escrevendo o Alias (se atribuem dentro da cláusula FROM).
SELECT
Trabalhadores.Sobrenome (1) AS Empregado
FROM
Empregadore Trabalhadores
(1)Esta nomenclatura [Tabela].[Campo] deve-se utilizar quando se está recuperando um campo cujo nome se repete em várias das tabelas que se utilizam na sentença. Não obstante quando na sentença se empregam várias tabelas é aconselhável utilizar esta nomenclatura para evitar o trabalho que supõem ao motor de dados averiguar em que tabela está cada um dos campos indicados na cláusula SELECT.
Recuperar Informação de um banco de Dados Externo
Para concluir este capítulo se deve fazer referência à recuperação de registros de banco de dados externos. Em ocasiões é necessário a recuperação de informação que se encontra contida em uma tabela que não se encontra no banco de dados que executará a consulta ou que nesse momento não se encontra aberta, esta situação podemos salva-la com a palavra reservada IN da seguinte forma:
SELECT
Sobrenome AS Empregado
FROM
Empleados IN'c: \databases\gerenciamento.mdb'
Em onde c: \databases\gerenciamento.mdb é o banco de dados que contém a tabela Empregados. Esta técnica é muito simples e comum em banco de dados do tipo ACCESS em outros sistemas como SQL-SERVER ou ORACLE, a cosa é mais complicada por ter que existir relações de confiança entre os servidores ou ao ser necessária a vinculação entre os banco de dados. Este exemplo recupera a informação de um banco de dados de SQL-SERVER localizado em outro servidor (obviamente que os servidores estão linkados):
SELECT
Sobrenome
FROM
Servidor1.BancoDados1.dbo.Empregados