- •Выборка данных
- •Оператор select
- •Выражения sql
- •Выражение from
- •Операции left join, right join
- •Операция inner join
- •Выражение in
- •Предикаты all, distinct, distinctrow, top
- •Объявление with owneraccess option
- •Выражение where
- •Операция Like
- •Операция In
- •Операция Between...And
- •Подзапрос
- •Выражение order by
- •Выражение group by
- •Выражение having
- •Оператор union
- •Оператор transform
- •Выражение procedure
- •Объявление parameters
- •Изменение данных
- •Оператор update
- •Оператор insert into
- •Оператор delete
- •Изменение структуры
- •Оператор select...Into
- •Оператор create table3
- •Выражение constraint4
- •Оператор alter table5
- •Оператор create index6
- •Оператор drop7
- •Агрегатные функции
- •Функция Count
- •Функция Avg
- •Функция Sum
- •Функции Var и VarP
- •Функции StDev и StDevP
- •Функции Min, Max
- •Функции First, Last
Выражения sql
Выражения SQL – строки, из которых формируются операторы SQL.
Microsoft Jet использует VBA для вычисления выражений. Все операторы SQL-выражений, кроме Between, In и Like, определены в VBA. В VBA имеется также более 100 функций, которые можно использовать в SQL-выражениях. Например, можно использовать эти функции при создании запроса в конструкторе запросов или в методе OpenRecordset объекта DAO. Можно также использовать собственные функции, написанные на VBA.
Функции, включаемые в SQL-выражение, должны возвращать либо строку, либо Variant. Выполняемая функцией операция должна выполняться один раз – нельзя использовать функцию, которая выполняет операцию для каждой записи, т.к. оператор SQL передается Microsoft Jet только один раз. Нельзя, например, использовать функцию, формальным аргументом которой является значение поля.
Можно использовать функции в программе для создания как объекта QueryDef, так и динамического или неизменяемого объекта Recordset. В конструкторе запросов можно использовать их в ячейках условий и вычисляемых полей.
Следующая процедура создает динамический объект Recordset, оператор SQL включает функцию Year в выражении WHERE:
Sub Orders96()
Dim dbs As Database, rst As Recordset, strSQL As String
Set dbs = CurrentDb
strSQL = "SELECT DISTINCTROW OrderID, OrderDate " _ & "FROM Orders WHERE ((Year([OrderDate])=1996));"
Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset)
rst.MoveLast
Debug.Print rst.RecordCount
End Sub
Следующий пример показывает, как функция включается в вывод запроса:
SELECT DISTINCTROW ShipName, Len([ShipName]) AS LengthOfShipName FROM Orders;
Этот же запрос можно создать в конструкторе: в одну ячейку «перетащить» имя поля ShipName, в другую ввести LengthOfShipName: Len([ShipName]).
Выражение from
Указывает таблицы или запросы, содержащие поля списка SELECT. Формат
SELECT fieldlist FROM tableexpression [IN externaldatabase]
Оператор SELECT с FROM имеет следующие части:
Часть |
Описание |
fieldlist |
Имя выбранного поля или полей, их псевдонимы, агрегатные функции SQL, предикаты выбора ALL, DISTINCT, DISTINCTROW или TOP и т.п. |
tableexpression |
Имя таблицы/таблиц, из которой выбираются занные. Может быть именем таблицы, сохраненного запроса или комбинации, включающей INNER JOIN, LEFT JOIN или RIGHT JOIN. |
externaldatabase |
Имя базы, содержащей таблицу/таблицы или запрос. По умолчанию текущая база |
Выражение FROM обязательно и следует за SELECT. Порядок перечисления таблиц роли не играет. Вместо IN выгоднее использовать связанные таблицы, это повышает производительность.
В следующем примере выводятся данные из таблицы Employees:
SELECT LastName, FirstName FROM Employees;
В конструкторе запросов таблицы, перечисленные в выражении FROM, автоматически отображаются в окне, а таблицы, включенные в окно конструктора, будут включены в выражение FROM.
Все поля таблицы Employees:
SELECT * FROM Employees;
Товары, их цены и цены, увеличенные на 10%:
SELECT ProductName, UnitPrice AS Current, UnitPrice * 1.1 AS ProposedNewPrices FROM Products;
Число товаров, их средняя и максимальная цена (используются агрегатные функции):
SELECT Count(*) AS [Total Products], Avg(UnitPrice) AS [Average Unit Price], Max(UnitPrice) AS [Maximum Unit Price] FROM Products;
Посчет числа записей с установленным значением PostalCode:
SELECT Count(PostalCode) AS Tally FROM Customers;
Названия и цены товаров:
SELECT ProductName, 'has a unit price of', UnitPrice FROM Products;
В следующем примере предполагается, что таблица Employees содержит поле Salary.
Число служащих, их средняя и максимальная зарплата:
Sub SelectX3()
Dim dbs As Database, rst As Recordset
' Modify this line to include the path to Northwind on your computer.
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;")
rst.MoveLast ' Populate the Recordset
' Call EnumFields to print the contents of the Recordset.
' Pass the Recordset object and desired field width.
EnumFields rst, 17
dbs.Close
End Sub
Вывод записей в окне отладчика. rst – динамический Recordset, intFldLen – ширина вывода полей.
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
Debug.Print strTitle ' Print the column heading
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
If IsNull(rst.Fields(lngFldCount)) Then ' Check for Null values.
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
