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

Операция 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);

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