Partager via


SELECT, commande SQL

Récupère les données d’une ou de plusieurs tables.

Le pilote ODBC Visual FoxPro prend en charge la syntaxe native du langage Visual FoxPro pour cette commande. Pour plus d’informations sur le pilote, consultez Les remarques sur les pilotes.

Syntaxe

  
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] ...]]  

Les arguments

Remarque

Une sous-requête, référencée dans les arguments suivants, est un SELECT dans un SELECT et doit être placé entre parenthèses. Vous pouvez avoir jusqu’à deux sous-requêtes au même niveau (pas imbriqué) dans la clause WHERE. (Voir cette section des arguments.) Les sous-requêtes peuvent contenir plusieurs conditions de jointure.

[ALL | DISTINCT] [Alias.] Select_Item [AS Column_Name] [, [Alias.] Select_Item [AS Column_Name] ...]
La clause SELECT spécifie les champs, constantes et expressions affichés dans les résultats de la requête.

Par défaut, ALL affiche toutes les lignes des résultats de la requête.

DISTINCT exclut les doublons des lignes des résultats de la requête.

Remarque

Vous ne pouvez utiliser DISTINCT qu’une seule fois par clause SELECT.

Alias. qualifie les noms d’éléments correspondants. Chaque élément que vous spécifiez avec Select_Item génère une colonne des résultats de la requête. Si deux éléments ou plus ont le même nom, incluez l’alias de table et un point avant le nom de l’élément pour empêcher les colonnes d’être dupliquées.

Select_Item spécifie un élément à inclure dans les résultats de la requête. Un élément peut être l’un des éléments suivants :

  • Nom d’un champ d’une table dans la clause FROM.

  • Constante spécifiant que la même valeur constante doit apparaître dans chaque ligne des résultats de la requête.

  • Expression qui peut être le nom d’une fonction définie par l’utilisateur.

Fonctions définies par l’utilisateur avec SELECT

Bien que l’utilisation de fonctions définies par l’utilisateur dans la clause SELECT présente des avantages évidents, vous devez également prendre en compte les restrictions suivantes :

  • La vitesse des opérations effectuées avec SELECT peut être limitée par la vitesse à laquelle de telles fonctions définies par l’utilisateur sont exécutées. Des manipulations à volume élevé impliquant des fonctions définies par l’utilisateur peuvent être mieux effectuées à l’aide d’API et de fonctions définies par l’utilisateur écrites en langage C ou assembly.

  • La seule façon fiable de transmettre des valeurs aux fonctions définies par l’utilisateur appelées à partir de SELECT est la liste d’arguments passée à la fonction lorsqu’elle est appelée.

  • Même si vous expérimentez et découvrez une manipulation supposée interdite qui fonctionne correctement dans une certaine version de FoxPro, il n’y a aucune garantie qu’elle continuera à fonctionner dans les versions ultérieures.

Outre ces restrictions, les fonctions définies par l’utilisateur sont acceptables dans la clause SELECT. Toutefois, n’oubliez pas que l’utilisation de SELECT peut ralentir les performances.

Les fonctions de champ suivantes sont disponibles pour une utilisation avec un élément sélectionné qui est un champ ou une expression impliquant un champ :

  • AVG(Select_Item)-Moyenne une colonne de données numériques.

  • COUNT(Select_Item)-Compte le nombre d’éléments sélectionnés dans une colonne. COUNT(*) compte le nombre de lignes dans la sortie de la requête.

  • MIN(Select_Item)-Détermine la plus petite valeur de Select_Item dans une colonne.

  • MAX(Select_Item)-Détermine la plus grande valeur de Select_Item dans une colonne.

  • SUM(Select_Item)-Totalise une colonne de données numériques.

Vous ne pouvez pas imbriquer les fonctions de champ.

AS Column_Name
Spécifie l’en-tête d’une colonne dans la sortie de la requête. Cela est utile lorsque Select_Item est une expression ou contient une fonction de champ et que vous souhaitez donner à la colonne un nom explicite. Column_Name peut être une expression, mais ne peut pas contenir de caractères (par exemple, des espaces) qui ne sont pas autorisés dans les noms de champs de table.

FROM [DatabaseName !]Table [Local_Alias] [, [DatabaseName !]Table [Local_Alias] ...]
Répertorie les tables qui contiennent les données récupérées par la requête. Si aucune table n’est ouverte, Visual FoxPro affiche la boîte de dialogue Ouvrir afin que vous puissiez spécifier l’emplacement du fichier. Une fois qu’elle a été ouverte, la table reste ouverte une fois la requête terminée.

DatabaseName ! spécifie le nom d’une base de données autre que celle spécifiée avec la source de données. Vous devez inclure le nom de la base de données qui contient la table si la base de données n’est pas spécifiée avec la source de données. Incluez le point d’exclamation ( !) délimiteur après le nom de la base de données et avant le nom de la table.

Local_Alias spécifie un nom temporaire pour la table nommée dans table. Si vous spécifiez un alias local, vous devez utiliser l’alias local au lieu du nom de table dans l’instruction SELECT. L’alias local n’affecte pas l’environnement Visual FoxPro.

WHERE JoinCondition [AND JoinCondition ...] [AND | OR FilterCondition [AND | OR FilterCondition ...]]
Indique à Visual FoxPro d’inclure uniquement certains enregistrements dans les résultats de la requête. WHERE est nécessaire pour récupérer des données à partir de plusieurs tables.

JoinCondition spécifie les champs qui lient les tables dans la clause FROM. Si vous incluez plusieurs tables dans une requête, vous devez spécifier une condition de jointure pour chaque table après la première.

Important

Tenez compte des informations suivantes lorsque vous créez des conditions de jointure :

  • Si vous incluez deux tables dans une requête et ne spécifiez pas de condition de jointure, chaque enregistrement de la première table est joint à chaque enregistrement de la deuxième table tant que les conditions de filtre sont remplies. Une telle requête peut produire des résultats longs.

  • Soyez prudent lorsque vous joignez des tables avec des champs vides, car Visual FoxPro correspond à des champs vides. Par exemple, si vous rejoignez sur CUSTOMER.ZIP et INVOICE.ZIP et si CUSTOMER contient 100 codes postal vides et INVOICE contient 400 codes postal vides, la sortie de la requête contient 40 000 enregistrements supplémentaires résultant des champs vides. Utilisez la fonction EMPTY( ) pour éliminer les enregistrements vides de la sortie de la requête.

  • Vous devez utiliser l’opérateur AND pour connecter plusieurs conditions de jointure. Chaque condition de jointure a le formulaire suivant :

    FieldName1 Comparison FieldName2

    FieldName1 est le nom d’un champ d’une table, FieldName2 est le nom d’un champ d’une autre table, et La comparaison est l’un des opérateurs décrits dans le tableau suivant.

Opérateur Comparaison
= Égal à
== Exactement égal à
COMME SQL LIKE
<>, !=, # Différent de
> Plus de
>= Supérieur ou égal à
< Inférieur à
<= Inférieur ou égal à

Lorsque vous utilisez l’opérateur = avec des chaînes, il agit différemment, en fonction du paramètre SET ANSI. Lorsque SET ANSI est défini sur OFF, Visual FoxPro traite les comparaisons de chaînes d’une manière familière aux utilisateurs Xbase. Lorsque SET ANSI est défini sur ON, Visual FoxPro suit les normes ANSI pour les comparaisons de chaînes. Consultez SET ANSI et SET EXACT pour plus d’informations sur la façon dont Visual FoxPro effectue des comparaisons de chaînes.

FilterCondition spécifie les critères que les enregistrements doivent respecter pour être inclus dans les résultats de la requête. Vous pouvez inclure autant de conditions de filtre dans une requête que vous le souhaitez, en les connectant à l’opérateur AND ou OR. Vous pouvez également utiliser l’opérateur NOT pour inverser la valeur d’une expression logique, ou utiliser EMPTY( ) pour rechercher un champ vide. FilterCondition peut prendre l’une des formes dans les exemples suivants :

Exemple 1FieldName1 Comparison FieldName2

customer.cust_id = orders.cust_id

Exemple 2expression de comparaison FieldName

payments.amount >= 1000

Exemple 3FieldName Comparison ALL (Subquery)

company < ALL ;

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

Lorsque la condition de filtre inclut ALL, le champ doit respecter la condition de comparaison pour toutes les valeurs générées par la sous-requête avant que son enregistrement soit inclus dans les résultats de la requête.

Exemple 4Comparaison fieldName ANY | SOME (Sous-requête)

company < ANY ;

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

Lorsque la condition de filtre inclut ANY ou SOME, le champ doit respecter la condition de comparaison pour au moins une des valeurs générées par la sous-requête.

L’exemple suivant vérifie si les valeurs du champ se trouvent dans une plage de valeurs spécifiée :

Exemple 5FieldName [NOT] BETWEEN Start_Range AND End_Range

customer.postalcode BETWEEN 90000 AND 99999

L’exemple suivant vérifie si au moins une ligne répond aux critères de la sous-requête. Lorsque la condition de filtre inclut EXISTS, la condition de filtre prend la valeur True (.T.) sauf si la sous-requête prend la valeur du jeu vide.

Exemple 6 [NOT] EXISTS (Sous-requête)

EXISTS ;

(SELECT * FROM orders WHERE customer.postalcode =

orders.postalcode)

Exemple 7FieldName [NOT] IN Value_Set

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

Lorsque la condition de filtre inclut IN, le champ doit contenir l’une des valeurs avant que son enregistrement soit inclus dans les résultats de la requête.

Exemple 8FieldName [NOT] IN (Sous-requête)

customer.cust_id IN ;

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

Ici, le champ doit contenir l’une des valeurs retournées par la sous-requête avant que son enregistrement ne soit inclus dans les résultats de la requête.

Exemple 9FieldName [NOT] LIKE cExpression

customer.country NOT LIKE "USA"

Cette condition de filtre recherche chaque champ qui correspond à cExpression. Vous pouvez utiliser le signe de pourcentage (%) et le trait de soulignement ( _ ) caractères génériques dans le cadre de cExpression. Le trait de soulignement représente un caractère inconnu unique dans la chaîne.

GROUP BY GroupColumn [, GroupColumn ...]
Regroupe les lignes de la requête en fonction des valeurs d’une ou de plusieurs colonnes. GroupColumn peut être l’un des éléments suivants :

  • Nom d’un champ de table standard.

  • Champ qui inclut une fonction de champ SQL.

  • Expression numérique qui indique l’emplacement de la colonne dans la table de résultats. (Le numéro de colonne le plus à gauche est 1.)

HAVING FilterCondition
Spécifie une condition de filtre que les groupes doivent respecter pour être inclus dans les résultats de la requête. HAVING doit être utilisé avec GROUP BY et peut inclure autant de conditions de filtre que vous le souhaitez, connectées par l’opérateur AND ou OR. Vous pouvez également utiliser NOT pour inverser la valeur d’une expression logique.

FilterCondition ne peut pas contenir de sous-requête.

Une clause HAVING sans clause GROUP BY se comporte comme une clause WHERE. Vous pouvez utiliser des alias locaux et des fonctions de champ dans la clause HAVING. Utilisez une clause WHERE pour accélérer les performances si votre clause HAVING ne contient aucune fonction de champ.

[UNION [ALL] SELECTCommand]
Combine les résultats finaux d’un SELECT avec les résultats finaux d’un autre SELECT. Par défaut, UNION vérifie les résultats combinés et élimine les lignes en double. Utilisez des parenthèses pour combiner plusieurs clauses UNION.

ALL empêche UNION d’éliminer les lignes dupliquées des résultats combinés.

Les clauses UNION suivent les règles suivantes :

  • Vous ne pouvez pas utiliser UNION pour combiner des sous-requêtes.

  • Les deux commandes SELECT doivent avoir le même nombre de colonnes dans leur sortie de requête.

  • Chaque colonne dans les résultats de la requête d’un SELECT doit avoir le même type de données et la même largeur que la colonne correspondante dans l’autre SELECT.

  • Seul le select final peut avoir une clause ORDER BY, qui doit faire référence aux colonnes de sortie par nombre. Si une clause ORDER BY est incluse, elle affecte le résultat complet.

Vous pouvez également utiliser la clause UNION pour simuler une jointure externe.

Lorsque vous joignez deux tables dans une requête, seuls les enregistrements avec des valeurs correspondantes dans les champs de jointure sont inclus dans la sortie. Si un enregistrement de la table parente n’a pas d’enregistrement correspondant dans la table enfant, l’enregistrement de la table parente n’est pas inclus dans la sortie. Une jointure externe vous permet d’inclure tous les enregistrements de la table parente dans la sortie, ainsi que les enregistrements correspondants dans la table enfant. Pour créer une jointure externe dans Visual FoxPro, vous devez utiliser une commande SELECT imbriquée, comme dans l’exemple suivant :

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)  

Remarque

Veillez à inclure l’espace qui précède immédiatement chaque point-virgule. Sinon, vous recevez une erreur.

La section de la commande avant la clause UNION sélectionne les enregistrements des deux tables qui ont des valeurs correspondantes. Les entreprises clientes qui n’ont pas de factures associées ne sont pas incluses. La section de la commande après la clause UNION sélectionne les enregistrements dans la table client qui n’ont pas d’enregistrements correspondants dans la table commandes.

En ce qui concerne la deuxième section de la commande, notez les points suivants :

  • L’instruction SELECT entre parenthèses est traitée en premier. Cette instruction crée une sélection de tous les numéros de client dans la table commandes.

  • La clause WHERE recherche tous les numéros de client dans la table client qui ne figurent pas dans la table commandes. Étant donné que la première section de la commande a fourni à toutes les entreprises ayant un numéro client dans la table commandes, toutes les entreprises de la table client sont désormais incluses dans les résultats de la requête.

  • Étant donné que les structures des tables incluses dans une UNION doivent être identiques, il existe deux espaces réservés dans la deuxième instruction SELECT pour représenter orders.order_id et orders.emp_id de la première instruction SELECT.

    Remarque

    Les espaces réservés doivent être du même type que les champs qu’ils représentent. Si le champ est un type de date, l’espace réservé doit être { / }. Si le champ est un champ de caractères, l’espace réservé doit être la chaîne vide («  »).

ORDER BY Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]
Trie les résultats de la requête en fonction des données d’une ou de plusieurs colonnes. Chaque Order_Item doit correspondre à une colonne dans les résultats de la requête et peut être l’une des suivantes :

  • Champ d’une table FROM qui est également un élément select dans la clause SELECT principale (et non dans une sous-requête).

  • Expression numérique qui indique l’emplacement de la colonne dans la table de résultats. (La colonne la plus à gauche est le numéro 1.)

ASC spécifie un ordre croissant pour les résultats de requête, en fonction de l’élément de commande ou des éléments, et est la valeur par défaut de ORDER BY.

DESC spécifie un ordre décroissant pour les résultats de la requête.

Les résultats de la requête apparaissent non ordonnés si vous ne spécifiez pas d’ordre avec ORDER BY.

Notes

SELECT est une commande SQL intégrée à Visual FoxPro comme toute autre commande Visual FoxPro. Lorsque vous utilisez SELECT pour poser une requête, Visual FoxPro interprète la requête et récupère les données spécifiées à partir des tables. Vous pouvez créer une requête SELECT à partir de la fenêtre d’invite de commandes ou d’un programme Visual FoxPro (comme avec n’importe quelle autre commande Visual FoxPro).

Remarque

SELECT ne respecte pas la condition de filtre actuelle spécifiée avec SET FILTER.

Remarques sur le pilote

Lorsque votre application envoie l’instruction ODBC SQL SELECT à la source de données, le pilote ODBC Visual FoxPro convertit la commande en commande Visual FoxPro SELECT sans traduction, sauf si la commande contient une séquence d’échappement ODBC. Les éléments placés dans une séquence d’échappement ODBC sont convertis en syntaxe Visual FoxPro. Pour plus d’informations sur l’utilisation de séquences d’échappement ODBC, consultez Time and Date Functions et in the Microsoft ODBC Programmer’s Reference, see Escape Sequences in ODBC.

Voir aussi

CREATE TABLE - SQL
INSERT - SQL
SET ANSI
DÉFINIR EXACT