связано с тем, что ничто – и даже само NULL-значение – не считается равным другому NULL-значению. (Несмотря на это, два неопределенных значения рассматриваются, однако, как дубликаты друг друга при исключении дубликатов, и предложение SELECT DISTINCT даст в результате не более одного NULL-значения. ) Выборка с упорядочением
Простейший вариант этой фразы – упорядочение строк результата по значению одного из столбцов с указанием порядка сортировки или без такого указания. (По умолчанию строки будут сортироваться в порядке возрастания значений в указанном столбце. ) Например, выдать перечень продуктов и содержание в них основных веществ в порядке убывания содержания белка SELECT Продукт, Белки, Жиры, Углев FROM Продукты ORDER BY Белки DESC; Продукт Белки Жиры Углев Судак Говядина Творог Яйца Кофе Мука
При включении в список ORDER BY нескольких столбцов СУБД сортирует строки результата по значениям первого столбца списка пока не появится несколько строк с одинаковыми значениями данных в этом столбце. Такие строки сортируются по значениям следующего столбца из списка ORDER BY и т. д. Например, выдать содержимое таблицы Блюда, отсортировав ее строки по видам блюд и основе: Результат: SELECT * FROM Блюда ORDER BY В Основа; БЛ Блюдо В Основа Выход Труд 21 Пудинг рисовый Г Крупа 160. 6 20 Каша рисовая Г Крупа 210. 4 18 Сырники Г Молоко 220. 4 ... . 16 Драчена Г Яйца 180. 4 28 Крем творожный Д Молоко 160. 4 ... . 26 Яблоки печеные Д Фрукты 160. 3 7 Сметана З Молоко 140. 1 8 Творог З Молоко 140. 2 2 Салат мясной З Мясо 200. 4 6 Мясо с гарниром З Мясо 250. 3 1 Салат летний З Овощи 200. 3 ... .
Кроме того, в список ORDER BY можно включать не только имя столбца, а его порядковую позицию в перечне SELECT. Благодаря этому возможно упорядочение результатов на основе вычисляемых столбцов, не имеющих имен. Например, запрос SELECT Продукт, ((Белки+Углев)*4. 1+Жиры*9. 3) FROM Продукты ORDER BY 2;
позволит получить список продуктов, показанный на рис. 2. 3, в – переупорядоченный по возрастанию значений калорийности список рис. 2. 3, а. Агрегирование данных SQL-функции
В SQL существует ряд специальных стандартных функций (SQL-функций). Кроме специального случая COUNT(*) каждая из этих функций оперирует совокупностью значений столбца некоторой таблицы и создает единственное значение, определяемое так: COUNT число значений в столбце, SUM сумма значений в столбце, AVG среднее значение в столбце, MAX самое большое значение в столбце, MIN самое малое значение в столбце.
Для функций SUM и AVG рассматриваемый столбец должен содержать числовые значения. Следует отметить, что здесь столбец – это столбец виртуальной таблицы, в которой могут содержаться данные не только из столбца базовой таблицы, но и данные, полученные путем функционального преобразования и (или) связывания символами арифметических операций значений из одного или нескольких столбцов. При этом выражение, определяющее столбец такой таблицы, может быть сколь угодно сложным, но не должно содержать SQL-функций (вложенность SQL-функций не допускается). Однако из SQL-функций можно составлять любые выражения. Аргументу всех функций, кроме COUNT(*), может предшествовать ключевое слово DISTINCT (различный), указывающее, что избыточные дублирующие значения должны быть исключены перед тем, как будет применяться функция. Специальная же функция COUNT(*) служит для подсчета всех без исключения строк в таблице (включая дубликаты). Функции без использования фразы GROUP BY
Если не используется фраза GROUP BY, то в перечень элементов_SELECT можно включать лишь SQL-функции или выражения, содержащие такие функции. Другими словами, нельзя иметь в списке столбцы, не являющихся аргументами SQL-функций. Например, выдать данные о массе лука (ПР=10), проданного поставщиками, и указать количество этих поставщиков: Результат: SELECT SUM(К_во), COUNT(К_во) FROM Поставки WHERE ПР = 10; SUM(К_во) COUNT(К_во) 220 2
Если бы для вывода в результат еще и номера продукта был сформирован запрос SELECT ПР, SUM(К_во), COUNT(К_во) FROM Поставки WHERE ПР = 10;
то было бы получено сообщение об ошибке. Это связано с тем, что SQL-функция создает единственное значение из множества значений столбца-аргумента, а для “свободного” столбца должно быть выдано все множество его значений. Без специального указания (оно задается фразой GROUP BY) SQL не будет выяснять, одинаковы значения этого множества (как в данном примере, где ПР=10) или различны (как было бы при отсутствии WHERE фразы). Поэтому подобный запрос отвергается системой. Правда, никто не запрещает дать запрос SELECT 'Кол-во лука =', SUM(К_во), COUNT(К_во) FROM Поставки WHERE ПР = 10; Результат: 'Кол-во лука =' SUM(К_во) COUNT(К_во) Кол-во лука = 220 2
Отметим также, что в столбце-аргументе перед применением любой функции, кроме COUNT(*), исключаются все неопределенные значения. Если оказывается, что аргумент – пустое множество, функция COUNT принимает значение 0, а остальные – NULL. Например, для получения суммы цен, средней цены, количества поставляемых продуктов и количества разных цен продуктов, проданных коопторгом УРОЖАЙ (ПС=5), а также для получения количества продуктов, которые могут поставляться этим коопторгом, можно дать запрос SELECT SUM(Цена), AVG(Цена), COUNT(Цена), COUNT(DISTINCT Цена), COUNT(*) FROM Поставки WHERE ПС = 5; и получить SUM(Цена) AVG(Цена) COUNT(Цена) COUNT(DISTINCT Цена) COUNT (*) 6. 2 1. 24 5 4 7
В другом примере, где надо узнать “Сколько поставлено моркови и сколько поставщиков ее поставляют? ”: SELECT SUM(К_во), COUNT(К_во) FROM Поставки WHER ПР = 2; будет получен ответ: SUM(К_во) COUNT (К_во) -0 0
Наконец, попробуем получить сумму массы поставленного лука с его средней ценой (“Сапоги с яичницей”): Результат: SELECT (SUM(К_во) +AVG(Цена)) FROM Поставки WHERE ПР = 10; SUM(К_во)+AVG(Цена) 220. 6 Фраза GROUP BY
Мы показали, как можно вычислить массу определенного продукта, поставляемого поставщиками. Предположим, что теперь требуется вычислить общую массу каждого из продуктов, поставляемых в настоящее время поставщиками. Это можно легко сделать с помощью предложения SELECT ПР, SUM(К_во) FROM Поставки GROUP BY ПР; Результат показан на рис. 2. 5, а. а) б) в) г) ПР ПР 9 0 0 11 150 150 12 30 30 15 370 70 1 370 370 3 250 250 5 170 70 6 220 140 8 150 150 7 200 200 2 0 0 4 100 100 13 190 190 14 70 70 16 250 250 17 50 50 10 220 220 Рисунок 2. 4
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9