|
Программирование >> Руководство по sql
SQL (расширение): select pub id, type, title id from titles order by pub id, type compute count (title id) by pub id, type compute count (title id) by pub id Результат: pub id type 0736 business pub id 0736 0736 0736 0736 0736 pub id 0877 pub id 0877 0877 pub id 0877 0877 0877 pub id 1389 1389 1389 type psychology psychology psychology psychology psychology type NULL type mod cook mod cook type trad cook trad cook trad cook type business business business title id BU2075 count title id PS1372 PS2091 PS2106 PS3333 PS7777 count count title id MC3026 count title id MC2222 MC3021 count titlejd TC3218 TC4203 TC7777 count count title id BU1032 BUllll BU7832 count pi!b id type title id 1389 popular comp PC1035 1389 popular comp PC8888 1389 popular comp PC9999 count count В этом отчете содержатся значения строк, итоговые данные по группам и подгруппам. В отличие от других запросов SQL, эти результаты не являются реляционными и не могут использоваться в других операторах SQL. Нулевые значения и группы. Так как нулевые (NULL) значения представляют неизвестные данные, то нельзя определенно сказать, что одно нулевое значение больше или меньше другого нулевого значения. Однако, если столбец, по которому выполняется группировка, содержит больше одного нулевого значения, все они будут собраны в одну группу. Столбец type в таблице titles содержит нулевое значение. Поэтому при группировке по этому столбцу и подсчете строк в каждой фуппе будет получен следующий результат: SQL: select type, count(*) from titles group by type Результат: ype NULL 1 business 4 mod cook 2 popular comp 3 psychology 5 trad cook 3 В результате содержится строка с типом NULL. Если в запросе вместо функции count(*) использовать функцию count(type), то вместо 1 во втором столбце этой строки будет стоять 0: SQL: select type, count(type) from titles group by type Результат: type NULL 0 business 4 mod cook 2 popular comp 3 psychology 5 trad cook 3 Почему в результате до сих пор присутствует нулевая фуппа, несмотря на значение О в правом столбце? Тогда как функция count(*) подсчитывает общее количество строк в фуппе, независимо от значений в конкретных столбцах, функция countQ работает с определенным столбцом и учитывает при подсчете только ненулевые значения. При выполнении предложения GROUP BY система обнаруживает существование типа NULL и создает для него отдельную фуппу. Затем функция countQ подсчитывает количество элементов в этой фуппе. В результате находится только значение NULL, которое не учитывается при подсчете, и поэтому в правый столбец записывается нуль. А что, если в столбце, по которому ведется фуппировка, имеется несколько нулевых значений? Чтобы ответить на этот вопрос, рассмофим следующий запрос: SQL: select advance, count(*) from titles group by advance Результат: advance NULL 0 2000 2275 4000 5000 6000 7000 8000 10125 J 15000 1 Затраты на две книги неизвестны. Обе они включаются в фуппу NULL. Обратите внимание, что книги без затрат (advance = 0) составляют отдельную фуппу, так NULL и О - это абсолютно разные значения. Предложение GROUP BY без агрегирующих функций. Без афегирующих функций предложение GROUP BY напоминает предложение DISTINCT. Оно разделяет таблицу на фуппы и для каждой из них возвращает по одной сфоке. Помните, что при использовании предложения GROUP BY для каждого элемента из списка выбора будет генерироваться по одному значению на набор. Несколько следующих примеров помогут вам в этом разобраться. Сначала получим список всех издателей из таблицы titles: SQL: select pub id from titles Результат: pub id l 1389 0736 0736 1389
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |