Программирование >>  Руководство по sql 

1 ... 38 39 40 [ 41 ] 42 43 44 ... 105


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



1 ... 38 39 40 [ 41 ] 42 43 44 ... 105

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика