Использование итоговых функций
Основные понятия
Всякая профессиональная деятельность так или иначе связана с информацией, с организацией ее сбора, хранения, выборки. Можно сказать, что неотъемлемой частью повседневной жизни стали базы данных, для поддержки которых требуется некоторый организационный метод, или механизм. Такой механизм называется системой управления базами данных (СУБД). Итак, введем основные понятия. База данных (БД) – совместно используемый набор логически связанных данных (и их описание), предназначенный для удовлетворения информационных потребностей организации. СУБД (система управления базами данных) – программное обеспечение, с помощью которого пользователи могут определять, создавать и поддерживать базу данных, а также получать к ней контролируемый доступ. Системы управления базами данных существуют уже много лет, многие из них обязаны своим происхождением системам с неструктурированными файлами на больших ЭВМ. Наряду с общепринятыми современными технологиями в области систем управления базами данных начинают появляться новые направления, что обусловлено требованиями растущего бизнеса, все увеличивающимися объемами корпоративных данных и, конечно же, влиянием технологий Internet. Реляционные базы данных Управление основными потоками информации осуществляется с помощью так называемых систем управления реляционными базами данных, которые берут свое начало в традиционных системах управления базами данных. Именно объединение реляционных баз данных и клиент-серверных технологий позволяет современному предприятию успешно управлять собственными данными, оставаясь конкурентоспособным на рынке товаров и услуг.
Реляционные БД имеют мощный теоретический фундамент, основанный на математической теории отношений. Появление теории реляционных баз данных дало толчок к разработке ряда языков запросов, которые можно отнести к двум классам: алгебраические языки, позволяющие выражать запросы средствами специализированных операторов, применяемых к отношениям; языки исчисления предикатов, представляющие собой набор правил для записи выражения, определяющего новое отношение из заданной совокупности существующих отношений. Следовательно, исчисление предикатов есть метод определения того отношения, которое желательно получить как ответ на запрос из отношений, уже имеющихся в базе данных. В реляционной модели объекты реального мира и взаимосвязи между ними представляются с помощью совокупности связанных между собой таблиц (отношений). Даже в том случае, когда функции СУБД используются для выбора информации из одной или нескольких таблиц (т.е. выполняется запрос), результат также представляется в табличном виде. Более того, можно выполнить запрос с применением результатов другого запроса. Каждая таблица БД представляется как совокупность строк и столбцов, где строки (записи) соответствуют экземпляру объекта, конкретному событию или явлению, а столбцы (поля) – атрибутам (признакам, характеристикам, параметрам) объекта, события, явления. В каждой таблице БД необходимо наличие первичного ключа – так именуют поле или набор полей, однозначно идентифицирующий каждый экземпляр объекта или запись. Значение первичного ключа в таблице БД должно быть уникальным, т.е. в таблице не допускается наличие двух и более записей с одинаковыми значениями первичного ключа. Он должен быть минимально достаточным, а значит, не содержать полей, удаление которых не отразится на его уникальности. Реляционные связи между таблицами баз данных
Связи между объектами реального мира могут находить свое отражение в структуре данных, а могут и подразумеваться, т.е. присутствовать на неформальном уровне. Между двумя или более таблицами базы данных могут существовать отношения подчиненности, которые определяют, что для каждой записи главной таблицы (называемой еще родительской) возможно наличие одной или нескольких записей в подчиненной таблице (называемой еще дочерней). Выделяют три разновидности связи между таблицами базы данных: "один–ко–многим"; "один–к–одному"; "многие–ко–многим". Отношение "один–ко–многим" Отношение "один–ко–многим" имеет место, когда одной записи родительской таблицы может соответствовать несколько записей дочерней. Связь "один–ко–многим" иногда называют связью "многие–к–одному". И в том, и в другом случае сущность связи между таблицами остается неизменной. Связь "один–ко–многим" является самой распространенной для реляционных баз данных. Она позволяет моделировать также иерархические структуры данных. Отношение "один–к–одному" Отношение "один–к–одному" имеет место, когда одной записи в родительской таблице соответствует одна запись в дочерней. Это отношение встречается намного реже, чем отношение "один–ко–многим". Его используют, если не хотят, чтобы таблица БД "распухала" от второстепенной информации, однако для чтения связанной информации в нескольких таблицах приходится производить ряд операций чтения вместо одной, когда данные хранятся в одной таблице. Отношение "многие–ко–многим" Отношение "многие–ко–многим" применяется в следующих случаях: одной записи в родительской таблице соответствует более одной записи в дочерней; одной записи в дочерней таблице соответствует более одной записи в родительской. Всякую связь "многие–ко–многим" в реляционной базе данных необходимо заменить на связь "один–ко–многим" (одну или более) с помощью введения дополнительных таблиц.
Предложение SELECT Оператор SELECT – один из наиболее важных и самых распространенных операторов SQL. Он позволяет производить выборки данных из таблиц и преобразовывать к нужному виду полученные результаты. Будучи очень мощным, он способен выполнять действия, эквивалентные операторам реляционной алгебры, причем в пределах единственной выполняемой команды. При его помощи можно реализовать сложные и громоздкие условия отбора данных из различных таблиц.
Оператор SELECT – средство, которое полностью абстрагировано от вопросов представления данных, что помогает сконцентрировать внимание на проблемах доступа к данным. Примеры его использования наглядно демонстрируют один из основополагающих принципов больших (промышленных) СУБД: средства хранения данных и доступа к ним отделены от средств представления данных. Операции над данными производятся в масштабе наборов данных, а не отдельных записей. Оператор SELECT имеет следующий формат: SELECT [ALL | DISTINCT ] {*|[имя_столбца [AS новое_имя]]} [,...n] FROM имя_таблицы [[AS] псевдоним] [,...n] [WHERE <условие_поиска>] [GROUP BY имя_столбца [,...n]] [HAVING <критерии выбора групп>] [ORDER BY имя_столбца [,...n]]
Оператор SELECT определяет поля (столбцы), которые будут входить в результат выполнения запроса. В списке они разделяются запятыми и приводятся в такой очередности, в какой должны быть представлены в результате запроса. Если используется имя поля, содержащее пробелы или разделители, его следует заключить в квадратные скобки. Символом * можно выбрать все поля, а вместо имени поля применить выражение из нескольких имен. Если обрабатывается ряд таблиц, то (при наличии одноименных полей в разных таблицах) в списке полей используется полная спецификация поля, т.е. Имя_таблицы.Имя_поля. Предложение FROM Предложение FROM задает имена таблиц и представлений, которые содержат поля, перечисленные в операторе SELECT. Необязательный параметр псевдонима – это сокращение, устанавливаемое для имени таблицы. Обработка элементов оператора SELECT выполняется в следующей последовательности: FROM – определяются имена используемых таблиц; WHERE – выполняется фильтрация строк объекта в соответствии с заданными условиями;
GROUP BY – образуются группы строк, имеющих одно и то же значение в указанном столбце; HAVING – фильтруются группы строк объекта в соответствии с указанным условием; SELECT – устанавливается, какие столбцы должны присутствовать в выходных данных; ORDER BY – определяется упорядоченность результатов выполнения операторов. Порядок предложений и фраз в операторе SELECT не может быть изменен. Только два предложения SELECT и FROM являются обязательными, все остальные могут быть опущены. SELECT – закрытая операция: результат запроса к таблице представляет собой другую таблицу. Существует множество вариантов записи данного оператора, что иллюстрируется приведенными ниже примерами.
Пример 4.1. Составить список сведений о всех клиентах. SELECT * FROM Клиент Пример 4.1. Список сведений о всех клиентах.
Параметр WHERE определяет критерий отбора записей из входного набора. Но в таблице могут присутствовать повторяющиеся записи (дубликаты). Предикат ALL задает включение в выходной набор всех дубликатов, отобранных по критерию WHERE. Нет необходимости указывать ALL явно, поскольку это значение действует по умолчанию.
Пример 4.2. Составить список всех фирм. SELECT ALL Клиент.Фирма FROM Клиент Или (что эквивалентно) SELECT Клиент.Фирма FROM Клиент Пример 4.2. Список всех фирм.
Результат выполнения запроса может содержать дублирующиеся значения, поскольку в отличие от операций реляционной алгебры оператор SELECT не исключает повторяющихся значений при выполнении выборки данных. Предикат DISTINCT следует применять в тех случаях, когда требуется отбросить блоки данных, содержащие дублирующие записи в выбранных полях. Значения для каждого из приведенных в инструкции SELECT полей должны быть уникальными, чтобы содержащая их запись смогла войти в выходной набор. Причиной ограничения в применении DISTINCT является то обстоятельство, что его использование может резко замедлить выполнение запросов. Откорректированный пример 4.2 выглядит следующим образом: SELECT DISTINCT Клиент.Фирма FROM Клиент Предложение WHERE С помощью WHERE-параметра пользователь определяет, какие блоки данных из приведенных в списке FROM таблиц появятся в результате запроса. За ключевым словом WHERE следует перечень условий поиска, определяющих те строки, которые должны быть выбраны при выполнении запроса. Существует пять основных типов условий поиска (или предикатов): Сравнение: сравниваются результаты вычисления одного выражения с результатами вычисления другого. Диапазон: проверяется, попадает ли результат вычисления выражения в заданный диапазон значений. Принадлежность множеству: проверяется, принадлежит ли результат вычислений выражения заданному множеству значений.
Соответствие шаблону: проверяется, отвечает ли некоторое строковое значение заданному шаблону. Значение NULL: проверяется, содержит ли данный столбец определитель NULL (неизвестное значение). Сравнение В языке SQL можно использовать следующие операторы сравнения: = – равенство; < – меньше; > – больше; <= – меньше или равно; >= – больше или равно; <> – не равно.
Пример 4.3. Показать все операции отпуска товаров объемом больше 20. SELECT * FROM Сделка WHERE Количество>20 Пример 4.3. Операции отпуска товаров объемом больше 20.
Более сложные предикаты могут быть построены с помощью логических операторов AND, OR или NOT, а также скобок, используемых для определения порядка вычисления выражения. Вычисление выражения в условиях выполняется по следующим правилам: Выражение вычисляется слева направо. Первыми вычисляются подвыражения в скобках. Операторы NOT выполняются до выполнения операторов AND и OR. Операторы AND выполняются до выполнения операторов OR. Для устранения любой возможной неоднозначности рекомендуется использовать скобки.
Пример 4.4. Вывести список товаров, цена которых больше или равна 100 и меньше или равна 150. SELECT Название, Цена FROM Товар WHERE Цена>=100 And Цена<=150 Пример 4.4. Список товаров, цена которых больше или равна 100 и меньше или равна 150.
Пример 4.5. Вывести список клиентов из Москвы или из Самары. SELECT Фамилия, ГородКлиента FROM Клиент WHERE ГородКлиента="Москва" Or ГородКлиента="Самара" Пример 4.5. Список клиентов из Москвы или из Самары.
Диапазон Оператор BETWEEN используется для поиска значения внутри некоторого интервала, определяемого своими минимальным и максимальным значениями. При этом указанные значения включаются в условие поиска.
Пример 4.6. Вывести список товаров, цена которых лежит в диапазоне от 100 до 150 (запрос эквивалентен примеру 4.4). SELECT Название, Цена FROM Товар WHERE Цена BETWEEN 100 And 150 Пример 4.6. Список товаров, цена которых лежит в диапазоне от 100 до 150.
При использовании отрицания NOT BETWEEN требуется, чтобы проверяемое значение лежало вне границ заданного диапазона.
Пример 4.7. Вывести список товаров, цена которых не лежит в диапазоне от 100 до 150. SELECT Товар.Название, Товар.Цена FROM Товар WHERE Товар.Цена NOT BETWEEN 100 And 150
Или (что эквивалентно) SELECT Товар.Название, Товар.Цена FROM Товар WHERE (Товар.Цена<100) OR (Товар.Цена>150) Пример 4.7. Список товаров, цена которых не лежит в диапазоне от 100 до 150.
Принадлежность множеству Оператор IN используется для сравнения некоторого значения со списком заданных значений, при этом проверяется, соответствует ли результат вычисления выражения одному из значений в предоставленном списке. При помощи оператора IN может быть достигнут тот же результат, что и в случае применения оператора OR, однако оператор IN выполняется быстрее.
Пример 4.8. Вывести список клиентов из Москвы или из Самары (запрос эквивалентен примеру 4.5). SELECT Фамилия, ГородКлиента FROM Клиент WHERE ГородКлиента IN ("Москва", "Самара") Пример 4.8. Список клиентов из Москвы или из Самары
NOT IN используется для отбора любых значений, кроме тех, которые указаны в представленном списке.
Пример 4.9. Вывести список клиентов, проживающих не в Москве и не в Самаре. SELECT Фамилия, ГородКлиента FROM Клиент WHERE ГородКлиента NOT IN ("Москва","Самара") Пример 4.9. Список клиентов, проживающих не в Москве и не в Самаре.
Соответствие шаблону С помощью оператора LIKE можно выполнять сравнение выражения с заданным шаблоном, в котором допускается использование символов-заменителей: Символ % – вместо этого символа может быть подставлено любое количество произвольных символов. Символ _ заменяет один символ строки. [] – вместо символа строки будет подставлен один из возможных символов, указанный в этих ограничителях. [^] – вместо соответствующего символа строки будут подставлены все символы, кроме указанных в ограничителях.
Пример 4.10. Найти клиентов, у которых в номере телефона вторая цифра – 4. SELECT Клиент.Фамилия, Клиент.Телефон FROM Клиент WHERE Клиент.Телефон LIKE '_4%' Пример 4.10. Выборка клиентов, у которых в номере телефона вторая цифра – 4.
Пример 4.11. Найти клиентов, у которых в номере телефона вторая цифра – 2 или 4. SELECT Клиент.Фамилия, Клиент.Телефон FROM Клиент WHERE Клиент.Телефон LIKE '_[2,4]%' Пример 4.11. Выборка клиентов, у которых в номере телефона вторая цифра – 2 или 4.
Пример 4.12. Найти клиентов, у которых в номере телефона вторая цифра 2, 3 или 4. SELECT Клиент.Фамилия, Клиент.Телефон FROM Клиент WHERE Клиент.Телефон LIKE '_[2-4]%' Пример 4.12. Выборка клиентов, у которых в номере телефона вторая цифра 2, 3 или 4.
Пример 4.13. Найти клиентов, у которых в фамилии встречается слог "ро". SELECT Клиент.Фамилия FROM Клиент WHERE Клиент.Фамилия LIKE "%ро%" Пример 4.13. Выборка клиентов, у которых в фамилии встречается слог "ро".
Значение NULL Оператор IS NULL используется для сравнения текущего значения со значением NULL – специальным значением, указывающим на отсутствие любого значения. NULL – это не то же самое, что знак пробела (пробел – допустимый символ) или ноль (0 – допустимое число). NULL отличается и от строки нулевой длины (пустой строки).
Пример 4.14. Найти сотрудников, у которых нет телефона (поле Телефон не содержит никакого значения). SELECT Фамилия, Телефон FROM Клиент WHERE Телефон IS NULL Пример 4.14. Выборка сотрудников, у которых нет телефона (поле Телефон не содержит никакого значения).
IS NOT NULL используется для проверки присутствия значения в поле.
Пример 4.15. Выборка клиентов, у которых есть телефон (поле Телефон содержит какое-либо значение). SELECT Клиент.Фамилия, Клиент.Телефон FROM Клиент WHERE Клиент.Телефон Is Not Null Пример 4.15. Найти клиентов, у которых есть телефон (поле Телефон содержит какое-либо значение).
Предложение ORDER BY В общем случае строки в результирующей таблице SQL-запроса никак не упорядочены. Однако их можно требуемым образом отсортировать, для чего в оператор SELECT помещается фраза ORDER BY, которая сортирует данные выходного набора в заданной последовательности. Сортировка может выполняться по нескольким полям, в этом случае они перечисляются за ключевым словом ORDER BY через запятую. Способ сортировки задается ключевым словом, указываемым в рамках параметра ORDER BY следом за названием поля, по которому выполняется сортировка. По умолчанию реализуется сортировка по возрастанию. Явно она задается ключевым словом ASC. Для выполнения сортировки в обратной последовательности необходимо после имени поля, по которому она выполняется, указать ключевое слово DESC. Фраза ORDER BY позволяет упорядочить выбранные записи в порядке возрастания или убывания значений любого столбца или комбинации столбцов, независимо от того, присутствуют эти столбцы в таблице результата или нет. Фраза ORDER BY всегда должна быть последним элементом в операторе SELECT.
Пример 4.16.Вывести список клиентов в алфавитном порядке. SELECT Клиент.Фамилия, Клиент.Фирма FROM Клиент ORDER BY Клиент.Фамилия Пример 4.16. Список клиентов в алфавитном порядке.
Во фразе ORDER BY может быть указано и больше одного элемента. Главный (первый) ключ сортировки определяет общую упорядоченность строк результирующей таблицы. Если во всех строках результирующей таблицы значения главного ключа сортировки являются уникальными, нет необходимости использовать дополнительные ключи сортировки. Однако, если значения главного ключа не уникальны, в результирующей таблице будет присутствовать несколько строк с одним и тем же значением старшего ключа сортировки. В этом случае, возможно, придется упорядочить строки с одним и тем же значением главного ключа по какому-либо дополнительному ключу сортировки.
Пример 4.17. Вывести список фирм и клиентов. Названия фирм упорядочить в алфавитном порядке, имена клиентов в каждой фирме отсортировать в обратном порядке. SELECT Клиент.Фирма, Клиент.Фамилия FROM Клиент ORDER BY Клиент.Фирма, Клиент.Фамилия DESC Пример 4.17. Список фирм и клиентов. Названия фирм в алфавитном порядке, имена клиентов в каждой фирме в обратном порядке.
Использование итоговых функций С помощью итоговых (агрегатных) функций в рамках SQL-запроса можно получить ряд обобщающих статистических сведений о множестве отобранных значений выходного набора. Пользователю доступны следующие основные итоговые функции: Count (Выражение) - определяет количество записей в выходном наборе SQL-запроса; Min/Max (Выражение) - определяют наименьшее и наибольшее из множества значений в некотором поле запроса; Avg (Выражение) - эта функция позволяет рассчитать среднее значение множества значений, хранящихся в определенном поле отобранных запросом записей. Оно является арифметическим средним значением, т.е. суммой значений, деленной на их количество. Sum (Выражение) - вычисляет сумму множества значений, содержащихся в определенном поле отобранных запросом записей. Чаще всего в качестве выражения выступают имена столбцов. Выражение может вычисляться и по значениям нескольких таблиц. Все эти функции оперируют со значениями в единственном столбце таблицы или с арифметическим выражением и возвращают единственное значение. Функции COUNT, MIN и MAX применимы как к числовым, так и к нечисловым полям, тогда как функции SUM и AVG могут использоваться только в случае числовых полей, за исключением COUNT(*). При вычислении результатов любых функций сначала исключаются все пустые значения, после чего требуемая операция применяется только к оставшимся конкретным значениям столбца. Вариант COUNT(*) - особый случай использования функции COUNT, его назначение состоит в подсчете всех строк в результирующей таблице, независимо от того, содержатся там пустые, дублирующиеся или любые другие значения. Если до применения обобщающей функции необходимо исключить дублирующиеся значения, следует перед именем столбца в определении функции поместить ключевое слово DISTINCT. Оно не имеет смысла для функций MIN и MAX, однако его использование может повлиять на результаты выполнения функций SUM и AVG, поэтому необходимо заранее обдумать, должно ли оно присутствовать в каждом конкретном случае. Кроме того, ключевое слово DISTINCT может быть указано в любом запросе не более одного раза. Очень важно отметить, что итоговые функции могут использоваться только в списке предложения SELECT и в составе предложения HAVING. Во всех других случаях это недопустимо. Если список в предложении SELECT содержит итоговые функции, а в тексте запроса отсутствует фраза GROUP BY, обеспечивающая объединение данных в группы, то ни один из элементов списка предложения SELECT не может включать каких-либо ссылок на поля, за исключением ситуации, когда поля выступают в качестве аргументов итоговых функций.
Пример 6.4. Определить первое по алфавиту название товара. SELECT Min(Товар.Название) AS Min_Название FROM Товар 6.4. Определение первого по алфавиту названия товара.
Пример 6.5. Определить количество сделок. SELECT Count(*) AS Количество_сделок FROM Сделка 6.5. Определить количество сделок.
Пример 6.6. Определить суммарное количество проданного товара. SELECT Sum(Сделка.Количество) AS Количество_товара FROM Сделка 6.6. Определение суммарного количества проданного товара.
Пример 6.7. Определить среднюю цену проданного товара. SELECT Avg(Товар.Цена) AS Avg_Цена FROM Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара; 6.7. Определение средней цены проданного товара.
Пример 6.8. Подсчитать общую стоимость проданных товаров. SELECT Sum(Товар.Цена*Сделка.Количество) AS Стоимость FROM Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара 6.8. Подсчет общей стоимости проданных товаров.
Предложение GROUP BY Часто в запросах требуется формировать промежуточные итоги, что обычно отображается появлением в запросе фразы "для каждого...". Для этой цели в операторе SELECT используется предложение GROUP BY. Запрос, в котором присутствует GROUP BY, называется группирующим запросом, поскольку в нем группируются данные, полученные в результате выполнения операции SELECT, после чего для каждой отдельной группы создается единственная суммарная строка. Стандарт SQL требует, чтобы предложение SELECT и фраза GROUP BY были тесно связаны между собой. При наличии в операторе SELECT фразы GROUP BY каждый элемент списка в предложении SELECT должен иметь единственное значение для всей группы. Более того, предложение SELECT может включать только следующие типы элементов: имена полей, итоговые функции, константы и выражения, включающие комбинации перечисленных выше элементов. Все имена полей, приведенные в списке предложения SELECT, должны присутствовать и во фразе GROUP BY - за исключением случаев, когда имя столбца используется в итоговой функции. Обратное правило не является справедливым - во фразе GROUP BY могут быть имена столбцов, отсутствующие в списке предложения SELECT. Если совместно с GROUP BY используется предложение WHERE, то оно обрабатывается первым, а группированию подвергаются только те строки, которые удовлетворяют условию поиска. Стандартом SQL определено, что при проведении группирования все отсутствующие значения рассматриваются как равные. Если две строки таблицы в одном и том же группируемом столбце содержат значение NULL и идентичные значения во всех остальных непустых группируемых столбцах, они помещаются в одну и ту же группу.
Пример 6.9. Вычислить средний объем покупок, совершенных каждым покупателем. SELECT Клиент.Фамилия, Avg(Сделка.Количество) AS Среднее_количество FROM Клиент INNER JOIN Сделка ON Клиент.КодКлиента=Сделка.КодКлиента GROUP BY Клиент.Фамилия 6.9. Вычисление среднего объема покупок, совершенных каждым покупателем.
Фраза "каждым покупателем" нашла свое отражение в SQL-запросе в виде предложения GROUP BY Клиент.Фамилия.
Пример 6.10. Определить, на какую сумму был продан товар каждого наименования. SELECT Товар.Название, Sum(Товар.Цена*Сделка.Количество) AS Стоимость FROM Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара GROUP BY Товар.Название 6.10. Определение, на какую сумму был продан товар каждого наименования.
Пример 6.11. Подсчитать количество сделок, осуществленных каждой фирмой. SELECT Клиент.Фирма, Count(Сделка.КодСделки) AS Количество_сделок FROM Клиент INNER JOIN Сделка ON Клиент.КодКлиента=Сделка.КодКлиента GROUP BY Клиент.Фирма 6.11. Подсчет количества сделок, осуществленных каждой фирмой.
Пример 6.12. Подсчитать общее количество купленного для каждой фирмы товара и его стоимость. SELECT Клиент.Фирма, Sum(Сделка.Количество) AS Общее_Количество, Sum(Товар.Цена*Сделка.Количество) AS Стоимость FROM Товар INNER JOIN (Клиент INNER JOIN Сделка ON Клиент.КодКлиента=Сделка.КодКлиента) ON Товар.КодТовара=Сделка.КодТовара GROUP BY Клиент.Фирма 6.12. Подсчет общего количества купленного для каждой фирмы товара и его стоимости.
Пример 6.13. Определить суммарную стоимость каждого товара за каждый месяц. SELECT Товар.Название, Month(Сделка.Дата) AS Месяц, Sum(Товар.Цена*Сделка.Количество) AS Стоимость FROM Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара GROUP BY Товар.Название, Month(Сделка.Дата) 6.13. Определение суммарной стоимости каждого товара за каждый месяц.
Пример 6.14. Определить суммарную стоимость каждого товара первого сорта за каждый месяц. SELECT Товар.Название, Month(Сделка.Дата) AS Месяц, Sum(Товар.Цена*Сделка.Количество) AS Стоимость FROM Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара WHERE Товар.Сорт="Первый" GROUP BY Товар.Название, Month(Сделка.Дата) 6.14. Определение суммарной стоимости каждого товара первого сорта за каждый месяц.
Понятие подзапроса Часто невозможно решить поставленную задачу путем одного запроса. Это особенно актуально, когда при использовании условия поиска в предложении WHERE значение, с которым надо сравнивать, заранее не определено и должно быть вычислено в момент выполнения оператора SELECT. В таком случае приходят на помощь законченные операторы SELECT, внедренные в тело другого оператора SELECT. Внутренний подзапрос представляет собой также оператор SELECT, а кодирование его предложений подчиняется тем же правилам, что и основного оператора SELECT. Внешний оператор SELECT использует результат выполнения внутреннего оператора для определения содержания окончательного результата всей операции. Внутренние запросы могут быть помещены непосредственно после оператора сравнения (=, <, >, <=, >=, <>) в предложения WHERE и HAVING внешнего оператора SELECT – они получают название подзапросов или вложенных запросов. Кроме того, внутренние операторы SELECT могут применяться в операторах INSERT, UPDATE и DELETE. Подзапрос – это инструмент создания временной таблицы, содержимое которой извлекается и обрабатывается внешним оператором. Текст подзапроса должен быть заключен в скобки. К подзапросам применяются следующие правила и ограничения: фраза ORDER BY не используется, хотя и может присутствовать во внешнем подзапросе; список в предложении SELECT состоит из имен отдельных столбцов или составленных из них выражений – за исключением случая, когда в подзапросе присутствует ключевое слово EXISTS; по умолчанию имена столбцов в подзапросе относятся к таблице, имя которой указано в предложении FROM. Однако допускается ссылка и на столбцы таблицы, указанной во фразе FROM внешнего запроса, для чего применяются квалифицированные имена столбцов (т.е. с указанием таблицы); если подзапрос является одним из двух операндов, участвующих в операции сравнения, то запрос должен указываться в правой части этой операции. Существует два типа подзапросов: Скалярный подзапрос возвращает единственное значение. В принципе, он может использоваться везде, где требуется указать единственное значение. Табличный подзапрос возвращает множество значений, т.е. значения одного или нескольких столбцов таблицы, размещенные в более чем одной строке. Он возможен везде, где допускается наличие таблицы. Использование подзапросов, возвращающих единичное значение Пример 7.1. Определить дату продажи максимальной партии товара. SELECT Дата, Количество FROM Сделка WHERE Количество=(SELECT Max(Количество) FROM Сделка) Пример 7.1. Определение даты продажи максимальной партии товара.
Во вложенном подзапросе определяется максимальное количество товара. Во внешнем подзапросе – дата, для которой количество товара оказалось равным максимальному. Необходимо отметить, что нельзя прямо использовать предложение WHERE Количество=Max(Количество), поскольку применять обобщающие функции в предложениях WHERE запрещено. Для достижения желаемого результата следует создать подзапрос, вычисляющий максимальное значение количества, а затем использовать его во внешнем операторе SELECT, предназначенном для выборки дат сделок, где количество товара совпало с максимальным значением.
Пример 7.2. Определить даты сделок, превысивших по количеству товара среднее значение и указать для этих сделок превышение над средним уровнем. SELECT Дата, Количество, Количество-(SELECT Avg(Количество) FROM Сделка) AS Превышение FROM Сделка WHERE Количество> (SELECT Avg(Количество) FROM Сделка) Пример 7.2. Определение даты сделок, превысивших по количеству товара среднее значение и указать для этих сделок превышение над средним уровнем.
В приведенном примере результат подзапроса, представляющий собой среднее значение количества товара по всем сделкам вообще, используется во внешнем операторе SELECT как для вычисления отклонения количества от среднего уровня, так и для отбора сведений о датах.
Пример 7.3. Определить клиентов, совершивших сделки с максимальным количеством товара. SELECT Клиент.Фамилия FROM Клиент INNER JOIN Сделка ON Клиент.КодКлиента=Сделка.КодКлиента WHERE Сделка.Количество= (SELECT Max(Сделка.Количество) FROM Сделка) Пример 7.3. Определение клиентов, совершивших сделки с максимальным количеством товара.
Здесь показан пример использования подзапроса при выборке данных из разных таблиц.
Пример 7.4. Определить клиентов, в сделках которых количество товара отличается от максимального не более чем на 10%. SELECT Клиент.Фамилия, Сделка.Количество FROM Клиент INNER JOIN Сделка ON Клиент.КодКлиента= Сделка.КодКлиента WHERE Сделка.Количество>=0.9* (SELECT Max(Сделка.Количество) FROM Сделка) Пример 7.4. Определение клиентов, в сделках которых количество товара отличается от максимального не более чем на 10%.
Покажем, как применяются подзапросы в предложении HAVING.
Пример 7.5. Определить даты, когда среднее количество проданного за день товара оказалось больше 20 единиц. SELECT Сделка.Дата, Avg(Сделка.Количество) AS Среднее_за_день FROM Сделка GROUP BY Сделка.Дата HAVING Avg(Сделка.Количество)>20 Пример 7.5. Определение даты, когда среднее количество проданного за день товара оказалось больше 20 единиц.
За каждый день определяется среднее количество товара, которое сравнивается с числом 20. Добавим в запрос подзапрос.
Пример 7.6. Определить даты, когда среднее количество проданного за день товара оказалось больше среднего показателя по всем сделкам вообще. SELECT Сделка.Дата, Avg(Сделка.Количество) AS Среднее_за_день FROM Сделка GROUP BY Сделка.Дата HAVING Avg(Сделка.Количество)> (SELECT Avg(Сделка.Количество) FROM Сделка) Пример 7.6. Определение даты, когда среднее количество проданного за день товара оказалось больше среднего показателя по всем сделкам вообще.
Внутренний подзапрос определяет средний по всем сделкам показатель, с которым во внешнем запросе сравнивается среднее за каждый день количество товара. Язык SQL ориентирован на выполнение операций над группами записей, хотя в некоторых случаях их можно проводить и над отдельной записью. Запросы действия представляют собой достаточно мощное средство, так как позволяют оперировать не только отдельными строками, но и набором строк. С помощью запросов действия пользователь может добавить, удалить или обновить блоки данных. Существует три вида запросов действия: INSERT INTO – запрос добавления; DELETE – запрос удаления; UPDATE – запрос обновления. Запрос добавления
Оператор INSERT применяется для добавления записей в таблицу. Формат оператора: <оператор_вставки>::=INSERT INTO <имя_таблицы> [(имя_столбца [,...n])] {VALUES (значение[,...n])| <SELECT_оператор>} Здесь параметр имя_таблицы представляет собой либо имя таблицы базы данных, либо имя обновляемого представления. Первая форма оператора INSERT с параметром VALUES предназначена для вставки единственной строки в указанную таблицу. Список столбцов указывает столбцы, которым будут присвоены значения в добавляемых записях. Список может быть опущен, тогда подразумеваются все столбцы таблицы (кроме объявленных как счетчик), причем в определенном порядке, установленном при создании таблицы. Если в операторе INSERT указывается конкретный список имен полей, то любые пропущенные в нем столбцы должны быть объявлены при создании таблицы как допускающие значение NULL, за исключением тех случаев, когда при описании столбца использовался параметр DEFAULT. Список значений должен следующим образом соответствовать списку столбцов: количество элементов в обоих списках должно быть одинаковым; должно существовать прямое соответствие между позицией одного и того же элемента в обоих списках, поэтому первый элемент списка значений должен относиться к первому столбцу в списке столбцов, второй – ко второму столбцу и т.д. типы данных элементов в списке значений должны быть совместимы с типами данных соответствующих столбцов таблицы.
Пример 8.1. Добавить в таблицу ТОВАР новую запись. INSERT INTO Товар (Название, Тип, Цена) VALUES(" Славянский ", " шоколад ", 12) Пример 8.1. Добавление в таблицу ТОВАР новой записи.
Если столбцы таблицы ТОВАР указаны в полном составе и в том порядке, в котором они перечислены при создании таблицы ТОВАР, оператор можно упростить. INSERT INTO Товар VALUES (" Славянский ", " шоколад ", 12) Вторая форма оператора INSERT с параметром SELECT позволяет скопировать множество строк из одной таблицы в другую. Предложение SELECT может представлять собой любой допустимый оператор SELECT. Вставляемые в указанную таблицу строки в
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|