Базы данных. Введение в базы данных. Общая характеристика основных понятий презентация

Содержание

Слайд 2

Содержание

Введение в базы данных. Общая характеристика основных понятий.
Термины БД.
Классификация БД.
Ограничения целостности данных.
Задачи для

закрепления пройденного материала.
Связи между реляционными таблицами.
Задачи для закрепления пройденного материала.
Поддержка целостности данных при использовании команд UPDATE и DELETE.
Язык T-SQL. Команды, операторы. Формирование запросов к базе данных. Неопределенное значение NULL.
Диалекты языка SQL (расширения SQL).
Команды языка Transact SQL.
Транзакция
Значение NULL и UNKNOWN (Transact-SQL).
Операторы.
Задачи для закрепления пройденного материала.
Подзапросы SQL
Синтаксис оператора SELECT.
Агрегатные функции
Многотабличные запросы
Многотабличные запросы, оператор соединения JOIN
Типы данных
Проектирование БД
Аномалии
Нормальные формы
Задачи для закрепления пройденного материала
Этапы проектирования
Индексы
VIEW/Представления
Переменные и управляющие конструкции
Условный оператор CASE
Переменные
Условный оператор IF….ELSE
Цикл WHILE
Хранимые процедуры
Пользовательские функции
Транзакции и целостность баз данных
Триггеры
Реляционная алгебра
Подход NoSql
Оптимизация

Слайд 3

Зачем нужно изучать базы данных?

Практически в каждом приложение реализована БД

Слайд 4

2) Почти в каждой вакансии упоминается SQL (Structured query language — «язык структурированных

запросов»)

Слайд 5

3) Базы данных позволяют хранить большие объемы данных.

4) Возможность анализ накопленных данных.

Слайд 6

Разработчик программного обеспечения.
Аналитик данных (Data Analyst).
Data Scientist.
QA инженер (Quality Assurance обеспечение качества ).
Project

Manager.
DevOps.

Профессии, требующие знания БД

Слайд 7

данные;
предметная область;
бизнес ̶ правила.

Основные понятия БД

Слайд 8

Пример фрагмента предметной области «Муниципальная библиотека»

UML (Unified Modeling Language) диаграмма вариантов использования

Правило: по

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

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

Слайд 9

База данных (БД) (Database, BD) – это организованная совокупность данных о некоторой предметной

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

Система управления базой данных (СУБД) (Database Management System, DBMS) – это программное обеспечение для работы с БД, т.е. совокупность языковых и программных средств, предназначенных для создания, ведения и совместного использования БД многими пользователями.

Основные термины

СУБД

Пользователь

Слайд 10

Надежное хранение данных.
Быстрый поиск нужной информации.
Многопользовательский доступ.
Разграничение прав доступа.

Доступ к базе данных по сети.
Понятный для работы с данными язык SQL (Structured Query Language).

Например, нужно вывести фамилии и имена сотрудников проживающих в городе Уфа из таблицы Сотрудники:

Задачи, которые решает СУБД

Слайд 11

Информационная система

Информационная система – это система, реализующая автоматизированный сбор, хранение, поиск, извлечение

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

Слайд 12

Классификация баз данных

1) По модели данных

Модель данных – это метод (принцип) логической организации

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

Графические представления сетевой модели данных

Графическое представление иерархической модели данных

Иерархическая модель схожа по принципу построения с файловой системой компьютера

Структура таблицы реляционной БД

Слайд 13

Иерархическая модель данных

Иерархическая модель данных имеет форму дерева с дугами-связями и узлами-элементами данных.  

Слайд 14

Сетевая модель данных

Сетевую модель данных можно рассматривать как расширенную версию иерархической модели.
Основное различие

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

Слайд 15

Реляционная база данных – это набор простых таблиц (отношений, сущностей), между которыми установлены

связи с помощью ключей.
Edgar Frank Codd.
Основные концепции модели опубликована в 1970 г.
Модель основывается на понятии «отношения» (Relation).
Запись - это строка таблицы.
Поле - это столбец таблицы.
Имя поля содержит название столбца вынесенное в заголовок.

Реляционная модель данных

Запись

Поле (имя + тип (свойства: размер, формат и др.))

Слайд 16

Атомарные значения полей

Слайд 17

Документно-ориентированная модель данных

Реляционная модель данных

Слайд 18

2) по способу хранения данных

Базы данных

Централизованные
(БД хранится на одном сервере)

Распределенные
(составные части

единой БД хранятся на нескольких серверах, объединенных
в сеть)

Слайд 19

Базы данных

Локальные
(БД , СУБД и клиентские программы установлены на рабочей станции (PC))

Удаленные (сетевые)

Клиент-серверные
(БД

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

Файл –серверные
(БД находится на сервере сети (файловом сервере), а СУБД и клиентские программы на рабочей станции)

Сервер

3) по способу доступа к БД

Слайд 20

Облачные платформы

Облачные платформы предоставляют возможность разработки, выполнения приложений и хранения данных на серверах,

расположенных в распределенных дата-центрах.  

Слайд 21

Главные законы об информации и информационной безопасности

149-ФЗ Об информационной безопасности — устанавливает основные

права и обязанности, касающиеся информации и информационной безопасности.
152-ФЗ — описывает правила работы с персональными данными.
98-ФЗ — определяет, что относится к коммерческой тайне компаний.
68-ФЗ — дает определение электронной подписи и описывает, как и когда ее можно применять, какой юридической силой она обладает.
187-ФЗ — описывает правила защиты IT-инфраструктуры на предприятиях, работающих в сферах, критически важных для государства. К таким сферам относится здравоохранение, наука, оборона, связь, транспорт, энергетика, банки и некоторая промышленность.

Государственный реестр сертифицированных средств защиты информации

составляет

Слайд 22

Программа курса «Базы данных»

Слайд 23

MS Access, MS SQL Server от компании Microsoft Corporation.
Oracle, MySQL от компании Oracle

Corporation.
PostgreSQL от компании PostgreSQL Global Development Group
Postgres Pro от российской компании Postgres Professional.
и др.

Примеры СУБД

Слайд 24

Основные элементы реляционной БД

ID

Отношение

1
2
3

Домен:
ID

Иванов
Сидоров
Синицина

Домен:
Surname

Иван
Петр
Инна

Домен:
Name

Иванович
Петрович
Петровна

Домен:
Middle_name

2001
2002

Домен:
Year_birth

мужской
женский

Домен:
Gender

Уфа
Белорецк
Ишимбай

Домен:
City

Слайд 25

Ключи

Первичный ключ (сокращенно РК - Primary Key) – это поле (или совокупность полей),

значения которого не могут повторяться.

Первичный ключ

Слайд 26

Простой, составной ключ

Простой первичный ключ состоит из одного поля.
Составной первичный ключ состоит из

более чем одного поля.

Простой первичный ключ

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

Слайд 27

Ключи по способу задания

Логический (естественный) первичный ключ – поле, данные в котором логически

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

Логический первичный ключ

Суррогатный первичный ключ

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

Слайд 28

Ключи

Внешний ключ (сокращенно FK - Foreign Key) – поле (совокупность полей) таблицы, связанное

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

Первичный
ключ (PK)

Внешний
ключ (FK)

Главная таблица

Подчиненная таблица

Первичный ключ (PK)

Ошибка!
Значение первичного ключа не может быть NULL

Ошибка! Нет значения PK в главной таблице равное 4

Слайд 29

Ключи

Потенциальный ключ (Candidate key) - простой или составной ключ, который уникально идентифицирует каждую

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

Потенциальные ключи:
Код пользователя (например, первичный ключ).
Логин.
E-mail.
Имя + Пароль (если не задано условие на уникальность пароля).

Не потенциальные ключи (т.к. не отвечают требованию минимальности):
Имя + Логин.
Имя + E-mail.

Слайд 30

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

Целостностью данных можно назвать механизм поддержания соответствия базы данных предметной области.


Ограничения целостности – это требования предназначенные для предупреждения добавления в базу данных невозможных, невероятных данных, т.е. обеспечивают защиту от возможных ошибок пользователя.
Базовые требования обеспечения целостности:
1) Ссылочную целостность (или целостность ссылок) обеспечивается системой первичных и внешних ключей. Правило: значение внешнего ключа подчиненной таблицы должно соответствовать одному из значений первичного ключа главной таблицы или иметь значение NULL.
2) Целостность сущностей. Правило: любая таблица (отношение) должна иметь первичный ключ. Поле первичного ключа не должно содержать пустые значения (NULL).
3) Целостность домена1. Правило: все значения некоторого поля должны принадлежат множеству допустимых значений.
Целостность домена обеспечивается заданием условий на значения (CHECK), запретом пустых значений (NOT NULL), заданием значения по умолчанию (DEFAULT) , хранимыми процедурами, триггерами.
Например, при создании структуры таблицы можно сразу указать возможное количество цифр в поле Номер телефона.

1Домен (в реляционной модели данных) − множество допустимых значений поля.

Слайд 31

Задачи

Какие поля в таб.1 и таб.2 могут быть первичными ключами?
Определите названия ключей по

типу и по способу задания.

Слайд 32

Задачи

3) Сколько строительных компаний в городе Москва?
4) Сколько строительных компаний в городе

Уфа?

2) Какие из приведенных ниже полей могут стать простым естественным первичным ключом?
фамилия;
имя;
номер и серия паспорта;
номер дома;
город проживания;
адрес электронной почты;
дата выполнения работы;
марка стиральной машины.

таблица «Город»

таблица «Строительная компания»

Слайд 33

Задачи

5) Определите какие материалы отправлены в каждый из городов?
6) Сколько единиц огнеупорных кирпичей

отправлено в каждый город?
7) Посчитайте общую стоимость материалов, отправленных в каждый город.

таблица «Город»

таблица «Строительная компания»

таблица «Материал»

таблица «Накладная»

Слайд 34

Виды связей между реляционными таблицами

 Виды связей между таблицами:
Один к одному (1:1, 1−1).
Один ко многим (1:М, 1 −

∞ ).
Многие ко многим (М:М, ∞ − ∞).

Главная таблица

Подчиненная таблица

Реляционная база данных — это совокупность двумерных взаимосвязанных таблиц.

Главная таблица

Подчиненная таблица

Главная таблица

Подчиненная таблица

Слайд 35

Вид связи один к одному

Связь один к одному означает, что одной записи в главной таблице

соответствует только одна запись в подчиненной.

1

1

таблица «ИНН»

таблица «Гражданин РФ»

PK

FK

Слайд 36

Вид связи один ко многим

Связь один ко многим означает, что одной записи в главной таблице

может соответствовать множество записей в подчиненной таблице.

таблица «Сотрудник»

таблица «Отдел»


1

Слайд 37

Вид связи многие ко многим

Связь многие ко многим означает, что одной записи в главной таблице

может соответствовать множество записей в подчиненной, и наоборот.

таблица «Преподаватель»

таблица «Дисциплина»

таблица «Преподаватель»

таблица «Дисциплина»

таблица «Семестровый учебный план»

1

1



Слайд 38

Задачи

1) Какие виды связи заданы между таблицами? Определите отношения подчиненности между таблицами?

таблица

«Каталог»

таблица «Эфирное масло»

Фрагмент БД «Информация по парфюмерной продукции»

таблица «Бренд»

Слайд 39

Задачи

2) Какие виды связи заданы между таблицами? Определите отношения подчиненности между таблицами?

Фрагмент

БД «Дипломное проектирование»

таблица «Студент»

таблица «Дипломный руководитель»

таблица «Группа»

таблица «Кафедра»

Слайд 40

Задачи

3) Какая из двух таблиц главная, какая подчинённая? Какой вид связи между таблицей

1 и таблицей 2?

таблица «Город»

таблица «Территориальное деление»

Фрагмент БД «География»

Фрагмент БД «Административные единицы»

таблица «Страна»

таблица «Столица»

4) Какая из двух таблиц главная, какая подчинённая? Какой вид связи между таблицей 1 и таблицей 2?

Слайд 41

Поддержка целостности сущностей и целостности ссылок.

Синтаксис :
1) <поле и тип данных> PRIMARY

KEY
2) FOREIGN KEY <поле> REFERENCES <главная таблица> [<первичный ключ>]

Пример, фрагмент БД «Дипломное проектирование»

table. Student

table. Diploma_supervisor

CREATE TABLE Diploma_supervisor
(Diploma_supervisor_Id INTEGER PRIMARY KEY IDENTITY(1,1),
Surname VARCHAR(20) NOT NULL,
Name VARCHAR(20) NOT NULL,
Middle_name VARCHAR(20),
Birthday DATE)

CREATE TABLE Student
(Student_id INTEGER PRIMARY KEY IDENTITY(1,1),
Surname VARCHAR(20) NOT NULL,
Name VARCHAR(20) NOT NULL,
Middle_name VARCHAR(20),
Diploma_supervisor_id INTEGER,
CONSTRAINT Key_ foreign
FOREIGN KEY (Diploma_supervisor_id) REFERENCES Diploma_supervisor (Diploma_supervisor_id))

ALTER TABLE Student
ADD CONSTRAINT Key_ foreign FOREIGN KEY(Diploma_supervisor_id) REFERENCES Diploma_supervisor (Diploma_supervisor_id)

Слайд 42

Поддержка целостности данных при использовании команд UPDATE и DELETE

FOREIGN KEY () REFERENCES [[

]
[ON DELETE {NO ACTION | SET NULL| CASCADE | SET DEFAULT}]
[ON UPDATE {NO ACTION | SET NULL| CASCADE | SET DEFAULT}]

table. Student

table. Diploma_supervisor

CREATE TABLE Student
(Student_id INTEGER PRIMARY KEY IDENTITY(1,1),
Surname VARCHAR(20) NOT NULL,
Name VARCHAR(20) NOT NULL,
Middle_name VARCHAR(20),
Diploma_supervisor_id INTEGER,
CONSTRAINT Key_ foreign
FOREIGN KEY(Diploma_supervisor_id) REFERENCES Diploma_supervisor(Diploma_supervisor_id) ON DELETE NO ACTION)

Ошибка

Слайд 43

Поддержка целостности данных при использовании команд UPDATE и DELETE

FOREIGN KEY ( ) REFERENCES

[[ ]
[ON DELETE {NO ACTION | SET NULL|CASCADE | SET DEFAULT}]
[ON UPDATE {NO ACTION | SET NULL| CASCADE | SET DEFAULT}]

table. Student

table. Diploma_supervisor

CREATE TABLE Student
(Student_id INTEGER PRIMARY KEY IDENTITY(1,1),
Surname VARCHAR(20) NOT NULL,
Name VARCHAR(20) NOT NULL,
Middle_name VARCHAR(20),
Diploma_supervisor_id INTEGER,
CONSTRAINT Key_ foreign
FOREIGN KEY(Diploma_supervisor_id) REFERENCES Diploma_supervisor(Diploma_supervisor_id) ON DELETE SET NULL)

NULL

2

2

NULL

Слайд 44

Поддержка целостности данных при использовании команд UPDATE и DELETE

FOREIGN KEY ( ) REFERENCES

[[ ]
[ON DELETE {NO ACTION | SET NULL|CASCADE | SET DEFAULT}]
[ON UPDATE {NO ACTION | SET NULL| CASCADE | SET DEFAULT}]

CREATE TABLE Cooperator
(Cooperator_id INTEGER PRIMARY KEY IDENTITY(1,1),
Surname VARCHAR(20) NOT NULL,
Name VARCHAR(20) NOT NULL,
Middle_name VARCHAR(20),
Dept_id INTEGER,
CONSTRAINT Key_ foreign
FOREIGN KEY(Dept_id ) REFERENCES Department(Dept_id ) ON DELETE CASCADE)

table. Cooperator

table. Department

Слайд 45

Поддержка целостности данных при использовании команд UPDATE и DELETE

FOREIGN KEY ( ) REFERENCES

[[ ]
[ON DELETE {NO ACTION | SET NULL|CASCADE | SET DEFAULT}]
[ON UPDATE {NO ACTION | SET NULL| CASCADE | SET DEFAULT}]

CREATE TABLE Cooperator
(Cooperator_id INTEGER PRIMARY KEY,
Surname VARCHAR(20) NOT NULL,
Name VARCHAR(20) NOT NULL,
Middle_name VARCHAR(20),
Dept_id INTEGER DEFAULT 1000,
CONSTRAINT Key_ foreign
FOREIGN KEY(Dept_id ) REFERENCES Department(Dept_id ) ON DELETE SET DEFAULT)

table. Cooperator

table. Department

103

103

1000

1000

Слайд 46

Язык SQL

Слайд 47

Диалекты языка SQL (расширения SQL)   

Transact-SQL (или T-SQL) — СУБД MS SQL Server (Microsoft).
Jet SQL –

СУБД Access (Microsoft).
PL/SQL (Procedural Language/SQL) — СУБД Oracle (Oracle).
PL/pgSQL (Procedural Language/postgreSQL) — СУБД PostgreSQL (PostgreSQL Global Development Group).
и др.

Слайд 48

Команды

Слайд 49

Команды языка определения данных (DDL - Data Definition Language)

Слайд 50

Примеры применения команд DDL

Создание таблицы «Плата за электроэнергию»
CREATE TABLE Rent_for_light
(Id INT PRIMARY KEY

IDENTITY(1,1),
Region VARCHAR(20),
N_Month TINYINT CHECK (N_Month>0 AND N_Month<13),
Unit_cost REAL /* плата за единицу электрической энергии, кВт*/
)

ALTER TABLE Rent_for_light
ADD Regional_coefficient REAL

TRUNCATE TABLE Rent_for_light

DROP TABLE Rent_for_light

Table. Rent_for_light

Table. Rent_for_light

Слайд 51

Команды языка манипулирования данными (DML - Data Manipulation Language)

Слайд 52

Примеры применения команд DML

INSERT INTO Rent_for_light
VALUES (‘Республика Башкортостан’, 1, 20, 0.1), (‘Республика Татарстан’,

1, 25, 0.1)

UPDATE Rent_for_light
SET Regional_coefficient = Regional_coefficient *2
WHERE Region =‘Республика Татарстан’

SELECT Region, Unit_cost
FROM Rent_for_light

DELETE FROM Rent_for_light
WHERE Regional_coefficient>0.1

Слайд 53

Синтаксис SELECT

SELECT column_name1, column_name2, …
FROM table_name
WHERE condition

поля для вывода

таблица, данные которой нужно вывести

условие

поиска, возвращает только строки , соответствующие этому условию

SELECT Region , N_Month, Unit_cost , Regional_coefficient
FROM Rent_for_light
WHERE Regional_coefficient>0.1

Слайд 54

Транзакция

Транзакция − это последовательность операций с данными, выполняющаяся как единое целое.
Транзакции повышают надежность баз данных.

Слайд 55

Пример транзакции

1) UPDATE Bank_account
SET Balance = Balance - 500
WHERE Number_account

= 101
2) UPDATE Bank_account
SET Balance = Balance + 500
WHERE Number_account = 109

Нужно перевести от одного клиента банка (с номером счета 101) другому клиенту банка (с номером счета 109) денежную сумму в размере 500 руб.

таблица «Счет в банке»

Слайд 56

3) Isolation (изолированность).

1) Atomicity (атомарность).

Транзакции и целостность баз данных

Количество операций, входящих в транзакцию,

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

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

2) Consistency (согласованность).

Должно быть согласованное состояние БД до и после выполнения транзакции.

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

4) Durability (устойчивость, долговечность).

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

Слайд 57

Команды языка управления транзакциями (TCL - Тгаnsасtiоn Соntrol Language)

Слайд 58

База данных

База данных

Команда 1

Команда 2

COMMIT

ROLLBACK

Начальное состояние БД

Состояние БД после транзакции
(конечное состояние)

BEGIN TRANSACTION
SAVE

TRANSACTION point1
UPDATE Bank_account
SET Balance= Balance - 500
WHERE Number_account = 101
IF (@@error != 0)
ROLLBACK TRANSACTION point1
UPDATE Bank_account
SET Balance= Balance + 500
WHERE Number_account = 109
IF (@@error != 0)
ROLLBACK TRANSACTION point1
COMMIT

Условие

Примеры применения команд TCL

SAVE TRANSACTION

Точка сохранения БД
«point1»

Условие

ROLLBACK

-

+

-

+

Слайд 59

Команды языка управления данными (DCL - Data Control Language)

Слайд 60

GRANT SELECT ON Student TO User2;
REVOKE SELECT ON Student TO User2;
DENY CREATE DATABASE,

CREATE TABLE TO User2.

Примеры применения команд DCL

Слайд 61

Значение NULL

Значение NULL - универсальное значение, не зависимое от типа данных поля. Данное

значение
свидетельствует об отсутствии значения у поля, это не то же самое, что число «0».
Поле с значением NULL - это поле, которое было оставлено пустым во время создания записи!

таблица «Информация об абитуриенте»

таблица «Результат экзамена»

Слайд 62

Использование значения NULL в условиях поиска

IS NULL – предикат, применяется для выявления равенства

значения некоторого поля неопределенному значению (NULL).
IS NOT NULL– предикат, применяется для выявления неравенства значения некоторого поля неопределенному значению (NULL).
1) SELECT column_names FROM table_name WHERE column_name IS NULL;
2) SELECT column_names FROM table_name WHERE column_name IS NOT NULL;
Пример 1:
SELECT * FROM Information WHERE Telephone IS NULL;
Пример 2:
SELECT * FROM Information WHERE Telephone IS NOT NULL;
Ошибка: …. WHERE Telephone = NULL или …. WHERE Telephone = NOT NULL
т.к. любая операция сравнения с NULL (даже с самим с собой «NULL = NULL»), в результате сравнения выдает значение UNKNOWN (неизвестность).

Слайд 63

Оператор SQL состоит из:
зарезервированных слов;
пользовательских названий.
Пользовательские названия могут быть идентификаторами или именами различных

объектов базы данных.
Идентификаторы в Transact SQL должны состоять из символов алфавита, цифр или символа «_», начинаться с буквы и не могут содержать пробелы.
Возможно включение других символов (@, #, $ в СУБД SQL Server и #, $ в СУБД Oracle).
[ ] — идентификатор группировки слов в переменную.

Комментарии в языке Transact - SQL:
1. /*Текст комментария*/ –для записи многострочных комментариев.
2. --Текст комментария –для однострочных комментариев.

Выбор базы данных для использования:
USE <название БД>
Например, use Sudent_Ivanov

Для обращения к таблице или полю таблицы можно указать составное имя:
Название_БД.имя_владельца.название_таблицы.название_поля или название_таблицы.название_поля
Каждая из этих характеристик отделяется от предыдущей точкой:
database.dbowner.table_name.column_name;
Промежуточное значения – имя владельца можно не указывать, если это не приводит к конфликтам имен.

Слайд 64

Подзапросы SQL (вложенные SQL запросы)

Пример структуры вложенного запроса:
SELECT <поле или список полей>
FROM <таблица

или список таблиц>
WHERE [поле]|[значение] оператор_сравнения|логический_оператор (SELECT <поле>
FROM <таблица>)

Вложенный запрос (подзапрос или внутренний запрос) — это запрос, вложенный в другой запрос.
Подзапрос может использоваться:
в инструкции SELECT;
в инструкции FROM;
в условии WHERE.
Подзапрос может быть вложен в инструкции SELECT, INSERT, UPDATE или DELETE, а также в другой подзапрос.

Например, нужно узнать оценки сотрудника Иванова:
SELECT *
FROM Evaluation
WHERE Cooperator_id =(SELECT Cooperator_id
FROM Cooperator
WHERE Surname = 'Иванов')

Слайд 65

Синтаксис оператора SELECT (продолжение)

SELECT [ALL | DISTINCT | TOP <число>[PERCENT] ] <поле или список

полей>
FROM <таблица или список таблиц>
[WHERE <условие выборки >]
[GROUP BY <поле или список полей >]
[HAVING <условие выборки для группы строк>]
[ORDER BY <поле_1> [ASC | DESC] [, <поле_n > [ASC | DESC]]]

Таблица «Продукция»

Нужно вывести список наименований имеющейся продукции:
SELECT DISTINCT Product_name AS Наименование
FROM Product

Нужно вывести первые три дорогие продукции:
SELECT TOP 3 *
FROM Product
ORDER BY Price DESC

Слайд 66

Операторы:

1. Арифметические операторы.
2. Операторы присваивания.
3. Операторы сравнения.
4. Логические операторы.
5. Унарные операторы.
6. Побитовые операторы.


Слайд 67

Арифметические операторы

Арифметические операторы выполняют математические операции над двумя значениями числовых типов данных или

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

Слайд 68

Арифметические операторы. Сложение

Select Surname, Name, Salary+1000
From Cooperator

Select Surname, Name, Salary+ Increase
From Cooperator


Table. Cooperator

Table. Cooperator

Слайд 69

Операторы присваивания

Оператор присваивания «=» присваивает значение переменной.
В качестве оператора для присваивания псевдонимов таблицам

или заголовкам столбцов применяется ключевое слово AS (alias).

Table. Cooperator

UPDATE Cooperator
SET Salary=1000

Базовая таблица после обновления

SELECT Surname AS Фамилия, Name AS Имя, Salary AS Стипендия
FROM Cooperator

Table. Cooperator

Результат выполненного запроса

Слайд 70

Операторы сравнения

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

значение – TRUE или FALSE.
СУБД сверяет все значения выбранного столбца с заданным и, если результат сравнения возвращает TRUE – выводит результат.

Слайд 71

Операторы сравнения

SELECT Surname AS [Фамилия сотрудника], Name AS [Имя сотрудника]
FROM Cooperator
WHERE Salary

>3000

SELECT Surname AS [Фамилия сотрудника], Name AS [Имя сотрудника]
FROM Cooperator
WHERE Salary >=3000

Table. Cooperator

Table. Cooperator

Слайд 72

Побитовые операторы

Побитовые операторы выполняют побитовые действия над двумя выражениями с любым типом данных,

относящихся к целочисленному.

Слайд 73

Побитовое И

SELECT Value_a & Value_b AS Результат
FROM Table1

0010 & 0011 = 0010

0100

& 1000 = 0000

SELECT Value_a | Value_b AS Результат
FROM Table1

0010 | 0011 = 0011

0100 | 1000 = 1100

Побитовое ИЛИ

Слайд 74

Побитовое «исключающее ИЛИ»

SELECT Value_a ^ Value_b AS Результат
FROM Table1

0010 ^ 0011 = 0001

0100

^ 1000 = 1100

SELECT ~Value_a AS Результат
FROM Table1

~0010=1101

~0100 =1011

Побитовое НЕ

Слайд 75

Логические операторы

Логические операторы проверяют истину некоторого условия. Логические операторы возвращают булево значение TRUE или

FALSE.

Слайд 76

Оператор AND (И)

Table. Cooperator

Select Surname AS Фамилия, Name AS Имя, Salary AS Зарплата
From

Cooperator
WHERE Salary>0 AND City =‘Уфа’

Результат

Слайд 77

Оператор OR (ИЛИ)

Table. Cooperator

Select Surname AS Фамилия, Name AS Имя, Salary AS Зарплата,

City AS Город
From Cooperator
WHERE City =‘Сибай’ OR City =‘Уфа’

Результат

Слайд 78

Оператор NOT (НЕ)

Table. Cooperator

Select Surname AS Фамилия, Name AS Имя, Salary AS Зарплата,

City AS Город
From Cooperator
WHERE NOT City =‘Уфа’

Результат

Слайд 79

Оператор IN

Select Surname AS Фамилия, Name AS Имя, Salary AS Зарплата, City AS

Город
From Cooperator
WHERE City IN (‘Уфа’, ‘Сибай’)

Операторы IN (равен любому из списка) и NOT IN (не равен ни одному из списка) используются для сравнения проверяемого значения поля с заданным списком. Этот список значений указывается в скобках справа от оператора IN.

Table. Cooperator

Результат

Слайд 80

Оператор NOT IN

Select Surname AS Фамилия, Name AS Имя, Salary AS Зарплата, City

AS Город
From Cooperator
WHERE NOT City IN (‘Уфа’, ‘Сибай’)

Операторы IN (равен любому из списка) и NOT IN (не равен ни одному из списка) используются для сравнения проверяемого значения поля с заданным списком. Этот список значений указывается в скобках справа от оператора IN.

Table. Cooperator

Результат

Слайд 81

Оператор LIKE

Table. Cooperator

Select Surname AS ‘Фамилия’, Name AS ‘Имя’, Salary AS ‘Зарплата’
From Cooperator
WHERE

Surname LIKE ‘C%’ AND Surname NOT LIKE '%@_%' ESCAPE '@'

Оператор LIKE просматривает строковые значения полей с целью определения, входит ли заданная в операторе подстрока (образец поиска) в символьную строку-значение проверяемого поля.
Можно применять шаблон искомого образца строки, использующий следующие символы:
символ подчеркивания «_», определяет возможность наличия в указанном месте одного любого символа;
символ «%» допускает присутствие в указанном месте проверяемой строки последовательности любых символов произвольной длины.
Если необходимо включить в образец символы «_» или «%» для этого с помощью ключевого слова ESCAPE нужно определить так называемый escape-символ, чаще для этой цели применяют символы "@" или "~".

Результат

Слайд 82

Оператор BETWEEN

Оператор BETWEEN используется для проверки условия вхождения значения поля в заданный интервал,

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

Table. Student

Select Surname AS Фамилия, Name AS Имя, City AS Город, Birthday AS [Дата рождения]
From Student
WHERE Birthday BETWEEN ’01.01.2004’ AND ’31.12.2004’

Select Surname AS Фамилия, Name AS Имя, City AS Город, Birthday AS [Дата рождения]
From Student
WHERE Birthday BETWEEN ’01.01.2003’ AND ’31.01.2003’

Результат

Результат

Table. Student

Слайд 83

Оператор ANY (SOME)

SELECT Surname, Name, Birthday
FROM Student s
WHERE Student_Id=ANY(SELECT Student_Id
FROM Exam_mark e

WHERE s.Student_Id=e.Student_Id AND Mark=3)

Table. Student

Table. Exam_mark

SELECT Surname, Name, Birthday
FROM Student s
WHERE Student_Id IN(SELECT Student_Id
FROM Exam_mark e
WHERE s.Student_Id=e.Student_Id AND Mark=3)

Table. Subject

SELECT Surname, Name, Birthday
FROM Student
WHERE NOT Student_Id=ANY(SELECT Student_Id FROM Exam_mark WHERE Mark=3)
AND Student_Id IN(SELECT Student_Id FROM Exam_mark )

Результат

Результат

Задание: Вывести студентов у которых есть тройки, т.е. есть хотя бы одна тройка

Задание: Вывести студентов у которых нет троек , т.е. нет ни одной тройки

Слайд 84

Оператор ALL

SELECT Surname, Name, Birthday
FROM Student s
WHERE 5=All(SELECT Mark
FROM Exam_mark e
WHERE s.Student_Id=e.Student_Id)
AND s.Student_Id

IN(SELECT Student_Id
FROM Exam_mark)

SELECT Surname, Name, Birthday
FROM Student s
WHERE 3 FROM Exam_mark e
WHERE s.Student_Id=e.Student_Id)
AND s.Student_Id IN(SELECT Student_Id
FROM Exam_mark )

Table. Student

Table. Exam_mark

Table. Subject

Результат

Результат

Задание: Вывести студентов у которых все оценки отличные, т.е. найти отличников

Задание: Вывести студентов у которых все оценки выше тройки

Слайд 85

Оператор EXISTS

SELECT Surname, Name
FROM Student s
WHERE EXISTS (SELECT *
FROM Exam_mark e WHERE

s.Student_Id=e.Student_Id)

Оператор EXISTS возвращает TRUE, если подзапрос возвращает хотя бы одну строку.

Задание: Вывести студентов которые сдавали экзамен

SELECT Surname, Name
FROM Student s
WHERE NOT EXISTS (SELECT *
FROM Exam_mark e WHERE s.Student_Id=e.Student_Id)

Задание: Вывести студентов, которые не сдавали экзамены

SELECT Surname, Name
FROM Student s
WHERE EXISTS (SELECT e.Student_Id
FROM Exam_mark e
WHERE s.Student_Id=e.Student_Id AND e.Mark=3
GROUP BY e.Student_Id)

Задание: Вывести студентов у которых есть хоть одна тройка

SELECT Surname, Name
FROM Student s
WHERE EXISTS (SELECT e.Student_Id
FROM Exam_mark e WHERE s.Student_Id=e.Student_Id
GROUP BY e.Student_Id
HAVING MIN(e.Mark)> 3)

Задание: Вывести студентов у которых все оценки больше тройки

Слайд 86

Унарные операторы

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

Слайд 87

Примеры, унарные операторы

SELECT -Value_a AS Результат
FROM Table1

~0010=1101

~0100 =1011

SELECT ~Value_a AS Результат
FROM

Table1

Слайд 88

Приоритет операторов

1. () – выражения в скобках.
2. +, -, ~ – унарные операторы.
3.

*, /, % – арифметические операторы.
4. +, - – арифметические операторы.
5. =, >, <, >=, <=, <> – операторы сравнения.
6. ^ (побитное исключающее ИЛИ), & (побитное И), | (побитное ИЛИ).
7. NOT.
8. AND.
9. ALL, ANY, SOME,BETWEEN, IN, LIKE, OR.
10. = присваивание значения переменной.

Пример. Вычислим сумму
SELECT a + b * 2 AS ИТОГО
FROM Table1
SELECT ( a + b) * 2 AS ИТОГО
FROM Table1

tab. Table1

Слайд 89

Задачи

Какие данные будут получены в результате выполнения запросов? Какие операторы применялись в запросах?
SELECT

*
FROM Product
WHERE Price<5000 OR NOT(Date_of_delivery<’20.12.2020’)
2) SELECT Product_name, Price*Number
FROM Product
WHERE Date_of_delivery BETWEEN ’20.12.2020’ AND ’01.02.2021’
3) SELECT *
FROM Product
WHERE NOT (Number>5) AND Product_name LIKE ‘_ы%’
4) SELECT Product_name, Price*Number
FROM Product
WHERE (Price*Number)>6000 AND Number IN(1,2,3)

Table. Product

Слайд 90

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

Общая структура запроса с агрегатной (или агрегатными) функциями и GROUP BY:
SELECT [<поле

или список полей группировки>,] <агрегатная функция 1> [, <агрегатная функция n>]
FROM <таблица>
[GROUP BY <поле или список полей группировки>]
[HAVING <условие выборки для группы строк>]

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

Слайд 91

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

Table. Product

Посчитать сколько всего продукции в магазине:
SELECT SUM(Number) AS Сумма
FROM Product

Посчитать на

какую сумму, по каждому наименованию, имеется продукции в магазине:
SELECT Product_name AS ‘Наименование продукции’, SUM(Price* Number) AS Сумма
FROM Product
GROUP BY Product_name

WHERE Price IS NOT NULL AND Number IS NOT NULL

Слайд 92

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

Table. Product

Вычислить среднею цену продукции в магазине:
SELECT AVG(Price) AS ‘Средняя цена’
FROM Product

Вывести

продукцию, средняя цена которых по каждому наименованию превышает значение 1000:
SELECT Product_name AS ‘Наименование продукции’, AVG(Price) AS ‘Средняя цена’
FROM Product
GROUP BY Product_name
HAVING AVG(Price) >1000

Слайд 93

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

Table. Product

Вывести максимальную и минимальную цену по каждому наименованию продукции, а

также посчитать разницу в цене между ними:
SELECT Product_name AS 'Наименование продукции', MIN(Price) AS 'Минимальная цена', MAX(Price) AS 'Максимальная цена', (MAX(Price) - MIN(Price)) AS 'Разница'
FROM Product
GROUP BY Product_name
ORDER BY 2

Вывести информацию о продукции, которой меньше всего на складе:
SELECT *
FROM Product
WHERE Number =(SELECT MIN(Number)
FROM Product)

Слайд 94

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

Table. Product

Посчитать количество различных наименований продукции:
SELECT COUNT(DISTINCT Product_name) AS 'Количество наименований'
FROM Product

Посчитать

количество поставок в январе 2021 года:
SELECT COUNT(DISTINCT Date_of_delivery) AS 'Количество поставок'
FROM Product
WHERE Date_of_delivery BETWEEN '01/01/2021'AND ‘31/01/2021'

SELECT COUNT(Price) AS 'Количество без учета NULL', COUNT(*) AS 'Количество c учетом NULL'
FROM Product

Варианты применения функции:
COUNT(поле)
COUNT(DISTINCT поле)
COUNT(*)

Слайд 95

Многотабличные запросы

Table Cooperator

Table Department

SELECT coop.Coop_id , coop.Surname, coop.Name, dep.Dept_id ,dep.Name
FROM Cooperator coop,

Department dep

Неверный результат

Слайд 96

Многотабличные запросы

Table Cooperator

Table Department

SELECT coop.Surname, coop.Name, dep.Dept_id ,dep.Name
FROM Cooperator coop, Department dep


WHERE coop.Dept_id =dep.Dept_id

Верный результат

Слайд 97

Многотабличные запросы, оператор соединения JOIN

Ключевое слово JOIN в SQL используется при построении запросов

на выборку, обновление и удаление.
JOIN позволяет соединить поля из нескольких таблиц в одну таблицу вывода.
Соединение временное и целостность таблиц не нарушает.
Существует следующие типы оператора JOIN:
INNER JOIN (INNER обычно опускается);
OUTER JOIN (OUTER обычно опускается)
LEFT JOIN;
RIGHT JOIN;
FULL JOIN.
CROSS JOIN.

Синтаксис:
JOIN: <левая_таблица> JOIN <правая_таблица> ON <условия_соединения>
LEFT JOIN:  <левая_таблица> LEFT JOIN <правая_таблица> ON <условия_соединения>
RIGHT JOIN: <левая_таблица> RIGHT JOIN <правая_таблица> ON <условия_соединения>
FULL JOIN: <левая_таблица> FULL JOIN <правая_таблица> ON <условия_соединения>
CROSS JOIN: <левая_таблица> CROSS JOIN <правая_таблица>

Слайд 98

Оператор соединения INNER JOIN

Table Cooperator

Table Department

SELECT coop.Coop_id , coop.Surname, coop.Name, dep. Dept_id ,dep.Name


FROM Cooperator coop JOIN Department dep ON coop.Dept_id =dep.Dept_id

Результат

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

Слайд 99

Оператор соединения LEFT OUTER JOIN

Table Cooperator

Table Department

SELECT coop.Coop_id , coop.Surname, coop.Name, dep.Dept_id ,dep.Name


FROM Cooperator coop LEFT JOIN Department dep ON coop.Dept_id =dep.Dept_id

Результат

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

Слайд 100

Оператор соединения RIGHT OUTER JOIN

Table Cooperator

Table Department

SELECT Coop_id , coop.Surname, coop.Name, dep.Dept_id ,dep.Name


FROM Cooperator coop RIGHT JOIN Department dep ON coop.Dept_id =dep.Dept_id

Результат

Задание: выяснить, какие отделы еще не сформированы, т.е. определить отделы, в которых еще нет сотрудников.

Слайд 101

Оператор соединения FULL OUTER JOIN

Table Cooperator

Table Department

SELECT Coop_id , coop.Surname, coop.Name, dep.Dept_id ,dep.Name


FROM Cooperator coop FULL JOIN Department dep ON coop.Dept_id =dep.Dept_id

Результат

Задание: нужно получить все данные по сотрудникам и все данные по имеющимся отделам.

Слайд 102

Оператор соединения CROSS JOIN

Table. Fabric

Table. model_of_clothes

Select *
From Fabric CROSS JOIN Model_of_clothes

Результат

Задание: нужно

вывести все возможные варианты пошива моделей одежды с имеющимися материалами.

Слайд 103

Типы данных MS SQL Server

Числовые типы данных:
BIT: хранит значение 0 или 1. Фактически

является аналогом булевого типа в языках программирования. Занимает 1 байт.
TINYINT: хранит числа от 0 до 255. Занимает 1 байт. Хорошо подходит для хранения небольших чисел.
SMALLINT: хранит числа от –32 768 до 32 767. Занимает 2 байта
INT: хранит числа от –2 147 483 648 до 2 147 483 647. Занимает 4 байта. Наиболее используемый тип для хранения чисел.
BIGINT: хранит очень большие числа от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807, которые занимают в памяти 8 байт.
DECIMAL[ ( p[ , s] ) ] и NUMERIC[ ( p[ , s] ) ]: числа с фиксированной точностью и масштабом. При использовании максимальной точности числа могут принимать значения в диапазоне
от -10^38+1 до 10^38-1. 
Синонимами типа DECIMAl по стандарту ISO является тип DEC(p, s).
Тип NUMERIC функционально эквивалентен типу DECIMAl.
p (точность) − максимальное общее число хранимых десятичных разрядов. Это число включает символы слева и справа от десятичной запятой. Точность должна быть значением в диапазоне от 1 до максимум 38. Точность по умолчанию составляет 18.
s (масштаб) − максимальное число хранимых десятичных разрядов справа от десятичной запятой. Это число отнимается от p для определения максимального количества цифр слева от десятичной запятой. Масштаб должен иметь значение от 0 до p и может быть указан только при заданной точности. По умолчанию масштаб принимает значение 0, поэтому 0 <= s <= p. Максимальный размер хранилища зависит от точности.
В зависимости от количества чисел после запятой переменная типа Decimal может занимать от 5 до 17 байт.
SMALLMONEY: хранит дробные значения от -214 748.3648 до 214 748.3647. Предназначено для хранения денежных величин. Занимает 4 байта. Эквивалентен типу DECIMAL(10,4).
MONEY: хранит дробные значения от -922 337 203 685 477.5808 до 922 337 203 685 477.5807. Представляет денежные величины и занимает 8 байт. Эквивалентен типу DECIMAL(19,4).
FLOAT: хранит числа от –1.79E+308 до 1.79E+308. Занимает от 4 до 8 байт в зависимости от дробной части.
Может иметь форму опредения в виде FLOAT(n), где n представляет число бит, которые используются для хранения десятичной части числа (мантиссы). По умолчанию n = 53.
REAL: хранит числа от –340E+38 до 3.40E+38. Занимает 4 байта. Эквивалентен типу FLOAT(24).

Слайд 104

Типы данных MS SQL Server

Типы данных, представляющие дату и время:
DATE: ГГГГ-ММ-ДД. Хранит даты

от 1 января 0001 года до 31 декабря 9999 года. Занимает 3 байта.
DATETIME: хранит даты и время от 01/01/1753 до 31/12/9999. Занимает 8 байт.
DATETIME2: ГГГГ-ММ-ДД чч:мм:сс[.доли секунды], хранит даты и время в диапазоне
от 01/01/0001 00:00:00.0000000 до 31/12/9999 23:59:59.9999999.
Занимает от 6 до 8 байт в зависимости от точности времени.
Может иметь форму DATETIME2(n), где n представляет количество цифр от 0 до 7 в дробной части секунд.
SMALLDATETIME: хранит даты и время в диапазоне от 01/01/1900 до 06/06/2079, то есть ближайшие даты. Занимает от 4 байта.
DATETIMEOFFSET: хранит даты и время в диапазоне от 0001-01-01 до 9999-12-31. Сохраняет детальную информацию о времени с точностью до 100 наносекунд. Занимает 10 байт.
TIME: хранит время в диапазоне от 00:00:00.0000000 до 23:59:59.9999999. Занимает от 3 до 5 байт.
Может иметь форму TIME(n), где n представляет количество цифр от 0 до 7 в дробной части секунд

Слайд 105

Типы данных MS SQL Server

Строковые типы данных:
CHAR: хранит строку длиной от 1 до

8 000 символов. На каждый символ выделяет по 1 байту. Не подходит для многих языков, так как хранит символы не в кодировке Unicode.
Количество символов, которое может хранить столбец, передается в скобках. Например, для столбца с типом CHAR(10) будет выделено 10 байт. И если мы сохраним в столбце строку менее 10 символов, то она будет дополнена пробелами.
VARCHAR: хранит строку. На каждый символ выделяется 1 байт. Можно указать конкретную длину для столбца - от 1 до 8 000 символов, например, VARCHAR(10). Если строка должна иметь больше 8000 символов, то задается размер MAX, а на хранение строки может выделяться до 2 Гб: VARCHAR(MAX).
Не подходит для многих языков, так как хранит символы не в кодировке Unicode.
В отличие от типа CHAR если в столбец с типом VARCHAR(10) будет сохранена строка в 5 символов, то в столбце будет сохранено именно пять символов.
NCHAR: хранит строку в кодировке Unicode длиной от 1 до 4 000 символов. На каждый символ выделяется 2 байта. Например, NCHAR(15)
NVARCHAR: хранит строку в кодировке Unicode. На каждый символ выделяется 2 байта.
Можно задать конкретный размер от 1 до 4 000 символов: . Если строка должна иметь больше 4000 символов, то задается размер MAX, а на хранение строки может выделяться до 2 Гб.
Еще два типа TEXT и NTEXT являются устаревшими и поэтому их не рекомендуется использовать. Вместо них применяются VARCHAR и NVARCHAR соответственно.

Слайд 106

Типы данных MS SQL Server

Бинарные типы данных:
BINARY: хранит бинарные данные в виде последовательности

от 1 до 8 000 байт.
VARBINARY: хранит бинарные данные в виде последовательности от 1 до 8 000 байт, либо до 2^31–1 байт при использовании значения MAX (VARBINARY(MAX)).
Еще один бинарный тип - тип IMAGE является устаревшим, и вместо него рекомендуется применять тип VARBINARY.
Остальные типы данных:
UNIQUEIDENTIFIER: уникальный идентификатор GUID (по сути строка с уникальным значением), который занимает 16 байт.
TIMESTAMP: некоторое число, которое хранит номер версии строки в таблице. Занимает 8 байт. В новых версиях СУБД заменен на rowversion.
CURSOR: представляет набор строк.
HIERARCHYID: представляет позицию в иерархии.
SQL_VARIANT: может хранить данные любого другого типа данных T-SQL.
XML: хранит документы XML или фрагменты документов XML. Занимает в памяти до 2 Гб.
TABLE: представляет определение таблицы.
GEOGRAPHY: хранит географические данные, такие как широта и долгота.
GEOMETRY: хранит координаты местонахождения на плоскости.

Слайд 107

Проектирование баз данных
Основные задачи:
1) Сохранить необходимые данные о конкретной предметной области.
2) Получить данные

по всем необходимым запросам.
3) Сократить избыточность дублирования данных.
4) Обеспечить целостности данных.

Проектирование 
баз данных — процесс разработки схемы базы данных и определения необходимых ограничений целостности. 

Слайд 108

Проблемы, возникающие при проектировании БД

Таблица «Сотрудник отдела»

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

не набрали=> аномалия добавления.
Т.к.чтобы добавить новый отдел без сотрудника нужно будет присвоить значение NULL в соответствующей строке поля Табельный номер сотрудника, но так как поле Табельный номер сотрудника является первичным ключом отношения, СУБД отклонит попытку добавления такой записи.

При изменении названия отдела или номера телефона => аномалия модификации.

Если в отделе работает всего один сотрудник и он увольняется => аномалия удаления.

Слайд 109

Аномалии в таблицах БД

При неправильно спроектированной схеме реляционной БД могут возникнуть аномалии при

выполнении операций модификации, добавления, удаления данных.

Аномалии

модификации

добавления

удаления

Слайд 110

таблица «Сотрудник отдела»

Декомпозиция

Решение проблемы

таблица «Сотрудник»

таблица «Отдел»

Слайд 111

Проектирование баз данных

Нормализация – это процесс преобразования отношения в состояние, обеспечивающее лучшие условия

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

Пример, таблица «Учебный план ВУЗа»

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

Дисциплина

Избыточность данных – это дублирование данных, содержащихся в базе данных

Слайд 112

Проектирование баз данных

Появляется избыточность данных => что можно предпринять? (см. следующий слайд)

таблица «Учебный

план ВУЗа»

Вопрос: какие аномалии могут возникнуть в данной таблице?

Слайд 113

таблица «Учебный план ВУЗа»

Декомпозиция

таблица «Дисциплина»

таблица «Учебный план ВУЗа»

Вопросы:
1) Сколько таблиц будет получено

в результате декомпозиции. С какими полями?
2) Какой вид связи будет между таблицами?

Слайд 114

Нормальные формы

Эдгар Кодд.
Нормальные формы:
Первая нормальная форма (1NF, 1НФ).
Вторая нормальная форма (2NF, 2НФ).
Третья

нормальная форма (3NF, 3НФ).
Нормальная форма Бойса — Кодда (BCNF).
Четвёртая нормальная форма (4NF).
Пятая нормальная форма (5NF).
Доменно-ключевая нормальная форма (DKNF).
Шестая нормальная форма (6NF).

Слайд 115

Первая нормальная форма (1НФ)

Определение. Отношение находится в 1НФ тогда и только тогда, когда

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

таблица «Счет в банке»

таблица «Счет в банке»

Слайд 116

Вторая нормальная форма (2НФ)

Определение. Отношение находится во 2НФ тогда и только тогда, когда

соответствует 1НФ и не ключевые атрибуты полностью зависят от всего первичного ключа.

Таблица «Банк»

таблица «Счет в банке»

Декомпозиция

Таблица «Банковский счет»

Таблица
«Клиент банка»

Слайд 117

Третья нормальная форма (3НФ)

Определение. Отношение находится в 3НФ тогда и только тогда, когда

соответствует 2 НФ и все не ключевые атрибуты взаимно независимы.

Таблица «Банк»

Таблица «Менеджер»

Таблица «Банка»

Слайд 118

Таблица «Менеджер»

Таблица «Банка»

Таблица «Клиент банка»

Таблица «Банковский счет»

таблица «Информация о счете»

Слайд 119

Таблица «Грузовые морские перевозки»

1 НФ

Задание:
Определите название ключа по типу и по способу задания.


Определите к какой нормальной форме нужно привести исходную таблицу. И что для этого нужно сделать?

Слайд 120

Таблица «Грузовые морские перевозки»

2 НФ

Таблица «Информация о судне»

таблица «Информация о рейсе»

Задание:
1) Определите к

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

Вопрос:
Нужно ли полученные таблицы приводить к следующей нормальной форме?

Слайд 121

Таблица «Морские перевозки»

3 НФ

таблица «Информация о рейсе»

таблица «Капитан»

Слайд 122

Результат приведения исходной таблицы к 3НФ

Таблица «Информация о судне»

таблица «Информация о рейсе»

таблица

«Капитан»

Таблица «Грузовые морские перевозки»

Процесс нормализации

Слайд 123

Проектирование баз данных

Проектирование базы данных осуществляется в три этапа:
1) концептуальное проектирование (инфологическое);
2) логическое

проектирование (даталогическое);
3) физическое проектирование.

Слайд 124

Концептуальное (инфологическое) проектирование

Цель –  построение независимой от СУБД информационной структуры путем объединения требований

пользователей.
Задачи:
Определение сущностей и их документирование.
Задание связей между сущностями и их документирование.
Создание ER-модели (entity-relationship diagram, ERD) предметной области.
Определение атрибутов и их документирование.
Определение значений атрибутов и их документирование.
Определение первичных ключей для сущностей и их документирование.
Обсуждение концептуальной модели данных с конечными пользователями.

___________________
CASE системы (англ. computer-aided software engineering )— набор инструментов и методов программной инженерии для проектирования программного обеспечения.
IDEF1X (IDEF1 Extended) — Data Modeling — методология построения реляционных структур (баз данных), относится к типу методологий «Сущность-взаимосвязь» (ER — Entity-Relationship) и, как правило, используется для моделирования реляционных баз данных.
Erwin - программа для проектирования и документирования баз данных.
UML (англ. Unified Modeling Language — унифицированный язык моделирования) — язык графического описания для объектного моделирования в области разработки программного обеспечения.



Слайд 125

Концептуальное проектирование, пример, предметная область «Успеваемость студентов».

Уточнение

Слайд 126

Концептуальное проектирование

Примеры значений для заполнения.
Программа обучения: 
бакалавриат, 
магистратура, 
специалитет,
аспирантура
Форма обучения: очная, заочная, очно-заочная
Шифр группы:
БПО-18
БПОз-20

Код и Направление
подготовки

(специальности): 
09.03.01 Информатика и вычислительная техника;
07.03.04 Управление в технических системах
Наименование программы:
Программное обеспечение средств вычислительной техники и автоматизированных систем; Системы и средства автоматизации технологических процессов.

Слайд 127

Логическое (даталогическое) проектирование

Цель –  создание схемы базы данных на основе конкретной модели данных.


Задачи:
Выбор модели данных.
Определение вида связей между таблицами.
Раскрытие отношения "многие-ко-многим".
Нормализация таблиц.
Проверка логической модели данных на предмет возможности выполнения всех транзакций, предусмотренных пользователями. 
Определение требований поддержки целостности данных и их документирование.
Создание окончательного варианта логической модели данных и обсуждение его с пользователями.

Слайд 128

Логическое проектирование

Слайд 129

Физическое проектирование

Цель –  создание схемы базы данных для конкретной СУБД.
Задачи:
Проектирование таблиц базы

данных средствами выбранной СУБД.
Реализация бизнес-правил в среде выбранной СУБД и их документирование.
Проектирование физической организации базы данных.
Разработка стратегии защиты базы данных.
Организация мониторинга функционирования базы данных и ее настройка.

Слайд 130

СХЕМА БАЗЫ ДАННЫХ

Схема данных – графическое отображение логической структуры базы данных в СУБД.

Слайд 131

Представления/VIEW в SQL (Виртуальные таблицы)

Представления/VIEW или виртуальная таблица – это поименованная таблица, получаемая

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

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

Хранит код сложных запросов

Освобождает от необходимости написания одного и того же кода для наиболее востребованных запросов

Можно обращаться как к обычной таблице

В отличии от базовой таблицы не занимает место в БД

Как и базовую таблицу можно использовать в предложении SELECT, INSERT, UPDATE, DELETE

Слайд 132

Представления/VIEW в SQL (Виртуальные таблицы)

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

Ограничить число столбцов

Ограничить число строк

Выводить дополнительные столбцы

Выводить

группы строк

Слайд 133

Синтаксис:
[CREATE|ALTER ] VIEW [(column_list)]
[WITH {ENCRYPTION | SCHEMABINDING| VIEW_METADATA}]
AS
SELECT
FROM
[WHERE condition]

[WITH CHECK OPTION]
Опция WITH CHECK OPTION (в условии) указывает, что должна осуществляться проверка заданного условия при выполнении команды INSERT или UPDATE к представлению (виртуальной таблице). Если условие, заданное в описании представления, возвращает TRUE, то команда INSERT или UPDATE выполняется и происходит добавление записи или соответственно обновление записи в базовой таблице, иначе выполнение команды отклоняется.

Представления/VIEW (Виртуальные таблицы)

Слайд 134

Представления/VIEW (Виртуальные таблицы)

Например, нужно создать представление для просмотра информации о студентах из города

Уфа:
CREATE VIEW Students_from_Ufa
AS
SELECT *
FROM Student
WHERE City = 'Уфа‘
Обращение к представлению Students_from_Ufa:
SELECT *
FROM Students_from_Ufa

Слайд 135

Представления таблиц и представления столбцов

CREATE VIEW New_tab1_stud AS
SELECT *
FROM Student
Вызов представления:
SELECT

*
FROM New_tab1_stud

CREATE VIEW New_tab2_stud (new_surname, new_name, new_stipend, new_kurs, new_city, new_ birthday, new_univ_id) AS
SELECT Surname, Name, Stipend, Kurs, city, Birthday, Univ_id
FROM Student
Вызов представления:
SELECT *
FROM New_tab2_stud

Слайд 136

Представление с вложенным запросом, представление с группировкой

Задание: создайте представление, которое представит информацию по

сотрудникам, работающим в отделе «IT».
CREATE VIEW Cooperator_IT
AS
SELECT Surname, Name, Phone_number, Start_date, Category
FROM Cooperator
WHERE Dept_id IN (SELECT Dept_id
FROM Department
WHERE Name = 'IT')

Задание: создайте представление, которое представит отделы, входящие в состав компании с максимальным коэффициентом.
CREATE VIEW Company_max_coefficient
AS
SELECT Full_name, MAX(Coefficient)
FROM Department JOIN Company ON Department.Company_id = Company.Company_id
GROUP BY Full_name

Слайд 137

Представления c командами модификации

Создание представления Student_view:
CREATE VIEW Student_view
AS
SELECT Surname, Name, City, Birthday
FROM Student
UPDATE

Student_view
SET City = 'Уфа'
WHERE Student_id = 6
*INSERT INTO Student_view
VALUES ('Иванов', 'Иван', NULL, NULL)
DELETE FROM Student_view
WHERE Surname= 'Иванов' AND Name='Иван‘
Вызов представления Student_view:
SELECT *
FROM Student_view
* данные будут добавлены, если поле первичного ключа в таблице Student является автоинкрементным, иначе нужно добавить в представлении поле первичного ключа Student_Id и при вставке новой записи, добавить значение для этого поля

Слайд 138

Применение команд модификации к представлениям, скрывающим поля

Создадим таблицу «Издательство»:
CREATE TABLE Publishing_house
(Id_publ INT PRIMARY

KEY IDENTITY (1, 1),
Name_publ VARCHAR(30) CHECK(Name_publ NOT LIKE '%[-^:\|.,/=><"@#?№&*+0-9a-zA-Z~%]%‘ESCAPE ‘~'),
City VARCHAR(20) CHECK(City NOT LIKE '%[^:\|.,/=><"@#?№&*+0-9a-zA-Z~%]%‘ESCAPE ‘~'),
Address VARCHAR(30) CHECK(Address NOT LIKE '%[-^:\|.,/=><"@#?№&*+0-9a-zA-Z~%]%‘ESCAPE ‘~'),
Telephone VARCHAR(12) CHECK(Telephone LIKE '+[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'),
Raiting TINYINT CHECK(Raiting BETWEEN 1 AND 10))
Создадим представление Publishing_house_view:
CREATE VIEW Publishing_house_view
AS
SELECT Name_publ, City, Raiting, Telephone
FROM Publishing_house
*INSERT INTO Publishing_house_view
VALUES ('Эксмо-АСТ' , 'Москва', 8, NULL)
UPDATE Publishing_house_view
SET Raiting = Raiting+1
WHERE Name_publ= 'Эксмо-АСТ'
* данные будут добавлены, если поле первичного ключа в таблице Publishing_house является автоинкрементным
DELETE FROM Publishing_house_view
WHERE Name_publ = 'Эксмо-АСТ'
Вызов представления Publishing_house_view:
SELECT *
FROM Publishing_house_view

Слайд 139

Представления/VIEW, скрывающие строки и команды модификации

Создание представления Publishing_house_view_more_than_5 :
CREATE VIEW Publishing_house_view_more_than_5
AS
SELECT Name_publ, City,

Raiting, Telephone
FROM Publishing_house
WHERE Raiting>5;
INSERT INTO Publishing_house_view_more_than_5
VALUES ('Лань', 'Санкт-Петербург', 4, NULL);
UPDATE Publishing_house_view_more_than_5
SET Raiting = 3
WHERE Name_publ= 'Эксмо -АСТ'
При вызов представления, добавленная и обновленная записи не будут выведены, поскольку в этих записях в поле Raiting, значения не соответствуют условию заданному при создании представления:
SELECT *
FROM Publishing_house_view_more_than_5
Решением проблемы может стать добавление опции WITH CHECK OPTION:
CREATE VIEW Publishing_house_view_more_than_5
AS
SELECT Name_publ, City, Raiting, Telephone
FROM Publishing_house
WHERE Raiting>5 WITH CHECK OPTION;

Слайд 140

Агрегатные функции в представлениях

Представление для просмотра успеваемости:
CREATE VIEW Total_day
AS
SELECT Surname, Name, COUNT(Subj_id)

AS Subj_quantity,
AVG(CAST(Mark as float)) AS Mark_avg
FROM Exam_mark e, Student s
WHERE e.Student_id =s. Student_id
GROUP BY Surname, Name;
Увидеть данные можно с помощью простого запроса к представлению:
SELECT *
FROM Total_day;
CREATE VIEW Student_Subject AS
SELECT Surname, Subj_name, Mark
FROM Student a, Exam_mark b, Subject c
WHERE a.Student_id = b.Student_id AND b.Subj_id = c.Subj_id
Создав представление Student_Subject , можно будет узнать, следующую информацию:

SELECT Surname
FROM Student_Subject
WHERE Subj_name = 'Базы данных';

SELECT Subj_name
FROM Student_Subject
WHERE Surname = 'Иванов';

Слайд 141

Представление для просмотра сколько сотрудников однофамильцев есть в каждом отделе:
CREATE VIEW Сount_сooperator_homonym
AS
SELECT

d.Name 'Отдел', c.Surname 'Фамилия', COUNT(c.Surname) 'Количество'
FROM Cooperator c, Department d
WHERE c.Dept_id=d.Dept_id
GROUP BY d.Name, c.Surname
HAVING COUNT(c.Surname) >1
ORDER BY 3 DESC
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY

Ограничения в представлениях:

В представлении можно применять сортировку ORDER BY если указать оператор OFFSET.

Слайд 142

Модифицируемые и немодифицируемые представления

Модифицируемое представление — это представление, относительно которого можно применить команды модификации

UPDATE/INSERT/DELETE.
Критерии модифицируемости представления:
Содержит первичный ключ базовой таблицы, если ключ не автоинкрементный.
Не содержит агрегатные функции.
Не содержит ключевое слово DISTINCT.
Нет GROUP BY или HAVING в определении представления.
Нет подзапросов.
Может быть использовано в другом представлении, но это представление должно быть также модифицируемыми.
В определении представления нет полей вывода константы или выражения значений.
Если в описание представления более одной базовой таблицы => команды модификации могут быть применены только к полям одной из них.

Слайд 143

Пример, модифицируемого представления с оператором соединения JOIN

Создадим таблицу «Книга» для хранения данных о

книге:
CREATE TABLE Book
(Id_book INT PRIMARY KEY IDENTITY (1, 1),
Name_book VARCHAR(30) CHECK(Name_book NOT LIKE '%[-^:\|.,/=><"@#?№&*+0-9~%]%' ESCAPE '~'),
Surname_author VARCHAR(30) CHECK(Surname_author NOT LIKE '%[-^:\|.,/=><"@#?№&*+0-9a-zA-Z~%]%' ESCAPE '~'),
Name_author VARCHAR(30) CHECK(Name_author NOT LIKE '%[-^:\|.,/=><"@#?№&*+0-9a-zA-Z~%]%' ESCAPE '~'),
Publication_date date DEFAULT Getdate(),
Id_publ INT FOREIGN KEY REFERENCES Publishing_house)

Создадим представление для просмотра информации о книге и в каком издательстве была издана:
CREATE VIEW Publishing_house_view (Name_publ, City, Name_book,Surname_author,Name_author, Publication_date,Id_publ)
AS
SELECT Name_publ, City, Name_book,Surname_author,Name_author, Publication_date, b.Id_publ
FROM Publishing_house p JOIN Book b ON p.Id_publ=b.Id_publ
Команда добавления данных не выполнится:
INSERT INTO Publishing_house_view (Name_publ, City, Name_book,Surname_author,Name_author, Publication_date, Id_publ)
VALUES ('Азбука-Аттикус', Null, 'Школа волшебства','Энде','Михаэль', '01.10.2021')
Команды добавления данных выполнятся успешно:
INSERT INTO Publishing_house_view (Name_publ, City)
VALUES ('Феникс', 'Ростов-на-Дону')/*запись добавиться в таблицуPublishing_house*/
и
INSERT INTO Publishing_house_view (Name_book,Surname_author,Name_author, Publication_date, Id_publ )
VALUES ('Базы данных','Иванов','Иван', '01.04.2020', 3) /*запись добавиться в таблицу Book*/
Чтобы добавленные записи увидеть через представление Publishing_house_view нужно добавить значение внешнего ключа в таблицу Book на соответствующее издательство.

Слайд 144

Команда обновления данных выполнится:
UPDATE Publishing_house_view
SET Name_book='Молекулярная физика'
WHERE Id_publ =3

Вызов представления:
Select*
From Publishing_house_view

Команда

удаления данных не выполнится:
DELETE FROM Publishing_house_view
WHERE Id_publ =7

Слайд 145

Команды изменения описания представления, удаления представления

ALTER VIEW <имя представления>
описание представления
DROP VIEW

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

Например, добавим условие в описании представления:
ALTER VIEW Publishing_house_view
AS
SELECT Name_publ,Name_book,Surname_author,Name_author
FROM Publishing_house p JOIN Book b ON p.Id_publ=b.Id_publ
WHERE Publication_date BETWEEN '01.01.2020' AND '01.05.2020'
Удалим ранее созданное представление:
DROP VIEW Publishing_house_view

Слайд 146

Оператор CASE позволяет осуществить проверку условий и возвратить в зависимости от выполнения того

или иного условия тот или иной результат.
Синтаксис простого CASE выражения:
CASE
WHEN THEN [ ...n ]
[ ELSE ]
END
Синтаксис поискового CASE выражения:
CASE
WHEN THEN [ ...n ]
[ ELSE ]
END

Условный оператор CASE

Слайд 147

Пример с условным оператором CASE

Премировать сотрудников: IT-отдела - 50% от ЗП;
Бухгалтерии -

40% от ЗП;
Остальных отделов по 30% от ЗП.

SELECT d.Name 'Отдел ',Surname 'Фамилия',Salary 'Зарплата',
CASE d.Name -- проверяемое значение
WHEN 'IT' THEN '50%'
WHEN 'Бухгалтерия' THEN '40%'
ELSE '30%'
END 'Надбавка к ЗП',
Salary/100*CASE d.Name
WHEN 'IT' THEN 50
WHEN 'Бухгалтерия' THEN 40
ELSE 30
END 'Премия‘
FROM Cooperator c, Department d
WHERE c.Dept_id=d.Dept_id
ORDER BY d.Name

Слайд 148

Пример с условным оператором CASE

Вывести средние оценки по студентам и расшифровать значения оценок
SELECT

Surname, ROUND(AVG(CAST(Mark AS Float)),2)'Средняя оценка', [Расшифровка оценки] =
CASE
WHEN AVG(Mark)>4.5 THEN 'отл'
WHEN AVG(Mark)>3.5 AND AVG(Mark)<=4.5 THEN 'хор'
WHEN AVG(Mark)>=3 AND AVG(Mark)<=3.5 THEN 'удов'
WHEN AVG(Mark)<3 THEN 'неуд'
--ELSE 'без расшифровки'
END
FROM Exam_marks e, Student s
WHERE e.Student_Id=s.Student_Id
GROUP BY e.Student_Id,Surname

Слайд 149

Посчитать сколько на каждом курсе оценок со значениями 2, 3, 4, 5
SELECT Surname,

Name, Kurse 'Номер курса',
SUM(CASE WHEN Mark=2 THEN 1 ELSE 0 END) 'Количество 2',
SUM(CASE WHEN Mark=3 THEN 1 ELSE 0 END) 'Количество 3',
SUM(CASE WHEN Mark=4 THEN 1 ELSE 0 END) 'Количество 4',
SUM(CASE WHEN Mark=5 THEN 1 ELSE 0 END) 'Количество 5'
FROM Student s, Exam_mark e
WHERE s.STUDENT_ID=e.Student_Id
GROUP BY Kurse, Surname, Name

Пример с условным оператором CASE

Слайд 150

Задать имя и тип переменной в Transact-SQL можно с помощью оператора DECLARE.
Синтаксис:
DECLARE @local_variable

data_type data _type
Например,
DECLARE @Surname VARCHAR(20)
DECLARE @Surname VARCHAR(20), @Order_date DATE
С помощью SET можно присвоить переменной некоторое значение:
Синтаксис:
SET @local_variable
Например,
DECLARE @Surname VARCHAR(20), @Order_date DATE, @Count_day TINYINT
SET @Surname ='Петров'
SET @Order_date = GETDATE()
SET @Count_day=7
SELECT @Surname 'Фамилия', @Order_date 'Дата заказа', DATEADD(d,@Count_day, @Order_date) 'Ориентировочная дата выдачи заказа'

Объявление переменных в языке Transact-SQL

Слайд 151

Оператор PRINT возвращает сообщение.
Синтаксис:
PRINT
Пример 1:
PRINT 'Вывод сообщения'
Пример 2:
DECLARE @Surname VARCHAR(20), @Order_date DATE, @Count_day TINYINT
SET

@Surname ='Петров'
SET @Order_date = GETDATE()
SET @Count_day=7
PRINT 'Фамилия:'+@Surname+'; дата заказа:'+CONVERT(VARCHAR(12),@Order_date,106)+
'; ориентировочная дата выдачи заказа:'+ CONVERT(VARCHAR(12),DATEADD(d,@Count_day,@Order_date),106)

PRINT в языке Transact-SQL

Пример 3:
DECLARE @stipend_increase FLOAT
SET @stipend_increase=(SELECT MIN(Stipend) FROM Student)
PRINT CAST(@stipend_increase AS VARCHAR(5))+'*20% = '+ CAST(@stipend_increase*1.2 AS VARCHAR(5))

Слайд 152

Условный оператор IF...ELSE

Конструкция IF...ELSE используется для наложения условий, определяющих, какие операторы T-SQL нужно выполнить. 
Синтаксис:
IF Boolean_expression
{sql_statement | BEGIN

… statement_block … END}
[ ELSE {sql_statement | BEGIN … statement_block … END}]

Пример, определим были ли публикации в текущем месяце:
DECLARE @last_data DATE, @count SMALLINT
SELECT @last_data = MAX(Publication_date),
@count = SUM(CASE WHEN DATEDIFF(MONTH, Publication_date, GETDATE()) < 1 THEN 1 ELSE 0 END)
FROM Book
IF @count > 0
BEGIN
PRINT 'Дата последней публикации: ' + CONVERT(VARCHAR, @last_data,100)
PRINT 'Опубликовано книг(а): ' + CONVERT(NVARCHAR, @count) + 'шт'
END
ELSE
PRINT 'Нет публикаций'

Слайд 153

Цикл в языке Transact-SQL

Синтаксис:
WHILE Boolean_expression
{sql_statement|statement_block}
[ BREAK]
{sql_statement|statement_block}
[CONTINUE}
END

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

увеличивать на 10%:
DECLARE @count_month INT, @start_date DATE, @min_stipend FLOAT, @stipend_increase FLOAT
SET @count_month=4
SET @start_date = GETDATE()
SET @min_stipend=(SELECT MIN(Stipend) FROM Student)
SET @stipend_increase=@min_stipend
WHILE @count_month>0
BEGIN
SET @count_month=@count_month-1
SET @start_date = DATEADD(month, 1, @start_date)
SET @stipend_increase =@stipend_increase*1.1
--SELECT @start_date 'Дата',@stipend_increase 'Увеличенная стипендия'
PRINT CONVERT(VARCHAR(12),@start_date,105)+ ' стипендия:‘
+CAST(@stipend_increase AS VARCHAR(12))
END

Слайд 154

Хранимые процедуры в Transact−SQL

Хранимая процедура (Stored Procedure) – это именованный набор команд языка

Transact-SQL, хранящийся на сервере в качестве самостоятельного объекта БД 

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

выполняются быстрее, чем последовательность отдельных SQL команд

хранится на сервере БД

поддерживают модульное программирование

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

проще использовать

Слайд 155

Хранимые процедуры в Transact−SQL

Типы хранимых процедур

Пользовательские процедуры

Временные процедуры

Системные процедуры

хранятся в базе данных

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

могут быть созданы в пользовательской базе данных.

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

Временные локальные процедуры

Временные глобальные процедуры

Имена начинаются с одного знака диеза (#); они видны только текущему соединению пользователя и удаляются, когда закрывается соединение.

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

Слайд 156

Синтаксис создания (изменения) процедуры:
{CREATE|ALTER} PROCEDURE|PROC procedure_name [; number]
[{@name_paramet data_type} [VARYING] [=DEFAULT][OUTPUT]][,...n]
[WITH {RECOMPILE|ENCRYPTION|RECOMPILE, ENCRYPTION}]
[FOR

REPLICATION]
AS
Параметр procedure_name задает имя хранимой процедуры.
Параметр @name_parametr является параметром процедуры (формальным аргументом), тип данных определяется data_type.
VARYING — указывает результирующий набор, поддерживаемый в качестве выходного параметра. 
DEFAULT определяет значение по умолчанию для соответствующего параметра процедуры. Значением по умолчанию также может быть NULL.
Опция OUTPUT указывает, что параметр процедуры является возвращаемым.
Опция WITH RECOMPILE задается если требуется компилировать хранимую процедуру при каждом ее вызове.
WITH ENCRYPTION задает шифрование исходного текста инструкции CREATE PROCEDURE.
FOR REPLICATION указывает, что процедура создается для репликации. Процедура, созданная с параметром FOR REPLICATION, используется в качестве фильтра и выполняется только в процессе репликации. Параметры не могут быть объявлены, если указан параметр FOR REPLICATION. 

Хранимые процедуры в Transact−SQL

Слайд 157

Синтаксис удаления процедуры:
DROP PROCEDURE {имя_процедуры} [,...n]

Хранимые процедуры в Transact−SQL

Синтаксис вызова:
[EXECUTE|EXEC] имя_процедуры [;номер]
[[@имя_параметра=]{значение |

@имя_переменной}
[OUTPUT ]|[DEFAULT]][,...n]

Слайд 158

Пример создания процедуры без параметров

Создадим процедуру для получения названий экзаменов и оценок, полученных

студентом Ивановым:
CREATE Procedure ExamResults
AS
SELECT Surname AS 'Фамилия', Name AS 'Имя', Subj_Name AS 'Дисциплина', Mark AS 'Оценка за экзамен'
FROM Student INNER JOIN Exam_marks ON Student.Student_Id=Exam_marks.Student_Id
INNER JOIN Subject ON Exam_marks.Subj_Id = Subject.Subj_Id
WHERE Student.Surname = 'Иванов'
Вызов процедуры:
EXECUTE ExamResults

Слайд 159

Пример создания процедуры для вычисления значений поля Cost_product

Table. Product

Table. Ingredient

CREATE PROCEDURE Cost_product
AS
Update

Product
SET Cost_product=(SELECT SUM(Cost_unit*Count_unit)
FROM Composition
WHERE Product.Id_product= Composition.Id_product
GROUP BY Id_product)
Вызов процедуры для расчета
значений в поле Cost_product
таблицы Product:
EXEC Cost_product или Cost_product

Table. Composition

Слайд 160

Пример создания процедуры с входным параметром

Создать процедуру для увеличения размера стипендии у студентов

со средней оценкой больше 4-х. Процент увеличения стипендии входной параметр:
CREATE PROCEDURE Reduce_stipend
@Persent float
AS
UPDATE Student
SET Stipend = Stipend*(100+@percent)/100
WHERE Student_Id IN (SELECT Student_Id
FROM Exam_marks
WHERE Mark IS NOT NULL AND Mark!=0
GROUP BY Student_Id
HAVING AVG(Mark)>4)
Обращения к процедуре и задание процента увеличения стипендии:
EXEC Reduce_stipend 50

Слайд 161

Пример создания процедуры с входными параметрами

Создать процедуру для выдачи списка студентов, получивших оценку,

значение которой может передаться через входной параметр по дисциплине, название которой также может передаваться при вызове процедуры. По умолчанию выводить фамилии студентов, получивших оценку «5» по дисциплине «Базы данных»:
CREATE PROCEDURE Subject_procedure
@Subject VARCHAR(30)= 'Базы данных', @Mark TINYINT=5
AS
SELECT Surname AS 'Фамилия', Subj_Name AS 'Дисциплина', Mark AS 'Оценка за экзамен'
FROM Student s INNER JOIN EXAM_MARKS e ON s.Student_Id = e.Student_Id
INNER JOIN SUBJECT sj ON e.Subj_Id = sj.Subj_Id
WHERE Subj_Name = @Subject AND Mark = @Mark

1) EXEC Subject_procedure

Варианты вызова процедуры Subject_procedure:

2) EXEC Subject_procedure @Mark = 3

3) EXEC Subject_procedure @Subject = 'Операционные системы'

4) EXEC Subject_procedure @Subject = 'Операционные системы', @Mark =4

Слайд 162

Создать процедуру для подсчета числа студентов, сдававших экзамен по дисциплине у преподавателя фамилия

и имя которого передаются через входные параметры
CREATE Procedure StudentNum
@Num SMALLINT OUTPUT,
@Lecture_surname VARCHAR(20),
@Lecture_name VARCHAR(20)
AS
SELECT @Num =COUNT(DISTINCT Student_Id)
FROM Exam_marks e INNER JOIN Subject s ON e.Subj_Id = s.Subj_Id
INNER JOIN Semester_plan sp ON s.Subj_Id =sp.Subj_Id
INNER JOIN Lecturer l ON sp.Lecturer_Id = l.Lecturer_Id
WHERE Surname = @Lecture_surname AND Name=@Lecture_name
Вызов процедуры:
DECLARE @Result SMALLINT
EXECUTE StudentNum @Result OUTPUT, 'Cидорова', 'Елена'
PRINT 'Количество студентов:'+CAST(@Result AS VARCHAR(10))

Пример создания процедуры с входными и выходным параметрами

Слайд 163

Получение информации о процедурах

Системные процедуры:
1) sp_help
Синтаксис: sp_help proc1

2) sp_helptext
Синтаксис: sp_helptext proc1
Например,
sp_helptext StudentNum

Например,


sp_help StudentNum

Слайд 164

Пользовательские функции (User Defined Functions, UDF) в Transact-SQL

CREATE PROCEDURE Count_student_proc
@count SMALLINT OUTPUT
AS
SELECT @count=COUNT(DISTINCT

e.Student_Id)
FROM Student s, Exam_marks e
WHERE s.Student_Id=e.Student_Id
GROUP BY e.Student_Id
HAVING AVG(Mark)>=4.75 AND MIN(Mark)>3
Вызов процедуры: 
DECLARE @result SMALLINT
EXECUTE Count_student_proc @result OUTPUT
PRINT 'Возможно, количество красных дипломов :' +CAST(@result AS VARCHAR(10))

CREATE FUNCTION dbo.Count_student_func()
RETURNS SMALLINT
AS
BEGIN
DECLARE @count SMALLINT
SELECT @count=COUNT(DISTINCT e.Student_Id)
FROM Student s, Exam_marks e
WHERE s.Student_Id=e.Student_Id
GROUP BY e.Student_Id
HAVING AVG(Mark)>=4.75 AND MIN(Mark)>3
RETURN @count
END
Вызов функции:
PRINT 'Возможно, количество красных дипломов:' +CAST(dbo.Count_student_func() AS VARCHAR(10))

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

Слайд 165

Пользовательские функции (User defined functions, UDF) Transact-SQL

Поддерживаются следующие типы пользовательских функций:
1) Скалярная функция

(Scalar) – похожа на встроенную функцию, возвращает одно значение. Значение может иметь различный формат данных.
2) Функция, возвращающая таблицу (Inline)− возвращает результирующий набор данных (таблицу), полученный при выполнении SELECT.
3) Многооператорная функция (Multi-statement ) − возвращает таблицу созданную одним или несколькими операторами Transact-SQL, чем напоминает хранимые процедуры. В отличие от процедур, на такие функции можно ссылаться в WHERE как на объект просмотра

Слайд 166

Скалярные функции (Scalar) в Transact-SQL

{CREATE | ALTER} FUNCTION [владелец.] имя_функции
([{@имя_параметра скалярный_тип_данных [=DEFAULT]}[,...n]])
RETURNS

скалярный_тип_данных
[WITH {ENCRYPTION | SCHEMABINDING} [,...n] ]
[AS]
BEGIN
<тело_функции>
RETURN скалярное выражение
END

Слайд 167

Скалярные функции (Scalar) в Transact-SQL

Например, создание скалярной функции для подсчета количества студентов, у

которых дата рождения входит в заданный период:
CREATE FUNCTION dbo.Count_student
(@data_start DATETIME, @data_end DATETIME)
RETURNS INT
AS
BEGIN
DECLARE @count INT
SET @count=(SELECT COUNT(Student_Id)
FROM Student
WHERE Birthday BETWEEN @data_start and @data_end)
RETURN @count
END

Вызов функции:
DECLARE @kol INT
SET @kol=dbo.Count_student('01.01.1996', '31.12.1997')
SELECT @kol 'Количество'
или
SELECT dbo.Count_student('01.01.1996', '31.12.1997') 'Количество '

Слайд 168

Табличные функции (Inline)в Transact-SQL

{CREATE | ALTER } FUNCTION [владелец.] имя_функции
([{ @имя_параметра скалярный_тип_данных [=DEFAULT]}[,...n]])
RETURNS

TABLE
[ WITH {ENCRYPTION | SCHEMABINDING} [,...n]]
[AS]
RETURN [(] SELECT_оператор [)]

Слайд 169

Табличные функции (Inline)в Transact-SQL

Пример, функции табличного типа для определения двух дисциплин с наибольшими

оценками.
CREATE FUNCTION [dbo].[subj_name]()
RETURNS TABLE
AS
RETURN (
SELECT TOP 2 sj.Subj_Name, MAX(Mark) as max_mark
FROM Exam_mark e INNER JOIN Subject sj ON sj.Subj_Id=e.Subj_Id
GROUP BY sj.Subj_Name
ORDER BY MAX(Mark) DESC
)
Вызов функции:
SELECT Subj_Name 'Название дисциплины'
FROM dbo.subj_name()

Слайд 170

Многооператорные функции (Multi-statement)в Transact-SQL

{CREATE | ALTER }FUNCTION [владелец.] имя_функции
([{ @имя_параметра скалярый_тип_данных [=DEFAULT]}[,...n]])
RETURNS @имя_параметра

TABLE <определение_таблицы>
[WITH {ENCRYPTION | SCHEMABINDING} [,...n]]
[AS]
BEGIN
<тело_функции>
RETURN
END

Слайд 171

Многооператорные функции (Multi-statement)в Transact-SQL

CREATE FUNCTION [dbo].[get_FIO_student]()
RETURNS @fio_sudent TABLE (ФИО varchar(50), [Дата рождения] DATE)
AS

BEGIN
INSERT @fio_sudent
SELECT Surname+' '+Name+' '+Middle_name, Birthday
FROM Student
ORDER BY Surname
RETURN
END
Вызов функции get_FIO_student:
SELECT *
FROM get_FIO_student()

Пример. Функция (типа multi-statement), которая выведет список студентов и их даты рождения:

Слайд 172

Удаление пользовательской функции в Transact−SQL

Синтаксис удаления функции:
DROP FUNCTION {[владелец.] имя_функции} [,...n]]

Слайд 173

Пример создания табличной функции

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

среднего значения по каждому студенту.
CREATE FUNCTION dbo.Avg_mark()
RETURNS TABLE
AS
RETURN(
SELECT Student_Id, AVG(Mark) AVG_mark,
SUM(CASE WHEN Mark=2 THEN 1 ELSE 0 END) Count_2,
SUM(CASE WHEN Mark=3 THEN 1 ELSE 0 END) Count_3,
SUM(CASE WHEN Mark=4 THEN 1 ELSE 0 END) Count_4,
SUM(CASE WHEN Mark=5 THEN 1 ELSE 0 END) Count_5
FROM Exam_mark GROUP BY Student_Id
)
Вызов функции:
SELECT *
FROM dbo.Avg_mark()

Слайд 174

Пример вызова функции из хранимой процедуры

Создание процедуры для определения кандидатов на получение красного

диплома. Название группы передается через входной параметр. Процедура вызывает ранее созданную функцию dbo.Avg_mark().
CREATE PROCEDURE Information_red_diploma
@group VARCHAR(5)
AS
SELECT Surname 'Фамилия', Name 'Имя', AVG_mark 'Средний балл', Комментарий=
(CASE
WHEN Count_2=0 AND Count_3=0 AND AVG_mark>=4.75
THEN 'может быть красный диплом'
WHEN Count_2=0 AND Count_3>0 AND AVG_mark>=4.75
THEN 'нужно исправить 3-ки, количесво:'+CAST(Count_3 AS VARCHAR(1))
ELSE ' '
END)
FROM Student,[Group], dbo.Avg_mark()
WHERE [Group].Id_Group=Student.Id_group AND Student.Student_Id =dbo.Avg_mark.Student_Id
AND Name_group=@group
Вызов процедуры:
Information_red_diploma 'БПО'

Слайд 175

Пример вызова функции из хранимой процедуры

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

которых ср.оценка больше или равна 4.75 и нет троек. Значение процента увеличения стипендия передается через входной параметр. Процедура вызывает ранее созданную функцию dbo.Avg_mark().
 CREATE PROCEDURE Update_stipend
@Persent FLOAT
AS
UPDATE Student
SET Stipend=(CASE
WHEN AVG_mark>=4.75 AND Count_2=0 AND Count_3=0
THEN Stipend*(100+@Persent)/100
ELSE Stipend
END)
FROM Student, dbo.Avg_mark()
WHERE Student.Student_Id =dbo.Avg_mark.Student_Id
Вызов процедуры:
Update_stipend 10

Слайд 176

Транзакции и целостность баз данных

Слайд 177

Пример

CREATE TABLE Bank_account
(Id INT PRIMARY KEY IDENTITY(1,1),
Number_account decimal(10,0),
Balance float)
INSERT INTO Bank_account
VALUES(101, 2000), (102,

1000)
BEGIN TRANSACTION
UPDATE Bank_account
SET Balance = Balance - 500
WHERE Number_account = 101
UPDATE Bank_account
SET Balance = Balance + 500
WHERE Number_account = 102
--COMMIT
-- ROLLBACK

Слайд 178

3) Isolation (изолированность).
Результаты транзакции не должны быть видены другим транзакциям, пока она

не завершиться.
4) Durability (устойчивость, долговечность).
Изменения, внесенные в БД в результате выполнения транзакции должны быть зафиксированы.

1) Atomicity (атомарность).
Каждая транзакция в БД должна быть выполнена полностью либо не выполнена совсем. Не допускается частичное выполнение.
2) Consistency (согласованность).
Должно быть согласованное состояние БД до и после выполнения транзакции.

Транзакции и целостность баз данных

Количество операций, входящих в транзакцию, может быть от одной и более.
Разработчик решает, какие команды должны выполняться как одна транзакция, а какие могут быть разбиты на несколько последовательно выполняемых транзакций.
Транзакция обладает следующими важными свойствами (ACID), которые гарантируют правильность и надежность работы системы:

Слайд 179

Модели одновременного конкурентного доступа

Пессимистичная модель

Оптимистичная модель

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

в базе данных: оптимистичный параллелизм и пессимистичный параллелизм. 

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

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

Слайд 180

Уровни изоляции транзакций

Уровни изоляции транзакций — это мера степени успешной изоляции транзакций данных

от возможности изменения другими транзакциями.

SET TRANSACTION ISOLATION LEVEL

READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE

Пессимистическая
модель

SNAPSHOT

Оптимистическая
модель

Пессимистическая модель основана на блокировках.
Оптимистическая модель основана на управлении версиями строк. 

Слайд 181

Уровень изоляции READ UNCOMMITTED
Клиент 1 выполняет транзакцию:
BEGIN TRANSACTION
UPDATE Bank_account
SET Balance = Balance

- 500
WHERE Number_account = 101
COMMIT

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

В это время Клиент 2 начинает выполнять транзакцию для другого счета:
BEGIN TRANSACTION
UPDATE Bank_account
SET Balance = Balance - 500
WHERE Number_account = 102
COMMIT

Слайд 182

Владелец счета 102 решив, что средств достаточно пытается совершить транзакцию для снятия наличных

в размере 2000, но на счете 102 такой суммы нет.
Владелец счета 102 видел баланс в еще не завершенной транзакции (до COMMIT или ROLLBACK).

Сотрудником выполняется транзакция зачисления суммы денег на счет 102, но потом выполняет команду ROLLBACK:
BEGIN TRANSACTION
UPDATE Bank_account
SET Balance = Balance + 1000
WHERE Number_account = 102
ROLLBACK

Уровень изоляции READ UNCOMMITTED. Проблема уровня «Грязное» чтение (dirty read)

Во время выполнения предыдущей транзакции, до выполнения команды ROLLBACK, владелец счета 102 проверяет свой баланс:
SELECT *
FROM Bank_account
WHERE Number_account=102

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Слайд 183

Уровень изоляции READ COMMITTED

Владелец счета 102 не может узнать свой баланс, пока в

предыдущей транзакции не выполнена команда COMMIT или ROLLBACK:
SELECT *
FROM Bank_account
WHERE Number_account=102

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

Сотрудником выполняется транзакция зачисления суммы денег на счет 102:
BEGIN TRANSACTION
UPDATE Bank_account
SET Balance = Balance + 1000
WHERE Number_account = 102
ROLLBACK

Слайд 184

Уровень изоляции READ COMMITTED. Проблема: неповторяющееся чтение (non-repeatable read)

SET TRANSACTION ISOLATION LEVEL READ

COMMITTED

Слайд 185

Уровень изоляции REPEATABLE READ

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

Слайд 186

Уровень изоляции REPEATABLE READ. Проблема: фантомное чтение (phantom reads)

SET TRANSACTION ISOLATION LEVEL

REPEATABLE READ

Слайд 187

Уровень изоляции SERIALIZABLE

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

Слайд 188

Проблемы одновременного доступа

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

Скорость

Надежность

Слайд 189

Уровень изоляции SNAPSHOT

Разрешение на уровни СУБД:
ALTER DATABASE DATABASE_NAME SET ALLOW_SNAPSHOT_ISOLATION ON
SET TRANSACTION ISOLATION

LEVEL SNAPSHOT

Слайд 190

Уровень изоляции SNAPSHOT

Разрешение на уровни СУБД:
ALTER DATABASE DATABASE_NAME SET ALLOW_SNAPSHOT_ISOLATION ON
SET TRANSACTION ISOLATION

LEVEL SNAPSHOT

Слайд 191

Уровень изоляции SNAPSHOT

Разрешение на уровни СУБД:
ALTER DATABASE DATABASE_NAME SET ALLOW_SNAPSHOT_ISOLATION ON
SET TRANSACTION ISOLATION

LEVEL SNAPSHOT

Слайд 192

Журнал транзакций (Write-Ahead Logging (WAL))

Во всех случаях придерживаются стратегии "упреждающей" записи в журнал

(так называемого протокола Write Ahead Log - WAL). Эта стратегия заключается в том, что запись об изменении любого объекта БД должна попасть во внешнюю память журнала раньше, чем измененный объект попадет во внешнюю память основной части БД. Если в СУБД корректно соблюдается протокол WAL, то с помощью журнала можно решить все проблемы восстановления БД после любого сбоя.
Если приложение выполняет инструкцию ROLLBACK или ядро СУБД обнаруживает ошибку, например, потерю связи с клиентом, записи журнала используются для отката изменений, сделанных незавершенной транзакцией.
Если на сервере происходит сбой, базы данных могут остаться в состоянии, когда часть изменений не переписана из буферного кэша в файлы данных, но в них имеются изменения, совершенные незаконченными транзакциями. Когда экземпляр SQL Server будет запущен, он выполнит восстановление каждой базы данных. Каждое изменение, записанное в журнале, которое, возможно, не было записано в файлы данных, накатывается1. Чтобы сохранить целостность базы данных, будет также произведен откат каждой незавершенной транзакции, найденной в журнале транзакций.

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

Слайд 193

Триггеры (Triggers)  в Transact−SQL

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

наступлении определенного события (действия) внутри БД.

Триггер

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

хранится на сервере БД; привязан к таблице (или представлению) и срабатывает на одно или несколько событий

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

может вызывать хранимые процедуры и функции

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

Слайд 194

Триггеры (Triggers)  в Transact−SQL

События:
INSERT – определяет действия, которые будут выполняться после добавления новой

записи в таблицу;
UPDATE – определяет действия, которые будут выполняться после изменения записи таблицы;
DELETE – определяет действия, которые будут выполняться после удаления записи из таблиц.
Время срабатывания: FOR – срабатывает до изменения данных; AFTER – срабатывает после изменения данных; INSTEAD OF – срабатывает в место указанного события, только для команд DML.

Слайд 195

Синтаксис создания/изменения триггера

Основной формат команды:
{CREATE | ALTER} TRIGGER [имя_триггера]
ON имя_таблицы
{FOR | AFTER

| INSTEAD OF} {[INSERT] [,] [UPDATE] [,] [ DELETE]}
[WITH ENCRYPTION]
AS SQL_операторы
Или используя предложение IF UPDATE:
CREATE TRIGGER [имя_триггера]
ON имя_таблицы
{FOR | AFTER | INSTEAD OF} {[INSERT] [,] [UPDATE]}
[WITH ENCRYPTION]
AS
IF UPDATE (имя_столбца)
[{AND |OR} UPDATE (имя_столбца)...]
SQL_операторы;

Слайд 196

Триггеры и виртуальные таблицы deleted и inserted

Таблицы deleted и inserted создаются автоматически.
Таблицы deleted

и inserted всегда имеют такую же структуру, что и у таблицы, на которую установлен триггер.
Содержимое таблиц inserted и deleted при разных событиях:
1) Если триггер срабатывает на событие INSERT: таблица inserted содержит копию строк, которые должны быть вставлены в таблицу.
2) Если триггер срабатывает на событие DELETE: удаляемые строки помещаются в таблицу deleted.
3) Если триггер срабатывает на событие UPDATE: обновление происходит в два этапа – удаление и вставка. Исходные строки помещаются в таблицу deleted, а новые данные помещаются в таблицу inserted.
Для получения информации о количестве строк, которое будет изменено при успешном завершении триггера, можно использовать функцию @@ROWCOUNT. Функция @@ROWCOUNT  возвращает количество строк, обработанных последней командой. 
Для отмены всех изменений, которые внес пользователь, необходимо использовать команду ROLLBACK TRANSACTION. Для фиксации изменений применяется команда COMMIT TRANSACTION.

Слайд 197

Синтаксис удаления триггера

DROP TRIGGER {имя_триггера} [,...n].

Слайд 198

Реализовать ограничение на вводимое значение

Создание триггера проверки возраста студента при добавления записи в

таблицу Student. Триггер выполняет вместо команды добавление.
CREATE TRIGGER Age_verification
ON Student
INSTEAD OF INSERT
AS
BEGIN
IF(SELECT DATEDIFF(YEAR, Birthday, GETDATE()) FROM INSERTED)>=17
INSERT INTO Student
SELECT Stipend, Surname, Name, Middle_name, Birthday, City, Univ_Id, Id_group, data_input, Kurse
FROM inserted
ELSE
PRINT 'Студент не может быть младше 17 лет'
END

Слайд 199

Триггер сохраняющий дату последнего изменения записи в таблице Student

CREATE TRIGGER Update_time_in_the_column
ON Student
AFTER UPDATE
AS
DECLARE

@Id INT
BEGIN
SET NOCOUNT ON
SELECT @Id=Student_Id
FROM inserted
UPDATE Student
SET Update_time=GETDATE()
WHERE Student_Id=@Id
END

Cсоздание триггер сохраняющего дату последнего изменения записи в таблице Student. Для написания подобного триггера в таблице должно быть поле, в которое будет записываться дата и время внесенного изменения. В примере это поле Update_time. Если такого поля в таблице Student нет, тогда нужно добавить.

Слайд 200

Триггер запрещающий изменение значения поля Mark и Exam_Date

RAISERROR – системная функция, позволяющая создавать

сообщение об ошибке и возвращать его как сообщение об ошибке сервера вызывающему приложению .
Синтаксис:
RAISERROR ( сообщение или номер ошибки, степень_серьезности, состояние)

 
CREATE TRIGGER Disallow_update_Mark_Exam_Date
ON Exam_mark
AFTER UPDATE
AS
IF UPDATE (Mark) OR UPDATE(Exam_Date)
BEGIN
ROLLBACK TRANSACTION
RAISERROR('нельзя изменять значение оценки или даты экзамена',16,1)
END

Слайд 201

Триггер, не допускающий добавление более трех записей о результатах сдачи по одной и

той же дисциплине одним и тем же студентом

CREATE TRIGGER Count_re_examination
ON Exam_mark
AFTER INSERT
AS
DECLARE @Student_Id INT, @Subj_Id INT
BEGIN
SELECT @Student_Id =Student_Id, @Subj_Id= Subj_Id
FROM inserted
IF (SELECT COUNT(Mark)
FROM Exam_mark
WHERE Student_Id=@Student_Id AND Subj_Id= @Subj_Id
GROUP BY Student_Id, Subj_Id)>3
BEGIN
ROLLBACK TRANSACTION
RAISERROR('не допускается более трех пересдач',16,1)
END
END

Слайд 202

Триггер перемещает удаленную запись из таблицы Student в архивную таблицу Archive_delete

CREATE TRIGGER Insert_in_table_Archive_delete
ON

Student
AFTER DELETE
AS
BEGIN
INSERT INTO Archive_delete
SELECT *
FROM deleted
END

Слайд 203

Индексы

Индекс (Index)- это объект базы данных, создаваемый для повышения производительности выборки данных.
Индекс создается

для поля (полей) таблицы и обеспечивает быстрый доступ к данным этой таблицы за счет упорядочения данных поля(полей) по значению.
В SQL Server индексы хранятся в виде B-деревьев
(B-tree, Balanced tree). «B» означает сбалансированное.

Возможные варианты поиск с помощью индекса:
1) точного значения;
2) интервала значений;
3) значений нескольких полей.

Слайд 204

Структура сбалансированного B дерева

На примере таблицы «Студент»
SELECT *
FROM Student
WHERE Id_student = 71

80
Носиков
Егор

71

Иванов
Петр

52
Егорова
Валерия

30
Самарин
Лилия

3 Мамаев
Илья

2 Сидоров
Василий

Слайд 205

Способы задания индекса

1) Автоматическое создание индекса при добавлении ограничения первичного ключа PRIMARY KEY.
Например,


CREATE TABLE Student
(ID_student INT PRIMARY KEY,
Surname VARCHAR(30),
Birthday DATA)

2) Автоматическое создание индекса при задании ограничения UNIQUE.
Например,

3) Добавление индекса при помощи команды CREATE INDEX.
Например,

CREATE TABLE Student
(ID_student INT PRIMARY KEY,
Surname VARCHAR(30),
Series_nomber_pas VARCHAR(20),
UNIQUE(Series_nomber_pas ))

CREATE INDEX Index_table_Student
ON Student(Series_nomber_pas)

Слайд 206

Создание индексов в MS SQL Server

Команда создания индекса для таблицы CREATE INDEX имеет

следующий синтаксис:
CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX index_name ON table_name (column1 [ASC | DESC] ,...)
[ INCLUDE ( column_name [ ,... ] ) ]
[WITH
[FILLFACTOR=n] [[, ] PAD_INDEX = {ON | OFF}]
[[, ] DROP_EXISTING = {ON | OFF}]
[[, ] SORT_IN_TEMPDB = {ON | OFF}]
[[, ] IGNORE_DUP_KEY = {ON | OFF}]
[[, ] ALLOW_ROW_LOCKS = {ON | OFF}]
[[, ] ALLOW_PAGE_LOCKS = {ON | OFF}]
[[, ] STATISTICS_NORECOMPUTE = {ON | OFF}]
[[, ] ONLINE = {ON | OFF}]] [ON file_group | "default "]

Значения параметров по умолчанию:
Параметр NONCLUSTERED – создает некластеризованный индекс.
Параметр ASC сортировка по возрастанию значений столбца (column1).
Параметр FILLFACTOR имеет значение по умолчанию n=0 => страницы узлов индекса заполняются полностью, а каждая из промежуточных страниц содержит свободное место для одной записи.
Параметр WITH PAD_INDEX задает заполнение индекса, по умолчанию выключен.
Параметр SORT_IN_TEMPDB указывает, следует ли хранить временные результаты сортировки в базе данных tempdb , по умолчанию выключен.
Параметр IGNORE_DUP_KEY задает ответ на ошибку, когда операция вставки пытается вставить повторяющиеся значения ключа в уникальный индекс. IGNORE_DUP_KEY применяется только к операциям вставки после создания или перестроения индекса.
Параметр STATISTICS_NORECOMPUTE определяет состояние автоматического перерасчета статистики указанного индекса, по умолчанию выключен.
Параметр DROP_EXISTING задает возможность удалить и перестроить существующий кластеризованный или некластеризованный индекс с измененными спецификациями столбцов и сохранить то же имя для индекса, по умолчанию выключен.
Параметр ONLINE указывает, доступны ли базовые таблицы и связанные с ними индексы для запросов и изменения данных во время операции индексирования, по умолчанию выключен.

Слайд 207

Увидеть индексы в таблице

EXECUTE sp_helpindex name_table
Пример, EXECUTE sp_helpindex Student
SELECT *
FROM dbo.Student

Слайд 208

2) Некластеризованный индекс
(Nonclustered index).
При определении некластеризованного индекса в таблице (представлении), физическая

структура данных не перестраивается, а только организуются ссылки на соответствующие записи.
Если таблица не имеет кластеризованного индекса, тогда на уровне листьев находится идентификатор строки (RID - Row Identifier), который состоит из: адреса файла, адреса физического блока (страницы), смещения строки в странице.

В SQL Server таблицу без кластеризованного индекса называется кучей (heap).
Если кластеризованного индекса нет, тогда некластеризованный индекс хранит на уровне листьев ссылки на записи кластеризованного индекса или на записи из кучи.

Существую два типа индексов:
1) Кластеризованный индексы (Clustered index).
При определении кластеризованного индекса в таблице (представлении) физическое расположение данных перестраивается в соответствии со структурой индекса, т.е. выполняется сортировка по полю индекса.

Кластеризованный и некластеризованный индекс

Слайд 209

Пример, работа кластеризованного индекс

Слайд 210

Ключевые различия между кластеризованными и неклстеризованными индексами

Слайд 211

Результаты тестов кластеризованного и некластеризованного индексов на объем занимаемого пространства и производительность

Созданы

две таблицы testtable (одно из полей column int PRIMARY KEY) и testtable2 (одно из полей column int PRIMARY KEY NONCLUSTERED)
Этап 1. Таблицы были заполнены данными (< 5000000 строк).

Этап 2. В каждую таблицу были добавлены еще 1000000 записей.

Слайд 212

Результаты тестов кластеризованного и некластеризованного индексов на объем занимаемого пространства и производительность

Этап

3. Из таблиц удалили 1000000 записей, затем добавили столько же записей.

Слайд 213

Запрос -> Оптимизатор запросов -> План выполнения запроса

Чтобы проанализировать производительность запроса и улучшить

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

Хранилище запросов дает представление о выборе плана выполнения и производительности. Это упрощает решение проблем с производительностью, помогая быстро находить различия в производительности, вызванные изменениями в плане выполнения. Хранилище запросов собирает данные, такие как журнал запросов, планы, статистику выполнения и статистику ожидания.
Инструкция создания хранилища запросов:
ALTER DATABASE Название_БД SET QUERY_STORE = ON;

Оптимизатор запросов — один из наиболее важных компонентов, анализирует запрос и определяет наиболее эффективный способ доступа к необходимым данным. Входные данные для оптимизатора запросов включают запрос, схему базы данных (определение таблиц и индексов) и статистику базы данных.
План выполнения — это результат работы оптимизатора запросов.

Слайд 214

Оптимизация БД и СУБД 

Основных рекомендации по оптимизации БД и СУБД:
перестройка/реорганизация индексов;
очистка процедурного кэша;
обновление

статистики.

Слайд 215

Статистика

Системная процедура для обновления статистики:
sp_updatestats

Команда обновления статистики для определенной таблицы:
UPDATE STATISTICS

название_таблицы

Статистика – это статистические сведения о распределении значений в одном или нескольких столбцах таблицы или индексированного представления.

Команда для просмотра информации о статистике: 
DBCC SHOW_STATISTICS (' название таблицы', 'имя индекса, статистики или столбца ')

Слайд 216

Перестройка индекса/реорганизация индекса

Команды в SQL Server для борьбы с фрагментацией индексов:
ALTER INDEX

REBUILD / REORGANIZE

Рекомендуется:
Если степень фрагментации менее 5%, тогда не нужно перестраивать или реорганизовывать индекс;
Если степень фрагментации от 5 до 30%, лучше выполнять реорганизацию индекса;
Если степень фрагментации более 30%, лучше выполнять перестроение индекса.

Отображение сведений о фрагментации таблицы:
DBCC SHOWCONTIG ('название таблицы');

Можно также посмотреть отчет о физическом состоянии индексов базы данных для этого правой кнопкой кликаем по БД–> Reports –> Standard Reports –> Index Physical Statistics
Отчет будет содержать информацию о состоянии индексов с рекомендациями Microsoft относительно их обслуживания

Слайд 217

Очистка кэш плана

Синтаксис для SQL Server:
DBCC FREEPROCCACHE
Подавление вывода всех регулярных информационных сообщений:
DBCC

FREEPROCCACHE WITH NO_INFOMSGS
Очистка кэш плана для текущей базы данных:
USE Имя_БД;
GO
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;

Подробнее в технической документации Microsoft

Слайд 218

Оптимизация структуры таблиц

Рекомендации:
При создании таблиц выбирать выбирайте самый маленький из допустимых типов данных.
Выбирать тип

данных VARCHAR или NVARCHAR, вместо TEXT.
Хранить изображений в БД нежелательно, можно в таблице хранить путь к файлу (локальный путь или URL). 

Слайд 219

Оптимизация запросов. Как найти проблемные запросы?

Activity Monitor – это утилита, позволяющая оценивать

активность пользователей приложения или сети. Показывает текущее состояние SQL Server, осуществляемые на момент проверки процессы и то, как они отражаются на производительности СУБД. 
Activity Monitor выглядит как окно с несколькими вкладками. Администратор базы данных может открыть такие панели:

Processes (процессы). На этой панели отражаются все активные процессы и подробная информация по ним. В Processes также можно запустить скрипт, который автоматически анализирует выбранный процесс.
Resource Waits (ожидающие ресурсы). На этой панели отображается, какие ресурсы необходимы СУБД для выполнения заданных функций. В перечень ресурсов входит объем оперативной памяти и сервера, сети, компиляция и др. В этой же панели администратор базы данных может просмотреть общий и средний промежуток времени ожидания ресурсов.
Data File I/O (ввод-вывод данных). На этой панели отражаются все операции, связанные с внесением изменений в файлы БД, а также полная информация об этих файлах.
Recent Expensive Queries (последние ресурсоемкие запросы). На этой панели отражаются те запросы, которые были выполнены в течение ближайших 30 секунд, и обработка которых затребовала наибольшего числа ресурсов. В некоторых версиях SQL Server эта панель называется Activity Expensive Queries (активные ресурсоемкие запросы).

Слайд 220

Как найти проблемные запросы? (SET STATISTICS IO, SET STATISTICS TIME)

Инструкция позволяет получить информацию

о времени выполнения запроса:
SET STATISTICS TIME {ON | OFF}
Инструкция предписывает SQL Server предоставить отчет о реальной активности ввода-вывода при выполнении запроса:
SET STATISTICS IO {ON | OFF }

Слайд 221

Оптимизация запросов

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

которые часто участвуют в запросах в разделе WHERE если применяется оператор сравнения «=».
Запросы с не колерующими подзапросами выполняются быстрее, чем с коррелирующими => по возможности писать не коррелирующие подзапросы вместо коррелирующих.
Не использовать * в SELECT. Не нужно извлекать данных больше чем нужно.
Если две или более таблицы часто участвую вместе в соединение, тогда для столбцов-соединения создайте соответствующие индексы (если они не были созданы БД по умолчанию, например, при добавлении ограничения Primary key).
Применять только тот тип JOIN, который вернет необходимые данные в контексте задания, без каких-либо дублей или лишней информации.
Применять сортировку строк только в случае необходимости.
Использовать как можно меньше столбцов в группировке. По возможности лучше использовать WHERE вместо HAVING.
Если в WHERE условие состоит из нескольких операторов AND, то условия должны располагаться в порядке возрастания вероятности истинности данного условия. Для OR наоборот.
Используйте IN вместо OR.
При выполнении соединения таблиц: соединение больших таблиц с маленькими менее оптимально, чем соединение маленьких таблиц с большими.
По возможности не применять конструкции DISTINCT, LIKE '%...' особенно на больших данных.
Использовать в запросе поиск по каждому индексу отдельно, т.е. применить быстрый поиск по каждому индексному полю

Слайд 222

Индексы для ускорения поиска

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

к полям, которые часто участвуют в запросах в разделе WHERE если применяется оператор сравнения «=».

Слайд 223

Индексы для ускорения поиска (покрывающий индекс)

Слайд 224

Не коррелирующий подзапрос

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

столбца сравнивается со значением, возвращаемым подзапросом, в запросах с IN, ALL и ANY. 

Слайд 225

Коррелирующий подзапрос

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

Слайд 226

Оператор JOIN (выборка из всех столбцов)

Слайд 227

Оператор JOIN (выборка данных не из всех столбцов таблиц)

Выборка данных из определенного количества

столбов быстрее чем выборка данных из всех столбцов => не нужно извлекать данных больше чем нужно.

Слайд 228

Поиск по каждому индексному полю отдельно

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

Слайд 229

Зачем нужна оптимизация запросов?

Запросы — это критически важный компонент для повышения общей производительности

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

Слайд 230

Рекомендации для увеличения производительности:

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

помнить некоторые правила составления строк запросов:
Избегать NOT - команды отрицания выполняются в несколько этапов, что увеличивает нагрузку на сервер.
Избегать LIKE - этот оператор сравнения применяет более мягкие шаблоны сравнения, чем оператор =, что увеличивает необходимое число этапов фильтрации.
Применять точные шаблоны поиска - применение подстановочных символов увеличивает время выполнения запроса, так как для проверки всех вариантов подстановки требуется дополнительные ресурсы сервера.
Избегать ORDER - команда сортировки требует упорядочивания строк таблицы вывода, что задерживает получение результата.
Не возвращайте клиенту большее количество столбцов или строк, чем действительно необходимо (Не используй * в Select).
Как можно раньше отфильтруйте данные. Не нужно выполнять большой тяжелый подзапрос для всех строк таблицы. Сначала отфильтруйте нужные строки.

Слайд 231

Оптимизация запросов SELECT

Не читайте больше данных, чем надо. Не используйте * Не

возвращайте клиенту большее количество столбцов или строк, чем действительно необходимо.
Если ваше приложение позволяет пользователям выполнять запросы, но вы не можете отсечь лишние тысячи возвращаемых строк, используйте оператор TOP внутри инструкции SELECT.
Как можно раньше отфильтруйте данные. Не нужно выполнять большой тяжелый подзапрос для всех строк таблицы. Сначала отфильтруйте нужные строки.
При объявлении полей всегда следует использовать размер, который нужен, и не выделять лишние байты про запас.
Если сортируете по дате создания записи, то попробуйте сортировать просто по id (первичный ключ с identity(1,1)).

Слайд 232

Корректно используйте JOIN

Если Вы имеете две или более таблиц, которые часто соединяются, тогда

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

Слайд 233

Оптимизация WHERE в запросе SELECT

Если where состоит из условий, объединенных AND,  они должны располагаться в

порядке возрастания вероятности истинности данного условия. Чем быстрее мы получим false  в одном из условий - тем меньше условий будет обработано и тем быстрее выполняется запрос. 
Если where состоит из условий, объединенных OR,  они должны располагаться в порядке уменьшения вероятности истинности данного условия. Чем быстрее мы получим true  в одном из условий - тем меньше условий будет обработано и тем быстрее выполняется запрос. 
Исопльзуйте IN вместо OR. Операция IN работает гораздо быстрее, чем серия OR.  Запрос "... WHERE column1 = 5 OR column1 = 6" медленнее чем "...WHERE column1 IN (5, 6)". 
Используйте Exists вместо Count >0 в подзапросах. Используйте where exists (select id from t1 where id = t.id) вместо where count(select id from t1 where id=t.id) > 0
LIKE. Эту операцию следует использовать только при крайней необходимости, потому что лучше и быстрее использовать поиск, основанный на full-text индексах. 

Слайд 234

Советы по оптимизации хранимых процедур и SQL пакетов

1) Для обработки данных используйте хранимые

SQL процедуры.
Когда хранимая процедура выполняется в первый раз (и у нее не определена опция WITH RECOMPILE), она оптимизируется, для нее создается план выполнения запроса, который кешируется SQL сервером. Если та же самая хранимая процедура вызывается снова, она будет использовать кешированный план выполнения запроса, что экономит время и увеличивает производительность.
2) Всегда включайте в ваши хранимые процедуры инструкцию "SET NOCOUNT ON". Если Вы не включите эту инструкцию, тогда каждый раз при выполнении запроса SQL сервер отправит ответ клиенту, указывающему число строк, на которые воздействует запрос.

Слайд 235

Рекомендации для увеличения производительности: временные таблицы для больших таблиц, табличные переменные - для

малых (меньше 1000).

Если требуется хранить промежуточные данные в таблицах, то используйте табличные переменные (@t1) для малых таблиц, а временные таблицы (#t1) - для больших. Временные таблицы бывают локальные (#)и глобальные (##).

Например, создадим локальную временную таблицу:
При определении временной таблицы имеет смысл проверить на существование:
IF OBJECT_ID('tempdb..# ProductSummary ') IS NOT NULL begin
DROP TABLE #ProductSummary
End
CREATE TABLE #ProductSummary
(ProdId INT primary key IDENTITY(1,1),
ProdName NVARCHAR(20),
Price Dec(8,2))
INSERT INTO #ProductSummary
VALUES ('Nokia 8', 18000),
('iPhone 8', 56000)
SELECT * FROM #ProductSummary
-- Очистка временной таблицы
TRUNCATE TABLE #ProductSummary

Временная таблица храниться физически в tempdb. Временная таблица удаляется автоматически после завершения последнего сеанса с ее использованием.

Слайд 236

Обобщенные табличные выражения

Кроме временных таблиц MS SQL Server позволяет создавать обобщенные табличные выражения

(common table expression или CTE), которые являются производными от обычного запроса и в плане производительности являются более эффективным решением, чем временные. Обобщенное табличное выражение задается с помощью ключевого слова WITH:

WITH OrdersInfo AS
(
    SELECT ProductId,
        SUM(ProductCount) AS TotalCount,
        SUM(ProductCount * Price) AS TotalSum
    FROM Orders
    GROUP BY ProductId
)
SELECT *
FROM OrdersInfo

Обобщённые табличные выражения были добавлены в SQL для упрощения сложных длинных запросов, особенно с множественными подзапросами. Их главная задача – улучшение читабельности, простоты написания запросов и их дальнейшей поддержки. Это происходит за счёт сокрытия больших и сложных запросов в созданные именованные выражения, которые потом используются в основном запросе.

Слайд 237

Лучшие кандидаты на установку индекса

Это поля, по которым идет JOIN
Поля связи, участвующие в

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

Слайд 238

SQL инъекция (SQL injection - SQLi)

SQL инъекция – это уязвимость веб-безопасности, которая позволяет

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

Слайд 239

Проблемы, вызванные SQL Инъекцией:

Утечка данных: Злоумышленники могут получить доступ к конфиденциальным данным, таким

как пароли, кредитные карты или личная информация.
Изменение данных: Атакующие могут изменять данные в базе данных, что может привести к разрушению целостности данных.
Отказ в обслуживании: SQL инъекция может вызвать перегрузку сервера и отказ в обслуживании, так как запросы выполняются в бесконечном цикле.

Слайд 240

Возможные SQL инъекции (SQL внедрения)

Наиболее простые:
1. Добавление к WHERE дополнительное условие, которое заведомо

вернет истинный результат
Условие 1=1 всегда будет истинным, и база данных воспримет его как команду вернуть в ответе все, что находится в таблице! Таким образом, этот SELECT-запрос запрашивает все данные на всех сотрудников.
2. Присоединение к запросу результатов другого запроса. Делается это через оператор UNION.
3. Закомментирование части запроса.

Слайд 241

Способы обнаружения SQL инъекции

Существует несколько способов обнаружения SQL инъекций:
Использование специализированных инструментов. Существуют различные

инструменты, такие как SQLMap, DBeaver, Acunetix, Burp Suite и другие, которые автоматически сканируют веб-приложения и ищут уязвимости, включая SQL инъекции.
Проверка наличия специфических символов. SQL инъекции обычно осуществляются путем вставки специальных символов в пользовательский ввод, чтобы обмануть фильтры и выполнить нежелательные SQL-запросы. Проверка наличия таких символов, таких как одинарные кавычки ('), двойные кавычки ("), точки с запятой (;) и других, может помочь обнаружить возможную SQL инъекцию.
Проверка неправильного поведения при обработке пользовательского ввода. Если веб-приложение не корректно обрабатывает пользовательский ввод, это может привести к возможной SQL инъекции. Например, если система не экранирует или не фильтрует пользовательский ввод, это может сигнализировать о наличии уязвимости.
Попытка найти ошибки в сообщениях об ошибках или логах. Часто, когда веб-приложение сталкивается с ошибкой SQL-запроса, она может вернуть сообщение об ошибке или записать ее в логи. Анализирование таких сообщений или логов может помочь выявить наличие SQL инъекции.
Тестирование наличия уязвимости с помощью специально сформированных запросов. Использование инструментов для создания и отправки специально сформированных запросов веб-приложению может помочь выявить наличие уязвимостей в защите от SQL инъекций.
Важно отметить, что эти методы могут помочь выявить наличие SQL инъекций, но не гарантируют 100% точности. Рекомендуется проводить комплексное тестирование безопасности веб-приложений с использованием различных методов и инструментов.

Слайд 242

Возможные решения:

Использование подготовленных запросов: используйте параметризованные запросы, чтобы передавать данные в базу данных,

вместо конкатенации строк. Это помогает избежать инъекций.
Экранизация данных: экранируйте специальные символы, такие как одинарные кавычки, перед внесением данных в SQL-запросы.
Ограничение привилегий БД: минимизируйте привилегии пользователя базы данных, чтобы ограничить возможность выполнения опасных операций.
Обновление и мониторинг безопасности: регулярно обновляйте и мониторьте ваше ПО, чтобы устранить уязвимости, которые могут быть использованы для атак.
Валидация ввода: проводите строгую валидацию всех пользовательских входных данных, чтобы предотвратить внесение вредоносного кода.
Использование файрвола приложений: защитите вашу систему с помощью WAF (Web Application Firewall), который может обнаруживать и блокировать SQL инъекции.
SQL инъекция - серьезная угроза, и предупреждение этой атаки требует сочетания технических и образовательных мероприятий.

Слайд 243

Службы Microsoft SQL Server

Слайд 244

Database Engine

Database Engine является ядром системы управления реляционной БД.
Может быть установлено несколько

экземпляров службы Database Engine.
Один экземпляр Database Engine может быть службой по умолчанию (с именем MS SQL SERVER), другие экземпляры должны иметь уникальные имена.
Каждый экземпляр службы Database Engine требует отдельной инсталляции, конфигурации и настройки безопасности.
Один Database Engine может обеспечить доступ к нескольким БД.

Слайд 245

Системные базы данных

Слайд 246

Утилиты Microsoft SQL Server:

SQL Server Management Studio.
SQL Server Books Online.

SQLCMD Microsoft.
SQL Configuration Manager.

Слайд 247

Система управления базами данных

Основные функции СУБД:
управление данными во внешней памяти (на дисках);
управление данными

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

Слайд 248

Обычно современная СУБД содержит следующие компоненты:
ядро, которое отвечает за управление данными во внешней

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

Система управления базами данных

Слайд 249

Реляционная алгебра

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

реляционными операциями.
Основные операции реляционной алгебры: объединение, пересечение, разность, декартово произведение, деление, проекция, выборка (селекция), соединение.

Слайд 250

Операция реляционной алгебры: проекция

Операция проекции (унарная операция) выделяет атрибуты только из указанных доменов.
πa1,…,an(R)

где a1,…,an — список полей, подлежащих выборке.

πВозраст, Вес(Отдела продаж)

Эквивалентный SQL-запрос:
SELECT DISTINCT Возраст, Вес
FROM [Отдел продаж]

Слайд 251

Операция реляционной алгебры: объединение (union)

Операция объединения над двумя отношениями, создает новое отношение, состоящее

из всех кортежей исходных отношений. Общие для исходных отношений кортежи в новом отношении не повторяются (не дублируются).

Эквивалентный SQL-запрос:
SELECT Фамилия, Имя, Отчество,
Возраст, Вес
FROM [Отдел продаж]
UNION
SELECT Фамилия, Имя, Отчество,
Возраст, Вес
FROM [Отдел кадров]

Слайд 252

Операция реляционной алгебры: выборка (селекция) (selection)

Операция выборки производится над кортежами одного отношения (унарная

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

как σaθb(R) или σaθv(R), где:
a, b — имена атрибутов;
θ — оператор сравнения из множества {<; ≤; =; ≥; >};
v — константа;
R — отношение.

σВозраст ≥ 27 (Отдел продаж

Эквивалентный SQL-запрос: SELECT *
FROM [Отдел продаж] WHERE Возраст >= 27

Слайд 253

Операция реляционной алгебры: пересечение (intersection)

Операция пересечения над двумя отношениями, создает новое отношение, состоящее

из кортежей, принадлежащих обоим исходным отношениям.

Эквивалентный SQL-запрос:
SELECT Фамилия, Имя, Отчество,
Возраст, Вес
FROM [Отдел продаж]
INTERSECT
SELECT Фамилия, Имя, Отчество,
Возраст, Вес
FROM [Отдел кадров]

Слайд 254

Операция реляционной алгебры: разность

Операция разность над двумя отношениями создает новое отношение, состоящее из кортежей,

принадлежащих первому отношению и не принадлежащих второму.

Эквивалентный SQL-запрос:
SELECT Фамилия, Имя, Отчество, Возраст, Вес
FROM [Отдел продаж]
EXCEPT
SELECT Фамилия, Имя, Отчество, Возраст, Вес
FROM [Отдел кадров]

Слайд 255

Операция реляционной алгебры: произведение (декартовое произведение) (сartesian product)

Table Cooperator

Table Department

Эквивалентный SQL-запрос:
SELECT Coop_id, coop.Surname,

coop.Name, dep.Dept_id ,dep.Name
FROM Cooperator coop, Department dep

произведение (декартовое произведение)

Слайд 256

Операция реляционной алгебры: соединение (join) 

Операция соединения над двумя отношениями создает новое отношение, состоящее

из всех атрибутов исходных отношений и объединяющее только те кортежи исходных отношений в которых значения общих атрибутов совпадают.

Эквивалентный SQL-запрос:
SELECT Coop_id , coop.Surname, coop.Name, dep. Dept_id ,dep.Name
FROM Cooperator coop, Department dep
WHERE coop.Dept_id =dep.Dept_id

Table Cooperator

Table Department

Выполняется через операции декартова произведения и выборки.

Слайд 257

Операция реляционной алгебры: деление (division)

Операция деления над двумя отношениями создает новое отношение, состоящее

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

Эквивалентный SQL-запрос привести затруднительно, возможен следующий вариант:
SELECT *
FROM Мультфильмы INNER JOIN Каналы
ON Мультфильмы.Название_канала = Каналы.Код_канала

Слайд 258

Термин NoSQL обозначает нереляционные базы данных, которые хранят данные в формате, отличном от

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

Big Data или большие данные — это структурированные или неструктурированные массивы данных большого объема. Их обрабатывают при помощи специальных автоматизированных инструментов, чтобы использовать для статистики, анализа, прогнозов и принятия решений.
Интернет вещей (IoT, Internet of Things) — объединение разных устройств в общую сеть, в которой они могут собирать информацию, обрабатывать ее и обмениваться данными между собой, с человеком и серверами в дата-центре или облаке.

Подход NoSQL

Слайд 259

Модель данных «Ключ-значение»

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

Чтобы частично или полностью изменить значение, приложение всегда перезаписывает существующее значение целиком. В большинстве реализаций атомарной операцией считается чтение или запись одного значения. Запись больших значений занимает относительно долгое время.
Поиск по значениям отсутствует, есть только по ключу/ключам. Все сведения о схеме поддерживаются и применяются на уровне приложения.
Главные плюсы: масштабируемость, простота.
Основные недостатки: не поддерживаются связи между объектами, в основном запросы только с поиском по ключу.
Возможно применить для хранения изображений, сессий, счетчиков посещений или просмотров, в игровых и рекламных приложениях, в проектах интернет вещей и т.д.

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

Интернет вещей (IoT, Internet of Things) — объединение разных устройств в общую сеть, в которой они могут собирать информацию, обрабатывать ее и обмениваться данными между собой, с человеком и серверами в дата-центре или облаке.

Слайд 260

Документно-ориентированная модель данных

Возможно реализовать большую вложенность и сложность структуры данных, чем в БД

«ключ-значение» (например, документ вложенный в документ, вложенный в документ). Данных хранятся в Json документах.
Основные достоинства: возможно хранение слабоструктурированных объектов; быстрое выполнение запросов.
Основные недостатки: при запросе выводиться весь документ, даже если необходимо было какое-то одно значение, что сказывается на производительности; медленный процесс обновления данных (данные могут храниться распределено на нескольких серверах); возможно дублирование данных.
Возможно применение для каталогов, пользовательские профилей, в CMS-системах, издательском деле и документальном поиске. 

CMS (Content Management System) — это система управления, движок, платформа или конструктор, который позволяет управлять содержимым сайта.

Слайд 261

Колоночная модель данных

Основная идея колоночной модели данных — это хранение данных не по строкам, как в реляционных таблицах,

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

Реляционная
таблица

Семейство колонок

Слайд 262

Графовая модель данных

Графовая модель данных основана на узлах и рёбрах, представляющих взаимосвязанные данные (например, отношения между

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

Узлы: сотрудники и отделы.
Ребра: определяют отношения подчинения и отдел, в котором работает каждый сотрудник.
Стрелки: показывают направление связей.

Слайд 263

Основные черты

Слайд 264

Теорема САР (или теорема Брюера)

Слайд 265

Примеры NoSQL СУБД

Документно-ориентированные: CouchDB (Couchbase), MongoDB (MongoDB).
Колоночные: Cassandra (Apache Software Foundation), ClickHouse (Яндекс).
Графовые:

Neo4j (Neo Technology), OrientDB (Orient Technologies LTD).
Ключ – значение: Tarantool (VK), Redis (Redis Labs), Oracle NOSQL Datebase (Oracle), Amazon DynamoDB (Amazon).
Имя файла: Базы-данных.-Введение-в-базы-данных.-Общая-характеристика-основных-понятий.pptx
Количество просмотров: 13
Количество скачиваний: 0