Итоговые функции: STDEV, STDEVP
Тема: SQL- продолжение (Построение запросов) Операция JOIN Во многом широкие возможности SQL базируются на его способности объединять информацию из нескольких таблиц или запросов и представлять результат в виде одного логического набора записей. В большинстве случаев Microsoft Access позволяет обновлять набор записей запроса на объединение, как если бы это была отдельная базовая таблица (при условии, если вы включили в инструкцию ключевое слово DISTINCTROW). Для задания типа объединения таблиц в логический набор записей, из которого будет выбираться необходимая нам информация, используйте операцию JOIN в предложении FROM. Вы можете попросить Access включить в логический набор записей только соответствующие строки обеих таблиц (эта операция называется INNER JOIN — внутреннее объединение) или включить все строки одной из двух заданных таблиц даже в том случае, когда соответствующая ей строка не найдена во второй таблице (эта операция называется OUTER JOIN — внешнее объединение). Можно создать вложенные объединения, объединив третью таблицу с результатом объединения двух других таблиц. Синтаксис:
({ имя-таблицы [[AS] псевдоним ] | имя-запроса-выборки [ [AS] псевдоним ] | < таблица-объединения > { INNER | LEFT | RIGHT } JOIN { имя-таблицы [ [AS] псевдоним ] | имя-запроса-выборки [[AS] псевдоним ] | < таблица-объединениям >} ON < условие-объединения >) где <таблица-объединения> есть результат другой операции объединения, а <условие-о6ъединешя> — это условие отбора, образованное из предикатов сравнений, которые сравнивают поля первой таблицы с полями второй. При желании можно употреблять в качестве имен таблиц или запросов альтернативные имена. Такое альтернативное имя можно использовать как псевдоним вместо полного имени таблицы при указании имен столбцов в списке выбора, предложении WHERE или подчиненных предложениях..
Используйте операцию INNER JOIN, если нужно включить все строки из обеих таблиц, удовлетворяющие условию объединения. Используйте LEFT JOIN, если нужно получить все строки из первой таблицы, объединенные с теми строками из второй таблицы, для которых выполняется условие объединения. Если во второй таблице нет строк, для которых условие объединения выполняется, Access в качестве значений столбцов второй таблицы возвращает значения Null. Аналогично, операция RIGHT JOIN возвращает все строки из второй таблицы, объединенные с теми строками из первой таблицы, для которых выполняется условие объединения. Если в условии объединения вы используете только предикаты сравнения на I равенство, то результат называется объединением по равенству. В бланке QBE Access может представить объединение по равенству, но не может представить объединение по условию «неравенства». Если вам нужно определить объединение таблиц по условию неравенства (<,>, < >, <= или >=), то запрос следует определять в режиме SQL. Если по условию равенства вы выполняется объединение таблицы с самой собой, то результат называется самообъединением.
Примеры: Чтобы выбрать информацию о компонентах и поставщиках, которые поставляют каждый из компонентов, и отсортировать ее по ComponentlD, выполните следующий запрос:
SELECT DISTINCTROW Component. *, Suppllier.SuppllierName, Suppllier. SuppllierAddressl, Suppllier.SuPpllierAddress2, Suppllier. SupplUerCity, Suppllier.SuppllierState, Suppllier.SuppllierPostal, Suppllier. SuppllierPhone, Suppllier.SuppllierFax FROM Suppllier INNER JOIN Component ON Suppllier.SuppllierlD = Component.SuppllierlD ORDER BY Component.ComponentlD;
Чтобы определить, какие поставщики не поставляют компонент с кодом 25, введите следующую инструкцию:
SELECT DISTINCTBOW Component. ComponentlD, Suppllier.SuppllierID,
Suppllier.SuppllierCity, Suppllier.SuppllierState FROM Suppllier INNER JOIN Component ON Suppllier.SuppllierlD = Component.SuppllierlD WHERE Component.ComponentID <=> 25;
Чтобы определить, какие из клиентов не имеют в данное время заказов, введнте следующую инструкцию:
SELECT DISTINCTROW Customer.CompanyName, Customer.City, Customer. State FROM Customer LEFT JOIN [Order] ON Customer.CustomerlD = Order.CustomerlD WHERE (((Order.CustomerlD) Is Null));
Чтобы получить список изделий и количество изделий, заказанных на настоящий момент, отсортированный по типу изделий, введите следующую инструкцию:
SELECT DISTINCTROW Type.TypeDescription, Catalog.Description, OrderItern.OrderID, Orderltem.Quantity FROM Type INNER JOIN (Catalog INNER JOIN OrderItem ON Catalog.CatalogItemID = Orderltem.CatalogItemID) ON Type.IteraTypeCode = Catalog.ItemTypeCode ORDER BY Type.TypeDescription;
Предложение ORDER BY Задает последовательность строк, возвращаемых инструкцией SELECT или INSERT. Синтаксис: ORDER BY { имя-столбца [ASC | DESC] },...
В предложении ORDER BY можно указать несколько столбцов. Список, сортируется сначала по значениям столбца, имя которого указано первым. Если существуют строки, в которых значения этого столбца равны, то они упорядочиваются по значениям столбца, имя которого является следующим в списке предложения ORDER BY. Для каждого столбца вы можете задать порядок сортировки: по возрастанию (ASC) или по убыванию (DESC). Если вы не указали порядка сортировки, то по умолчанию принимается значение ASC. Использование предложения ORDER BY в инструкции SELECT — это единственное средство для задания последовательности, в которой располагаются возвращаемые записи.
Примеры: Чтобы выбрать клиентов, которые сделали первый заказ не позже 1988 года, и возвратить их список, упорядоченный по возрастанию почтовых индексов, выполните запрос:
SELECT DISTINCTROM Customer.CompanyName, Customer.City, PostalCode FROM Customer WHERE (((1988) >= (SELECT MIN [Year (OrderDate)) FROM [Order] WHERE Order.CustomerID = Customer.CustomerID))) ORDER BY Customer.PostalCode;
Чтобы найти всех поставщиков и всех клиентов из штата Вашингтон (Washington) и возвратить их список, упорядоченный по убыванию почтовых индексов, выполните запрос:
SELECT DISTINCTROW Customer.CompanyName, Customer.City, PostalCode FROM Customer WHERE Customer.State = "WA" UNION SELECT DISTINCTROW Supplier. SupplierName, Supplier. SupplierCity Supplier.SupplierPostal FROM Supplier WHERE Supplier.SupplierState = "WA"
Описание PARAMETERS
Располагается перед инструкцией SQL и предназначено для определения типов данных используемых вами в запросе параметров. Вы можете использовать параметры, чтобы предоставить пользователю возможность во время выполнения запроса ввести значения, входящие в условия отбора, или чтобы использовать в условии отбора значения, которые содержатся в элементах управления открытой формы.
Синтаксис:
PARAMETERS {[ имя-параметра ] тип-данных),...; Если при выполнении запроса пользователь должен ввести значения, то каждое имя параметра должно описывать значение, которое требуется ввести. Например, [Распечатать фактуры для заказов на дату:] является более содержательным, чем [Введите дату:]. Если вы хотите сослаться на элемент управления открытой формы, используйте следующий формат:
[Forms]! [Myform]![Mycontrol]
Чтобы сделать ссылку на элемент управления в подчиненной форме, используйте формат: [Forms]![MyForm]![Mysubformcontrol].[Form]![CantrolOnSubform] Допустимые типы данных параметров перечислены ниже:
Пример:
Чтобы создать запрос с параметрами для подсчета объема продаж и суммарной стоимости всех проданных изделий за данный месяц, введите следующую инструкцию:
PARAMETERS [Год, в котором подсчйтывнются итоги":] Short' [Месяц, в котором подсчитываются итоги:] Short; SUMfOrderltem.Quantity) AS Quantity, SUMfOrderltem. [Quantity] * [QuotedPrice]) AS TotalSales, SUM (OrderItem.[Quantity] * [OurCost]) AS TotalCost FROM [Order] INNER JOIN (Catalog INNER JOIN Orderltem ON Catalog.CatalogltemID = Orderltem.CatalogltemID) WHERE (((Year ([OrderDate]}) = [Год, в котором подсчитываются итоги: ]) AND ((Month ([OrderDate])) = [Месяц, в котором подсчитываются итоги:])) GROUP BY Orderltem.CatalogltemID;
Предикат: BETWEEN Сравнивает значение с заданным диапазоном значений.
Синтаксис: выражение [NOT] BETWEEN выражение AND выражение Типы данных всех выражений должны быть совместимы. Сравнение буквенно-цифровых литералов (строк) в Microsoft Access производится без учета регистра.
Пусть а, Ь и с - выражения. Тогда a BETWEEN Ь AND с эквивалентно следующему выражению: a >= Ь AND a <= с a NOT BETWEEN Ь AND с эквивалентно: а < Ь OR a > c Результат считается неопределенным, если одно из выражений равно NULL.
Пример:
Чтобы определить, что среднее значение произведения Quantity (Количество) на QuotedPrice (Договорная цена) не меньше 500 долларов и не больше 10 000 долларов, введите следующее выражение:
AVG(Quantity * QuotedPrice) BETWEEN 500 AND 10000
Предикат: Сравнение Сравнивает значения двух выражений или значение некоторого выражения и значение, являющееся результатом подчиненного запроса. Синтаксис:
выражение {= | <> | > | < | >= | <= } {выражение | подчинениый-запрос}. Сравнение строк в Microsoft Access производится без учета регистра. Тип данных первого выражения должен быть совместим с типом данных второго выражения или со значением, возвращаемым при выполнении подчиненного запроса. Если подчиненный запрос не возвращает ни одной записи или возвращает более одной записи, регистрируется ошибка, если только список выбора в подчиненном запросе не COUNTC*). В последнем случае несколько возвращаемых записей порождают одно значение. Если результат оценки первого или второго выражения или подчиненного запроса есть Null, результат сравнения неопределен.
Примеры: Чтобы определить, что заказ сделан в 1992 году, введите: Year(OrderDate) = 1992 Чтобы определить, что OrderlD (код заказа) не равен 50, введите: OrderlD <> 50 Чтобы определить, что AmountOwed (задолженность) больше, чем 0, введите: AmountOwed > 0 Чтобы определить, что заказ сделан в первой половине года, введите: Month(OrderDate) < 7
Чтобы определить, что максимальная итоговая стоимость заказа в некоторой группе меньше средней итоговой стоимости заказов, вычисленной по всей таблице Order (Заказ), введите:
MAX (SubTotalCost - (SubTotalCost * Discount)) < FROM [Order])
Предикат: EXISTS
Проверяет существование по крайней мере одной строки, которая удовлетворяет условиям отбора в подчиненном запросе. Синтаксис: EXISTS {подчиненный-запрос) Результат всегда определен. Если подчиненный запрос возвращает, по крайней мере, одну строку, результат имеет значение Истина, в противном случае результат равен значению Ложь. Подчиненный запрос может не возвращать никаких значений для этого предиката, поэтому вы можете указывать любой список выбора (включая *).
Пример: Чтобы найти всех поставщиков, которые поставляют, по крайней мере, один вид компонента, введите:
SELECT DISTINCTROW Supplier.SupplierName FROM Supplier WHERE EXISTS : (SELECT * FROM Component WHERE Component.SupplierlD = Supplier.SupplierlD);
В приведенном примере внутренний подчиненный запрос содержит внешнюю ссылку на таблицу Supplier 1 (Поставщик) в инструкции SELECT, ссылаясь на столбец во внешней таблице (Supplier.SupplierlD в предложении WHERE подчиненного запроса). Это приводит к тому, что в инструкции SELECT подчиненный запрос должен выполняться для каждой строки, что может быть не самым эффективным способом достижения результата. Предикат: IN Определяет, равно ли некоторое значение одному из значений, указанных в списке значений или возвращаемых подчиненным запросом.
Синтаксис: выражение [NOT] IN {(подчиненный запрос) | ({литерал},…) | выражение} Сравнение строк в Microsoft Access производится без учета регистра. Типы данных всех выражений, литералов и столбца, возвращаемого при выполнении подчиненного запроса, должны быть совместимыми. Если результат выражения есть Null или любое из значений, возвращаемых подчиненным запросом, равно Null, то результат сравнения не определен. В терминах других предикатов выражение IN выражени е эквивалентно:
выражение = выражение выражение IN (подчиненный запрос) эквивалентно: выражение = ANY {подчиненный запрос) выражение IN (a, Ь, с,...), где a, Ь и с - литералы, эквивалентно: (выражение = a) OR (выражение =- b) OR (выражение = c)… выражение NOT IN... эквивалентно следующему: NOT (выражение IN...)
Примеры: Чтобы определить, что клиент проживает в одном из штатов, расположенных на Западном побережье США, введите следующую строку:
State IN ("СА", "OR", "WA")
Чтобы определить, что CustomerID (Код клиента) совпадает с одним из значений SupplierID (Код поставщика) для штата Вашингтон, введите следующее:
CustomerID IN (SELECT SupplierID FROM Supplier
Предикат: LIKE
Отыскивает строки, сравнивая их с образцом.
Синтаксис:
имя-столбца [NОТ] LIKE образец
Сравнение строк в Microsoft Access производится без учета регистра. Если значение столбца равно Null, то результат сравнения не определен. Сравнение двух пустых строк или пустой строки с символом ' возвращает значение Истина. Для задания позиций, содержащих одиночный символ или произвольное число символов (включая пулевое число символов), можно использовать несколько специальных символов шаблона, в соответствии со следующей таблицей:
Вы можете также указать, что некоторая определенная позиция в текстовом или Мемо-поле может содержать только символы из заданного вами списка, заключенного в квадратные скобки. Можно задать диапазон символов, если ввести символ начала диапазона, затем дефис, а потом — конечный символ диапазона, например [A-Z] либо [3-7]. Если вы хотите проверить, что в некоторой позиции стоит символ, не входящий в заданный вами список, начните список с восклицательного знака (1). Если вам необходимо проверить наличие в данной позиции символа *,?, # или [, то вам придется заключить такой символ в квадратные скобки.
Примеры: Чтобы определить, что имя клиента содержит по крайней мере 4 буквы и начинается со Smi, введите следующее выражение: CustomerName LIKE "Smi?*" Чтобы узнать, что почтовый индекс является допустимым канадским почтовым индексом, введите: PostalCode LIKE "[A-Z] # [A-Z] #[A-Z]#"
Предикат: NULL
Определяет, что значение выражения равно Null. Этот предикат всегда имеет значение Истина или Ложь и не может порождать неопределенное значение. Синтаксис: выражение IS [NOT] NULL
Примеры: Для выяснения того, что столбец PhoneNumber никогда не заполнялся, введите следующее:
PhoneNumber IS NULL
Предикаты Some, Any, All
Сравнивают значение выражения с некоторым значением или всеми значениями столбца, возвращаемого подчиненным запросом.
Синтаксис: выражение { = | <> | > | < | >= | <= } [SOME | ANY | ALL] (подчинениый-запрос) Пояснения: Сравнение строк в Microsoft Access производится без учета регистра. Тип данных выражения должен быть совместимым с типом данных столбца, возвращаемого подчиненным запросом. Когда используется ALL, предикат принимает значение Истина, когда все результаты сравнения со значениями, возвращаемыми при выполнении подчиненного запроса, истинны. Если выражение или некоторое значение из возвращаемых подчиненным запросом равно Null, результат не определен. Если используются SOME (или ANY, которое является синонимом SOME), то предикат принимает значение Истина, когда результат сравнения хотя бы с одним из возвращаемых подчиненным запросов значений истинен. Если выражение имеет значение Null, результат не определен. Если в результате выполнения подчиненного запроса не возвращается никаких значений, то предикат принимает значение Ложь. Примеры:
Чтобы определить компоненты, стоимость которых больше, чем стоимость любого из компонентов с кодом 008, введите следующее:
SELECT DISTINCTROW Component.Description, Component.OurCost FROM Component WHERE (Component.OurCost) > ALL (SELECT OurCost FROM Component
Чтобы найти компоненты, у которых стоимость выше, чем стоимость некоторого из компонентов с кодом 008, введите следующие:
SELECT DISTINCTROW Component.Description, Component.OurCost FROM Component WHERE (Component.OurCost) > SOME (SELECT OurCost FROM Component WHERE ItemTypeCode = "008"); Условие отбора Определяет простой или составной предикат, который может принимать значения Истина, Ложь или быть неопределенным для данной строки или группы строк. Используйте условие отбора в предложении WHERE или в инструкции SELECT, в подчиненном запросе, инструкциях DELETE или UPDATE. Условие отбора может быть также задано внутри предложения HAVING в инструкции SELECT. Условие отбора определяет те строки, которые должны быть отобраны в результирующую логическую таблицу (набор записей) или те строки, которые подлежат обновлению при выполнении операции изменения. Если условие отбора для строки имеет значение Истина, то такая строка включается в результирующий набор.
Синтаксис: [NOT] { предикат | (условие-отбора) } [{AND | OR | XOR | EQV | IMP) [NOT] { предикат | { условие-отбора)}]...
Пояснения: В условии отбора Microsoft Access может применять подчиненный запрос к каждой строке таблицы, которая является результатом выполнения предыдущих предложений. Затем Access оценивает результат подчиненного запроса по отношению к каждой строке-кандидату. Если вы включите предикат сравнения, используя синтаксис выражение оператор-сравнения подчипелный-замрос, то в том случае, когда подчиненный запрос не возвращает ни одной строки, возникает ошибка. Порядок применения логических операторов следующий: NOT, AND, OR, XOR (исключающее OR), EQV (эквивалентность) и IMP (импликация). Для изменения последовательности вычисления логического выражения можно включить дополнительные круглые скобки. Вы можете использовать логические операторы AND и OR непосредственно в бланке QBE. Если вы хотите использовать ХОН, EQV или IMP, вам следует записать выражение в строке Поле, убрать флажок Вывод на экран, а к строке Условие отбора ввести <>False. При использовании логического оператора NOT действуют следующие соглашения: NOT (Истина) есть Ложь, NOT (Ложь) есть Истина, a NOT (неопределенное-яначение) есть «неопределенное-значенне». Результат считается неопределенным вовсех случаях, когда предикат ссылается на значение Null. Если условие отбора для строки имеет значение. Ложь или является неопределенным, тег такая строка не включается в результирующий набор.
Примеры: Чтобы найти все изделия, стоимость которых больше 100 долларов и при этом для их комплектации необходимо два дня или их количество и наличии меньше 5 (но последние два условия не выполняются одновременно), введите следующую инструкцию: Таблица истинности для логических операций SQL
SELECT DISTINCTROW Catalog. CataloglteralD, Catalog.DaysToBuild, Catalog.NumberlnStock FROM Catalog AND ([Catalog.DaysToBuild) = 2 XOR (Catalog.NumberlnStock) < 5); Инструкция SELECT
Выполняет реляционные операции выбора и объединения для создания логической таблицы (набора записей) на базе других таблиц или запросов. Элементы списка выбора задают вычисляемые выражения или столбцы, выбираемые из исходных таблиц, которые включаются в логическую таблицу. Таблицы, которые должны быть объединены, указываются в предложении FROM, а строки, которые необходимо выбрать, — в предложении WHERE. Используйте GROUP BY для определения, как должны быть сформированы группы для итогового запроса, а предложение HAVING — для отбора тех групп, которые должны быть включены в результат запроса. Синтаксис: SELECT [All | DISTINCT | DISTINCTROW | TOP число [PERCENT]] список-выбора FROM [{ имя-таблицы [[AS] псевдоним] | [GROUP BY имя -столбца,...] [HAVING условие-отбора] [UNION [ALL] инструкция-выбора] [ORDER BY { имя-столбца [ASC | DESC]},... | IN <”имя-базы-данных-источнмка"> <[строка-подключения- источника-данных]> [WITH OWNERACCESS OPTION];
где список-выбора есть {* | {выражение [AS имя-столбца-выходной-таблицы] | имя-таблицы. * | имя-запроса. * | псевдоним. *},...}
и где таблица-объединения есть
({ имя-таблицы [[AS] псевдоним ] | имя-запроса-выборки [[AS] псевдоним ]} | < таблица-объединения> } {INNER | LEFT | RIGHT | JOIN { имя-таблицы [[AS] псевдоним ] | имя-запроса-выборки [[AS] псевдоним ] | ON < условие-обеединения>) Пояснения: Для каждой таблицы и каждого запроса вы можете при желании определить альтернативное имя. Это имя вы можете использовать как псевдоним вместо полного имени таблицы при задании имен столбцов в списке выбора, в предложении WHERE или в подчиненных предложениях. Если вы производите объединение таблицы или запроса с самим собой, то вам придется употреблять альтернативное имя, чтобы указать, на какую копию таблицы или запроса вы ссылаетесь при задании списка выбора, условий объединения или условий отбора. Если имя таблицы или имя запроса совпадает с зарезервированным словом языка SQL (например, «Order»), вы должны заключать такое имя в квадратные скобки. Когда вы перечисляете несколько таблиц или запросов и не указываете условия объединения, в качестве исходной таблицы используется Декартово произведение всех таблиц. Например, FROM TableA, ТаblеВ заставляет Access считать областью поиска все строки из таблицы TableA, присоединенные к каждой из строк таблицы ТаblеВ. В этом случае число логических записей, обрабатываемых Access, может быть равно числу строк в таблице ТаblеА, умноженному на число строк в таблице ТаblеВ. В качестве результата Access возвратит те записи, в которых условия отбора, определенные в предложениях WHERE и HAVING, примут значение Истина. DISTINCT требует, чтобы Access возвратил только строки, отличающиеся ото всех остальных. В запросе, который использует предикат ALL или DISTINCT, вы не сможете изменить содержимое каких-либо столбцов. DIST1NCTROW (по умолчанию) требует, чтобы Access возвратил только такие строки, в которых конкатенация первичных ключей из всех таблиц, участвующих в формировании выходных столбцов, является уникальной. В зависимости оттого, какие именно столбцы вы выберете, в результирующем наборе вы иногда увидите повторяющиеся строки, однако каждая строка в выходной таблице извлечена из уникальной (DISTINCT) комбинации строк (ROWS) базовых таблиц. Если вы хотите обновлять значения полей набора записей запроса на объединение, то нужно использовать предикат DISTINCTROW. Если вы хотите, чтобы результирующий набор содержал только первые п или первые п процентов (PERCENT) записей, используйте предикат ТОР п или TOP n PERCENT. Параметр п должен быть целым числом я должен быть не больше 100, если вы используете ключевое слово PERCENT. Заметьте, что если вы не включите в запрос предложение ORDER BY, то порядок расположения возвращаемых строк неопределен. Если вы употребляете предложение GROUP BY, то список выбора должен содержать одну или несколько итоговых функций (AVG, COUNT, MAX, MIN, STDEV, STDEVP, SUM, VAR или VARP) либо одно или несколько имей столбцов, указанных в предложении GROUP BY. В предложении GROUP BY можно использовать любой столбец из любой таблицы, указанной в предложении FROM, даже если этот столбец не указан и списке выбора. Если в предложении GROUP BY вы хотите сослаться на вычисляемое выражение, необходимо присвоить этому выражению в списке выбора имя и затем ссылаться на него в предложении GROUP BY. Если перед предложением GROUP BY расположено предложение WHERE, Access формирует группы из строк, отобранных после применения предложения WHERE. Если вы используете предложение HAVING и при этом не включили в запрос предложение GROUP BY, то список выбора должен формироваться с использованием итоговых функций (AVG, COUNT, MAX, MIN, STDEV, STDEVP, SUM, VAR или VARP). Если вы поставите предложение GROUP BY перед предложением HAVING, условие отбора предложения HAVING будет применяться к каждой из групп, образованных на основе совпадения значений заданных столбцов. Если вы не включите в запрос предложение GROUP BY, то условие отбора предложения HAVING будет применяться ко всей логической таблице, определенной инструкцией SELECT. В предложении ORDER BY можно указать один или несколько столбцов, по значениям которых будут сортироваться возвращаемые записи. Список сортируется сначала по значению столбца, имя которого указано первым. Если существуют строки, в которых значения этого столбца равны, то они упорядочиваются по значениям столбца, имя которого и списке предложения ORDER BY является следующим. Для каждого столбца вы можете задать порядок сортировки: по возрастанию (ASC) или по убыванию (DESC). Если вы не указали способ сортировки, то по умолчанию используется сортировка по возрастанию. Использование предложения ORDER BY в инструкции SELECT — это единственное средство для задания последовательности, в которой располагаются возвращаемые записи.; Обычно пользователь, выполняющий запрос, должен иметь право на доступ не только к этому запросу, но и соответствующие права доступа к таблицам, которые используются в запросе (эти права связаны с чтением данных для отбора строк, изменением, вставкой или удалением данных при выполнении запроса). Если с приложением работают несколько пользователей, то для защиты данных в таблицах вы можете сделать так, чтобы никто из пользователей не имел прямого доступа к таблицам, но при этом все пользователи могли бы выполнять созданные вами запросы. Если вы являетесь владельцем и таблиц и запросов, то вы можете запретить доступ к таблицам, но при этом разрешить выполнять запросы. Для обеспечения гарантии правильного выполнения запроса вы должны включить в него предложение WITH OWNERACCESS OPTION, которое наделяет пользователя при доступе к данным при выполнении конкретного запроса такими же правами, что и владельца соответствующей таблицы. Чтобы выбрать информацию о клиентах и их покупках на сумму более 100 долларов, введите следующую инструкцию:
SELECT Cust.CustomerlD, Cust.CompanyName, Ord.OrderDate, Cat.CatalogltemID, Cat.Description, Order Item. Quantity, Orderltem.QuotedPrice FROM [Catalog AS Cat INNER JOIN ((Customer AS Cust INNER JOIN [Order] AS Ord ON Cust.CustoraerlD = Ord.CustomerlD) INNER JOIN OrderItem ON Ord.OrderlD = Orderltem.OrderlD) ON Cat.CatalogltemID = Orderltera.CatalogltemID) WHERE (Orderltem.Quantity * Orderltem. Price) > 100;
Чтобы среди клиентов, имеющих одинаковый почтовый индекс, найти максимальный заказ, введите следующий запрос:
SELECT DISTIHCTROW Customer.PostalCode, Max (Otder.SubTotalCost) AS MaxOfSubTotalCost FROM Customer INNER JOIN [Order] ON Customer.CustomerlD = Order.CustomerlD GROUP BY Customer.PostalCode;
Для определения средней и максимальной цен на изделия для каждого типа продукции введите следующее:
SELECT DISTINCTROW Туре. TypeDescription, AVG (Catalog. Price) AS AvgOf Price, MAX (Catalog.Price) AS MaxOfPrice FROM Type INNER JOIN Catalog ON Type.ItemTypeCode = Catalog.ItemTypeCode GROUP BY Type.TypeDescription;
Чтобы определить наибольшую стоимость заказа по каждой группе клиентов (сформированных по штатам) и выделить такие ситуации, когда наибольшая стоимость заказа в группе оказывается меньше, чем средняя стоимость заказов по всем клиентам, введите следующее:
SELECT DISTINCTROW Customer.State, Max (Order.SubTotalCost) AS MaxOfSubTotalCost FROM Customer INNER JOIN [Order] ON Customer.CustoraerlD = Order.CustomerlD GROUP BY Customer.State HAVING (((Max (Order.SubTotalCost)) < (SELECT AVG (SubTotalCost) FROM [Order])));
Для нахождения средней и максимальной стоимости заказа для клиентов из штата Вашингтон за каждый месяц, в котором максимальная стоимость заказа была меньше 4000 долларов, введите следующую инструкцию:
SELECT DISTINCTROW Month ([OrderDate]) AS Month, AVG (Order.SubTatalCost) AS AvgOfSubTotalCost, MAX (Order.SubTotalCost) AS MaxOfSubTotalCost FROM Customer INNER JOIN [Order] ON Customer.CustomerlD = Order.CustoraerlD WHERE (((Customer.State) = "WA")) GROUP BY Month ([OrderDate]) HAVING (((Max (Orider. SubTotalCost)) < 4000));
Для определения числа различающихся цен на изделия, имеющиеся на складе, вам потребуется выполнить два запроса. Запрос DistinctPrice (Различающиеся цены) выглядит следующим образом:
SELECT DISTINCT Price FROM Catalog WHERE NumberlnStock > 0;
Запрос на вычисление количества различающихся цен CountDjstinctPrice (Количество различающихся цен) имеет вид:
SELECT COUNT (*) FROM DistinctPrice;
Чтобы выбрать информацию о компонентах и поставщиках, выпускающих каждый из этих компонентов, отсортировав данные по значению столбца ComponentlD, введите следующее:
SELECT DISTINCTROW Component.*, Supplier.SupplierName, Supplier.SupplierAddressl, Supplier.SuppLierAddress2, Supplier.SupplierCity, Supplier.SupplierState, Supplier.Supplier Postal, Supplier.Supplier Phone, Supplier.SupplierFax FROM Supplier INNER JOIN Component ON Supplier.SupplierlD = Component.SuppliefID ORDER BY Component.ComponentID;
Чтобы определить, какие поставщики не вьшускают компонент с номером 25, выполните следующий запрос:
SELECT DISTINCTROW Component.ComponentID, Supplier.SupplierlD, Supplier.SupplierName, Supplier.SupplierCity, Supplier.SupplierState FROM Supplier INNER JOIN Component ON Supplier.SupplierlD <> Component.SupplierlD WHERE Component.ComponentID = 25;
Чтобы определить, кто из клиентов не имеет в настоящее время заказов, введите следующую инструкцию:
SELECT DISTINCTROW Customer.CompanyName, Customer.City, Customer.State FROM Customer LEFT JOIN [Order] ON Customer.CustomerlD = Order.CustomerlD WHERE (((Order.CustomerlD) IS NULL));
Чтобы увидеть список изделий и их количество по текущим заказам,'отсортировав информацию по типам изделий, введите следующее:
SELECT DISTINCTROW Type.TypeDescription, Catalog.Description, Orderltem.OrderlD, Orderltem.Quantity FROM Type INNER JOIN (Catalog INNER JOIN Orderltem ON Catalog.CatalogltemID = Orderltem.CatalogltemID) ON Type.ItemTypeCode = Catalog.ItemTypeCode ORDER BY Type.TypeDescription;
Чтобы выбрать клиентов, которые сделали первые заказы в 1988 г. или ранее, и вывести их список в порядке возрастания почтовых индексов, введите следующее:
SELECT DISTINCTROW Customer.CompanyName, Customer. City, PostalCode FROM Customer WHERE (((1988) >= (SELECT MIN (Year (OrderDate)) FROM [Order] WHERE Order.CustomerlD = Customer.CustomerlD))) ORDER BY Customer.PostalCode;
Чтобы найти всех поставщиков и всех клиентов из штата Вашингтон и расположить их в порядке убывания почтового индекса, введите следующее:
SELECT DISTINCTROW Customer.CompanyName, Customer.City, PostalCode FROM Customer WHERE Customer.State = "WA" UNION SELECT DISTINCTROW Supplier.SupplierName, Supplier.SupplierCity, Supplier.SupplierPostal FROM Supplier WHERE Supplier.SupplierState = "WA" ORDER BY PostalCode;
Чтобы найти всех поставщиков, которые поставляют по крайней мере один
SELECT DISTINCTROW Supplier.SupplierName FROM Supplier WHERE Exists (SELECT * FROM Component WHERE Component.SupplierlD = Supplier.SupplierlD);
Чтобы найти компоненты, стоимость которых больше стоимости любого из компонентов с кодом 008, введите следующую инструкцию:
SELECT DISTINCTROW Component. Description, Component.OurCost FROM Component WHERE (Component.OurCost) > ALL (SELECT OurCost FROM Component WHERE ItemTypeCode = "008");
Чтобы найти все изделия, стоимость которых выше 100 долларов и при этом для
SELECT DISTINCTROW Catalog.CatalogltemID, Catalog.Description, Catalog.OurCost, Catalog.DaysToBuild, Catalog.NumberInStock FROM Catalog WHERE (Catalog.OurCost) > 100 AND ((Catalog. DaysToBuild) = 2 XOR (Catalog.NumberlnStock) < 5);
Чтобы выбрать из таблицы Customer (Клиент) и поместить во временную таблицу имена всех клиентов из штата Орегон, введите следующее:
INSERT INTO TempCust SELECT * FROM Customer WHERE State = "OR"; Подчиненный запрос Для использования в предикате сравнения выбирает из одного столбца некоторое множество значений либо вообще ни одного. Синтаксис: (SELECT [All | DISTINCT список-выбора FROM [{ имя-таблицы [[AS] псевдоним ] | имя-запроса-выборки [ [AS] псевдоним ]} | < таблица-объединения >},... [WHERE условие-отбора ] [GROUP BY имя-столбца,...] [HAVING условие-отбора ]
где список-выбора есть
{* | { выражение | имя-таблицы. * | имя-запроса,* | псевдоним. *}}
и где < та6лица-о6ъедчнения > есть
({ имя-таблицы [[AS] псевдоним ] | имя-запроса-выборки [[AS] псевдоним ]} | < таблица-объединения >} { имя-таблицы [[AS] псевдоним ] | имя-запроса-выборки [[AS] псевдоним ] | < таблица-объединения >} ON <условие-объединения>) Специальный символ «звездочка» (*) можно употреблять в списке выбора подчиненного запроса только в тех случаях, когда подчиненный запрос используется в предикате EXISTS или когда предложение FROM внутри подчиненного запроса ссылается на единственную таблицу или запрос, содержащие только один столбец. Для каждой таблицы и каждого запроса вы можете при желании определить альтернативное имя. Это имя вы можете использовать как псевдоним вместо полного имени таблицы при задании имен столбцов в списке выбора, в предложении WHERE или в подчиненных предложениях. Если вы производите объединение таблицы или запроса с самим собой, то вам придется употреблять альтернативное имя, чтобы указать, на какую копию таблицы или запроса вы ссылаетесь при задании списка выбора, условий объединения или условий отбора. Если имя таблицы или имя запроса совпадает с зарезервированным словом языка SQL (например, «Order»), такое имя нужно заключать в квадратные скобки. Когда вы перечисляете несколько таблиц или запросов и не указываете условий объединения, в качестве исходной таблицы используется Декартово произведение всех таблиц. Например, FROM TableA, TableB заставляет Access считать областью поиска все строки из таблицы TableA, присоединенные к каждой из строк таблицы ТаblеВ. В этом случае число логических записей, обрабатываемых Access, может быть равно числу строк в таблице TableA, умноженному на число строк в таблице ТаblеВ. В качестве результата Access возвратит те записи, для которых условия отбора, определенные в предложениях WHERE и HAVING, примут значение Истина. В условии отбора в предложении WHERE подчиненного запроса вы можете ссылаться на столбцы любой таблицы или запроса, определенных во внешних запросах. Если ссылка на таблицу или запрос может восприниматься неоднозначно, нужно полностью задавать имя столбца. В предложении GROUP BY вы можете ссылаться на любой столбец из любой таблицы, указанной в предложении FROM, даже если этот столбец не входит в список выбора. Если перед предложением GROUP BY расположено предложение WHERE, Access формирует группы из строк, отобранных после применения предложения WHERE. Когда вы включаете предложение GROUP BY в инструкцию SELECT, спи
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|