Compartilhar via


SELECT – comando SQL

Recupera dados de uma ou mais tabelas.

O driver ODBC do Visual FoxPro dá suporte à sintaxe de linguagem nativa do Visual FoxPro para esse comando. Para obter informações específicas do driver, consulte Comentários do driver.

Sintaxe

  
SELECT [ALL | DISTINCT]  
   [Alias.] Select_Item [AS Column_Name]  
   [, [Alias.] Select_Item [AS Column_Name] ...]   
FROM [DatabaseName!]Table [Local_Alias]  
   [, [DatabaseName!]Table [Local_Alias] ...]   
[WHERE JoinCondition [AND JoinCondition  
...]  
   [AND | OR FilterCondition [AND | OR FilterCondition ...]]]  
[GROUP BY GroupColumn [, GroupColumn ...]]  
[HAVING FilterCondition]  
[UNION [ALL] SELECTCommand]  
[ORDER BY Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]]  

Argumentos

Observação

Uma subconsulta, mencionada nos argumentos a seguir, é um SELECT dentro de um SELECT e deve ser colocada entre parênteses. Você pode ter até duas subconsultas no mesmo nível (não aninhadas) na cláusula WHERE. (Veja essa seção dos argumentos.) As subconsultas podem conter várias condições de junção.

[TODOS | DISTINTO] [Alias.] Select_Item [AS Column_Name] [, [Alias.] Select_Item [COMO Column_Name] ...]
A cláusula SELECT especifica os campos, constantes e expressões que são exibidos nos resultados da consulta.

Por padrão, ALL exibe todas as linhas nos resultados da consulta.

DISTINCT exclui duplicatas de todas as linhas dos resultados da consulta.

Observação

Você pode usar DISTINCT apenas uma vez por cláusula SELECT.

Alias. qualifica nomes de itens correspondentes. Cada item especificado com Select_Item gera uma coluna dos resultados da consulta. Se dois ou mais itens tiverem o mesmo nome, inclua o alias da tabela e um ponto antes do nome do item para evitar que as colunas sejam duplicadas.

Select_Item especifica um item a ser incluído nos resultados da consulta. Um item pode ser um dos seguintes:

  • O nome de um campo de uma tabela na cláusula FROM.

  • Uma constante que especifica que o mesmo valor constante deve aparecer em todas as linhas dos resultados da consulta.

  • Uma expressão que pode ser o nome de uma função definida pelo usuário.

Funções definidas pelo usuário com SELECT

Embora o uso de funções definidas pelo usuário na cláusula SELECT tenha benefícios óbvios, você também deve considerar as seguintes restrições:

  • A velocidade das operações executadas com SELECT pode ser limitada pela velocidade com que essas funções definidas pelo usuário são executadas. Manipulações de alto volume envolvendo funções definidas pelo usuário podem ser melhor realizadas usando API e funções definidas pelo usuário escritas em C ou linguagem assembly.

  • A única maneira confiável de passar valores para funções definidas pelo usuário invocadas de SELECT é pela lista de argumentos passada para a função quando ela é invocada.

  • Mesmo se você experimentar e descobrir uma manipulação supostamente proibida que funcione corretamente em uma determinada versão do FoxPro, não há garantia de que ela continuará funcionando em versões posteriores.

Além dessas restrições, as funções definidas pelo usuário são aceitáveis na cláusula SELECT. No entanto, lembre-se de que o uso de SELECT pode diminuir o desempenho.

As seguintes funções de campo estão disponíveis para uso com um item de seleção que é um campo ou uma expressão que envolve um campo:

  • AVG(Select_Item) - Calcula a média de uma coluna de dados numéricos.

  • COUNT(Select_Item) - Conta o número de itens selecionados em uma coluna. COUNT(*) conta o número de linhas na saída da consulta.

  • MIN(Select_Item)-Determina o menor valor de Select_Item em uma coluna.

  • MAX(Select_Item)-Determina o maior valor de Select_Item em uma coluna.

  • SUM(Select_Item) - Totaliza uma coluna de dados numéricos.

Não é possível aninhar funções de campo.

COMO Column_Name
Especifica o título de uma coluna na saída da consulta. Isso é útil quando Select_Item é uma expressão ou contém uma função de campo e você deseja dar um nome significativo à coluna. Column_Name pode ser uma expressão, mas não pode conter caracteres (por exemplo, espaços) que não são permitidos em nomes de campo de tabela.

FROM [DatabaseName!]Tabela [Local_Alias] [, [DatabaseName!]Tabela [Local_Alias] ...]
Lista as tabelas que contêm os dados recuperados pela consulta. Se nenhuma tabela estiver aberta, o Visual FoxPro exibirá a caixa de diálogo Abrir para que você possa especificar o local do arquivo. Depois de aberta, a tabela permanece aberta após a conclusão da consulta.

DatabaseName! Especifica o nome de um banco de dados diferente daquele especificado com a fonte de dados. Você deve incluir o nome do banco de dados que contém a tabela se o banco de dados não for especificado com a fonte de dados. Inclua o delimitador de ponto de exclamação (!) após o nome do banco de dados e antes do nome da tabela.

Local_Alias especifica um nome temporário para a tabela nomeada em Tabela. Se você especificar um alias local, deverá usar o alias local em vez do nome da tabela em toda a instrução SELECT. O alias local não afeta o ambiente do Visual FoxPro.

WHERE JoinCondition [E JoinCondition ...] [E | OU FilterCondition [E | OU Condição de filtro ...]]
Informa ao Visual FoxPro para incluir apenas determinados registros nos resultados da consulta. WHERE é necessário para recuperar dados de várias tabelas.

JoinCondition especifica campos que vinculam as tabelas na cláusula FROM. Se você incluir mais de uma tabela em uma consulta, deverá especificar uma condição de junção para cada tabela após a primeira.

Importante

Considere as seguintes informações ao criar condições de junção:

  • Se você incluir duas tabelas em uma consulta e não especificar uma condição de junção, todos os registros da primeira tabela serão associados a todos os registros da segunda tabela, desde que as condições de filtro sejam atendidas. Essa consulta pode produzir resultados longos.

  • Tenha cuidado ao unir tabelas com campos vazios porque o Visual FoxPro corresponde a campos vazios. Por exemplo, se você ingressar em CUSTOMER.ZIP e INVOICE.ZIP e se CUSTOMER contiver 100 CEPs vazios e INVOICE contiver 400 CEPs vazios, a saída da consulta conterá 40.000 registros extras resultantes dos campos vazios. Use a função EMPTY( ) para eliminar registros vazios da saída da consulta.

  • Você deve usar o operador AND para conectar várias condições de junção. Cada condição de junção tem o seguinte formato:

    FieldName1 Comparação FieldName2

    FieldName1 é o nome de um campo de uma tabela, FieldName2 é o nome de um campo de outra tabela e Comparison é um dos operadores descritos na tabela a seguir.

Operador Comparação
= Igual
== Exatamente igual
LIKE COMO SQL
<>, !=, # Diferente
> Mais de
>= Maior ou igual a
< Menor que
<= Menor ou igual a

Quando você usa o operador = com strings, ele age de forma diferente, dependendo da configuração de SET ANSI. Quando SET ANSI é definido como OFF, o Visual FoxPro trata as comparações de cadeia de caracteres de uma maneira familiar aos usuários do Xbase. Quando SET ANSI é definido como ON, o Visual FoxPro segue os padrões ANSI para comparações de cadeia de caracteres. Consulte SET ANSI e SET EXACT para obter mais informações sobre como o Visual FoxPro executa comparações de cadeia de caracteres.

FilterCondition especifica os critérios que os registros devem atender para serem incluídos nos resultados da consulta. Você pode incluir quantas condições de filtro quiser em uma consulta, conectando-as ao operador AND ou OR. Você também pode usar o operador NOT para reverter o valor de uma expressão lógica ou pode usar EMPTY( ) para verificar se há um campo vazio. FilterCondition pode assumir qualquer uma das formas nos exemplos a seguir:

Exemplo 1 FieldName1 Comparação FieldName2

customer.cust_id = orders.cust_id

Exemplo 2 Expressão de comparação FieldName

payments.amount >= 1000

Exemplo 3 Comparação de nome de campo ALL (subconsulta)

company < ALL ;

(SELECT company FROM customer WHERE country = "USA")

Quando a condição de filtro inclui ALL, o campo deve atender à condição de comparação para todos os valores gerados pela subconsulta antes que seu registro seja incluído nos resultados da consulta.

Exemplo 4 Comparação de nome de campo ANY | SOME (Subconsulta)

company < ANY ;

(SELECT company FROM customer WHERE country = "USA")

Quando a condição de filtro inclui ANY ou SOME, o campo deve atender à condição de comparação para pelo menos um dos valores gerados pela subconsulta.

O exemplo a seguir verifica se os valores no campo estão dentro de um intervalo especificado de valores:

Exemplo 5 FieldName [NOT] ENTRE Start_Range E End_Range

customer.postalcode BETWEEN 90000 AND 99999

O exemplo a seguir verifica se pelo menos uma linha atende aos critérios na subconsulta. Quando a condição de filtro inclui EXISTS, a condição de filtro é avaliada como True (.T.), a menos que a subconsulta seja avaliada como o conjunto vazio.

Exemplo 6 [NÃO] EXISTE (Subconsulta)

EXISTS ;

(SELECT * FROM orders WHERE customer.postalcode =

orders.postalcode)

Exemplo 7 FieldName [NOT] IN Value_Set

customer.postalcode NOT IN ("98052","98072","98034")

Quando a condição de filtro inclui IN, o campo deve conter um dos valores antes que seu registro seja incluído nos resultados da consulta.

Exemplo 8 FieldName [NOT] IN (Subconsulta)

customer.cust_id IN ;

(SELECT orders.cust_id FROM orders WHERE orders.city="Seattle")

Aqui, o campo deve conter um dos valores retornados pela subconsulta antes que seu registro seja incluído nos resultados da consulta.

Exemplo 9 FieldName [NOT] LIKE cExpression

customer.country NOT LIKE "USA"

Essa condição de filtro pesquisa cada campo que corresponde a cExpression. Você pode usar os caracteres curinga de sinal de porcentagem (%) e sublinhado ( _ ) como parte de cExpression. O sublinhado representa um único caractere desconhecido na cadeia de caracteres.

GROUP BY GroupColumn [, GroupColumn ...]
Agrupa linhas na consulta com base em valores em uma ou mais colunas. GroupColumn pode ser um dos seguintes:

  • O nome de um campo de tabela regular.

  • Um campo que inclui uma função de campo SQL.

  • Uma expressão numérica que indica o local da coluna na tabela de resultados. (O número da coluna mais à esquerda é 1.)

TENDO FilterCondition
Especifica uma condição de filtro que os grupos devem atender para serem incluídos nos resultados da consulta. HAVING deve ser usado com GROUP BY e pode incluir quantas condições de filtro você quiser, conectadas pelo operador AND ou OR. Você também pode usar NOT para reverter o valor de uma expressão lógica.

FilterCondition não pode conter uma subconsulta.

Uma cláusula HAVING sem uma cláusula GROUP BY se comporta como uma cláusula WHERE. Você pode usar aliases locais e funções de campo na cláusula HAVING. Use uma cláusula WHERE para um desempenho mais rápido se a cláusula HAVING não contiver funções de campo.

[UNIÃO [TODOS] SELECTCommand]
Combina os resultados finais de um SELECT com os resultados finais de outro SELECT. Por padrão, UNION verifica os resultados combinados e elimina linhas duplicadas. Use parênteses para combinar várias cláusulas UNION.

ALL impede que UNION elimine linhas duplicadas dos resultados combinados.

As cláusulas UNION seguem estas regras:

  • Você não pode usar UNION para combinar subconsultas.

  • Ambos os comandos SELECT devem ter o mesmo número de colunas em sua saída de consulta.

  • Cada coluna nos resultados da consulta de um SELECT deve ter o mesmo tipo de dados e largura que a coluna correspondente no outro SELECT.

  • Somente o SELECT final pode ter uma cláusula ORDER BY, que deve se referir às colunas de saída por número. Se uma cláusula ORDER BY for incluída, ela afetará o resultado completo.

Você também pode usar a cláusula UNION para simular uma junção externa.

Quando você une duas tabelas em uma consulta, somente os registros com valores correspondentes nos campos de junção são incluídos na saída. Se um registro na tabela pai não tiver um registro correspondente na tabela filho, o registro na tabela pai não será incluído na saída. Uma junção externa permite incluir todos os registros na tabela pai na saída, juntamente com os registros correspondentes na tabela filho. Para criar uma junção externa no Visual FoxPro, você deve usar um comando SELECT aninhado, como no exemplo a seguir:

SELECT customer.company, orders.order_id, orders.emp_id ;  
FROM customer, orders ;  
WHERE customer.cust_id = orders.cust_id ;  
UNION ;  
SELECT customer.company, 0, 0 ;  
FROM customer ;  
WHERE customer.cust_id NOT IN ;  
(SELECT orders.cust_id FROM orders)  

Observação

Certifique-se de incluir o espaço que precede imediatamente cada ponto-e-vírgula. Caso contrário, você receberá um erro.

A seção do comando antes da cláusula UNION seleciona registros de ambas as tabelas que têm valores correspondentes. As empresas clientes que não possuem faturas associadas não estão incluídas. A seção do comando após a cláusula UNION seleciona registros na tabela de clientes que não têm registros correspondentes na tabela de pedidos.

Em relação à segunda seção do comando, observe o seguinte:

  • A instrução SELECT entre parênteses é processada primeiro. Essa instrução cria uma seleção de todos os números de cliente na tabela de pedidos.

  • A cláusula WHERE localiza todos os números de cliente na tabela de clientes que não estão na tabela de pedidos. Como a primeira seção do comando fornecia todas as empresas que tinham um número de cliente na tabela de pedidos, todas as empresas na tabela de clientes agora estão incluídas nos resultados da consulta.

  • Como as estruturas das tabelas incluídas em um UNION devem ser idênticas, há dois espaços reservados na segunda instrução SELECT para representar orders.order_id e orders.emp_id da primeira instrução SELECT.

    Observação

    Os espaços reservados devem ser do mesmo tipo que os campos que eles representam. Se o campo for um tipo de data, o espaço reservado deverá ser { / / }. Se o campo for um campo de caracteres, o espaço reservado deverá ser a string vazia ("").

ORDENAR POR Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]
Classifica os resultados da consulta com base nos dados em uma ou mais colunas. Cada Order_Item deve corresponder a uma coluna nos resultados da consulta e pode ser um dos seguintes:

  • Um campo em uma tabela FROM que também é um item de seleção na cláusula SELECT principal (não em uma subconsulta).

  • Uma expressão numérica que indica o local da coluna na tabela de resultados. (A coluna mais à esquerda é a número 1.)

O ASC especifica uma ordem crescente para os resultados da consulta, de acordo com o item ou itens do pedido, e é o padrão para ORDER BY.

DESC especifica uma ordem decrescente para os resultados da consulta.

Os resultados da consulta aparecerão não ordenados se você não especificar uma ordem com ORDER BY.

Comentários

SELECT é um comando SQL integrado ao Visual FoxPro como qualquer outro comando do Visual FoxPro. Quando você usa SELECT para fazer uma consulta, o Visual FoxPro interpreta a consulta e recupera os dados especificados das tabelas. Você pode criar uma consulta SELECT na janela do Prompt de Comando ou em um programa do Visual FoxPro (como acontece com qualquer outro comando do Visual FoxPro).

Observação

SELECT não respeita a condição de filtro atual especificada com SET FILTER.

Comentários do motorista

Quando seu aplicativo envia a instrução SQL ODBC SELECT para a fonte de dados, o driver ODBC do Visual FoxPro converte o comando no comando SELECT do Visual FoxPro sem tradução, a menos que o comando contenha uma sequência de escape ODBC. Os itens incluídos em uma sequência de escape ODBC são convertidos na sintaxe do Visual FoxPro. Para obter mais informações sobre como usar sequências de escape ODBC, consulte Funções de data e hora e, na Referência do programador ODBC da Microsoft, consulte Sequências de escape no ODBC.

Confira também

CRIAR TABELA - SQL
INSERIR - SQL
SET ANSI
SET EXACT