Ковалев Язык баз данных SQL
.pdf1)count(*)
2){count | sum | avg | min | max} ([all | distinct] выражение_над_столбцами)
Функции применяются к группам строк и возвращают для каждой из групп единственное зна- чение.
Функция count(*) возвращает общее количество строк в группе с учетом как дубликатов строк, так и строк, состоящих из одних null-значений. Остальные функции применяются к выражению над столбцами, то есть к столбцу значений, полученных из группы строк при вычислении вы- ражения для каждой из строк. Null-значения в столбце значений игнорируются. Опция all дей- ствует по умолчанию и означает учет дубликатов строк. Если указана опция distinct, то дубли- каты строк игнорируются. Эти опции значимы для функций подсчета числа строк, суммирова- ния и осреднения, но не для функций экстремальных значений.
Результат осреднения целочисленных значений округляется до целого. Поэтому в этом случае может потребоваться использование функции явного преобразования типов. Приведем пример вычисления средней оценки по всем предметам в целом:
Сессия(keyСтудент, keyПредмет, Оценка, …), 3 ≤ Оценка ≤ 5
select
avg(convert(decimal(5, 2), Оценка)) as Оценка_средняя, count(*) as Число_сдач
from Сессия
Для определения средней оценки и числа сдач по конкретному предмету пример можно допол- нить фразой
where keyПредмет = 10
Вложение функций агрегирования не допускается. Однако из них можно составлять любые вы- ражения.
6.5Фразы group by и having
Фраза group by (группировать по) обычно используется в сочетании с функциями агрегирова- ния.
фраза_group_by ::=
group by [all] выражение_группировки ,..
Выражение группировки может быть именем столбца или в общем случае выражением над столбцами, не содержащим функций агрегирования. После того, как список выражений груп- пировки определен, можно определить столбцы, выбираемые в операторе select. Каждый выби- раемый столбец должен быть
1)либо выражением группировки, указанным во фразе group by,
2)либо выражением с некоторой комбинацией функций агрегирования.
Работу оператора select с фразой группировки можно представить следующим образом:
1)выбираются строки, соответствующие условию поиска во фразе where;
2)для каждой из строк вычисляются выражения группировки, после чего создается табли- ца, состоящая из уникальных сочетаний значений этих выражений. Тем самым создается таблица групп;
Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с. |
21 |
3)затем таблица групп расширяется выбираемыми столбцами, которые не попали в список выражений группировки и для которых, следовательно, должны быть заданы агреги- рующие выражения;
4)если задано ключевое слово all, то шаги 1 и 2 меняются местами. То есть таблица групп создается для всевозможных групп безотносительно к условию поиска во фразе where. Однако при расширении таблицы групп при вычислении агрегирующих выражений ус- ловие поиска учитывается, так что дополнительные строки таблицы групп будут допол- нены null-значениями.
Приведем пример вычисления средних оценок с группировкой по предметам:
Сессия(keyСтудент, keyПредмет, Оценка), 3 ≤ Оценка ≤ 5.
select
keyПредмет,
avg(covert(decimal(5, 2), Оценка)) as Оценка_средняя, count(*) as Число_сдач
from Сессия
group by keyПредмет
Таблица Сессия |
|
|
keyСтудент |
keyПредмет |
Оценка |
|
|
|
100 |
10 |
3 |
100 |
11 |
4 |
100 |
12 |
5 |
101 |
11 |
5 |
Результат запроса |
|
|
keyПредмет |
Оценка |
Число |
|
средняя |
сдач |
10 |
3.00 |
1 |
11 |
4.50 |
2 |
12 |
5.00 |
1 |
Фраза having ограничивает строки, возвращаемые фразой group by, таким же образом, как фра- за where ограничивает строки, возвращаемые фразой select. В один оператор select могут быть включены и фраза where, и фраза having. При этом фраза where применяется до операции группировки, а фраза having после нее.
Синтаксис фразы having идентичен синтаксису фразы where за исключением того, что фраза having может включать функции агрегирования.
В следующем примере данные о суммарном балле выдаются для тех студентов, которые сдали 3 экзамена:
Сессия(keyСтудент, keyПредмет, Оценка), 3 ≤ Оценка ≤ 5.
select
keyСтудент,
sum(Оценка) as Балл_суммарный from Сессия
group by keyСтудент having count(*) = 3
Таблица Сессия |
|
|
keyСтудент |
keyПредмет |
Оценка |
100 |
10 |
3 |
100 |
11 |
4 |
100 |
12 |
5 |
101 |
11 |
5 |
Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с. |
22 |
Промежуточный результат |
|
|
keyСтудент |
Балл_суммарный |
count(*) |
100 |
12 |
3 |
101 |
5 |
1 |
Окончательный результат keyСтудент Балл суммарный
100 12
Для повышения производительности во фразу having имеет смысл включать лишь те условия, которые действительно требуют предварительные вычисления сгруппированных данных. В противном случае условия следует размещать во фразе where.
6.6Операция union и фраза order by
С помощью операции объединения union из базовых операторов select могут быть составлены выражения вида
выражение_select ::=
{базовый_оператор_select | (выражение_select)} [ union [all]
{базовый_оператор_select | (выражение_select)}
] ...
Выражение select вычисляется в естественном порядке слева направо и сверху вниз. Порядок вычислений может быть переопределен с помощью круглых скобок.
Операнды операции объединения должны содержать одно и то же число столбцов. Соответст- вующие столбцы должны быть совместимого типа. Имена и псевдонимы столбцов могут быть различными. В этом случае имена столбцов результирующего запроса определяются по перво- му операнду. Если указана опция all, из результирующего запроса строки-дубликаты не удаля- ются:
1 |
|
|
↔ select … |
|
1 |
|
|
2 |
|
|
→ |
2 |
|
|
|
|
|
|
|
|
|||
|
|
|
union all |
10 |
|
|
|
|
|
|
|
|
|
|
|
10 |
|
|
↔ select … |
|
2 |
|
|
2 |
|
|
|
30 |
|
|
|
30 |
|
|
|
|
|
|
|
Выражение select в сочетании с необязательной фразой сортировки определяет общий вид опе- ратора select:
|
|
|
выражение |
select |
|
|
|
|
|
|
|
оператор_select::=
{базовый_оператор_select | (выражение_select)} [ union [all]
{базовый_оператор_select | (выражение_select)}
] ...
[ order by {выражение_сортировки [asc | desc]},..
]
Выражение сортировки может быть именем или псевдонимом столбца, выражением над столб- цами или номером позиции столбца в списке выбираемых столбцов. Выражение сортировки
Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с. |
23 |
может ссылаться на столбцы, отсутствующие в списке выбираемых столбцов. Однако, если в операторе select задана опция distinct или оператор включает операцию union, то выражение сортировки должно быть выражено в терминах выбираемых столбцов. Выражение сортировки не может ссылаться на столбцы, содержащие сверхбольшие блоки данных типа BLOB, по- скольку для них не определены операции сравнения. Опция asc соответствует сортировке по возрастанию, а desc – по убыванию. По умолчанию принимается опция asc. Null-значение рас- сматривается как наименьшее значение. Если задано несколько выражений сортировки, то дан- ные сортируются в лексикографическом порядке. Сортировка требует явного задания фразы top.
6.7Представления
Представления создаются с помощью следующего оператора:
create view имя_представления as
оператор_select
Таким образом, представление – это именованный оператор select.
Представления можно использовать точно так же, как и таблицы, в частности, в операторе select.
Индексы для представлений создаются и удаляются с помощью операторов create index и drop index, в которых имя таблицы заменяется на имя представления.
Неиндексированные представления являются виртуальными таблицами. Их вычисление произ- водится в момент обращения к представлению. Индексированные представления являются хра- нимыми таблицами. Они автоматически модифицируются, когда модифицируются используе- мые в них базовые таблицы.
Индексированные представления лучше всего использовать для запросов соединения и агреги- рования, в которых обрабатывается большое количество строк или которые часто используются в других запросах.
Удалить представление можно с помощью оператора
drop view имя_представления
Для чего нужны представления:
|
|
|
Пользователь |
|
|
|
|
|
|
|
|
|
|
Неиндексированные |
|
|
Индексированные |
|
Табличные |
|
|
|
пользовательские |
||||
представления |
|
|
представления |
|
||
|
|
функции |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Базовые таблицы |
|
|
Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с. |
24 |
7. Переменные
Переменные могут быть локальными скалярными, локальными табличными и глобальными.
Имена локальных скалярных и табличных переменных начинаются с префикса @, глобальных – с префикса @@. Их область действия ограничена процедурой, в которой они объявлены.
Локальные скалярные переменные создаются с помощью оператора объявления
declare {@имя_переменной тип_данных} ,..
Тип данных может быть любым, за исключением содержащих сверхбольшие блоки данных ти- па BLOB. После создания переменная имеет значение null.
Присвоить значение локальной скалярной переменной можно следующими способами:
1)использовать команду set:
set @имя_переменной = выражение
2)использовать команду select:
select @имя_переменной = выражение
3)использовать команду select, совмещенную с оператором select, например
select @ВесMax = max(Вес) from Изделия оператор select
Изделия(Вес, ...)
Начиная с SQL Server 2000, появилась возможность объявления локальных переменных с таб- личным типом данных:
declare @имя_переменной table (определение_таблицы)
Здесь определение таблицы идентично обычному определению таблицы в операторе create table за исключением того, что оно не должно иметь ограничений внешнего ключа foreign key.
Имена глобальных переменных начинаются с префикса @@. Глобальные переменные предо- пределены SQL Server’ ом и их нельзя определить самостоятельно. Они предоставляют инфор- мацию о текущих установках различных свойств и параметров SQL Server’ а. В частности, зна- чение глобальной переменной @@rowcount представляет количество строк, подвергшихся воздействию последнего оператора.
Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с. |
25 |
8. Операторы управления
Блоки операторов (составные операторы) образуются с помощью операторных скобок begin и end. Блок может содержать операторы Transact-SQL, в том числе другие блоки.
Условный оператор if имеет следующий синтаксис:
if булево_выражение оператор_или_блок
[ else
оператор_или_блок
]
Ключевое слово case, в отличие от большинства языков программирования, определяет в Trans- act-SQL не условный оператор, обобщающий оператор if, а условную функцию.
Функция case имеет 2 синтаксиса – простой и поисковый.
Простая функция case записывается в виде:
case выражение |
|
|
|
when |
выражение1 |
then |
результирующее_выражение1 |
… |
|
|
|
when |
выражениеn |
then |
результирующее_выражениеn |
[else результирующее_выражениеn+1]
end
Поисковая функции case записывается в виде:
case
when |
булево_выражение 1 |
then |
результирующее_выражение1 |
… |
|
|
|
when |
булево_выражение n |
then |
результирующее_выражениеn |
[else |
результирующее_выражениеn+1] |
end
Поисковая функция case становится эквивалентной простой функции case, если
булево_выражение i ≡ (выражение = выражение i)
Просмотр ветвей when идет сверху вниз. Функция case часто используется в операторах select и update.
Оператор цикла while имеет вид:
while булево_выражение оператор_или_блок
Если при первой оценке булево выражение будет ложным, то тело цикла не будет выполнено вообще.
Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с. |
26 |
9. Хранимые процедуры
Хранимые процедуры являются объектами базы. Они могут иметь входные и выходные пара- метры, а также возвращать целочисленное значение. По соглашению возвращаемое целочис- ленное значение определяет статус выполнения хранимой процедуры. Нулевое значение соот- ветствует успешному выполнению хранимой процедуры, а ненулевые значения могут исполь- зоваться разработчиком хранимой процедуры для описания возможных типов ошибок.
Хранимая процедура создается с помощью следующего оператора:
create procedure имя_процедуры
[ @имя_параметра тип_данных [= значение_по_умолчанию] [output] ] ,..
as
операторы
Можно создать временную локальную или глобальную процедуру, указав перед ее именем # или ## соответственно. Параметры процедуры являются ее локальными переменными и потому имена параметров должны начинаться с символа @.
Задание значения по умолчанию для параметра позволяет при вызове процедуры не задавать его входное значение. Значение по умолчанию может быть и null-значением. Выходные пара- метры, в отличие от входных, объявляются в заголовке процедуры с ключевым словом output.
Возврат статуса выполнения хранимой процедуры производится с помощью следующего опе- ратора возврата:
return (целочисленное_значение)
Хранимые процедуры могут вызывать другие хранимые процедуры, то есть реализовывать вложенность. Глубина вложенности не должна превышать 32.
Вызов хранимой процедуры производится с помощью следующего оператора:
|
exec [@имя_переменной = ] имя_процедуры |
|
Форма 1 |
[ |
аргумент ,.. |
Форма 2 |
| |
{@имя_параметра = аргумент} ,.. |
Форма 3 |
| |
{аргумент ,..}, {@имя_параметра = аргумент} ,.. |
|
] |
|
аргумент ::= {выражение | default | @имя_переменной output}
Перед именем вызываемой процедуры может быть указано имя локальной переменной, предна- значенной для получения возвращаемого процедурой целочисленного значения.
Необязательный список аргументов может быть задан в одной из 3х форм.
В 1й форме аргументы задаются по позициям, тот есть их порядок должен соответствовать по- рядку параметров хранимой процедуры. Список аргументов может быть неполным, то есть со- ответствовать лишь начальной части списка параметров хранимой процедуры.
Во 2й форме аргументы задаются с указанием имен соответствующих параметров. Это позволя- ет задать аргументы для части параметров, причем в любом порядке.
Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с. |
27 |
3я форма является комбинированной. Для начальной части списка параметров аргументы зада- ются по позициям, а для конечной части выборочно по именам.
В качестве аргумента для входного параметра процедуры может выступать произвольное вы- ражение или ключевое слово default.
Выражение может быть в частном случае представлено именем локальной переменной. Ключе- вое слово default позволяет указать аргумент со значением по умолчанию внутри списка аргу- ментов по позициям. Аргументы, соответствующие выходным параметрам, должны быть пред- ставлены именем локальной переменной с ключевым словом output. Если аргумент, соответст- вующий входному параметру, опущен или представлен ключевым словом default, то для пара- метра в качестве входного значения будет использоваться значение по умолчанию, объявленное в хранимой процедуре. Если опущен аргумент, соответствующий выходному параметру, то для параметра в качестве входного значения будет использоваться значение по умолчанию, а вы- ходное значение проигнорировано.
Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с. |
28 |
10. Пользовательские функции
Пользовательские функции обладают более мощными возможностями по сравнению с храни- мыми процедурами и могут использоваться там, где применение хранимых процедур невоз- можно, например, в определении таблиц и внутри фразы from оператора select.
Пользовательские функции могут возвращать скалярные или табличные значения.
10.1 Скалярные пользовательские функции
Скалярные пользовательские функции создаются с помощью следующего оператора:
create function имя_функции
(
[ @имя_параметра тип_данных [= значение_по_умолчанию] ] ,..
)
returns тип_данных as
begin
операторы
end
Выходные параметры скалярные пользовательские функции не поддерживают.
Фраза returns определяет тип возвращаемого значения. Значение возвращается с помощью с помощью следующего оператора возврата:
return(возвращаемое_значение)
Синтаксис вызова скалярной пользовательской функции из выражения:
имя_функции ([аргумент ,..]) аргумент ::= {выражение | default}
В отличие от вызова хранимых процедур здесь аргументы задаются по позициям и, кроме того, список аргументов должен быть полным.
Для вызова скалярной функции можно использовать также оператор exec в одной из 2х форм:
Форма 1 |
exec |
@имя_переменной = имя_функции ([аргумент ,..]) |
Форма 2 |
exec |
@имя_переменной = имя_функции {@имя_параметра = аргумент } ,.. |
Как и при вызове из выражения, в этих формах должны быть представлены аргументы для всех параметров функции.
Таким образом., 2-я форма позволяет лишь изменять порядок перечисления аргументов.
Для удаления скалярной пользовательской функции используется следующий оператор:
drop function имя_функции
Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с. |
29 |
10.2 Табличные пользовательские функции
Табличные пользовательские функции могут быть подставляемые и многооператорные.
Синтаксис оператора создания подставляемой табличной пользовательской функции:
create function имя_функции
(
[ @имя_параметра тип_данных [= значение_по_умолчанию] ] ,..
)
returns table as
return (оператор_select)
Синтаксис оператора создания многооператорной табличной пользовательской функции:
create function имя_функции
(
[ @имя_параметра тип_данных [= значение_по_умолчанию] ] ,..
)
returns @имя_таблицы table (определение_таблицы) as
begin
операторы
end
Поскольку оператор возврата return в многооператорной табличной функции всегда возвраща- ет таблицу, объявленную во фразе returns, то он должен выполняться без аргументов, то есть иметь вид return.
Как подставляемые, так и многооператорные табличные функции, могут быть использованы только во фразе from оператора select.
При вызове функции список аргументов должен быть полным:
имя_функции ([аргумент ,..]) аргумент ::= {выражение | default}
Для удаления табличной пользовательской функции используется оператор
drop function имя_функции
Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с. |
30 |