Vous êtes sur le site Web historique de la documentation de 4D. Les documentations sont progressivement déplacées vers developer.4d.com |
||||||||||||||
|
4D v20 R7
SELECT
|
SELECT [ALL | DISTINCT] {* | select_élément, ..., select_élément} FROM ref_table, ..., ref_table [WHERE critère_recherche] [ORDER BY liste_tri] [GROUP BY liste_tri] [HAVING critère_recherche] [LIMIT {ref_langage_4d |nombre_entier | ALL}] [OFFSET ref_langage_4d |nombre_entier ] [INTO {ref_langage_4d, ..., ref_langage_4d}] [FOR UPDATE] |
||
La commande SELECT permet de récupérer des données stockées dans une ou plusieurs table(s).
Si vous passez le paramètre *, toutes les colonnes seront retournées ; ou bien, vous pouvez passer un ou plusieurs paramètre(s) de type select_élément pour spécifier individuellement chaque colonne à sélectionner (les colonnes doivent être séparées par des virgules). Si vous ajoutez le mot-clé facultatif DISTINCT à l'instruction SELECT, les valeurs dupliquées ne seront pas retournées.
Il n'est pas possible d'exécuter des requêtes contenant à la fois le "*" et des champs explicites. Par exemple, l'instruction suivante :
SELECT *, SALES, TARGET FROM OFFICES
... n'est pas autorisée, tandis que :
SELECT * FROM OFFICES
... est valide.
La clause FROM doit être suivie d'un ou plusieurs argument(s) de type ref_table permettant de désigner la ou les table(s) contenant les données à sélectionner. Vous pouvez passer comme argument soit un nom SQL standard soit une chaîne. Il n'est pas possible de passer d'expression de type requête à la place d'un nom de table.
Facultativement, vous pouvez passer le mot-clé AS afin d'affecter un alias à la colonne. Si ce mot-clé est passé, il doit être suivi du nom de l'alias qui peut également être soit un nom SQL standard soit une chaîne.
Note : Cette commande ne prend pas en charge les champs 4D de type Objet.
Toutes les clauses suivantes sont facultatives.
La clause WHERE définit des conditions que les valeurs doivent satisfaire pour être sélectionnées. Pour cela, passez un critère_recherche qui sera appliqué aux données récupérées par la clause FROM. L'expression critère_recherche retourne toujours une valeur de type booléen.
La clause ORDER BY peut être utilisée afin d'indiquer que les données sélectionnées doivent être triées en fonction des valeurs de la liste_tri. Vous pouvez ajouter le mot-clé ASC ou DESC afin de définir si le tri doit être ascendant ou descendant. Par défaut, le tri est ascendant.
La clause GROUP BY peut être utilisée afin de demander le regroupement des données identiques en fonction des valeurs de la liste_tri passée en argument. Vous pouvez passer des colonnes de groupes multiples. Cette clause permet généralement d'éviter les redondances ou de traiter une fonction d'agrégation (COUNT, SUM, MIN ou MAX) qui sera appliquée à ces groupes. Vous pouvez également ajouter le mot-clé ASC ou DESC comme avec la clause ORDER BY.
La clause HAVING peut être utilisée afin d'appliquer un critère_recherche à l'un des groupes. La clause HAVING peut être utilisée sans la clause GROUP BY.
La clause LIMIT permet de restreindre le nombre de données sélectionnées à la quantité définie par la variable ref_langage_4d ou le nombre_entier.
La clause OFFSET permet de définir un nombre (variable ref_langage_4d ou nombre_entier) de valeurs à ignorer avant de débuter le décompte pour l'application de la clause LIMIT.
La clause INTO permet de désigner des variables ref_langage_4d auxquelles les données sélectionnées seront affectées. Vous pouvez également passer le mot-clé LISTBOX afin de placer les données dans la list box désignée par le paramètre ref_langage_4d.
Une instruction SELECT comportant la clause FOR UPDATE tentera de verrouiller en écriture tous les enregistrements sélectionnés. Si un enregistrement au moins ne peut pas être verrouillé, l'ensemble de la commande échouera et une erreur sera retournée. Dans le cas contraire, les enregistrements resteront verrouillés jusqu'à ce que la transaction courante soit validée ou annulée.
Imaginons une base de données de films contenant une table qui, pour chaque film, stocke le titre, l'année de sortie et le nombre d'entrées vendues.
Nous voulons sélectionner les années depuis 1979 ainsi que le nombre d'entrées pour les films ayant fait moins de 10 millions d'entrées. Nous souhaitons ignorer les 5 premières années et afficher uniquement 10 années, classées par ordre croissant.
C_ENTIER LONG($AnneeFilm;$EntreesMin;$Depart;$Limite)
TABLEAU ENTIER(tAnneeFilm;0)
TABLEAU ENTIER LONG(tEntreesMin;0)
$AnneeFilm:=1979
$EntreesMin:=10000000
$Depart:=5
$Limite:=10
Debut SQL
SELECT Annee_Film, SUM(Entrees)
FROM FILMS
WHERE Annee_Film >= :$AnneeFilm
GROUP BY Annee_Film
HAVING SUM(Entrees) < :$EntreesMin
ORDER BY 1
LIMIT :$Limite
OFFSET :$Depart
INTO :tAnneeFilm, :tEntreesMin;
Fin SQL
Cet exemple utilise une combinaison de critères de recherches :
SELECT id_fournisseurs
FROM fournisseurs
WHERE (nom= 'CANON')
OR (nom= 'Hewlett Packard' AND city = 'New York')
OR (nom= 'Firewall' AND status = 'Closed' AND city = 'Chicago');
Soit la table COMMERCIAUX où QUOTA est le montant des ventes prévu pour le commercial et VENTES le montant des ventes effectivement réalisé.
TABLEAU REEL(tValeurs_Min;0)
TABLEAU REEL(tValeurs_Max;0)
TABLEAU REEL(tValeurs_Sommes;0)
Debut SQL
SELECT MIN ( ( VENTES * 100 ) / QUOTA ),
MAX( (VENTES * 100 ) / QUOTA ),
SUM( QUOTA ) - SUM ( VENTES )
FROM COMMERCIAUX
INTO :tValeurs_Min, :tValeurs_Max, :tValeurs_Sommes;
Fin SQL
Cet exemple sélectionne tous les acteurs nés dans une ville donnée :
TABLEAU TEXTE(tNomsActeurs;0)
TABLEAU TEXTE(tVilles;0)
Debut SQL
SELECT ACTEURS.Prenom, VILLES.Nom
FROM ACTEURS AS 'Act', VILLES AS 'Vil'
WHERE Act.ID_Ville_Naissance=Vil.ID_Ville
ORDER BY 2 ASC
INTO : tNomsActeurs, : tVilles;
Fin SQL
critère_recherche
liste_tri
ref_langage_4d
ref_table
select_élément
sous_requête
Produit : 4D
Thème : Commandes SQL
Nom intl. : SELECT
4D - Référence SQL ( 4D v20 R7)