Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ковалев Язык баз данных SQL

.pdf
Скачиваний:
18
Добавлен:
29.03.2016
Размер:
329.68 Кб
Скачать

1)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