Чтение онлайн

на главную - закладки

Жанры

Понимание SQL

Грубер Мартин

Шрифт:

Пока * является единственым аргументом который включает NULL значения, и он используется только с COUNT; функции отличные от COUNT игнорируют значения NULL в любом случае. Следующая команда подсчитает(COUNT) число не-NULL значений в поле rating в таблице Заказчиков (включая повторения ):

SELECT COUNT (ALL rating )

FROM Customers;

АГРЕГАТЫ ПОСТРОЕННЫЕ НА СКАЛЯРНОМ ВЫРАЖЕНИИ

До этого, вы использовали агрегатные функции с одиночными полями как аргументами. Вы можете также использовать агрегатные функции с аргументами которые состоят из скалярных выражений включающих одно или более полей. (Если вы это делаете, DISTINCT не разрешается. ) Предположим, что таблица Порядков имеет еще один столбец который хранит предыдущий неуплаченый баланс (поле blnc) для каждого заказчика. Вы должны найти этот текущий баланс, добавлением суммы приобретений к предыдущему балансу. Вы можете найти наибольший неуплаченый баланс следующим образом:

SELECT MAX (blnc + (amt) )

FROM Orders;

Для каждой строки таблицы, этот запрос будет складывать blnc и amt для этого заказчика и выбирать самое большое значение которое он найдет. Конечно, пока заказчики могут иметь многочисленые порядки, их неуплаченый баланс оценивается отдельно для каждого порядка. Возможно, порядок с более поздней датой будет иметь самый большой неуплаченый баланс. Иначе, старый баланс должен быть выбран как в запросе выше. Фактически, имеются большое количество ситуаций в SQL где вы можете использовать скалярные выражения с полями или вместо полей, как вы увидете это в Главе 7.

ПРЕДЛОЖЕНИЕ GROUP BY

Предложение GROUP BY позволяет вам определять подмножество значений в особом поле в терминах другого поля, и применять функцию агрегата к подмножеству. Это дает вам возможность объединять поля и агрегатные функции в едином предложении SELECT. Например, предположим что вы хотите найти наибольшую сумму приобретений полученную каждым продавцом.

Вы можете сделать раздельный запрос для каждого из них, выбрав MAX (amt) из таблицы Порядков для каждого значения поля snum. GROUP BY, однако, позволит Вам поместить их все в одну команду:

SELECT snum, MAX (amt)

FROM Orders

GROUP BY snum;

Вывод для этого запроса показывается в Таблице 6.5.

SQL Execution Log

SELECT snum, MAX (amt) FROM Orders GROUP BY snum;

snum

1001

767.19

1002

1713.23

1003

75.75

1014

1309.95

1007

1098.16

Таблица 6.5: Нахождение максимальной суммы продажи у каждого продавца

GROUP BY применяет агрегатные функции независимо от серий групп которые определяются с помощью значения поля в целом. В этом случае, каждая группа состоит из всех строк с тем же самым значением поля snum, и MAX функция применяется отдельно для каждой такой группы. Это значение поля, к которому применяется GROUP BY, имеет, по определению, только одно значение на группу вывода, также как это делает агрегатная функция. Результатом является совместимость которая позволяет агрегатам и полям объединяться таким образом.

Вы можете также использовать GROUP BY с многочислеными полями. Совершенствуя вышеупомянутый пример далее, предположим что вы хотите увидеть наибольшую сумму приобретений получаемую каждым продавцом каждый день. Чтобы сделать это, вы должны сгруппировать таблицу Порядков по датам продавцов, и применить функцию MAX к каждой такой группе, подобно этому:

SELECT snum, odate, MAX ((amt))

FROM Orders

GROUP BY snum, odate;

Вывод для этого запроса показывается в Рисунке 6.6.

SQL Execution Log

SELECT snum, odate, MAX (amt)

FROM Orders GROUP BY snum, odate;

snum

odate

1001

10/03/1990

767.19

1001

10/05/1990

4723.00

1001

10/06/1990

9891.88

1002

10/03/1990

5160.45

1002

10/04/1990

75.75

1002

10/06/1990

1309.95

1003

10/04/1990

1713.23

1014

10/03/1990

1900.10

1007

10/03/1990

1098.16

Таблица 6.6: Нахождение наибольшей суммы приобретений на каждый день

Конечно же, пустые группы, в дни когда текущий продавец не имел порядков, не будут показаны в выводе.

ПРЕДЛОЖЕНИЕ HAVING

Предположим, что в предыдущем примере, вы хотели бы увидеть только максимальную сумму приобретений значение которой выше $3000.00. Вы не сможете использовать агрегатную функцию в предложении WHERE (если вы не используете подзапрос, описанный позже ), потому что предикаты оце ниваются в терминах одиночной строки, а агрегатные функции оцениваются в терминах групп строк. Это означает что вы не сможете сделать что-нибудь подобно следующему:

SELECT snum, odate, MAX (amt)

FROM Oreders

WHERE MAX ((amt)) > 3000.00

GROUP BY snum, odate;

Это будет отклонением от строгой интерпретации ANSI. Чтобы увидеть максимальную стоимость приобретений свыше $3000.00, вы можете использовать предложение HAVING.

Предложение HAVING определяет критерии используемые чтобы удалять определенные группы из вывода, точно также как предложение WHERE делает это для индивидуальных строк.

Правильной командой будет следующяя:

SELECT snum, odate, MAX ((amt))

FROM Orders

GROUP BY snum, odate

HAVING MAX ((amt)) > 3000.00;

Вывод для этого запроса показывается в Таблице 6. 7.

SQL Execution Log

SELECT snum, odate, MAX (amt) FROM Orders

GROUP BY snum, odate HAVING MAX (amt) > 3000.00;

snum

odate

1001

10/05/1990

4723.00

1001

10/06/1990

9891.88

1002

10/03/1990

5160.45

Поделиться:
Популярные книги

iOS. Приемы программирования

Нахавандипур Вандад
Компьютеры и Интернет:
программирование
5.00
рейтинг книги
iOS. Приемы программирования

Наследник

Майерс Александр
3. Династия
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Наследник

Недотепа

Лукьяненко Сергей Васильевич
Фантастика:
фэнтези
5.80
рейтинг книги
Недотепа

Набирая силу

Рокотов Алексей
2. Путь князя
Фантастика:
фэнтези
5.00
рейтинг книги
Набирая силу

Ворон

Смолл Бертрис
Любовные романы:
исторические любовные романы
8.79
рейтинг книги
Ворон

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

Невольничий караван

Май Карл Фридрих
Приключения:
прочие приключения
6.83
рейтинг книги
Невольничий караван

Переговоры

Форсайт Фредерик
Детективы:
политические детективы
5.75
рейтинг книги
Переговоры

Неучтенный элемент. Том 2

NikL
2. Антимаг. Вне системы
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 2

Человек случайностей (др. изд.)

Мердок Айрис
Проза:
современная проза
6.80
рейтинг книги
Человек случайностей (др. изд.)

Марш через джунгли

Вебер Дэвид Марк
1. Империя человека
Фантастика:
космическая фантастика
6.86
рейтинг книги
Марш через джунгли

Парижский шлейф

Машкова Диана
Любовные романы:
современные любовные романы
7.43
рейтинг книги
Парижский шлейф

Будущее разума

Каку Митио
Научно-образовательная:
прочая научная литература
физика
8.00
рейтинг книги
Будущее разума

Созвездие Козлотура

Искандер Фазиль Абдулович
Проза:
советская классическая проза
6.33
рейтинг книги
Созвездие Козлотура