Оператор SELECT (Microsoft Access SQL)

Область применения: Access 2013 | Office 2013

Указывает ядру СУБД Microsoft Access возвращать информацию из базы данных в виде наборе записей.

Синтаксис

SELECT [предикат] { * | table.* | [table.] field1 [AS alias1] [, [table.] field2 [AS alias2] [, ...]]} FROM tableexpression [, ...] [IN externaldatabase] [WHERE... ] [GROUP BY... ] [HAVING... ] [ЗАКАЗ ПО... ] [С ПАРАМЕТРОМ OWNERACCESS]

Оператор SELECT состоит из следующих частей:

Часть Описание
predicate Одно из следующих предикатов: ALL, DISTINCT, DISTINCTROW, or TOP Можно использовать предикаты, чтобы ограничивать количество возвращаемых записей. Если ничего не указано, значение по умолчанию ALL.
* Указывает, что все поля из указанной таблицы или таблиц выбраны.
table Имя таблицы с полями, из которых происходит выборка записей.
поле1, поле2 Имена полей, содержащих данные, которые необходимо извлечь. Если вы включите более одного поля, они будут извлечены в порядке по списку.
псевдоним1, псевдоним2 Имена для использования в качестве заголовков столбцов вместо исходных имен столбцов в таблице.
tableexpression Имя таблицы или таблиц, содержащих данные, которые необходимо извлечь.
externaldatabase Имя базы данных, содержащей таблицы в tableexpression , если они не находятся в текущей базе данных.

Комментарии

Чтобы выполнить это действие, ядро СУБД Microsoft Jet выполняет поиск указанной таблицы или таблиц, извлекает выбранные столбцы, выбирает строки, которые удовлетворяют критерию и сортирует или группирует итоговые строки в указанном порядке.

Операторы SELECT не изменяют данные в базе данных.

SELECT обычно является первым словом в операторе SQL. Большинство операторов SQL — операторы SELECT или SELECT…INTO.

Минимальный синтаксис для оператора SELECT:

SELECT fields FROM table

Для выбора всех полей в таблице можно использовать звездочку (*). В приведенном ниже примере выделяются все поля в таблице "Сотрудники".

SELECT * FROM Employees;

Если имя поля включается в несколько таблиц в предложении FROM, перед ним следует укажите имя таблицы и оператор . (точка). В приведенном ниже примере поле "Отдел" находится в таблице Руководители и таблице Сотрудники. Оператор SQL выделяет отделы в таблице Сотрудники в таблицы и имена руководителей в таблице Руководители:

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

Когда создается объект Recordset, ядро СУБД Microsoft Jet использует имя поля таблицы в качестве имени объекта Field в объекте Recordset. Если вы хотите использовать другое имя поля или имя, которое не подразумевается выражением, используемые для генерации поля, используйте зарезервированное слово AS. В следующем примере используется название Birth в качестве имени возвращаемого объекта Field в итоговом объекте Recordset:

SELECT BirthDate 
AS Birth FROM Employees;

При каждом использовании агрегатных функций или запросов, которые возвращают неоднозначные или повторяющиеся имена объекта Field, воспользуйтесь оператором AS для предоставления запасного имени объекта Field. В следующем примере используется название HeadCount в качестве имени возвращаемого объекта Field в итоговом объекте Recordset:

SELECT COUNT(EmployeeID)
AS HeadCount FROM Employees;

Для дополнительного ограничения и организации возвращаемых данных, можно использовать другие предложения в операторе SELECT. Дополнительные сведения см. в статье справки для предложения, которое вы используете.

Ссылки, предоставляемые сообществом UtterAccess. UtterAccess — это премиальный вики-портал и форум, посвященный Microsoft Access.

Пример

В некоторых из примеров ниже предполагается, что существует гипотетическое поле Salary (Оклад) в таблице Employees (Сотрудники). Обратите внимание, что это поле на самом деле не существует в таблице Employees (Сотрудники) базы данных Northwind.

В данном примере создается объект Recordset типа dynaset на основании оператора SQL, который выбирает поля "Фамилия" и "Имя" среди всех записи в таблице "Сотрудники". Он вызывает процедуру EnumFields, которая печатает содержимое объекта Recordset в окне 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

В данном примере выполняется подсчет количества записей, которые содержат информацию в поле "Индекс", и присваивается имя "Путь" возвращаемому полю.

    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 

В этом примере показано количество сотрудников и среднее и максимальное вознаграждения.

    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 

Суб процедура EnumFields передает объект Recordset из процедуры вызова. Затем процедура форматирует и печатает поля Recordset в окне Отладка. Переменная - это желаемая ширина печатного поля. Некоторые поля могут быть обрезаны.

    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