- •Выборка данных
- •Оператор 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
Операция Between...And
Определяет, попадает ли значение в указанный интервал. Формат
expr [Not] Between value1 And value2
Часть |
Описание |
expr |
Выражение, указывающее поле, сожержимое которого проверяется |
value1, value2 |
Выражения, с которыми сравнивается expr |
Эквивалентно
(expr Between value1 And value2) ~ (expr >= value1) And (expr <= value2)
(expr Not Between value1 And value2) ~ (expr < value1) Or (expr > value2)
Например,
SELECT IIf(PostalCode Between 98101 And 98199, "Local", "Nonlocal") FROM Publishers
Between...And возвращает True или False, если одно из значений expr, value1 или value2 – Null, то Between...And также возвращает Null. Символ * в выражении рассматривается как литерал, а не символ подстановки.
Пример:
Sub SubQueryX()
Dim dbs As Database, rst As Recordset
' Modify this line to include the path to Northwind on your computer.
Set dbs = OpenDatabase("Northwind.mdb")
' List the name and contact of every customer who placed an order
' in the second quarter of 1995.
Set rst = dbs.OpenRecordset("SELECT ContactName,CompanyName,ContactTitle,Phone" _ & " FROM Customers WHERE CustomerID IN (SELECT CustomerID FROM Orders" _ & " WHERE OrderDate Between #04/1/95# And #07/1/95#);")
rst.MoveLast ' Populate the Recordset.
' Call EnumFields to print the contents of the Recordset.
' Pass the Recordset object and desired field width.
EnumFields rst, 25
dbs.Close
End Sub
Подзапрос
Подзапрос – оператор SELECT, вложенный в другой оператор SELECT, SELECT...INTO, INSERT...INTO, DELETE или UPDATE, или другой подзапрос. Возможны три формы использования подзапроса
comparison [ANY | ALL | SOME] (sqlstatement)
expression [NOT] IN (sqlstatement)
[NOT] EXISTS (sqlstatement)
Подзапрос имеет следующие части:
Часть |
Описание |
comparison |
Выражение и оператор сравнения, сравнивающий его с результатом подзапроса |
expression |
Выражение, результат которого ищется в наборе, сформированным подзапросом |
sqlstatement |
Собственно подзапрос – оператор SELECT, составленный по обычным правилам и заключенный в скобки |
Подзапрос можно использовать вместо списка значений в выражениях WHERE или HAVING. Предикаты ANY и SOME (синонимы) используются для выбора в основном запросе записей, удовлетворяющих критерию сравнения с хотя бы одной записью подзапроса. Например, следующий запрос выбирает все товары, чьи цены выше цены какого-либо товара, продаваемого со скидкой более 25%:
SELECT * FROM Products WHERE UnitPrice > ANY (SELECT UnitPrice FROM OrderDetails WHERE Discount >= .25);
Предикат ALL используется для выбора в основном запросе записей, удовлетворяющих критерию сравнения со всеми записями подзапроса. Если в предыдущем запросе заменть ANY на ALL, он вернет список товаров, дороже самого дорогого товара, продаваемого со скидкой более 25%, т.е. список более ограничен.
Предикат IN используется для выбора в основном запросе записей, соответствующих какой-либо записи в подзапросе. Например, следующий запрос вернет записи о всех товарах, скидка на которые больше 25%
SELECT * FROM Products WHERE ProductID IN (SELECT ProductID FROM OrderDetails WHERE Discount >= .25);
Соответственно, NOT IN используется для выбора в основном запросе записей, которые не соответствуют записям подзапроса. Так, в предыдущем примере были бы выбраны товаря со скидкой 25% и меньше.
Предикат EXISTS используется для праверки, вернул ли подзапрос какие-либо записи, и соответственно возвращает true/false.
Для ссылки в подзапросе на таблицу, указанную во внешнем выражении FROM, используется псевдоним. В следующем примере выбираются имена и должности служащих, чьи оклады равны или больше среднего оклада для занимаемых ими должностей. Для ссылки на таблицу Employees (ее копии во внешнем запросе) используется псевдоним T1:
SELECT LastName, FirstName, Title, Salary FROM Employees AS T1
WHERE Salary >= (SELECT Avg(Salary) FROM Employees WHERE T1.Title = Employees.Title) Order by Title;
В этом примере служебное слово AS не обязательно.
Подзапросы допустимы в перекрестных запросах как предикаты в выражениях WHERE, но не допустимы в качестве вывода (список оператора SELECT).
В следующем примере выводится имя и адрес всех заказчиков, сделавших заказ во втором квартале 1995(вызывается процедура EnumFields из примера к оператору SELECT):
Sub SubQueryX()
Dim dbs As Database, rst As Recordset
' Modify this line to include the path to Northwind on your computer.
Set dbs = OpenDatabase("Northwind.mdb")
' List the name and contact of every customer
' who placed an order in the second quarter of 1995.
Set rst = dbs.OpenRecordset("SELECT ContactName, CompanyName," _ & " ContactTitle, Phone FROM Customers WHERE CustomerID" _ & " IN (SELECT CustomerID FROM Orders" _ & " WHERE OrderDate Between #04/1/95# And #07/1/95#);")
rst.MoveLast ' Populate the Recordset.
' Call EnumFields to print the contents of the Recordset.
' Pass the Recordset object and desired field width.
EnumFields rst, 25
dbs.Close
End Sub
Все заказы без скидок, чьи объемы больше среднего:
SELECT OrderID, (UnitPrice * Quantity) As OrderTotal FROM [Order Details] WHERE Discount = 0 AND (UnitPrice * Quantity) > ALL(SELECT Avg(UnitPrice * Quantity) FROM [Order Details]);
Названия и цены всех товаров, чья цена совпадает с ценой Aniseed Syrup:
SELECT ProductName, UnitPrice FROM Products WHERE UnitPrice =
(SELECT UnitPrice FROM [Products] WHERE ProductName = 'Aniseed Syrup');
Названия и адреса всех заказчиков, сделавших заказ во втором квартале 1995:
SELECT ContactName, CompanyName, ContactTitle, Phone FROM Customers
WHERE CustomerID IN (SELECT CustomerID FROM Orders WHERE OrderDate BETWEEN #04/1/95# AND #06/30/95#);
Имена всех служащих, оформивших хотябы один заказ (можно было бы сделать с INNER JOIN):
SELECT FirstName, LastName FROM Employees WHERE EXISTS
(SELECT OrderID FROM Orders WHERE Orders.EmployeeID = Employees.EmployeeID);
