Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SQL.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
327.17 Кб
Скачать

Выражения 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]