Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Recupera i dati da una o più tabelle.
Visual FoxPro ODBC Driver supporta la sintassi nativa del linguaggio Visual FoxPro per questo comando. Per informazioni specifiche del driver, vedere Note sul driver.
Sintassi
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] ...]]
Argomenti
Nota
Una sottoquery, a cui si fa riferimento negli argomenti seguenti, è un'istruzione SELECT all'interno di un'istruzione SELECT e deve essere racchiusa tra parentesi. È possibile avere fino a due sottoquery allo stesso livello (non annidato) nella clausola WHERE. Vedere la sezione degli argomenti. Le sottoquery possono contenere più condizioni di join.
[ALL | DISTINCT] [Alias.]
Select_Item [AS Column_Name] [, [Alias.]
Select_Item [AS Column_Name] ...]
La clausola SELECT specifica i campi, le costanti e le espressioni visualizzati nei risultati della query.
Per impostazione predefinita, ALL visualizza tutte le righe nei risultati della query.
DISTINCT esclude i duplicati di qualsiasi riga dai risultati della query.
Nota
È possibile usare DISTINCT una sola volta per ogni clausola SELECT.
Alias. qualifica i nomi degli elementi corrispondenti. Ogni elemento specificato con Select_Item genera una colonna dei risultati della query. Se due o più elementi hanno lo stesso nome, includere l'alias della tabella e un punto prima del nome dell'elemento per impedire che le colonne vengano duplicate.
Select_Item specifica un elemento da includere nei risultati della query. Un elemento può essere uno dei seguenti:
Nome di un campo di una tabella nella clausola FROM.
Costante che specifica che lo stesso valore costante deve essere visualizzato in ogni riga dei risultati della query.
Espressione che può essere il nome di una funzione definita dall'utente.
Funzioni definite dall'utente con SELECT
Anche se l'uso di funzioni definite dall'utente nella clausola SELECT presenta vantaggi evidenti, è consigliabile considerare anche le restrizioni seguenti:
La velocità delle operazioni eseguite con SELECT potrebbe essere limitata dalla velocità con cui vengono eseguite tali funzioni definite dall'utente. Le manipolazioni di volumi elevati che coinvolgono funzioni definite dall'utente potrebbero essere eseguite meglio usando l'API e le funzioni definite dall'utente scritte in linguaggio C o assembly.
L'unico modo affidabile per passare i valori alle funzioni definite dall'utente richiamate da SELECT è dall'elenco di argomenti passato alla funzione quando viene richiamato.
Anche se si sperimenta e si scopre una manipolazione presumibilmente proibita che funziona correttamente in una determinata versione di FoxPro, non c'è alcuna garanzia che continuerà a funzionare nelle versioni successive.
Oltre a queste restrizioni, le funzioni definite dall'utente sono accettabili nella clausola SELECT. Tenere tuttavia presente che l'uso di SELECT potrebbe rallentare le prestazioni.
Le funzioni di campo seguenti sono disponibili per l'uso con un elemento select che è un campo o un'espressione che include un campo:
AVG(Select_Item)-Media una colonna di dati numerici.
COUNT(Select_Item)-Conta il numero di elementi selezionati in una colonna. COUNT(*) conta il numero di righe nell'output della query.
MIN(Select_Item):determina il valore più piccolo di Select_Item in una colonna.
MAX(Select_Item)-Determina il valore più grande di Select_Item in una colonna.
SUM(Select_Item)-Totala una colonna di dati numerici.
Non è possibile annidare le funzioni di campo.
AS Column_Name
Specifica l'intestazione di una colonna nell'output della query. Ciò è utile quando Select_Item è un'espressione o contiene una funzione di campo e si vuole assegnare alla colonna un nome significativo.
Column_Name può essere un'espressione, ma non può contenere caratteri (ad esempio spazi) non consentiti nei nomi dei campi di tabella.
FROM [DatabaseName!]Tabella [Local_Alias] [, [DatabaseName!]Tabella [Local_Alias] ...]
Elenca le tabelle che contengono i dati recuperati dalla query. Se non è aperta alcuna tabella, Visual FoxPro visualizza la finestra di dialogo Apri in modo da poter specificare il percorso del file. Dopo l'apertura, la tabella rimane aperta al termine della query.
DatabaseName! specifica il nome di un database diverso da quello specificato con l'origine dati. È necessario includere il nome del database che contiene la tabella se il database non è specificato con l'origine dati. Includere il delimitatore punto esclamativo (!) dopo il nome del database e prima del nome della tabella.
Local_Alias specifica un nome temporaneo per la tabella denominata in Table. Se si specifica un alias locale, è necessario usare l'alias locale anziché il nome della tabella nell'istruzione SELECT. L'alias locale non influisce sull'ambiente Visual FoxPro.
WHERE JoinCondition [AND JoinCondition ...] [AND | OR FilterCondition [AND | OR FilterCondition ...]]
Indica a Visual FoxPro di includere solo determinati record nei risultati della query. WHERE è necessario per recuperare i dati da più tabelle.
JoinCondition specifica i campi che collegano le tabelle nella clausola FROM. Se si includono più tabelle in una query, è necessario specificare una condizione di join per ogni tabella dopo la prima.
Importante
Quando si creano condizioni di join, prendere in considerazione le informazioni seguenti:
Se si includono due tabelle in una query e non si specifica una condizione di join, ogni record della prima tabella viene unito a ogni record della seconda tabella purché vengano soddisfatte le condizioni di filtro. Una query di questo tipo può produrre risultati lunghi.
Prestare attenzione quando si uniscono tabelle con campi vuoti perché Visual FoxPro corrisponde a campi vuoti. Ad esempio, se si esegue il join in CUSTOMER.ZIP e INVOICE.ZIP e se CUSTOMER contiene 100 codici postali vuoti e INVOICE contiene 400 codici postali vuoti, l'output della query contiene 40.000 record aggiuntivi risultanti dai campi vuoti. Usare la funzione EMPTY( ) per eliminare i record vuoti dall'output della query.
È necessario usare l'operatore AND per connettere più condizioni di join. Ogni condizione di join ha il formato seguente:
FieldName1 Comparison FieldName2
FieldName1 è il nome di un campo di una tabella, FieldName2 è il nome di un campo di un'altra tabella e Comparison è uno degli operatori descritti nella tabella seguente.
| Operatore | Confronto |
|---|---|
| = | Uguale |
| == | Esattamente uguale |
| MI PIACE | SQL LIKE |
| <>, !=, # | Diverso da |
| > | Più di |
| >= | Più di o uguale a |
| < | Minore di |
| <= | Minore di o uguale a |
Quando si usa l'operatore = con stringhe, funziona in modo diverso, a seconda dell'impostazione di SET ANSI. Quando SET ANSI è impostato su OFF, Visual FoxPro gestisce i confronti di stringhe in modo familiare agli utenti di Xbase. Quando SET ANSI è impostato su ON, Visual FoxPro segue gli standard ANSI per i confronti tra stringhe. Per altre informazioni sul modo in cui Visual FoxPro esegue confronti di stringhe, vedere SET ANSI e SET EXACT .
FilterCondition specifica i criteri che i record devono soddisfare per essere inclusi nei risultati della query. È possibile includere tutte le condizioni di filtro in una query desiderate, collegandole con l'operatore AND o OR. È anche possibile usare l'operatore NOT per invertire il valore di un'espressione logica oppure è possibile usare EMPTY( ) per verificare la presenza di un campo vuoto. FilterCondition può accettare qualsiasi forma negli esempi seguenti:
Esempio 1FieldName1 NomeCampo confronto2
customer.cust_id = orders.cust_id
Esempio 2Espressione di confronto NomeCampo
payments.amount >= 1000
Esempio 3Confronto NomeCampo ALL (sottoquery)
company < ALL ;
(SELECT company FROM customer WHERE country = "USA")
Quando la condizione di filtro include ALL, il campo deve soddisfare la condizione di confronto per tutti i valori generati dalla sottoquery prima che il record venga incluso nei risultati della query.
Esempio 4Confronto NomeCampo ANY | SOME (Sottoquery)
company < ANY ;
(SELECT company FROM customer WHERE country = "USA")
Quando la condizione di filtro include ANY o SOME, il campo deve soddisfare la condizione di confronto per almeno uno dei valori generati dalla sottoquery.
Nell'esempio seguente viene verificato se i valori nel campo si trovano all'interno di un intervallo di valori specificato:
Esempio 5NomeCampo [NOT] BETWEEN Start_Range AND End_Range
customer.postalcode BETWEEN 90000 AND 99999
Nell'esempio seguente viene verificato se almeno una riga soddisfa i criteri nella sottoquery. Quando la condizione di filtro include EXISTS, la condizione di filtro restituisce True (.T.) a meno che la sottoquery non restituisca il set vuoto.
Esempio 6 [NOT] EXISTS (sottoquery)
EXISTS ;
(SELECT * FROM orders WHERE customer.postalcode =
orders.postalcode)
Esempio 7NomeCampo [NOT] IN Value_Set
customer.postalcode NOT IN ("98052","98072","98034")
Quando la condizione di filtro include IN, il campo deve contenere uno dei valori prima che il record venga incluso nei risultati della query.
Esempio 8NomeCampo [NOT] IN (Sottoquery)
customer.cust_id IN ;
(SELECT orders.cust_id FROM orders WHERE orders.city="Seattle")
In questo caso, il campo deve contenere uno dei valori restituiti dalla sottoquery prima che il relativo record venga incluso nei risultati della query.
Esempio 9NomeCampo [NOT] LIKE cExpression
customer.country NOT LIKE "USA"
Questa condizione di filtro cerca ogni campo che corrisponde a cExpression. È possibile usare il segno di percentuale (%) e i caratteri jolly (_ ) come parte di cExpression. Il carattere di sottolineatura rappresenta un singolo carattere sconosciuto nella stringa.
GROUP BY GroupColumn [, GroupColumn ...]
Raggruppa le righe nella query in base ai valori in una o più colonne.
GroupColumn può essere uno dei seguenti:
Nome di un campo di tabella normale.
Campo che include una funzione di campo SQL.
Espressione numerica che indica la posizione della colonna nella tabella dei risultati. Il numero di colonna più a sinistra è 1.
HAVING FilterCondition
Specifica una condizione di filtro che i gruppi devono soddisfare per essere inclusi nei risultati della query. HAVING deve essere usato con GROUP BY e può includere tutte le condizioni di filtro desiderate, connesse dall'operatore AND o OR. È anche possibile usare NOT per invertire il valore di un'espressione logica.
FilterCondition non può contenere una sottoquery.
Una clausola HAVING senza una clausola GROUP BY si comporta come una clausola WHERE. È possibile usare alias locali e funzioni di campo nella clausola HAVING. Usare una clausola WHERE per ottenere prestazioni più veloci se la clausola HAVING non contiene funzioni di campo.
[UNION [ALL] SELECTCommand]
Combina i risultati finali di un'istruzione SELECT con i risultati finali di un altro select. Per impostazione predefinita, UNION controlla i risultati combinati ed elimina le righe duplicate. Usare le parentesi per combinare più clausole UNION.
ALL impedisce a UNION di eliminare le righe duplicate dai risultati combinati.
Le clausole UNION seguono queste regole:
Non è possibile usare UNION per combinare sottoquery.
Entrambi i comandi SELECT devono avere lo stesso numero di colonne nell'output della query.
Ogni colonna nei risultati della query di un'istruzione SELECT deve avere lo stesso tipo di dati e la stessa larghezza della colonna corrispondente nell'altra istruzione SELECT.
Solo l'istruzione SELECT finale può avere una clausola ORDER BY, che deve fare riferimento alle colonne di output in base al numero. Se viene inclusa una clausola ORDER BY, influisce sul risultato completo.
È anche possibile usare la clausola UNION per simulare un outer join.
Quando si uniscono due tabelle in una query, nell'output vengono inclusi solo i record con valori corrispondenti nei campi di join. Se un record nella tabella padre non dispone di un record corrispondente nella tabella figlio, il record nella tabella padre non viene incluso nell'output. Un outer join consente di includere tutti i record nella tabella padre nell'output, insieme ai record corrispondenti nella tabella figlio. Per creare un outer join in Visual FoxPro, è necessario usare un comando SELECT annidato, come nell'esempio seguente:
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)
Nota
Assicurarsi di includere lo spazio che precede immediatamente ogni punto e virgola. In caso contrario, verrà visualizzato un errore.
La sezione del comando prima della clausola UNION seleziona i record di entrambe le tabelle con valori corrispondenti. Le società clienti che non dispongono di fatture associate non sono incluse. La sezione del comando dopo la clausola UNION seleziona i record nella tabella customer che non dispongono di record corrispondenti nella tabella orders.
Per quanto riguarda la seconda sezione del comando, tenere presente quanto segue:
L'istruzione SELECT all'interno delle parentesi viene elaborata per prima. Questa istruzione crea una selezione di tutti i numeri dei clienti nella tabella ordini.
La clausola WHERE trova tutti i numeri dei clienti nella tabella customer che non sono nella tabella orders. Poiché la prima sezione del comando ha fornito tutte le aziende con un numero cliente nella tabella ordini, tutte le aziende nella tabella customer sono ora incluse nei risultati della query.
Poiché le strutture delle tabelle incluse in un'unione devono essere identiche, nella seconda istruzione SELECT sono presenti due segnaposto per rappresentare orders.order_id e orders.emp_id dalla prima istruzione SELECT.
Nota
I segnaposto devono essere dello stesso tipo dei campi rappresentati. Se il campo è un tipo di data, il segnaposto deve essere { / / }. Se il campo è un campo carattere, il segnaposto deve essere la stringa vuota ("").
ORDER BY Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]
Ordina i risultati della query in base ai dati in una o più colonne. Ogni Order_Item deve corrispondere a una colonna nei risultati della query e può essere una delle seguenti:
Campo in una tabella FROM che è anche un elemento select nella clausola SELECT principale (non in una sottoquery).
Espressione numerica che indica la posizione della colonna nella tabella dei risultati. La colonna più a sinistra è numero 1.
AsC specifica un ordine crescente per i risultati della query, in base all'elemento o agli elementi dell'ordine, ed è l'impostazione predefinita per ORDER BY.
DESC specifica un ordine decrescente per i risultati della query.
I risultati della query vengono visualizzati non ordinati se non si specifica un ordine con ORDER BY.
Osservazioni:
SELECT è un comando SQL integrato in Visual FoxPro come qualsiasi altro comando di Visual FoxPro. Quando si usa SELECT per porre una query, Visual FoxPro interpreta la query e recupera i dati specificati dalle tabelle. È possibile creare una query SELECT dalla finestra del prompt dei comandi o da un programma Visual FoxPro (come con qualsiasi altro comando Visual FoxPro).
Nota
SELECT non rispetta la condizione di filtro corrente specificata con SET FILTER.
Osservazioni del driver
Quando l'applicazione invia l'istruzione ODBC SQL SELECT all'origine dati, il driver ODBC Visual FoxPro converte il comando nel comando Visual FoxPro SELECT senza conversione, a meno che il comando non contenga una sequenza di escape ODBC. Gli elementi racchiusi in una sequenza di escape ODBC vengono convertiti nella sintassi di Visual FoxPro. Per altre informazioni sull'uso di sequenze di escape ODBC, vedere Funzioni di data e ora e nelle informazioni di riferimento del programmatore ODBC Microsoft, vedere Sequenze di escape in ODBC.