SYBASE (543027), страница 3

Файл №543027 SYBASE (Базы данных) 3 страницаSYBASE (543027) страница 32015-08-16СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 3)









обязательно все данные, а удаленные - не обязательно все (только часть). Изменения, произведенные в консолидированной БД, тиражируются в удаленные, а изменения в одной из удаленных БД попадают в консолидированную БД и затем в другие удаленные БД. Для обмена данными SQL Remote использует сообщения. Поэтому можно и не иметь прямое сетевое соединение с удаленными БД, а достаточно организовать обмен сообщениями, например, по электронной почте.

Приложения в архитектуре клиент-сервер, работающие в режиме сессии, используют сетевые протоколы (TCP/IP, IPX/SPX и др.). Точно также приложения, работающие с сообщениями, используют службы сообщений, например: MAPI, VIM, SMTP и простой обмен файлами.

Службы сообщений используют адрес получателя для сохранения и передачи сообщений к пункту назначения. В отличие от режима сессии, многие системы, основанные на сообщениях, не гарантируют ни обязательной доставки сообщения, ни определенного порядка прихода сообщений. Поэтому SQL Remote реализует специальный протокол, который гарантирует проведение обновлений в правильном порядке.

Публикация - это объект, описывающий тиражируемые данные. Удаленные пользователи оформляют подписки на публикации для получения этих данных. Публикация может включать данные из нескольких таблиц, представленных либо целиком, либо подмножеством столбцов, либо подмножеством строк по условию выборки.

Система репликации администрируется централизованно в консолидированной БД средствами SQL Central. Публикация может быть использована несколькими подписчиками через системы передачи сообщений (MAPI, VIM, SMTP и файловый обмен).

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

  1. 2 пользователя добавляют в таблицу строку с одинаковым первичным ключом (второй INSERT закончится неудачно). Этого можно избежать, включив колонку-идентификатор БД в первичный ключ такой таблицы;

  2. 2 пользователя обновляют одну и ту же колонку в таблице (не первичный ключ). Для этого SQL Anywhere предоставляет специальный триггер (RESOLVE UPDATE), обнаруживающий и разрешающий конфликт.

SQL Central

SQL Central - графическое средство администрирования БД, соответствующее интерфейсу Windows95. Главное окно SQL Central похоже по дизайну на Explorer. Действия, выполняемые из SQL Central:

  1. создание БД;

  2. загрузка/выгрузка БД;

  3. создание процедур;

  4. назначение полномочий;

  5. управление системой репликации SQL Remote.

Определения основных понятий

База данных - это набор взаимосвязанных таблиц данных и других объектов БД, созданных и служащих для определенной цели (для совместного использования многими пользователями).

Таблица - это совокупность строк (записей), состоящих из колонок (полей). Это логический эквивалент файла БД.

Колонка - это логический эквивалент поля. Она содержит один элемент данных внутри строки или записи.

Индекс - это объект БД, служащий для ускорения поиска данных в той таблице, для которой создается индекс. Для таблицы может быть создано один или более индексов.

Порождение (представление) - это альтернативный взгляд на данные в одной или более таблиц. Обычно создается как подмножество колонок из одной или более таблиц.

Процедура (хранимая процедура) - это совокупность SQL-предложений и необязательных предложений программного языка Transact-SQL, записанная в БД и имеющая имя.

Триггер - это специальная форма хранимой процедуры, которая активизируется (срабатывает автоматически), когда пользователь вводит команды изменения данных, такие как insert, delete или update, в определенной таблице или колонке.

Триггеры часто используются для сохранения целостности данных.

2. ОПИСАНИЕ СТРУКТУРЫ

Создание таблицы

Таблица создается в уже имеющейся БД. Синтаксис команды создания БД:

create database <имя БД>

[on {default | database_device} [=<размер>]

[, database_device [=<размер>]]...]

[log on database_device [=<размер>]

[, database_device [=<размер>]]...]

[with override]

[for load]

Имя БД должно быть уникальным в SQL-сервере. SQL-сервер может управлять до 32767 баз данных. Максимальное число сегментов для БД - 32.

Структура on позволяет определить место хранения БД и объем памяти под нее в Мб. Ключевое слово default означает, что для БД отводится текущая внешняя память в соответствующем пуле, указанном в таблице sysdevices БД master.

Если default не используется, то внешней памяти для БД (диску) назначается логическое имя (database_device). Таких имен может быть несколько. Размер БД - от 2 МБ до 223 Мб.

Структура log on позволяет определить отдельную внешнюю память (диск) под журнал БД. Журнал БД хранится отдельно от самой БД по следующим причинам:

  1. журнал позволяет использование команды dump transaction (в отличие от команды dump всей БД, что экономит время и магнитные ленты);

  2. журнал повышает эффективность БД;

  3. журнал обеспечивает полное восставление БД на момент сбоя винчестера (диска).

Объем журнала составляет от 10 до 25 процентов памяти под саму БД.

Опция for load используется для возможности создания новой БД с имеющейся копии БД.

Для уничтожения БД используется команда:

drop database <имя БД> [, <имя БД>] …

Для изменения размера БД используется команда:

alter database <имя БД>

[on {default | database_device} [=<размер>]

[, database_device [=<размер>]]…]

[log on {default | database_device} [=<размер>]

[, database_device [=<размер>]]…]

[with overrige]

[for load]

Таблица создается с помощью команды CREATE TABLE:

create table [<имя БД>.[<владелец>].]<имя таблицы>

(<имя колонки> <тип данных>

[default {<константное выражение>| user | null}]

{[{identity | null | not null}]

| [[constraint <имя ограничения>]

{{unique | primary key}

[clustered \ nonclustered]

[with fillfactor=x][on <имя сегмента>]

| references [[<имя БД>.]<владелец>.] ref_table

[(ref_column)]

| check (<условие поиска>)}]}...

| [constraint <имя ограничения>]

{{unique | primary key}

[clustered | nonclustered]

(<имя колонки [{,<имя колонки>}...])

[with fillfactor = x] [on <имя сегмента>]

| foreign key (<имя колонки>[{,<имя колонки>}...])

references [[<имя БД>.]<владелец>.] ref_table

[(ref_column [{,ref_column}...])]

| check (<условие поиска>)}

[{,{<следующая колонка> | <следующее ограничение>}}...])

[on <имя сегмента>]

В команде create table для каждой колонки таблицы задается имя колонки, тип данных и наличие/отсутствие неопределенных значений. Кроме этого, может быть определена identity-колонка. И наконец, определяются ограничения целостности данных на уровне колонки и на уровне таблицы.

Каждая таблица может включать одну identity-колонку. Identity-колонки используются для хранения последовательных номеров записей, автоматически генерируемых SQL-сервером. Значение этой колонки однозначно идентифицирует каждую запись в таблице. Тип данных в identity-колонке всегда numeric с 0 для дробной части. Число для целой части определяет максимальное значение в этой колонке. Для этого необходимо возвести 10 в степень, равную указанному числу для целой части, и вычесть единицу. Например, если указать numeric(7,0), то максимальное значение равно 10^7-1=9999999.

Формирование значений identity-колонки осуществляется следующим образом: при вводе первой записи в таблицу SQL-сервер присваивает значение 1; затем при добавлении новой записи значение этой колонки увеличивается на 1; при “откатке” транзакций, удалении записей и “ручном” добавлении записей в значениях identity-колонки могут появляться промежутки.

SQL-сервер обеспечивает два метода сохранения целостности данных в БД:

  1. определение правил, умолчаний, индексов и триггеров;

  2. определение ограничений целостности в команде create table.

В команде create table можно создать следующие типы ограничений (constraint):

  1. unique | primary key - ограничение уникального ключа требует, чтобы никакие две записи в таблице не имели в этой колонке одинаковых значений; ограничение первичного ключа требует отсутствия null-значений в колонке;

  2. references (ограничения ссылочной целостности) требуют, чтобы данные, вводимые в определяемые колонки, должны соответствовать данным в уже определенных таблице и колонках;

  3. check (контрольные ограничения) определяют границы значений данных, вводимых в колонки.

Кроме ограничений целостности, для колонки можно задать значение по умолчанию (default). Если пользователь не вводит значение в эту колонку, то SQL-сервер автоматически вводит значение по умолчанию. Значение по умолчанию задается тремя способами:

  1. константным выражением;

  2. словом user (в качестве значения берется имя пользователя);

  3. словом null (по умолчанию берутся null-значения).

Ограничения unique или primary key создают уникальные индексы для указанной колонки. По умолчанию ограничение unique создает негрупповые (nonclustered) индексы, а ограничение primary key, по умолчанию, создает групповые (clustered) индексы. Пользователь может изменить эти значения по умолчанию, указав конкретно unique clustered или primary key nonclustered.

Кроме указанных выше трех типов ограничений, различают ограничения на уровне таблицы и на уровне колонки. Ограничения на уровне колонки действуют только для одной колонки и указываются сразу после имени и типа колонки. Ограничения на уровне таблицы действуют для двух и более колонок и указываются отдельной структурой. Ограничения на уровне таблицы могут включать структуру foreign key (внешний ключ) и список из одного и более имен колонок.

Типы данных:

Категория типа данных

Запись

Размерность

Размер в байтах

Целые числа

а) tinyint

б) smallint

в) int (integer)

0¸255

-32768¸32767

(-215¸215-1)

-2147483648¸2147483647

(-231¸231-1)

1 байт

2 байта

4 байта

Вещественные числа с фиксированной точкой

а) numeric(p, s)

б) decimal (p, s) (dec)

-1038¸1038-1

-1038¸1038-1

2¸17 байт

2¸17 байт

Вещественные числа с плавающей точкой

а) float (precision)

б) double precision

в) real

от ЭВМ

от ЭВМ

от ЭВМ

4б. или 8б.

8 байт

4 байта

Деньги

а) smallmoney

б) money

-214748.3648¸ 214748.3647

-922337203685477.5808¸ 922337203685477.5807

4 байта

8 байт

Дата/время

а) smalldatetime

б) datetime

1.01.1900¸6.06.2079

1.01.1753¸31.12.9999

4 байта

8 байт

Символьные данные

а) char (n)

б) varchar (n)

в) nchar (b)

г) nvarchar (n)

д) text

0¸255 байт

0¸255 байт

0¸255байт

0¸255 байт

0¸231-1 байт

(0¸2147483647)

n байт

фактическая длина

@@ncharsize*n

@@ncharsize*фактдлина

от 2К до 2 Гбайт

Двоичные данные

а) binary (n)

б) varbinary (n)

в) image

0¸255байт

0¸255 байт

0¸231-1 байт

(0¸2147483647)

n байт

фактич. длина

от 2К до 2 Гбайт

Битовые данные

bit

0 или 1

1 бит (1/8 байта)

Пример создания таблиц в учебной БД:

(структура БД приведена в приложении VI)

Имя БД: MPEI1

Владелец: STUD1

1) Создание таблицы с именем POSS:

create table poss

(nomer integer,

fio char(40) not null,

data_rogden char (6),

pol char (1),

sem_polog_k char (1),

spec char (6),

kat_obuch_k char(2),

vuz_k integer,

mp char (2),

gp char (2),

mo char (2),

gok char (2))

2) Создание таблицы с именем VUZ_GOROD:

create table vuz_gorod

(cod_vuza integer,

nazvanie_vuza char (25),

cod_goroda char (3),

nazvanie_goroda char (20),

cod_stran char (2),

nazvanie_stran char (15))

3) Создание таблицы с именем VUZ:

create table vuz

(cod integer,

uch_zavedenie char (25))

4) Создание таблицы с именем FAMILY:

create table family

(cod char (1),

family_status (12))

5) Создание таблицы с именем KAT_OBUCH:

create table kat_obuch

(cod char (2),

kat_obucheniya char (16))

6) Создание таблицы с именем GOROD:

create table gorod

(cod char (3),

nazvanie_goroda char (20))

Загрузка таблиц данными выполняется с помощью оператора INSERT (1-ая форма).

Оператор INSERT:

insert [into] [<имя БД>.[<владелец>.]]{<имя таблицы>|<имя представления>}[(<список колонок>)]

{values (<выр.1>[,<выр.2>]...) | select_statement}

Примеры операторов INSERT для созданных таблиц:

1) insert poss values

(534305, 'ЖУРАВЛЕВ АВЕРЬЯН АЛЕКСЕЕВИЧ', '000073’, 'M', '0','001001', '05',
0129000, '08', '90', '03', '95')

2) insert vuz_gorod values

(1115842, 'С.-П. ИИЖТ', '002', 'САНКТ-ПЕТЕРБУРГ', '01', 'РОССИЯ')

3) insert vuz values

(1962902, 'СТАВР.МЕД.ИНСТ.')

4) insert family values

('0', 'ХОЛОСТ')

5) insert kat_obuch values

('03', 'СТУДЕНТ')

6) insert gorod values

('003', 'АСТРАХАНЬ')

Ограничения целостности данных

Ссылочная целостность - это правила, управляющие целостностью данных и устанавливающие определенные (специфические) взаимосвязи между первичными и внешними ключами различных таблиц. SQL-сервер сохраняет ссылочную целостность с помощью пользовательских триггеров.

Умолчание - это опция или свойство (значения) поля или типа данных, выбираемое системой в случае неопределенности.

Умолчания и правила определяют ограничения целостности, которые вступают в силу во время ввода и модификации данных.

Правило - это спецификация, контролирующая данные при вводе в определенное поле или в поле пользовательского типа данных.

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

Пользовательские типы данных - это типы данных, определенные пользователем в термах существующих системных типов данных (на основе базовых типов данных). Пользовательские типы данных могут быть ограничены правилами и умолчаниями.

Пример использования правила: контроль двух колонок

create table my_publishers

(pub_id char (4),

pub_name varchar (40),

constraint my_chr_constraint

check (pub_id in ("1389", "0736", "0877")

or pub_name not like "Bad News Books"))

Пример использования умолчаний:

create table my_titles

(title_id char (6),

title varchar (80),

price money default null,

total_sales int default 0)

Пример использования контроля значения поля (при вводе, т.е. оператор INSERT):

create table my_new_publishers

(pub_id char (4)

check (pub_id in ("1389", "0736", "0877", "1622","1756")

or pub_id like "99 [0-9][0-9]"),

pub_name varchar (40),

city varchr (20),

state char (2))

Примеры определения пользовательских типов данных:

execute sp_addtype nm, "varchar (30)"

execute sp_addtype p#, "char (10)"

Определение контрольных ограничений

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

Условие поиска может включать:

  1. список константных выражений с функцией in;

  2. диапазон константных выражений с функцией between;

  3. множество условий с функцией like.

Константные выражения обычно включают в себя арифметические операции и встроенные функции.

Но условие поиска не может включать подзапросы, многофункциональные спецификации и адресные спецификации.

Существуют два типа контрольных ограничений:

  1. на уровне поля;

  2. на уровне таблицы.

Контрольное ограничение на уровне поля действует только для одного поля, на котором это ограничение определяется. Контрольные ограничения на уровне таблицы действуют для любых полей этой таблицы.

Создавать умолчания, правила и индексы можно не только в рамках команды create table, но и отдельными командами create. Эти команды можно использовать уже после того, как созданы и загружены таблицы. Умолчания и правила создаются для ограничения значений какого-либо одного поля таблицы.

Создание умолчаний

create default [<владелец>.]<имя умолчания>

as <константное выражение>

Создание правил

create rule [<владелец>.]<имя правила>

as <условное выражение>

где <условное выражение> аналогично условному выражению в структуре where оператора select за тем исключением, что вместо имени поля указывается аргумент правила, начинающийся со знака @. Аргумент у правила может быть только один.

Связывание правила с объектом БД (именем колонки)

sp_bindrule <имя правила>, <имя объекта> [, futureonly]

где <имя объекта> - это имя таблицы и имя колонки (<имя таблицы>.<имя колонки>).

Проверка действия правила осуществляется оператором insert (или update) после создания и связывания правила.

Пример команды create table с контрольными ограничениями:

create table poss1

( nomer integer check ( nomer between 1 and 700000),

fio char (40) not null check ( fio not like “%.%” or fio not like “%-%”),

d_rogd char (2) check ( d_rogd between “01” and “31”),

m_rogd char (2) check ( m_rogd between “01” and “12”),

g_rogd char (2) check (g_rogd between “00” and “99”),

pol char (1) check ( pol like “М” or pol like “Ж”),

sem_polog_k char (1) check ( sem_polog_k in (“0”, “1”, “2”, “3”)),

spec char (6) check ( spec between “000000” and “190046”),

kat_obuch_k char(2) check ( kat_obuch_k between “01” and “17”),

vuz_k integer check ( vuz_k between 128955 and 8199999),

mp char (2) check ( mp between “01” and “12”),

gp char (2) check ( gp between “00” and “99”),

mo char (2) check ( mo between “01” and “12”),

gok char (2) check ( gok between “00” and “99”))

Развязывание правила с объектом БД

sp_unbindrule <имя объекта> [, futureonly]

Создание индексов

Индексы бывают трех типов:

1) Составные индексы - определяются на двух и более колонках.

2) Уникальные индексы - никакие два значения индекса не могут быть равны между собой.

  1. Групповые или негрупповые индесы - групповые индексы создают возможность совпадения физической и логической последовательностей записей в таблице; в негрупповых индексах - этого нет.

Команда создания индекса:

create [unique] [clustered | nonclustered] index

(<имя индекса> on [[<имя БД>.] <владелец>.] <имя табл.>

(<имя колонки> [,<имя колонки>]...)

[with {fillfactor=x, ignore_dup_key, sorted_data,

[ignore_dup_row | allow_dup_row]}]

[on <имя сегмента>]

Опция fillfactor определяет процент заполнения памяти в каждой странице индекса. Число x может принимать значение от 1 до 100. Опция fillfactor полезна в том случае, когда нужно предусмотреть будущие изменения данных (добавление и обновление записей), т. е. зарезервировать память для будущих расширений индекса.

Опция ignore_dup_key позволяет избежать “откатки” большой транзакции во время попытки получения дублируемого значения в поле, по которому создан уникальный индекс. Другими словами, если в транзакции одной из команд является insert или update, которая формирует дублируемое значение в поле с уникальным индексом, то эта команда не выполняется, а вся транзакция в целом выполняется.

Опция sorted_data убыстряет процесс создания индекса, если данные в таблице уже отсортированы.

Опции ignore_dup_row и allow_dup_row используются при создании неуникальных групповых индексов. Опция ignore_dup_row запрещает ввод дублируемых значений в поле, а опция allow_dup_row - разрешает.

Опция on <имя сегмента> позволяет определить сегмент памяти, в котором создается индекс.

Примеры создания индексов:

1) create unique index nomind on poss (nomer)

2) create index polind on poss (pol)

3) create index vuzind on poss (vuz_k)

4) create unique index codvind on vuz (cod)

5) create unique index codgind on gorod (cod)

6) create unique index codvgind on vuz_gorod (cod_vuza)

7) create index codgoind on vuz_gorod (cod_goroda)

Уничтожение умолчаний и правил

drop default [<владелец>.]<имя умолчания> [, [<владелец>.]<имя умолчания>] …

drop rule [<владелец>.]<имя правила> [, [<владелец>.]<имя правила>] …

Информацию о правилах и умолчаниях можно получить с помощью процедуры sp_help.

В <условном выражении> при создании правила или в команде create table нельзя использовать оператор join и подзапросы, поэтому для сложных ограничений необходимо использовать триггеры.

Пример создания триггера для контроля колонок таблицы poss1 vuz_k (учебное заведение) и spec (специальность):

  1. создание таблиц только кодов учебных заведений и только шифров специальностей:

create table codv (vkod integer)

create table cods (skod char(6))

  1. загрузка этих таблиц данными:

insert codv values (<код>) …

insert cods values (<код>) …

  1. создание триггера:

create trigger vuz_spec on poss1 for insert as

if ( select count(*) from codv, inserted where codv.vkod = inserted.vuz_k) = 0

select “значение поля vuz_k не принадлежит списку”

if ( select count(*) from cods, inserted where cods.skod = inserted.spec) = 0

select “значение поля spec не принадлежит списку”

Триггер vuz_spec сравнивает введенное значение поля vuz_k или spec со всеми значениями поля в таблице codv или cods и в случаях несовпадения выдает соответствующие сообщения.

Удаление элементов структуры БД осуществляется оператором DROP, например:

1) Удаление таблицы:

drop table [[<имя БД>.].]<имя таблицы>

[,[[<имя БД>..]<имя таблицы>]...

Пример: drop table poss

2) Удаление индекса:

drop index <имя таблицы>.<имя индекса>

[,<имя таблицы>.<имя индекса>]...

Пример: drop index poss.nomind

3. ВЫБОРКА ДАННЫХ

ОБЩЕЕ ОПИСАНИЕ ОПЕРАТОРА SELECT

Выборка данных осуществляется с помощью оператора SELECT:

select [all | distinct] <список полей SELECT>

[into [[<имя БД>.]<владелец>.]<имя таблицы>

[from [[<имя БД>.]<владелец>.]{<имя таблицы> | <имя представления>}

[holdlock | noholdlock][shared]

[,[[<имя БД>.]<владелец>.]{<имя таблицы | <имя представления>}

[holdlock | noholdlock][shared]]...]

[where <условие поиска>]

[group by [all]

[,

[having <условие поиска>]

[order by {[[[<имя БД>.]<владелец>.]{<имя табл.>. | <имя представления>.}]

<имя колонки> | <номер в списке SELECT> | <выражение>}

[asc | desc]

[,{[[[<имя БД>.<владелец>.]{<имя таблицы>. | <имя представления>.}]

<имя колонки> | <номер в списке SELECT> | <выражение>}

[asc|desc]]...]

[compute row_aggregate (<имя колонки>)

[,row_aggregate (<имя колонки>)]...

[by <имя колонки> [,<имя колонки>]...]]

[for browse]

Список выборки - это перечень колонок, определенных в главной фразе предложения SELECT. Список выборки представляет собой один или более разделенных запятыми элементов данных. Элемент данных может быть именем колонки, константой или комбинацией имен колонок и констант, связанных арифметическими операторами: + (сложить), - (вычесть), * (умножить), / (разделить), % (остаток от деления). Эти арифметические операторы используются для связки данных только числового типа. Кроме этого, элементу в списке выборки может предшествовать одна из агрегатных функций, описанных ниже.

Если вместо списка выборки ставится символ *, то это означает, что данные выбираются по всем колонкам таблицы.

При выдаче отчета по запросу, по умолчанию, заголовком колонки является имя колонки. Но у пользователя есть возможность изменить заголовок колонки, задав в качестве элемента данных следующее:

<заголовок колонки> = <имя колонки>

или

<имя колонки> <заголовок колонки>

Если в <заголовок колонки> входят специальные символы, то он заключается в кавычки.

Примеры:

  1. select Publisher = pub_name, pub_id from publishers

  2. select pub_name Publisher, pub_id from publishers

  3. select “Publisher’s Name” = pub_name from publishers

  4. select title_id, total_sales * price - advance / 2 from titles

Перед списком выборки могут задаваться ключевые слова all или distinct. All определяет, что должны быть выбраны все повторяющиеся значения (all предполагается по умолчанию). Distinct определяет, что повторяющиеся значения не должны выбираться, т. е. исключаются дубликаты.

Структура into используется для создания новых таблиц БД путем выполнения запроса в уже существующих таблицах БД. Например:

select pub_id, pub_name into newtable from publishers

Предложение select…into не только создает новую таблицу, но и загружает ее данными.

Структура from должна включать в себя список всех таблиц и представлений, содержащих колонки, которые перечислены в списке выборки и структуре where. Максимальное количество таблиц и представлений в структуре from равно 16. Ключевые слова holdlock, noholdlock и shared используются системным администратором и здесь не рассматриваются.

Условие выборки указывается во фразах where и having.

В условие выборки включается следующее:

1) Операции сравнения: =, , ! =, , >=, , !<.

2) Диапазоны (between и not between).

3) Списки (in, not in).

4) Символы сравнения (like, not like).

5) Неопределенные значения (is null, is not null).

6) Комбинации из логических операторов: and, or, not.

7) Условия соединения таблиц.

8) Подзапросы.

Операции сравнения используются следующим образом:

where <выражение1> <операция сравнения> <выражение2>

где <выражение> может быть константой, именем колонки, функцией, подзапросом и любой комбинацией из них, соединенных арифметическими и поразрядными операциями. Например:

select * from titleauthor where royaltyper < 50

Функция between дает возможность определить условие, если искомое значение находится в заданных границах (диапазоне). Функция between имеет следующий формат:

<выражение1> [not] between <выражение2> and <выражение3>

Условие считается выполненным, если <выражение1> равно или больше, чем <выражение2> и равно или меньше, чем <выражение3>. Если используется опция not, то условие считается выполненным, если <выражение1> меньше <выражения2> или больше <выражения3>. Например:

select title_id, total_sales from titles where total_sales between 4095 and 12000

Функция in предоставляет возможность эффективного сравнения значения выражения со списком значений данных. Функция in имеет следующий формат:

<выражение> [not] in (<список значений>)

Условие удовлетворяется, если <выражение> равно одному из значений, указанных в <списке значений>. Если используется опция not, то не равно ни одному из значений из <списка>. Например:

select au_name, state from authors where state in (‘CA’, ‘IN’, ‘MD’)

Список значений может быть сформирован посредством обращения к подзапросу, рассматриваемому ниже.

Функция like предоставляет возможность поиска имеющих вид символьной строки значений данных, которые включают заданную строку в качестве подстроки. Функция like имеет следующий формат:

<имя колонки> [not] like <символьная строка>

Колонка должна иметь тип символьной строки, а <символьная строка> представляет собой любую символьную комбинацию. Кроме того, <символьная строка> может включать специальные символы:

  1. символ “%” - представляет любую строку, состоящую из 0 или более символов;

  2. символ “_” (подчеркивания) - представляет любой одиночный символ;

  3. [<описатель>] - определяет диапазон или множество символов, в которые должен входить одиночный символ;

  4. [^<описатель>] - определяет диапазон или множество символов, в которые не должен входить одиночный символ.

То есть <описатель> задается двумя способами:

а) в виде диапазона: r1-r2, например: [a-f]

б) в виде множества: r1r2…, например: [abcdef]

Условие not like является истинным, если ложно соответствующее условие like.

Примеры:

  1. like ‘M%’ - строка начинается на М;

  2. like ‘%er’ - строка заканчивается на er;

  3. like ‘%en%’ - строка имеет подстроку en в любом месте;

  4. like ‘___ryl’ - строка имеет в длину 6 символов и заканчивается на ryl;

  5. like ‘[CK]ars[eo]n’ - строка имеет в длину 6 символов, начинается либо с С, либо с K, а пятый символ - либо e, либо o;

  6. like ‘[M-Z]ing’ - 4хсимвольная строка, заканчивается на ing, а начинается с буквы, принадлежащей диапазону от M до Z;

  7. like ‘M[^C]%’ - строка начинается на M, а в качестве второй буквы (цифры) берется любой символ, отличный от C.

Функция null обеспечивает способ просмотра в таблице неопределенных значений или, напротив, исключения null значений из результата запроса. Функция null имеет следующий формат:

<имя колонки> is [not] null

В структуре where отдельные условия могут соединяться логическими операторами and, or и not. Операция and(и) используется для определения двух и более условий, которые одновременно удовлетворяются в отбираемых строках, например:

select * from quotations where qonorder > 0 and suppno = 54

Оператор or(или) используется для определения двух и более условий, которое обеспечивает отбор строк, удовлетворяющих по крайней мере одному из этих условий, например:

select * from authors where au_fname = ‘Anne’ or au_fname = ‘Ann’

Оператор not используется для определения отрицания условия, например:

select * from authors where not state = ‘CA’

Для группирования условий могут быть использованы скобки, например:

select * from quotations where suppno = 61 and (purtno = 221 or purtno = 222)

Структура group by определяет группы совпадающих значений в указанных колонках. Максимальное количество колонок (выражений) равно 16. В ответе на запрос возвращается только одна результирующая строка для каждой группы. Почти всегда в структуре group by используются агрегатные функции. Например, функция count(*) оценивает количество строк в группе. Если какие-либо строки в группируемой колонке содержат null значения, то каждая такая строка рассматривается как принадлежащая отдельной группе, содержащей одну строку.

Пример:

select nazvanie_goroda from vuz_gorod where cod_stran = ‘01’ group by nazvanie_goroda

Структура having определяет одно или более условий, накладываемых на группы, т. е. заставляет СУБД возвращать результат только для тех групп, которые удовлетворяют заданному <условию поиска>. Having - это то же самое для структуры group by, что и where для структуры select.

Пример:

select nomer from poss group by nomer having count(*) > 1

Сортировка значений полей по возрастанию или убыванию осуществляется с помощью структуры order by, в которой перечисляются через запятую либо названия колонок, либо номера этих колонок в списке полей SELECT. Опция asc определяет сортировку по возрастанию, а опция desc - по убыванию. Если опция не определена, то предполагается упорядочение по возрастанию.

Пример:

select cod_vuza,nazvanie_vuza from vuz_gorod where cod_stran = ‘01’ order by 1

Структура compute используется с агрегатными функциями для получения в отчетах дополнительных записей, содержащих итоговые значения по каждой группе значений полей. С помощью структур compute можно подсчитать итоговые значения и для подгрупп, а также можно задавать несколько структур compute для одной группы. В структуре compute используются следующие агрегатные функции: sum, avg, min, max, count (sum и avg используются только для числовых колонок). Элемент данных, следующий за одной из этих функций, должен быть заключен в круглые скобки.

Агрегатные функции

Функция avg вычисляет среднее среди отобранных значений элемента. Эта функция предназначена только для числовых колонок и может быть использована с ключевым словом distinct. При вычислении среднего null значения игнорируются.

Функция sum вычисляет сумму отобранных значений элемента. Эта функция также предназначена только для числовых колонок, может быть использована с ключевым словом distinct и null значения игнорируются.

Функция max находит наибольшее среди отобранных значений элемента. Эта функция может быть применена к колонке любого типа и null значения игнорируются.

Функция min находит наименьшее среди отобранных значений элемента и также может быть применена к колонке любого типа, null значения игнорируются.

Функция count используется одним из двух способов:

  • count(distinct <имя колонки>) возвращает число, равное количеству отличных друг от друга строк, удовлетворяющих условию поиска;

  • count(*) возвращает число, равное количеству строк, удовлетворяющих условию поиска.

Правила использования структуры compute:

  1. в агрегатных функциях нельзя использовать distinct;

  2. поля в структуре compute должны обязательно присутствовать в списке выборки;

  3. в операторе select, использующего compute, нельзя применять структуру into;

  4. при использовании compute by обязательно присутствие структуры order by, при этом список полей в compute by либо идентичен списку полей в order by, либо является его подмножеством с сохранением следования полей слева направо, начинающегося с одного и того же выражения и без пропусков каких-либо выражений.

Пример: если указывается order by a, b, c , то можно использовать:

compute <агр. функция> (<имя колонки>) by a, b, c

compute <агр. функция> (<имя колонки>) by a, b

compute <агр. функция> (<имя колонки>) by a

и нельзя использовать:

compute <агр. функция> (<имя колонки>) by b,c

compute <агр. функция> (<имя колонки>) by a, c

compute <агр. функция> (<имя колонки>) by c

  1. для подсчета общих итогов используется compute без by.

Примеры:

  1. если в compute после by указывается больше одного поля, то группа значений разбивается на подгруппы и агрегатная функция подсчитывается на нижнем уровне группирования:

select type, pub_id, price from titles

order by type, pub_id, price

compute sum(price) by type, pub_id

  1. если агрегатную функцию нужно подсчитать на каждом уровне группирования, то необходимо использовать compute больше одного раза:

select type, pub_id, price from titles

order by type, pub_id, price

compute sum(price) by type, pub_id

compute sum(price) by type

Кроме того, в структуре compute можно указывать одну и ту же агрегатную функцию для нескольких колонок, а также разные агрегатные функции для различных колонок.

  1. если необходимо подсчитать только общие итоги, которые печатаются в конце отчета, то надо использовать compute без by:

select type, price,advance from titles

where price > $20

compute sum(price), sum(advance)

Оператор union

Оператор union служит для объединения двух и более запросов в один, для которого

можно использовать структуры order by и compute. Синтаксис оператора:

<запрос1>

[union [all] <запрос N>]…

[<структура order by>]

[<структура compute>]

где <запрос1>: select <список выборки>

[<структура into>]

[<структура from]

[<структура where>]

[<структура group by>]

[<структура having>]

а <запрос N>: select <список выборки>

[<структура from]

[<структура where>]

[<структура group by>]

[<структура having>]

Пример:

select * from t1 union select * from t2

Оператор union, по умолчанию, уничтожает дублируемые записи из результата запросов. Если используется опция all, то все записи включаются в отчет.

Правила использования оператора union:

  1. все списки выборки в операторе union должны иметь одинаковую структуру (одинаковое количество однотипных выражений);

  2. заголовки колонок в отчете по объединенному запросу берутся из первого запроса;

  3. структуру into можно использовать только в первом запросе;

  4. структуры order by и compute можно указывать только после последнего запроса для сортировки и подсчета итогов в объединенном запросе;

  5. структуры group by и having можно использовать только в индивидуальных запросах;

  6. оператор union можно использовать в операторе insert, например:

insert into tour

select city, state from stores

union

select city, state from authors

  1. нельзя использовать union в операторе create view;

  2. нельзя использовать опцию browse в предложениях select оператора union.

Встроенные функции

Встроенные функции используются в списке выборки, в структуре where и в различных выражениях. Встроенные функции можно разделить на классы:

- системные функции, которые применяются к системным таблицам БД;

- строковые функции, которые применяются к значениям следующих типов: char, nchar, varchar, nvarchar, binary, varbinary;

- текстовые функции, которые применяются к значениям типа text и image;

- математические функции (тригонометрические, геометрические и др.);

- функции даты, которые применяются к значениям типа datetime и smalldatetime;

- функции преобразования одних типов данных в другие и форматирования дат.

Системные функции

Системные функции обеспечивают наиболее быстрый способ обращения к системным таблицам. Общий синтаксис вызова системной функции:

select <имя функции> (<аргумент[ы]>)

Таблица 1

Функция

Аргумент(ы)

Результат

1) col_name

( <ид. объекта>,

<ид. колонки>)

имя колонки

2) col_length

(“<имя объекта>”,

“<имя колонки>”)

длина колонки в таблице

3) data_pgs

(<ид. объекта>,

{doampg | ioampg})

количество страниц, занимаемое таблицей или индексом (не включаются страницы, используемые внутренними структурами)

4) datalength

(<выражение>)

длина выражения в байтах

5) db_id

(“<имя БД>”)

номер идентификатора БД

6) db_name

(<номер ид. БД>)

имя БД

7) host_id

()

номер идентификатора главного процесса

8) host_name

()

имя текущей главной ЭВМ

9) index_col

(“<имя объекта>”,

<ид. индекса>, <ключ>)

имя колонки индекса

10) isnull

(<выражение>, <значение>)

замена заданного значения null значением

11) object_id

(“<имя объекта БД>”)

номер идентификатора объекта БД

12) object_name

(<ид. объекта БД>)

имя объекта БД

13) reserved_pgs

(<ид. объекта>, {doampg | ioampg})

количество страниц, занимаемое таблицей или индексом (включаются страницы, используемые внутренними структурами

14) rowcnt

(doampg)

количество записей в таблице

15) sused_id

([“<имя клиента>”])

номер идентификатора клиента

16) sused_name

([<ид. клиента>])

имя клиента

17) tsequal

(<вр. метка>, <вр. метка2>)

сравнивает значения временных меток измененной записи; <вр. метка> - временная метка после выборки записи для просмотра; <вр. метка2> - временная метка сохраненной записи после обновления

18) used_pgs

(<ид. объекта>, doampg, ioampg)

общее количество страниц, занимаемое таблицей и ее индексом (включаются страницы, используемые внутренними структурами)

19) user_id

([“<имя пользов.>”])

номер идентификатора пользователя

20) user_name

([<ид.пользователя>])

имя пользователя

21) valid_name

(“<строка>”)

возвращает 0, если <строка> содержит недопустимые символы или длиной больше 30 байт, и не 0 - в противном случае

Примеры:

  1. select x = col_length (“titles”, “title”)

  2. select length = datalength (pub_name), pub_name from publishers

  3. select name from sysusers where name = user_name(1)

Строковые функции

Строковые функции позволяют работать со строковыми и двоичными данными.

Синтаксис вызова строковых функций:

select <имя функции> (<аргументы>)

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

select (<выражение> + <выражение> [ + <выражение>]…)

Обозначение типов аргументов в таблице2:

  1. char_expr - типы char, varchar, nchar и nvarchar;

  2. expression - типы char_expr и типы binary и varbinary;

  3. pattern - типы данных char_expr, которые можно включать в сопоставление с образцами;

  4. approx_numeric - типы float, real и double precition;

  5. integer_expr - типы tinyint, smallint и int;

  6. start - тип integer_expr;

  7. length - тип integer_expr.

Таблица 2

Функция

Аргумент(ы)

Результат

1) ascii

(char_expr)

код ASCII для первого символа в выражении

2) char

(integer_expr)

преобразует цифру, занимающую 1 байт в символ длиной 1 байт

3) charindex

(expression1, expression2)

ищет первое вхождение выражения1 в выражение2 и возвращает номер позиции; если не находит вообще, то возвращает 0

4) char_length

(char_expr)

количество символов в строке или тексте

5) difference

(char_expr1, char_expr2)

разность между двумя значениями типа soundex (см. ниже)

6) lower

(char_expr)

преобразует большие буквы в маленькие

7) ltrim

(char_expr)

убирает начальные пробелы

8) patindex

(“%pattern%”, char_expr [using {bytes | chars | characters}])

возвращает номер первой позиции вхождения pattern в char_expr или 0, если вхождения нет

9) replicate

(char_expr, integer_expr)

возвращает строку типа char_expr, содержащуюся в аргументе1 и повторяемую <аргумент2> раз (max длина строки 255 байт)

10) reverce

(char_expr)

реверс строки, например: “abcd” - “dcba”

Функция

Аргумент(ы)

Результат

11) right

(char_expr, integer_expr)

возвращает часть строки, состоящей из <аргумента2> символов, считая справа

12) rtrim

(char_expr)

убирает замыкающие пробелы

13) soundex

(char_expr)

возвращает четырехсимвольный код символьной строки, состоящий из римских букв

14) space

(integer_expr)

возвращает строку из указанного количества пробелов

15) str

(approx_numeric [, length [, decimal]])

символьное представление числа с плавающей точкой; length устанавливает общее число знаков, а decimal - число знаков после десятичной точки; если length и decimal не указываются, то по умолчанию length=10, а decimal=0

16) stuff

(char_expr1, start, length, char_expr2)

удаляет length символов из expr1, начиная с start, а затем вставляет expr2 в expr1, начиная с start; если expr2=null, то только удаляет

17) substring

(expression, start, length)

выделение подстроки в expression длиной length, начиная с start

18) upper

(char_expr)

преобразование маленьких букв в большие

19) +

expression + expression

конкатенация двух и более символьных или бинарных выражений

Примеры:

  1. select au_lname, substring (au_fname, 1, 1) from authors

  2. select charindex(“wonderful”, notes), patindex(“wonderful”, notes) from titles

where title_id = “TC3218”

  1. select stuff(“abc”, 2, 3, “xyz”)

  2. select (“abc” + “def”)

Строковые функции могут вкладываться друг в друга.

  1. select substring(pub_id + title_id, 1, 6) from titles where price > $20

Текстовые функции

Текстовые функции используются для работы с данными типа text и image.

Таблица 3

Функция

Аргумент(ы)

Результат

1) patindex

(“%pattern%”,char_expr [using {bytes | chars | characters}])

возвращает числовое представление значения первой позиции первого вхождения pattern в символьную строку или 0 - если pattern не найден

2) textptr

(<имя текстовой колонки>)

возвращает указатель на текст (16байтное двоичное число)

3) textvalid

(“<имя таблицы>..<имя колонки>”, <указатель на текст>)

возвращает 1, если указатель допустимый и 0 - в противном случае

4) set textsize

{n | 0}

задает max длину в байтах для колонки типа text/image в select-предложении; если 0, то max длина равна 32 K

Пример:

declare @val varbinary(16)

select @val = textptr(blurb) from texttest

Математические функции

Общий синтаксис вызова математической функции:

<имя функции> (<аргументы>)

Типы аргументов:

  1. approx_numeric - это типы float, real и double precition;

  2. integer - типы tinyint, smallint и int;

  3. numeric - это типы approx_numeric, numeric, dec, decimal, все integer и money;

  4. power - это типы numeric, approx_numeric и money.

Таблица 4

Функция

Аргумент(ы)

Результат

1) abs

(numeric)

абсолютное значение аргумента

2) acos

(approx_numeric)

арккосинус (в радианах)

3) asin

(approx_numeric)

арксинус (в радианах)

4) atan

(approx_numeric)

арктангенс (в радианах)

5) atn2

(approx_numeric1, approx_numeric2)

арктангенс деления аргумента1 на аргумент2

6) ceiling

(numeric)

округление до ближайшего целого, большего или равного аргументу

7) cos

(approx_numeric)

косинус (в радианах)

8) cot

(approx_numeric)

котангенс (в радианах)

9) degrees

(numeric)

преобразование радианов в градусы

10) exp

(approx_numeric)

число e в степени аргумент

11) floor

(numeric)

округление до ближайшего целого, меньшего или равного аргументу

12) log

(approx_numeric)

натуральный логарифм

13) log10

(approx_numeric)

десятичный логарифм

14) pi

()

число пи

15) power

(numeric, power)

преобразование числа типа numeric в число типа power

16) radians

(numeric)

преобразование градусов в радианы

17) rand

([integer])

функция random на отрезке [0;1] или для числа типа integer

18) round

(numeric, integer)

округление числа типа numeric до числа из integer знаков

19) sign

(numeric)

знак числа

20) sin

(approx_numeric)

синус (в радианах)

21) sqrt

(approx_numeric)

квадратный корень

22) tan

(approx_numeric)

тангенс (в радианах)

Примеры:

  1. select ceiling(123.45) => 124.

  2. select round(123.4545,2) => 123.4500

Функции даты (времени)

Таблица 5

Часть даты

Аббревиатура

Значения

1) год

1) yy

1) 1753¸9999

2) квартал

2) qq

2) 1¸4

3) месяц

3) mm

3) 1¸12

4) день года

4) dy

4) 1¸366

5) день

5) dd

5) 1¸31

6) неделя

6) wk

6) 1¸54

7) день недели

7) dw

7) 1¸7 (1-Sunday)

8) час

8) hh

8) 0¸23

9) минута

9) mi

9) 0¸59

10) секунда

10) ss

10) 0¸59

11) миллисекунда

11) ms

11) 0¸999

Таблица 6

Функция

Аргумент(ы)

Результат

1) getdate

( )

Текущая системная дата и время

2) datename

(datepart, date)

часть даты как строка ASCII

3) datepart

(datepart, date)

часть даты как целое число

4) datediff

(datepart, date, date)

количество времени между 2-мя датами в частях даты

5) dateadd

(datepart, number, date)

дата, получаемая прибавлением частей даты к другой дате

Примеры:

  1. select getdate();

  2. select datediff(month, pubdate, ”Nov 30 1985”) from titles;

  3. select dateadd(day, 3, pubdate) from titles

Функции преобразования одних типов данных в другие и форматирование дат

SQL-сервер поддерживает три функции преобразования типов:

  1. convert;

  2. inttohex;

  3. hextoint.

Синтаксис функции convert:

convert (<тип данных>, <выражение> [, <стиль>])

Пример:

select title, convert(char(5), total_sales) from titles

Правила преобразования:

1) преобразование данных типов character в данные типов money, date/time, всех типов numeric и approx_numeric осуществляется только в том случае, если все символы в строке допустимы в новом типе;

2) при преобразовании целых типов данных в тип character необходимо указывать соответствующую длину строки символов;

  1. функцию convert можно использовать при преобразовании типов money, date/time, всех типов numeric, integer, binary и image.

Функции inttohex и hextoint служат для преобразования целых чисел в шестнадцатиричные и наоборот.

Операция Join (соединения таблиц).

Для выполнения операции соединения нескольких таблиц в предложении SELECT необходимо соблюдать три условия:

1) В списке выборки имена колонок указываются с именами таблиц, в которые входят эти колонки.

2) В предложении from указываются через запятую имена всех таблиц, участвующих в соединении, причем на первом месте указывается таблица, в которой осуществляется выборка данных.

3) В предложении where указываются все связи таблиц, где каждая таблица соединяется с другой по полям, определенным на одинаковых доменах, с помощью операций сравнения: =, >, >=, <, , !<.

Примеры использования операции join приведены в разделе “Хранимые процедуры”.

При выполнении операции join в отчет по запросу входят только те записи, которые удовлетворяют условию соединения таблиц. Иногда желательно посмотреть данные, которые не удовлетворили этому условию. В таких случаях используют операцию Outer join, в которой применяются только два оператора сравнения:

1) *= - включаются все записи из первой названной таблицы;

  1. =* - включаются все записи из второй названной таблицы.

При этом, если указывается операция “*=”, то в отчет включаются все записи из первой таблицы, а в колонках, принадлежащих второй таблице, в записях, не удовлетворяющих условию соединения, ставятся null значения. Аналогично, если указывается операция “=*”, то в отчет включаются все записи из второй таблицы, а в колонках, принадлежащих первой таблице, в записях, не удовлетворяющих условию соединения, ставятся null значения.

Пример:

select au_fname, au_lname, pub_name from authors, publishers

where authors.city *= publishers.city

Подзапросы

Подзапрос - это select - предложение, вложенное в другое select-, insert-, update- или delete-предложение или в другой подзапрос.

Предложения, которые включают подзапрос, обычно имеют один из следующих форматов:

1) where <выражение> [not] in (<подзапрос>)

2) where <выражение> <операция сравнения> [any|all] (<подзапрос>)

  1. where [not] exists (<подзапрос>)

Пример подзапроса приведен в разделе “Хранимые процедуры”.

Подмножества

Подмножество - это порождение (представление) данных, строящееся на основе одной или нескольких таблиц БД, называемых базовыми. Кроме этого, представление может быть построено на основе другого представления.

Представления используются для:

  1. предоставления пользователю только интересующих его данных;

  2. упрощения манипулирования данными (представления определяются сложными операциями выборки, проекции и соединения);

  3. предоставления различным пользователям видеть одни и те же данные по-разному;

  4. обеспечения механизма секретности данных;

  5. поддержки логической независимости данных.

Механизм секретности данных осуществляется командами grant и revoke (рассматриваются в разделе “Администрирование”), примененным к представлениям. При этом пользователи получают доступ к различным подмножествам данных:

  1. доступ к подмножеству записей базовой таблицы;

  2. доступ к подмножеству колонок базовой таблицы;

  3. доступ к подмножеству записей и колонок базовой таблицы;

  4. доступ к записям, получаемых путем соединения двух и более базовых таблиц;

  5. доступ к статистическим итогам данных в базовой таблице;

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

В основе команды создания представления лежит оператор select. Синтаксис команды:

create view [[<имя БД>.] <владелец>.] <имя представления>

[(<имя колонки> [, <имя колонки>]…)]

as

[with check option]

Пример:

create view pub_view (publisher, city, state)

as select pub_name, city, state from publishers

Существует несколько ограничений на использование select-предложения в создании представления:

  1. нельзя использовать структуры order by и compute;

  2. нельзя использовать слово into;

  3. нельзя ссылаться на временную таблицу.

Структура with check option используется в тех случаях, когда данное представление будет использоваться командами insert и update. При этом будут контролироваться вводимые и обновляемые записи на соответствие select-предложению в представлении.

Существуют ограничения применения операторов изменения данных (update, insert и delete рассматриваются в следующем разделе) к представлениям:

  1. нельзя применять эти операторы к колонкам представления, значения которых подсчитываются с помощью агрегатных или встроенных функций;

  2. нельзя применять эти операторы к представлениям, использующим агрегатные функции и структуру group by;

  3. нельзя применять эти операторы к представлениям, использующим distinct;

  4. нельзя использовать insert для представлений, построенных на таблицах с колонками not null, когда в эти колонки попадают null значения;

  5. нельзя использовать delete для представлений, построенных на нескольких таблицах;

  6. нельзя использовать insert для представлений, построенных на нескольких таблицах с опцией with check option;

  7. нельзя применять insert и update в представлении, построенном на нескольких таблицах с опцией distinct;

  8. нельзя использовать update для колонки identity.

Удаление представлений осуществляется командой drop view:

drop view [[<имя БД>.] <владелец>.] <имя представления>

[, [[<имя БД>.] <владелец>.] <имя представления>]…

Пример:

drop view pub_view

4. ОБНОВЛЕНИЕ ДАННЫХ

Понятие транзакции

Транзакция - это механизм, объединяющий множество действий в БД в логическую единицу работы. Другими словами, транзакция позволяет пользователю сгруппировать любое количество действий с БД в единое целое, которое может быть выполнено или отменено. Использование транзакций необходимо при выполнении любых изменений в БД.

Транзакции обеспечивают:

  1. целостность данных при работе операторов манипулирования данными (insert, update и delete);

  2. восстановление данных в случае сбоев.

По умолчанию, каждая из команд insert, update и delete рассматривается как одна транзакция.

Каждая определяемая пользователем транзакция, состоящая из операторов языка SQL, начинается командой begin transaction (начать транзакцию), а заканчивается либо командой commit transaction (выполнить транзакцию), либо командой rollback transaction (отменить транзакцию).

Понятие пакета

Пакет - это набор транзакций (одна или более), запускающий процесс работы SQL - сервера и завершающийся по признаку конца пакета. По окончании работы пакета автоматически обеспечивается работа инструментальных средств создания отчетов. Признаком конца пакета является слово "gо". Кроме SQL-предложений в пакетах можно использовать операторы программного языка (Transact-SQL). В свою очередь, набор пакетов можно в интерактивном режиме сохранять в файле операционной системы и затем загружать из файла операционной системы.

Оператор INSERT рассматривался выше при описании загрузки таблиц БД.

Пример:

insert poss values

(534305, 'ЖУРАВЛЕВ АВЕРЬЯН АЛЕКСЕЕВИЧ', '000073', 'M', '0', '001001', '05', 0129000, '08', '90', '03','95')

Оператор DELETE служит для удаления записей из таблицы по заданному условию поиска.

delete [from][[<имя БД>.]<владелец>.]{<имя таблицы>|<имя представления>}

[from][[<имя БД>.]<владелец>.]{<имя таблицы>|<имя представления>}

[,[[<имя БД>.<владелец>.]<имя таблицы>|<имя представления>]]...]

[where <условие поиска>]

Пример:

delete poss where nomer = 534305

удаление из таблицы poss записи с данными о Журавлеве Аверьяне Алексеевиче (см. предыдущий пример).

Оператор TRUNCATE позволяет быстро удалить все записи из таблицы.

truncate table [[<имя БД>.] <владелец>.] <имя таблицы>

Пример: truncate table poss

Оператор UPDATE служит для внесения изменений в записи таблиц БД.

update [[<имя БД>.]<владелец>.] {<имя таблицы>|<имя представления>}

set [[[<имя БД>.]<владелец>.]{<имя таблицы>.|<имя представления>.}]

<имя кол.1>={<выр.1> | null | (<предложение select>)}

[,<имя кол.2>={<выр.2> | null | (<предложение select>)}]...

[from [[<имя БД>.] <владелец>.]{<имя таблицы>|<имя представления>}

[,[[<имя БД>.]<владелец>.]{<имя таблицы>|<имя представления>}]]...

[where <условие поиска>]

Пример: Студент Иванов Иван Петрович был переведен из МЭИ в МГУ:

update poss set vuz_k=2066426

where fio='Иванов Иван Петрович' and vuz_k=2066414

где 2066414 - код МЭИ,

2066426 - код МГУ.

5. ХРАНИМЫЕ ПРОЦЕДУРЫ

Общие понятия

Хранимая процедура - это совокупность предложений языка SQL и необязательных операторов программного языка (Transact-SQL), имеющая имя. Хранимые процедуры, поддерживаемые SQL-сервером, называются системными процедурами.

Хранимые процедуры могут:

1) иметь параметры;

2) вызывать другие процедуры;

  1. возвращать статус-значение в вызывающую процедуру или пакет: успех или неудача (и причина неудачи);

  2. возвращать значения параметров в вызывающую процедуру или пакет;

5) быть запущены или удалены с SQL-сервера.

Хранимые процедуры отличаются от просто SQL-предложений и от пакетов SQL - предложений тем, что они являются объектами БД и перед созданием они проходят прекомпиляцию. Создаются хранимые процедуры с помощью команды create procedure, а запускаются на выполнение командой execute.

При создании хранимых процедур необходимо руководствоваться следующими правилами:

  1. если в пакете используется команда create procedure, то нельзя использовать никаких других команд в этом пакете;

  2. в команде create procedure можно использовать любое количество SQL-предложений, за исключением команды use и команд create:

  • create view;

  • create default;

  • create rule;

  • create trigger;

  • create procedure;

  1. другие объекты БД могут быть созданы в процедуре;

  2. нельзя в теле одной процедуры создать объект БД, уничтожить его, а затем создать новый объект БД с этим же именем;

  3. SQL-сервер создает объекты, определенные в теле процедуры, во время выполнения этой процедуры, а не во время ее компиляции;

  4. если вы запускаете процедуру, которая вызывает другую процедуру, то вызываемая процедура может обращаться к объектам, созданным первой процедурой;

  5. вы можете ссылаться на временные таблицы в теле процедуры;

  6. временные таблицы, созданные процедурой, существуют в БД только во время выполнения этой процедуры;

  7. максимальное количество параметров в хранимой процедуре - 255;

  8. максимальное количество локальных и глобальных переменных в процедуре ограничено только доступной памятью.

Синтаксис команды создания хранимой процедуры:

create procedure [<владелец>.] <имя процедуры> [; <номер>]

[[(] @ <имя параметра> <тип данных> [=<умолчание>][output]

[,@<имя параметра> <тип данных>[=<умолчание>][output]]...[)]]

[with recompile] as

Синтаксис команды запуска хранимой процедуры:

[execute] [@return_status=]

[[[<имя сервера>.]<имя БД>.]<владелец>.]<имя процедуры>[;<номер>]

[[@<имя параметра>=]<значение>|

[@<имя параметра>=] @<переменная>[output]

[,[@<имя параметра>=]<значение>|

[@<имя параметра>=]@<переменная>[output]...]]

[with recompile]

где номер - это номер процедуры в группе процедур, имеющей свое имя; например, имена процедур: orders;1, orders;2 и т. д. (orders - имя группы);

умолчание - это значение параметра по умолчанию;

output - обозначает, что параметр возвращает значение в вызываемую процедуру;

with recompile (в команде create procedure)- сообщает SQL-серверу не сохранять проект указанной процедуры; новый проект процедуры создается при каждом ее запуске на выполнение;

with recompile (в команде execute) - сообщает SQL-серверу выполнить компиляцию нового проекта процедуры;

return status - показывает либо успешное завершение процедуры, либо причины невыполнения (ошибки); это значение может сохраняться в переменной и затем использоваться операторами Transact-SQL; это значение может находиться в промежутке от 0 до -99 (0 - успешное завершение, остальные значения обозначают ошибки).

Три способа запуска хранимых процедур:

1) <имя процедуры>

2) execute <имя процедуры>

3) exec <имя процедуры>

Синтаксис команды удаления хранимой процедуры:

drop procedure [<владелец>.] <имя процедуры>

[,[<владелец>.]<имя процедуры>]...

Переименование хранимых процедур выполняется следующим образом:

sp_rename <старое имя>, <новое имя>

Примеры выполнения запросов с помощью хранимых процедур:

1) выдать данные по учащимся России, принятых на учебу в 89 и 90 годах по специальности 0401 и отсортировать по годам приема и учебным заведениям:

create procedure zapr1 as select * from poss

where (gp='89' or gр='90') and spec='000401' order by gp, vuz_k

2) выдать фамилии, даты рождения, названия учебных заведений, пол, специальности, категории обучения, месяцы приема, года приема, месяцы окончания и года окончания по выпускникам России 1996 года; данные отсортировать по учебным заведениям и специальностям;

create procedure zapr2 as select fio, data_rogden,

vuz.uch_zavedenie, pol, spec, kat_obuch. kat_obucheniya,

mp, gp, mo, gok

from poss, vuz, kat_obuch

where gok='96' and vuz_k=vuz.cod and

kat_obuch_k=kat_obuch.cod

order by 3,5

3) выдать список студентов, обучаемых в городе Москве, принятых на учебу в 1989 г.; схема выдачи отчета должна включать поля: фамилия, дата рождения, учебное заведение, пол, специальность, категория обучения, месяц окончания, год окончания; данные отсортировать по учебным заведениям и специальностям.

create procedure zapr3 as select fio, data_rogden,

vuz.uch_zavedenie, pol, spec, kat_obuch.kat_obucheniya,

mo, gok from poss, vuz, kat_obuch

where vuz_k in (select cod_vuza from vuz_gorod

where cod_goroda='001’)

and kat_obuch_k between '03' and '04'

and gp='89' and vuz_k=vuz.cod

and kat_obuch_k=kat_obuch.cod

order by 3,5

4) выдать статистические данные по всем учебным заведениям России, где есть специальность 0401.

create procedure zapr4 as select vuz.uch_zavedenie,

count(*) from poss, vuz where spec='000401'

and vuz_k=vuz.cod group by vuz.uch_zavedenie

В хранимых процедурах можно использовать операторы языка программирования Transact-SQL.

  1. Условный оператор: if ... else

Синтаксис оператора:

if <логическое выражение> <оператор>

[ else [if <логическое выражение>] <оператор>]

где <логическое выражение> возвращает либо TRUE, либо FALSE и может включать имя поля, константу, комбинацию из имен полей и констант, соединенных арифметическими или поразрядными операциями, и подзапрос, возвращающий единственное значение (обычно используется exists или not exists).

В качестве оператора используется либо предложение языка SQL, либо оператор языка Transact-SQL.

Пример:

if exists(select postalcode from authors where postalcode = ‘94705’)

select «Berkeley author»

  1. Составной оператор (блок): begin ... end

Если в качестве оператора нужно использовать несколько SQL-предложений или операторов, то нужно использовать составной оператор.

Синтаксис оператора: begin

< блок предложений>

end

Пример:

begin

update titles set price = price * 2

select title, price from titles where price > $28

end

  1. Оператор цикла: while

Синтаксис оператора:

while <логическое выражение> <оператор>

где <оператор> выполняется до тех пор, пока истинно <логическое выражение>. В качестве оператора может использоваться оператор языка Transact-SQL, SQL-предложение или составной оператор.

Пример:

while (select avg(price) from titles) < $30

begin

select title_id, price from titles where price > $20

update titles set price = price * 2

end

  1. Оператор break ... continue

Операторы break и continue используются в теле цикла while. Оператор break выполняет немедленный выход из цикла и передает управление первому после цикла (обычно после end) оператору. Оператор continue продолжает выполнять цикл while, пропуская все операторы цикла while, следующие после continue. Очень часто операторы break и continue используются в операторе if ... else.

Синтаксис оператора:

while <логическое выражение>

begin

<оператор 1>

break

<оператор 2>

continue

<оператор 3>

end

Пример:

while (select avg(price) from titles)> $20

begin

update titles set price = price/2

if (select avg(price) from titles) < $40 break

else if (select avg(price) from titles) <$20 continue

select «Average price still over $20»

end

select title_id, price from titles where price > $20

select «Not Too Expensive»

  1. Оператор объявления переменных declare

Синтаксис оператора:

declare @<имя переменной> <тип данных>

[, @<имя переменной> <тип данных>] ...

Имена локальных переменных начинаются с @. При объявлении переменной ее значение устанавливается NULL. Присвоение значения переменной осуществляется предложением select:

select @<имя переменной> = {<выражение> | ()}

[, @<имя переменной> = {<выражение> | ()} ...]

[<предложение from>] [<предложение where>] [<предложение group by>]

[<предложение having>] [<предложение order by>] [<предложение compute>]

Примеры:

declare @veryhigh money

select @veryhigh = max(price) from titles

Кроме локальных переменных существуют и глобальные переменные, поддерживаемые системой SYBASE. Имена глобальных переменных начинаются с двух знаков «@», например: @@error

  1. Оператор перехода: goto

Синтаксис оператора:

<имя метки>:

.

.

.

goto <имя метки>

где <имя метки> задается по обычным правилам задания имени идентификатора.

Пример:

declare @count smallint

select @count = 1

restart:

select «yes»

select @count = @count + 1

if @count <= 4 goto restart

  1. Оператор return

Оператор return выполняет безусловный выход из процедуры. При этом может указываться код возврата.

Синтаксис оператора:

return [<целочисленное выражение>]

Пример:

create procedure find @nm varchar(30) = null

as if @nm is null

begin

select «you must give a user name»

return

end

else

begin

select sysobjects.name from sysobjects, syslogins

where syslogins.name = @nm and sysobjects.uid = syslogins.suid

end

  1. Оператор print

Оператор print используется для вывода сообщений пользователя и значений локальных переменных на экран пользователя. Длина сообщения не должна превышать 255 байт.

Синтаксис оператора:

print {<строка символов> | @<имя переменной> | @@<имя переменной>}

[, <список аргументов>]

Примеры:

print «Berkeley author»

print @msg

  1. Оператор raiserror

Оператор raiserror показывает на экране пользователя ошибку, определенную пользователем, или сообщение из локальной переменной, а также устанавливает системный флажок, т. е. записывает номер ошибки в глобальную переменную @@error.

Синтаксис оператора:

raiserror <номер ошибки> [{<строка символов> | @<имя локальной переменной>}]

[, <список аргументов>] [<расширенное значение> = <расширенное значение>

[{, < расширенное значение> = <расширенное значение>} ...]]

Пример:

raiserror 99999 «you must give a user name»

  1. Оператор waitfor

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

Характеристики

Тип файла
Документ
Размер
254 Kb
Материал
Тип материала
Высшее учебное заведение

Список файлов учебной работы

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7029
Авторов
на СтудИзбе
260
Средний доход
с одного платного файла
Обучение Подробнее