Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по базам данных.doc
Скачиваний:
33
Добавлен:
08.03.2015
Размер:
1.21 Mб
Скачать

Типы данных

Character:

CHAR- 1 символ – 1 байт

CHAR(n) -nсимволов –nбайт

VARCHAR(n) - строка переменной длины (n<=255)

Bit:

BIT

BIT(n)

BITVARING(n) - битовая строка переменной длины

Exact Numeric:

NUM[P[,S]] –P– максимальное количество десятичных чисел;S– максимальное количество цифр после десятичной точки.

DEC[P[,S]]

INTEGER- целочисленный – 4 байта

SHALLINT- короткое целое, стандартный размер – 2 байта.

Approximate Numeric:

FLOAT[(n)] -n– определяет точность представления мантиссы.

REAL- тоже, что иFLOAT, только со стандартной точностью.

DOUBLE- повышенная (удвоенная) точность.

Date Time: (для работы со временем)

DATE- представляет дату в формате: месяц, день, год. Множество значений упорядоченно, и существует некая константа –CURDATE, которая имеет значение текущей даты (всегда).

TIME[(n)] - время,n– точность представления секунд

TIMESTAMP[(n)] - это дата и время.

Interval: - (представление временных отрезков)

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

Ко всем типам относится значение NULL, то есть пусто, пустое значение, отсутствие его.

I. Создание баз данных

CREATE SCHEMA [<имя1> AUTHORIEATION <имя2>]

<имя1> - имя базы данных

<имя1> - идентификатор автора, создателя

II. Уничтожение баз данных

DROPSCHEMA<имя> - при этом ни одной конкретной таблицы не создается

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

1). CREATE DATABASE <имя>

DROP DATABASE <имя> - ее удаление

2). DATABASE<имя> - открыть базу данных

CLOSE<имя> - закрыть базу данных

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

CREATETABLE<имя таблицы>

(<имя атрибута> <тип>,

<имя атрибута> <тип>,

-----------------------------

<имя атрибута> <тип>)

Например:

CREATE TABLE Salesman

(ID CHAR(2),

Name VARCHAR(20),

Status NUM(2) )

IV. Изменение таблиц

ALTER TABLE <имя таблицы> ADD <имя атрибута> <тип>

Пример: ALTER TABLE Salesman

ADD born DATE (дата рождения)

Здесь мы добавим еще один атрибут: «дата рождения»

V. Исключение таблицы

DROPTABLE<имя>

VI. Создание индекса

CREATEINDEX<имя инд.>ON<имя табл.>

(<имя атр.>[, <имя атр.>, …])

Идентифицировать все подряд не надо, надо там, где часто производим поиск.

CREATE UNIQUEINDEX <имя инд.> ON <имя табл.>

(<имя атр.>[, <имя атр.>, …])

Это уникальный индекс.

VII. Удаление индекса

DROPINDEX<имя инд.>

ОГРАНИЧЕНИЕ НА ДОПУСТИМЫЕ ЗНАЧЕНИЯ ДАННЫХ

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

Виды ограничений:

  • Ограничения на атрибуты

  • Ограничения на таблицу

Если накладываем ограничения, то инструкция представляется в расширенном виде:

CREATE TABLE <имя табл.>

(<имя атр.> <тип> [<ограничения>],

<имя атр.> <тип> [<ограничения>],

- - - - - - - - - - - - - - - - - - - - - - - - - -

<имя атр.> <тип> [<ограничения>] [,

<ограничения на таблицу> (<имя атр.> [,

<имя атр.>, …])])

1) Ограничения

исключение № 411 значений:

NOT NULL

Пример:

CREATE TABLE Salesman

(IDCHAD(2)NOTNULL, - т.е. у данного атрибута не должно быть нулевого значения

Name varchar (20) NOT NULL,

Status NUM (2) NOT NULL)

  1. ПОДДЕРЖКА УНИКАЛЬНОСТИ ЗНАЧЕНИЙ:

UNTQUE

Пример:

CREATE TABLE Salesman

(ID CHAR (2) NOT NULL UNTQUE

name VARCHAR (20) NOT NULL,

StatusNUM(2))

Поддерживает уникальность, т.е. СУБД будет следить за тем, чтобы не возникало два одинаковых значения этого атрибута в различных картинах.

UNTQUEможет быть наложено на таблицу.

Можно указывать не один атрибут, а группу атрибутов.

Пример:

CREATETABLESalesman

(------------ то же самое,

а в конце:

UNTQUE(ID,Status)

Значения Statusповторяться могут, но их комбинации (ID,Status) нет.

  1. ОПРЕДЕЛЕНИЕ ПЕРВИЧНОГО КЛЮЧА.

PRIMARY KEY

Пример:

CREATE TABLE Salesman

(ID CHAD (2) NOT NULL PRIMARY KEY,

Name VARCHAR (20) NOT NULL,

Status NULL (2);

UNTQUE(Name,Status)

Не может быть одинаково имя и статус.

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

  1. ОГРАНИЧЕНИЕ НАЗНАЧЕНИЯ.

CHECK (<предикат>)

Может быть наложен на таблицу и отдельный атрибут.

Примеры:

CHECK (Status ≥ 10)

CHECK (Status > 20 OR City = ‘Tula’)

  1. ЗАДАНИЕ ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ.

Первоначально для всех значений устанавливается значение NULL.

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

DEFAULT = <ЗНАЧЕНИЕ>

Пример:

CREATE TABLE Salesman

(- - - - - - - -

- - - - - - - -

StatusNULL(2)DEFAULT= 20,)

Status= 20, если оно не задано

ПОДДЕРЖКА ЦЕЛОСТНОСТИ ПО ВНЕШНИМ КЛЮЧАМ

Это целесообразно делать, если внешний ключ является составным.

На атрибут: ключ является простым

На таблицу: оно накладывается так:

Это составной внешний ключ

FOREIGNKEY(<список атрибутов>)REFERENCES

<имя таблицы> (<список атрибутов >)

Это составной первичный ключ таблицы

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

REFERENCES<имя таблицы> (<имя атрибутов>)

Манипулирование данными DMLвключает в себя четыре инструкции:

SELECT

INSERT

DELETE

UPDATE

Select– выбор, определяет таблицу, которую надо выбрать из базы данных

приводят к изменению базы данных

INSERT- вставка

DELETE- уничтожение

UPDATE– изменение, обновление

SELECT

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

Используется не только самостоятельно.

На базе SELECTстроятся все отчеты.

Общая конструкция, которая используется

SELECT:

SELECT<список атрибутов>

FROM<имя таблицы>

WHERE<предикат>

В первой строке – перечень атрибутов, которые включаются в выборку.

Вторая строка – имя таблицы, из которой делают выборку.

Третья строка – условие истинности, по которым делается выборка.

Пример:

Дано три отношения

Поставщики (S) (Код.пост., имя, катег. пост., город)

Деталь (Р) (Код.дет., наимен., вес, цвет, город)

Поставки (SР) (Код.пост.; Код.дет., количество)

S

Код пост.

имя

Катег. пост

город

S1

S2

S3

S4

S5

Иванов

Петров

Сидоров

Круглов

Смирнов

10

20

30

10

30

Москва

Тула

Тула

Москва

Орел

Р

Код дет.

наименование

вес

цвет

город

Р1

Р2

Р3

Р4

Р5

Р6

Сайка

Виски

Кольцо

Винт

Шайба

Винт

10

12

24

40

25

10

Красный Зеленый

Синий

Красный

Желтый

Красный

Москва

Тула

Москва

Москва

Тула

Рязань

SP

Код пост.

Код дет.

количество

S1

S1

S1

S2

S2

S2

S2

S3

S3

S5

S5

S5

Р1

Р3

Р6

Р1

Р2

Р5

Р6

Р2

Р4

Р4

Р5

Р6

100

200

100

200

300

200

100

300

300

100

200

300

SELECT*

FROM<имя таблицы>

___________________

SELECTкод дет.

FROMSP

Возможна перестановка столбцов таблицы.

Пример:

SELECTгород, имя Москва Иванов

FROMSТула Петров

… …

Орел Смирнов

Результатом любой выборки является отношение, т.е. множество картежей.

DISTINCT– устраняет повторы картежей ( устраняют повторяющие значения).

SELECT DISTINCT код дет. Р1

FROM SP P3

_________________________

Р2

Р5

Р4

Вместо атрибута в строке (селект) может быть записано выражение.

Пример:

SELECTнаим., вес*1000

FROMP

_____________________

гайка 10000

винт 12000

- - - - - - - - - - - - - - -

винт 10000

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

Пример:

SELECTнаим., вес*1000, ‘грамм’

FROMP

_______________________________

гайка 10000 грамм

- - - - - - - - - - - - - -

винт 10000 грамм

ВЫБОРКА С ОГРАНИЧЕНИЕМ

Примеры:

Пусть требуется выбрать коды поставщиков, проживающих в Туле и имеющих категорию больше 20.

SELECT код пост. S3

FROM S

WHEREТула = город

ANDкатег. > 20

________________________

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

SELECTDISTINCTцвет зеленый

FROMР синий

WHEREнаим.= ‘винт’ красный

ORвес > 17 желтый

Новые команды для ограничений:

IN– принадлежит

BETWEEN- между

LIKE– соответствует шаблону

IN

Пусть требуется выбрать фамилии поставщиков, проживающих в Туле или в Москве.

SELECT имя

FROM S

WHERE город IN (‘Тула’, ‘Москва’)

________________________________

Иванов

Петров

Сидоров

Круглов

BETWEEN

Пусть требуется выбрать коды и названия деталей, вес которых заключен между 16 и 25.

SELECT код.дет., наим.

FROM Р

WHERE вес BETWEEN 16 AND 25

P3 Кольцо

P5Шайба

Граничные значения при употреблении BETWEENпопадают в выборку.

LIKE

К атрибутам типа CHARиVARCHARгруппе символьных атрибутов

LIKE<шаблон> – конкретное значение

Кроме него в шаблоне могут использоваться символы:

( _ ) – любой символ,

(%) - все количество всех символов.

M_ _K– все строки из 4-х символов, первый из которых М, последний К

М % - все строковые значения, которые начинаются с М

М % К – любое строковое значение , которое начинается с М и заканчивается К.

Пример:

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

SELECT DISTINCT город

FROM Р

WHERE наим. LIKE’%a’

_______________________

Москва

Тула

Использование NULLзначений.

Сравнение с NULLневозможно.

Если хотим распознать это значение, то используем ISNULL.

Пример:

Пусть требуется выбрать те номера деталей, для которых еще не определен код деталей.

SELECT DISTINCT код дет.

FROM SР

WHEREколичествоISNULL

ISNOTNULL– если не равно нулю,

NotIN(…) - не принадлежит множеству.

УПОРЯДОЧЕННЫЕ ВЫБОРКИ:

ORDERBY<имя атрибутов>, <имя атрибутов>

ASC– по возрастанию (по умолчанию)

DESC– по убыванию.

В строке ORDERBYвместо имени атрибута может быть использован порядковый номер.

В ORDERBYмогут быть указаны те атрибуты, которые попадают в выборку (указаны в строке ‘SELECT’).

Пример:

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

SELECTкод дет., цвет, вес

FROMР

WHERE город NOT IN (‘Тула’)

ORDER BY вес, цвет DESC

__________________________

P1, красный, 10

P6, красный, 10

P3, синий, 24

P4, красный, 40

ИСПОЛЬЗОВАНИЕ АГРЕГИРОВАННЫХ ФУНКЦИЙ

COUNT– количество картежей

SUM

AVG– среднее значение атрибута

MIN

MAX

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

SELECT<имя атрибутов>, <имя функций> (<имя атрибутов>)

FROM<имя таблицы>

Пример:

Надо вычислить среднюю категорию поставщика.

SELECTAVG (катег.)

FROMS

Количество категорий поставщиков.

SELECT COUNT (катег.)

FROM S

____________________________

SEKECT COUNT (DISTINCT катег.)

FROM S

____________________________

SELECTCOUNT(*) все картежи, включаяNULL, значения повторяющиеся

FROM S

ALL

SELECT COUNT (ALL катег.)

FROMS

Будут подсчитаны все повторяющие значения, значения NULLподсчитываться не будут.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРА GROUP BY

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

Пример:

Пусть требуется для каждого кода деталей вычислить MAXобъем поставки.

SELECTкод дет., МАХ (кол)

FROM SP

GROUP BY код дет.

____________________________

P1 200

P3 200

P6 300

P2 300

P5 200

P4 300

Пример:

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

SELECT Наим., цвет, MIN (вес)

FROM P

GROUPBYНаим., цвет

_________________

Гайка красный 10

Винт зеленый 12

Кольцо синий 24

Винт красный 10

Шайба желтый 25

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

Пример:

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

SELECTкод дет., АVG(Кол.)

FROM SP

GROUP BY код дет.

НАVINGCOUNT(Код пост.) > 1

_____________________

Р1 150

Р6 500/3

Р2 300

Р5 200

Р4 200

Очень часто требуется построить запрос, где требуется много таблиц.

Join– присоединение таблиц

JoinS. Город Р. Город

<имя табл.> <имя атр.>

Пример:

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

SELECTS.имя, Р.наим.,S.Город

FROM SP

WHERE S.Город = P.Город

______________________________

Иванов Гайка Москва

Иванов Кольцо Москва

Иванов Винт Москва

Петров Винт Тула

Петров Шайба Тула

Сидоров Винт Тула

Сидоров Шайба Тула

Круглов Гайка Москва

Круглов Кольцо Москва

Круглов Винт Москва

Можно строить следующие сложные запросы с использованием более сложных предикатов.

Пример:

Требуется вывести информацию о поставщиках и городах, в которых они проживают для тех поставщиков, для которых объем поставки больше 200.

SELECT S. имя, S. город

FROM S, SP

WHERES. код пост. =SP. код пост.

ANDSP. Кол. > 200

________________

Петров Тула

Сидоров Тула

Сидоров Тула

Смирнов Орел

Если хотим устранить дублирование картежей, то надо добавить DISTINCT.

Пример:

Надо вывести поставки поставщиков, которые проживают не в том городе, где делаются детали.

SELECTS. имя,P. наим.,SP. количество

FROM S, P, SP

WHERE SP. Код пост. =S. Код пост.

ANDSP. Код дет. =P. Код дет.

ANDS. город < >P. город

_____________________

Иванов винт 100

Петров гайка 200

Петров винт 100

Сидоров винт 300

Смирнов винт 100

Смирнов шайба 200

МИРНОВ ВИНТ 300

СОЕДИНЕНИЕ КОПИЙ ОДНОЙ ТАБЛИЦЫ

Алиасы

В одном запросе SELECTможно использовать копии одной и той же таблицы, указанная вFROM– это алнаса.

Имя Алиаса образуется следующим образом:

<имя табл.> <имя Алиаса >

S first S second

PaPb

Пример:

Требуется найти все пары поставщиков, имеющие одинаковые категории.

SELECTа. имя,b. Имя, а. Катег.

FROM S а, S b

WHERE а. Катег. = b. Катег.

____________________________

  • Иванов Иванов 10

Иванов Круглов 10

  • Петров Петров 20

  • Сидоров Сидоров 30

Сидоров Смирнов 30

  • Круглов Иванов 10

  • Круглов Круглов 10

  • Смирнов Сидоров 30

  • Смирнов Смирнов 30

  • - это то, что нам не надо. Для его удаления нужно добавить условие:

ANDа. имя <b. имя

ВЛОЖЕННЫЕ ЗАПРОСЫ

Пусть требуется выбрать все поставки, в которых поставляется кольцо.

SELECT SP. Код пост., SP. Код дет.,SP. Кол-во

FROMSP,P

WHERESP. Код дет. =P. код дет.

AND P. наим. = ‘кольцо’

______________________

SELECT *

FROM SP

WHERE код дет. =

(SELECT код дет.

FROM P

WHERE наим. = ‘кольцо’)

Сначала вычисляется внутренний SELECT, а затем обрабатывается внешний запрос.

В результате первого шага у нас получится одно значение: Р3.

Сравним по эффективности эти два запроса.

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

Можно использовать операцию In(если вместо кольцо – винт).

SELECT *

FROM SP

WHERE код дет. IN

(SELECT код дет.

FROM P

WHEREнаим. = ‘винт’)

Но так как мы используем множественную операцию IN, то внешний запрос обрабатывается неправильно.

Пример:

Нужно найти имена всех поставщиков, имеющих суммарный объем поставок более 400.

SELECTимя

FROMSвнешний запрос

WHEREкод пост.IN

(SELECT код пост.

FROM SP outer

WHERE400 < внутренний запрос

(SELECTSUM(кол.)

FROM SP inner

WHERE outer. Код пост.=inner. Код пост.))

______________________________________

Иванов

Петров

Сидоров

Смирнов

СВЯЗАННЫЕ ПОДЗАПРОСЫ

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

Пример:

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

(*- выбрать все)

SEKECT *

FROM S

WHERE 200 IN

(SELECT Количество

FROM SP

WHERES.Код пост. =SP.код пост.)

Конструкция «вложенный цикл» имеет трудоемкость n2.

____________________

S1Иванов 10 Москва

S2Петров 20 Тула

S5Смирнов 30 Орел

Как можно сконструировать этот запрос, чтобы получился запрос – соединение

SELECTDISTINCTS.Код пост.,S.имя,S.катег.,S.город

FROM S, SP

WHERE S.Код пост. =SP.код пост.

ANDSP.Кол-во = 200

Пример:

Пусть требуется выбрать все поставки с объемом большим, чем средний объем для данной детали.

SELECT DISTINCT *

FROM SP out

WHERE out.Кол. >

(SELECT AVG (Кол.)

FROM SP inn

WHERE inn.Код дет. = out.код дет.)

______________________________________________________

S2 P1 200

S5 P6 300

S2 P1 200

S5 P6 300

S3 P4 300

S3 P4 300

S5P6300

Для того, чтобы не было повторов, нужно добавить DISTINCT.

ИСПОЛЬЗОВАНИЕ ЗАПРОСОВ SELECT ПАРАМЕТРА EXISTS

EXISTSможет быть применен к внутренней выборке и генерирует булева значения.

True- если выборка не пустая,

False- если выборка пустая.

Пример:

Нужно выбрать код и имя поставщиков при условии, что в Sесть хотя бы один поставщик из Москвы.

SELECT S.Код пост., S.имя

FROM S

WHERE EXISTS

(SELECT *

FROM S

WHERE Город = ‘Москва’)

Здесь алиасы не используются, так как внутренние и внешние запросы не связаны.

Результат: два первых столбца таблицыS(полностью).

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

Пример:

Нужно найти коды поставщиков, которые имеют несколько поставок.

SELECT DISTINCT Код out.Код пост.

FROM SP out

WHERE EXISTS

(SELECT *

FROM SP inn

WHERE inn.Код пост. =out.код пост.

ANDinn.Код дет.<> out.код дет.)

__________________

S1, S2, S3, S5.

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

Но это невозможно в нашем случае, так как таблица SPимеет первичный ключкод пост., код дет., следовательно, повтора не может быть в этих столбцах.

Пример:

Надо выбрать данные о всех поставщиках, которые поставляют детали в нескольких поставках.

SELECT *

FROM S

WHERE EXISTS

(SELECT *

FROM SP out

WHERE S.Код пост. = out код пост.

AND 1<

(SELECT COUNT (*)

FROM SP inn

WHERE out.Код дет. =inn.код дет.))

Использование параметров ANY,SOME,ALL.

Параметры ANYиSOMEвSQLвыполняются одинаково. Различие лишь в смысле этих слов.

ANY- какой-нибудь;

SOME- какой-либо.

Пример:

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

SELECT *

FROM S

WHERE город = ANY

(SELECTгород принимает значениеtrue, если какой-либо город,

FROMP) выбранный из внутреннего цикла совпадает с городом из внешней выборки.

Можно еще и так.

SELECT *

FROM S

WHERE город IN

(SELECTгород

FROMP)

Можно построить запрос и с использованием EXISTS:

SELECT *

FROM S

WHERE EXISTS

(SELECT *

FROM P

WHERE S. город = P. город)

Предикат ALLпринимает значениеtrue, если каждое из выбранных в подзапросе значений удовлетворяет внешнему запросу.

Пример:

Выбрать поставщиков, категория которых выше, чем категория всех из поставщиков, проживающих в Москве.

SELECT *

FROM S

WHERE катег. > ALL

(SELECT катег.

FROM S

WHERE город = ‘Москва’)

Параметр UNIONпозволяет объединить результаты двух независимых выборков в одну таблицу.

При выполнении операции UNIONдублирование картежей исключается.

Пример:

Выбрать детали, которые производятся в Москве, и поставщиков, которые живут там же.

SELECT код пост., имя

FROM S

WHERE город = ‘Москва’

UNION

SELECT код дет., наим.

FROM P

WHERE город = ‘Москва’

S1 Иванов

S4 Круглов

P1 гайка

P3 кольцо

P4 винт

На этом мы заканчиваем инструкцию SELECT.

ИЗМЕНЕНИЕ ДАННЫХ В БАЗЕ ДАННЫХ

CREATE– создает таблицу

ALTER

SELECT– работает с готовыми таблицами, исполненными данными

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

INSERTработают с целыми комплектами

DELETE

UPDATEпозволяют изменить значение

INSERT

INSERTINTO<имя табл.> [(<имя атр.>, …)]

VALUES(<знач.>, …)

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

Если в строке INSERTуказан список атрибутов, в который входят не все атрибуты, то список значений в строкеVALUESдолжен быть согласован по количеству, порядку следования, при этом значение отсутствующих атрибутов формируется по умолчанию(NULL).

Пример:

Нужно добавить картеж в таблицу.

INSERT INTO S

VALUES (‘S6’, ‘Стеклов‘, 20, ‘Орел’)

Пример:

(Когда вводятся не все атрибуты).

INSERTINTOP(Код дет., наим., город)

VALUES(‘P7’, ‘кольцо‘ , ‘Тула‘)

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

Если при определении этой таблицы для этих атрибутов не сформировано значение по умолчанию, то устанавливается для них значение NULL.

Если для цвет – NULL, то эта конструкция ошибочна.

Картеж, описываемый в INSERT, уже существует в таблице, то вместо строкиVALYES, используется запросSELECTв существующей базе данных.

Пример:

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

INSERT INTO SP (код пост., код дет.)

SELECTS. код пост.,P. Код дет.

FROM S, P

WHERE S. город = P. Город

Значение атрибута количество будет сформировано по умолчанию.

Пример:

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

INSERT INTO SM

SELECT код пост., SUM (кол-во)

FROM SP

GROUP BY код пост.

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

DELETEFROM<имя табл.>

WHERE <предикат >

Пример:

DELETE FROM SP

DROP SP- удаляется вся таблицаSP, и с ней больше работать нельзя.

___________________

DELETE FROM SP

WHERE кол. > 200

Следующая инструкция обновления UPDATE. Она обновляет только некоторые картежи.

Пример:

Пусть требуется установить категории поставщиков в 30.

UPDATE S

SET катег. = 30

Пример:

Надо повысить категорию поставщиков до 30, у которых она была равна 20.

UPDATE S

SEТ катег. = 30

WHERE катег. = 20

Пример:

Нужно всех москвичей, у которых категория меньше 30 переселить в Томск и повысить до 30.

UPDATE S

SET катег. = 30, город =’Томск’

WHEREкатег. < 30

ANDгород = ’Москва’

Пример:

Нужно увеличить на 10 категорию всех поставщиков, проживающих не в Москве.

UPDATE S

SET катег. = катег. + 10

WHEREгород < > ‘Москва’

В строке SETможно использовать и значениеNULL, присваивая его какому-либо атрибуту.

Пример:

Нужно всем (каким-либо) москвичам аннулировать категорию.

UPDATES

SETкатег.=NULLЭто присваивание

WHEREгород < > ‘Москва’ Это отношение

В этой инструкции может использоваться и подзапрос.

Пример:

Пусть мы создаем таблицу, в которой хотим поместить всех поставщиков из Москвы.

CREATE TABLE MS

(Код пост. CHAR(2),

- - - - - - - - - - - - - - - - -)

___________________

INSERT INTO MS

SELECT *

FROMS

WHEREгород = ‘Москва’

Пример:

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

INSERT INTO MS

SELECT *

FROM S

WHERE код пост.IN

(SELECTкод пост.

FROM SP

WHERE код дет. IN

(SELECT код дет.

FROM P

WHERE город= ‘Москва’))

Пример:

Пусть нужно удалить все поставки деталей, которые производятся в Туле.

ANY – любой.

DELETE FROM SP

WHERE код дет. = ANY

(SELECT код дет.

FROM P

WHEREгород = ‘Тула’)

Пример:

Увеличить на 10 категорию всех поставщиков, имеющих более одной поставки.

UPDATE S

SET катег. = катег. + 10

WHERE 1<

(SELECT COUNT (*)

FROM SP

WHERE S. код пост. =SP. Код пост.)

Ограничение:

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

Пример:

Нужно удалить всех поставщиков с категорией ниже среднего.

DELETE FROM S

WHERE Катег. <

(SELECT AVG (Катег.) ТАК НЕЛЬЗЯ

FROM S)

Представления VIEW

Это создание виртуальной подсхемы для разработки приложения. Если мы создаем таблицы с помощью команды CREATE, то они будет избыточными. Чтобы этого избежать существует понятие представленияVIEW.

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

Пример

Пусть мы хотим создать представление о немосковских поставщиках.

CREATE VIEW NMS

AS SELECT * (создать как выборку)

FROMS

WHEREгород<>’Москва’

Не существует никаких ограничений на SELECT, но существует ограничения наUPDATEиDELETE.

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

Пример

CREATEVIEWNKS

ASSELECTкод. пост, имя, город

FROMS

Здесь атрибут «категория» будет невиден, поэтому доступ к нему ограничен.

Пример

Пусть мы хотим решить задачу о переезде поставщика S2 в Рязань.

UPDATENKS

SETгород = ’Рязань’

WHEREкод. пост = ‘S2’

Можно создавать групповые представления.

Пример

Хотим создать представление о поставках, в которых для каждого поставщика отражалась количество поставщиков в суммарном и среднем объеме.

CREATEVIEWTOTSP(код. пост, кол-во пост, сумм пост, сред. пост)

ASSELECTкод. пост,COUNT(код. дет.),SUM(кол-во),AVG(кол-во)

FROM SP

GROUP BY код. пост.

Чтобы получить соответственно отчет о поставках:

SELECT*

FROMTOTSP

Пример

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

CREATE VIEW NAMESP

AS SELECT S.имя, P.наим, SP.код.дет

FROM S, P, SP

WHERE S.код. пост. = SP.код. пост.

AND P.код.дет.=SP.код.дет.

Удаление представления: DROPVIEW<имя представления>

Пример

DROPTOTSP

Неоднозначность при обновлении представления

Пример

Создать представление, в котором будут собраны пары городов, в которых проживают поставщики и производят деталь, у которой категория больше 10.

CREATE VIEW CSP(S.город,P.город)

AS SELECT DISTINCT S.город, P.город

FROM S, P

WHERE категория>10

Тула

Москва

Орел

Москва

Тула

Тула

Орел

Тула

Тула

Рязань

Орел

Рязань

Если сделать UPDATE, то могут возникнуть неоднозначности. Т.к. одному картежу представления может существовать несколько пар картежей базовых таблицSиP, на которых на которых определено это представление.

Если мы захотим скорректировать представление, то неопределенно где изменить данные в SилиP, т.к. картежу Тула Москва соответствует три пары картежей, т.к. мы используемDISTINCT, то создаетсяне обновляемое представление

UPDATEBLE– обновляемое.

Стандартом ANSIопределяется набор требований к представлениям, которые обеспечивают его обновляемость:

  1. представление базируется на одной таблице

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

  3. отсутствует параметр DISTINCT

  4. отсутствует GROUP BU иHAVING

  5. отсутствует подзапросы в определенном представлении

  6. представление может быть определено на базе другого представления, если оно является обновляемым

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

Пример

По таблице SPопределить представление, в котором для каждого из поставщиков определено количество поставок.

CREATE VIEW POST(код. пост., код. пост.)

AS SELECT код. пост, COUNT(*)

FROM SP

GROUP BY код. пост.

Не обновляемо, т.к. есть COUNTиGROUPBY, и нет первичного ключа.

CREATE VIEW MSK

AS SELECT *

FROMS

WHEREгород = ‘Москва’

Обновляемо, т.к. все условия выполнены.

Пример

Создать представление, в которое входит информация о поставщиках, среди поставок объемом 200, причем категория не входит.

CREATE VIEW PST

AS SELECT код. пост., имя, город

WHERE код. пост. IN

(SELECT код. пост.

FROM SP

WHEREкол=200)

Не обновляемое, т.к. содержит запрос.

Пример

Выбрать поставщиков с категорией равной 30.

CREATE VIEW SNK

AS SELECT *

FROMS

WHEREкатег=30

В это представление попадут не все картежи, следовательно это представление можно обновлять.

Добавим в него картеж с помощью INSERT

INSERT INTO SNK

VALUES (‘S6’,’Орлов’,20,’Тула’)

Через представление мы видим атрибут с категорией 30. Этот картеж попадает в базовую таблицу, а в представление его не будет.

Для избежания такой ситуации имеется параметр WITHCHECKOPTION

WITH CHECK OPTION

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

Пример

Создать представление, в которое войдут поставщики из Москвы, т.к. значение атрибута ‘город’ будет одинаковым, то не целесообразно его представлять в представлении.

CREATE VIEW MSK

AS SELECT (код. пост., имя, катег.)

FORMS

WHEREгород =’Москва’

Оно обновляемо.

Если мы хотим обновить, то по умолчанию будет ‘Москва’, если нет, то результат такого представления будет невидим. Но добавляемый картеж не будет противоречить определению представления, т.к. в нем город не используется, поэтому лучше описывать в определении представлении Москва, т.к. параметр WITHCHECKOPTIONбудет защищать.

Механизм защиты SQL

  1. Данные необходимо защищать от разрушения (сбой программ, неквалифицированное использование и т.д.)

  2. Защита от несанкционированного доступа.

Имеется три механизма защиты данных:

  1. Механизм представлений

  2. Механизм привилегий

  3. Механизм транзакций

Механизм представлений

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

Каждый пользователь имеет свой ID(идентификационный номер) и под ним он регистрируется в системе.USER– общий идентификатор. Для каждого используется определенный набор привилегий. Привилегии определяю действия или данные, которые доступны пользователю. Пользователь, создает таблицу, является ее владельцем, может назначать привилегии другим пользователям по работе с таблицей.

Стандартный набор привилегий SQLвключает в себя:

  1. INSERT

Право выполнять с таблицей соответствующие операции

  1. DELETE

  1. UPDATE

  1. SELECT

  1. REFERENCES

Право использовать атрибуты таблиц в качестве внешних ключей других таблиц

Кроме того есть не стандартные привилегии:

GRANT– назначение привилегий

REVOKE- лишение привилегий

Конструкция для GRANT:

GRANT<имя правила>ON<имя таблицы>TO<IDпользователя>

Может быть указан список привилегий после GRANT, и привилегию можно назначать списку пользователей (послеTO)

Пример

Право выборки из таблицы S

GRANT SELECT ON S TO Петров

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

GRANT INSERT, SELECT NO S TO Sidorov

GRANTпозволяет назначать привилегии на отдельные атрибуты таблицы.

GRANT UPDATE ON SP(кол) TO Petrov

GRANT UPDATE ON S(город, категория) TO Ivanov

Можно передать все свои привилегии другому пользователю, также можно сделать некоторую привилегию общедоступной.

GRANT ALL ON P TO Sidoriv

GRANT SELECT ON S TO PUBLIC

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

IVANOV S

GRANT INSERT ON S TO PETROV

WITHGRANTOPTION

Чтобы PETROVмог передать право передачи соответствующих атрибутов.

Как менять привилегии? Структура команды REVOKE.

REVOKE<имя привилегии>ON<имя таблицы>FROM<имя пользователя>

REVOKE SELECT, INSERT ON S FORM IVANOV

Лишить привилегий может тот, кто ее предоставил.

Три базовых уровня привилегий

  1. CONNECT

  2. RESOURCE

  3. DBA

CONNECT– право входить в систему

RESOURCE– право создавать базовые таблицы

DBA– право полностью распоряжаться базой данных, и назначать привилегии.

Есть еще один уровень: SYSADM. Он выше, чем уровеньDBA.

GRANTRESOURCETOIVANOV

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

GRANT CONNECT TO IVANOV IDENTIFIED BY PAROL

Администратор и Иванов могут теперь изменить пароль.

Механизм транзакций

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

Основная цель транзакций – это предотвратить непоправимые последствия ошибок, которые вызывают сбой в системе.

Пример

Если мы хотим удалить поставщика, то надо удалить его из таблицы S, однако может оказаться, что среди поставок может оказаться поставки этого поставщика, следовательно, нужно отменить его поставки, либо передать их другому поставщику.

Для решения этой проблемы нужно:

  1. обновление таблицы поставок

  2. удаление поставщика

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

Для управления транзакций в SQLсуществуют две конструкции:

  1. COMMITWORK– зафиксировать все изменения, выполненные в ходе транзакции

  2. ROLLBACKWORK– отменить все изменения, выполненные в ходе транзакции

Режим автоматического фиксирования правильных транзакций SETAUTOCOMMITON, отменаSETAUTOCOMMITOFF

Параллельное выполнение транзакций на уровне SQLтакже рассматривается.

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

В SQLвводится понятии блокировкиLOCK.

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

Существуют два вида блокировки:

  1. S-Locks– распределяемая блокировка

  2. X-Locks– исключительная блокировка

S-Locksв единицу времени может выполняться более чем одним пользователем, предоставляет многим пользователям доступ к одним и тем же данным, не изменяя их

X-Locksзапрещает доступ к данным пользователям, кроме того, чья блокировка выполняется в данный момент.

Использование встроенного SQL

С самого начала определен механизм расширения SQL(механизм встраиванияSQLв некоторый язык третьего поколения).

Стандартом ANSIопределены четыре:

  1. Pascal

  2. Fortran

  3. Cobol

  4. Pl1

Правило, которое положено в строенный SQL:

  1. Перед каждой командой SQLзапроса нужно писатьEXECSQL

  2. Исходный запрос SQLобрабатывается препроцессором.

Язык программирования

SQL

Препроцессор

Модуль доступа

Модуль доступа обеспечивает интерпретация SQLкода. Для одной конкретной программы может существовать один модуль доступа. С использованием программы, но встроенномSQLсвязан механизм привилегий:

Каждой программе ставится в соответствие некоторая привилегия (ID). Для того чтобы использовать встроенныйSQLнужно соблюдение типов.

В запросах SQLразрешается использовать переменные высокого уровня везде, где в соответствии с синтаксисом могут быть выражения. Использование в запросахSQLязыков высокого уровня должно удовлетворять четырем правилам:

  1. Эти переменные должны быть объявлены в SQLDecelerateSection

  2. Должна быть обеспечена совместимость по типу данных

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

  4. Перед именем переменной при ее использовании в SQLкоманде ставится «:»

Пример

EXEC SQL

INSERT INTO S

VALUES (:Id,:Name,:Категория,:Sity)

while not eof(Input) do

begin

readln(:id,:name,:lex,:sity)

EXEC SQL

INSERT INTO S

VALUES(:id,:name,:lex,:sity);

end;

Раздел SQLDecelerateSectionпомещается в любом месте. Все переменные помещаются в этом разделе.

Пример

EXEC SQL BEGIN DECELERATE SECTION;

VAR

ID, …

EXEC SQL END DECELERATE SECTION;

Понятие о курсоре SQL

  1. Первое определение курсора

  2. Активизировать курсор

  3. Прочитать соответствующий курсор, переместить курсор

  4. Закрыть курсор

Рассмотрим эти инструкции на конкретных примерах. Курсор определяется также как представление – с помощью SELECT.

Пример

Мы хотим рассматривать таблицу S, обрабатывать ее, рассматривать поставщиков из Москвы.

EXEC SQL DECELERATE CURSOR MS FOR

SELECT *

FROM S

WHERE Город=’Москва’;

Эта функция определяет курсор, но никакого значение курсор не принимает.

Пример

Если мы хотим обрабатывать этих поставщиков, то должны открыть курсор.

EXECSQLOPENCURSORMS

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

EXECSQLFETCHCURSOR MS

INTO:id,:name,:lex,:sity

Где id,name,lex,sity– это переменные языка высокого уровня. При этом происходят два действия:

  1. Перечисленным переменным присваиваются значения активного картежа

  2. Курсор перемещается к следующему картежу

При использовании этой инструкции курсор можно не писать.

Пример

Напечатать данные обо всех поставщиках проживающих в Москве.

KEY:=’Y’

EXEC SQL OPEN CURSOR MS;

WHILE KEY=’Y’ DO {(KEY=’Y’)AND(SQLCODE=0) DO}

BEGIN

EXEC SQL FETCH MS

INTO :id,:name,:lex,:sity

WRITELN(id, name, lex, sity);

WRITE(‘ПРОДОЛЖИТЬ? (Y/N)’);

READLN(KEY)

END;

EXEC SQL CLOSE CURSOR MS;

Для того чтобы управлять этим циклом в SQLесть специальная переменнаяSQLCODE. Эта переменная формируется каждый раз, когда исполняетсяFETCH. Она принимает значение 0, когда курсор не пуст.

Основные функции и структура СУБД

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

Компиляторы:все необходимые средства, которые поддерживают язык. Основные проблемы:

  1. Языки баз данных являются непроцедурными языками следовательно работа ведётся в режиме интерпретации.

  2. Оптимализация кода.

Подсистема: компиляторы получают на выход некоторый объектный код. И это не интерпретатор этого кода.

Утилиты: состав производный. Стандартные:

  1. Средства загрузки и выгрузки.

  2. Диагностика целостности.

  3. Статическая обработка по запросам и самим данным.

  4. Средства архивации.

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

  1. Управление данными внешней памяти

  2. Управление буферами оперативной памяти.

  3. Управление транзакциями.

  4. Журнализация.

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

  1. Менеджер данных.

  2. Менеджер буферов.

  3. Менеджер транзакций.

  4. Менеджер журналов.

Кроме 4 основных имеется род дополнительных функций, основное назначение которых – связь 4 основных функций. Все системы БД являются многопользовательскими.

Внутренний интерфейс ядра, который недоступен пользователю.

Управление данными во внешней памяти.

Эта функция включает в себя весь набор функций.

Работа с данными на физическом уровне.

Сюда входят функции:

  1. Хранилище.

  2. Доступ к ним.

  3. Хранение и использование дополнительных данных, необходимых для ускорения доступа к структурам БД.

Некоторые СУБД активно используют вход в ОС уже имеющиеся механизмы файловых систем. Другие СУБД полностью берут эту функцию без связи с ОС вплоть до связи с внешними устройствами на физическом уровне. Серьёзные СУБД используют свою собственную системы именования объектов БД.

Управление буферами оперативной памяти.

БД обычно работают со структурой данных обычного размера. Обычно является таблица, в которую входят 106кортежей. Структура, как правило, не может быть размещена в ОП. Обмен с внешней памяти должен быть сведён к минимуму. Единственным способом реально увеличить способ работы с данными является буферизация данных в оперативной памяти. Обмен данными происходит не отдельными большими порциями, а сразу целыми буферами. При этом, если происходит обращение к внешней памяти, с той или иной целью, то сначала инициализируется обращение к буферу. Если в буфере нет обходимых данных, то происходит считывание данных с внешнего устройства.

Управление транзакией.

Транзакция – это последовательность операций которые БД рассматривает как единое целое. Основное свойство транзакций – это перевод из одного целостного состояния в другое. Поддержка механизма транзакций – это обязательное условие даже для однопользовательских СУБД. Транзакция рассматривается как единица активности пользователя по отношению к БД. В многопользовательских СУБД возникает проблема обработки параллельных транзакций. С этим понятием связаны понятия сериализации, сериального плана.

Сериализация – это смешение транзакций при котором суммарный эффект равен эффекту последовательного выполнения. Их выполняют псевдопараллельно.

Сериализация транзакций выполняется с помощью построения сериального плана. Он приводит к смещению транзакций.

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

Журнализация

Под надежностью хранения мы понимаем следующие требования: СУБД должна быть в состоянии восстановить последнее целостное состояние данных после нестандартного вмешательства.

Две разновидности сбоев:

  1. Мягкий (происходит в результате программных ошибок: внезапного аварийного отключения питания. В результате БД может оказаться в логически противоречивом состоянии, но потери БД и разрушение на внешних носителях не происходит)

  2. Жесткий (сопровождается нарушением данных на внешних устройствах.)

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

Выполнение журнала поддерживается WALстратегией. Это стратегия упреждающей записи. Перед тем как фиксируют изменение во внешней памяти, запись об этих изменениях заносится в журнал. ЕслиWALпротокол в СУБД ведется корректно, то восстановление БД возможно после любого сбоя. Самая простая ситуация восстановления – это откат транзакции (индивидуальный). Для того, чтобы выполнить этот откат достаточно поддерживать в СУБД лишь локальный журнал. Он хранит лишь записи о последней выполняемой транзакции после поспешного завершения транзакции журнал как бы обнуляется и следующая транзакция начинается с начала. Некоторые достаточно простые СУБД ведут локальный журнал. Однако во многих СУБД записи записываются в общесистемных журнал. При этом записи относящиеся к одной транзакции в общесистемном журнале связываются в обратный список.

Есть системы, которые комбинируют общесистемные и локальные журналы. При жестком сбое восстановление происходит так: возможно, что после жесткого сбоя можно восстановить систему из журнала. После жесткого сбоя восстановления архивированных БД. СУБД поддерживает систему архивирования данных.

Архивирование – это выгрузка данных на внешние носители. Одновременно должно храниться несколько последних суток, в месте с архивом и хранится журнал. Механизм журнализации тесно связан с механизмом транзакции.

Архитектура многопользовательских СУБД

Любая БД должна быть многопользовательской.

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

Сеть – это некая среда обмена информацией между компьютерами.

Поскольку ресурсы в этой системе распределены неравномерно, то появляются ситуации, в которых компьютеры оказываются неэквивалентны. Некоторые из них являются обладателями какого то общего ресурса причем у одного компьютера один ресурс, а у другого – другой. Могут быть компьютеры не обладающие общими ресурсами. Компьютер, который является обладателем какого либо ресурса называется сервером (сервер данных). Так как ресурс общий, то потребность использования этого ресурса возникает у других компьютеров. Компьютер, который обращается к серверу называется клиент.