Partager via


SELECT, instruction (Microsoft Access SQL)

S’applique à : Access 2013 | Office 2013

Demande au moteur de base de données Microsoft Access de renvoyer des informations depuis la base de données sous la forme d'un jeu d'enregistrements.

Syntaxe

SELECT [prédicat] { * | table.* | [table.]champ1 [AS alias1] [, [table.]champ2 [AS alias2] [, …]]} FROM expressiontable [, …] [IN externaldatabase] [WHERE... ] [GROUP BY... ] [HAVING... ] [ORDER BY... ] [AVEC L’OPTION OWNERACCESS]

L'instruction SELECT est composée des arguments suivants :

Argument Description
prédicat Un des prédicats suivants : ALL, DISTINCT, DISTINCTROW ou TOP. Utilisez le prédicat pour limiter le nombre d’enregistrements retournés. Si aucun n'est précisé, ALL est choisi par défaut.
* Indique que tous les champs de la ou des tables spécifiées sont sélectionnés.
table Nom de la table contenant les champs dans lesquels les enregistrements sont sélectionnés.
champ1, champ2 Noms des champs contenant les données à extraire. Si vous incluez plusieurs champs, les données seront extraites dans l'ordre indiqué.
alias1, alias2 Noms à utiliser comme en-têtes de colonne au lieu des noms de colonnes d’origine dans la table.
expressiontable Nom de la ou des tables contenant les données à extraire
basededonnéesexterne Nom de la base de données contenant les tables dans tableexpression si elles ne se trouvent pas dans la base de données active.

Remarques

Pour effectuer cette opération, le moteur de base de données Microsoft Jet recherche la ou les tables spécifiées, extrait les colonnes choisies, sélectionne les lignes qui correspondent aux critères, trie et/ou regroupe ces lignes dans l’ordre indiqué.

Les instructions SELECT ne modifient pas les données dans la base de données.

SELECT constitue généralement le premier mot d'une instruction SQL. Les instructions SQL sont pour la plupart des instructions SELECT ou SELECT…INTO.

La syntaxe minimale d'une instruction SELECT est la suivante :

SELECT champs FROM table

Vous pouvez utiliser un astérisque (*) pour sélectionner tous les champs d'une table. L’exemple suivant sélectionne tous les champs de la table Employees.

SELECT * FROM Employees;

Si un nom de champ est inclus dans plusieurs tables de la clause FROM, faites-le précéder du nom de la table et de l’opérateur . (point). Dans l'exemple suivant, le champ Department se trouve à la fois dans les tables Employees et Supervisors. L'instruction SQL sélectionne les départements dans la table Employees et les noms des superviseurs dans la table Supervisors :

SELECT Employees.Department, Supervisors.SupvName 
FROM Employees INNER JOIN Supervisors 
WHERE Employees.Department = Supervisors.Department;

Lorsqu'un objet Recordset est créé, le moteur de base de données Microsoft Jet utilise le nom de champ de la table comme nom de l'objet Field dans l'objet Recordset. Si vous souhaitez utiliser un autre nom de champ ou un nom qui n'est pas concerné par l'expression utilisée pour générer le champ, utilisez le mot réservé AS. L'exemple suivant utilise le titre Birth comme nom pour l'objet Field renvoyé dans l'objet Recordset résultant :

SELECT BirthDate 
AS Birth FROM Employees;

Chaque fois que vous utilisez des fonctions d'agrégation ou des requêtes qui renvoient des noms d'objet Field ambigus ou en double, vous devez utiliser la clause AS pour fournir un nom de remplacement à l'objet Field. Dans l'exemple suivant, le titre Effectif est utilisé comme nom pour l'objet Field renvoyé dans l'objet Recordset:

SELECT COUNT(EmployeeID)
AS HeadCount FROM Employees;

Vous pouvez utiliser les autres clauses d'une instruction SELECT pour limiter et organiser plus encore les données renvoyées. Pour plus d'informations, consultez la rubrique d'aide relative à la clause que vous utilisez.

Liens fournis par la communauté UtterAccess. UtterAccess est le forum d’aide et wiki de Microsoft Access de référence.

Exemple

Dans cet exemple, le champ hypothétique Salary est censé exister dans la table Employees. Notez que ce champ n'existe pas dans la table Employees de la base de données Northwind.

Cet exemple crée un objet Recordset de type feuille de réponse dynamique basé sur une instruction SQL qui sélectionne les champs LastName et FirstName de tous les enregistrements de la table Employees. Il appelle la procédure EnumFields, qui imprime le contenu d’un objet Recordset dans la fenêtre Debug .

    Sub SelectX1() 
     
        Dim dbs As Database, rst As Recordset 
     
        ' Modify this line to include the path to Northwind 
        ' on your computer. 
        Set dbs = OpenDatabase("Northwind.mdb") 
     
        ' Select the last name and first name values of all  
        ' records in the Employees table. 
        Set rst = dbs.OpenRecordset("SELECT LastName, " _ 
            & "FirstName FROM Employees;") 
     
        ' Populate the recordset. 
        rst.MoveLast 
     
        ' Call EnumFields to print the contents of the 
        ' Recordset. 
        EnumFields rst,12 
     
        dbs.Close 
     
    End Sub

Dans cet exemple, le nombre d'enregistrements comportant une entrée dans le champ PostalCode est calculé et le champ renvoyé est nommé Tally.

    Sub SelectX2() 
     
        Dim dbs As Database, rst As Recordset 
     
        ' Modify this line to include the path to Northwind 
        ' on your computer. 
        Set dbs = OpenDatabase("Northwind.mdb") 
     
        ' Count the number of records with a PostalCode  
        ' value and return the total in the Tally field. 
        Set rst = dbs.OpenRecordset("SELECT Count " _ 
            & "(PostalCode) AS Tally FROM Customers;") 
     
        ' Populate the Recordset. 
        rst.MoveLast 
     
        ' Call EnumFields to print the contents of  
        ' the Recordset. Specify field width = 12. 
        EnumFields rst, 12 
     
        dbs.Close 
     
    End Sub 

Dans cet exemple, le nombre d'employés est indiqué ainsi que les salaires maximal et moyen.

    Sub SelectX3() 
     
        Dim dbs As Database, rst As Recordset 
     
        ' Modify this line to include the path to Northwind 
        ' on your computer. 
        Set dbs = OpenDatabase("Northwind.mdb") 
     
        ' Count the number of employees, calculate the  
        ' average salary, and return the highest salary. 
        Set rst = dbs.OpenRecordset("SELECT Count (*) " _ 
            & "AS TotalEmployees, Avg(Salary) " _ 
            & "AS AverageSalary, Max(Salary) " _ 
            & "AS MaximumSalary FROM Employees;") 
     
        ' Populate the Recordset. 
        rst.MoveLast 
     
        ' Call EnumFields to print the contents of 
        ' the Recordset. Pass the Recordset object and 
        ' desired field width. 
        EnumFields rst, 17 
     
        dbs.Close 
     
    End Sub 

§LSA La procédure Sub EnumFields bénéficie d'un objet Recordset à partir de la procédure appelante. La procédure met en forme et imprime les champs de l'objet Recordset dans la fenêtre Débogage. La variable est la largeur de champ imprimé voulue. Certains champs peuvent être tronqués.

    Sub EnumFields(rst As Recordset, intFldLen As Integer) 
     
        Dim lngRecords As Long, lngFields As Long 
        Dim lngRecCount As Long, lngFldCount As Long 
        Dim strTitle As String, strTemp As String 
     
        ' Set the lngRecords variable to the number of 
        ' records in the Recordset. 
        lngRecords = rst.RecordCount 
     
        ' Set the lngFields variable to the number of 
        ' fields in the Recordset. 
        lngFields = rst.Fields.Count 
     
        Debug.Print "There are " & lngRecords _ 
            & " records containing " & lngFields _ 
            & " fields in the recordset." 
        Debug.Print 
     
        ' Form a string to print the column heading. 
        strTitle = "Record  " 
        For lngFldCount = 0 To lngFields - 1 
            strTitle = strTitle _ 
            & Left(rst.Fields(lngFldCount).Name _ 
            & Space(intFldLen), intFldLen) 
        Next lngFldCount     
     
        ' Print the column heading. 
        Debug.Print strTitle 
        Debug.Print 
     
        ' Loop through the Recordset; print the record 
        ' number and field values. 
        rst.MoveFirst 
     
        For lngRecCount = 0 To lngRecords - 1 
            Debug.Print Right(Space(6) & _ 
                Str(lngRecCount), 6) & "  "; 
     
            For lngFldCount = 0 To lngFields - 1 
                ' Check for Null values. 
                If IsNull(rst.Fields(lngFldCount)) Then 
                    strTemp = "<null>" 
                Else 
                    ' Set strTemp to the field contents.  
                    Select Case _ 
                        rst.Fields(lngFldCount).Type 
                        Case 11 
                            strTemp = "" 
                        Case dbText, dbMemo 
                            strTemp = _ 
                                rst.Fields(lngFldCount) 
                        Case Else 
                            strTemp = _ 
                                str(rst.Fields(lngFldCount)) 
                    End Select 
                End If 
     
                Debug.Print Left(strTemp _  
                    & Space(intFldLen), intFldLen); 
            Next lngFldCount 
     
            Debug.Print 
     
            rst.MoveNext 
     
        Next lngRecCount 
     
    End Sub