Принцип на декларативност:
SQL е декларативен език - указвате КАКВО искате да получите, а не КАК точно да се изпълни
Системата за управление на базата данни сама определя най-ефективния начин за изпълнение
1.Работа с таблици (релации):
Данните се съхраняват в таблици със редове и колони
Всяка таблица има уникално име и дефинирана структура
Колоните имат определен тип данни (текст, число, дата и т.н.)
2.Основни операции (CRUD):
SELECT - извличане на данни
INSERT - добавяне на нови записи
UPDATE - промяна на съществуващи данни
DELETE - изтриване на записи
3.Връзки между таблиците:
Създават се чрез външни ключове (FOREIGN KEYS)
Поддържат референциална цялост на данните
Позволяват обединяване на таблици чрез JOIN операции
4.Цялостност на данните:
Първични ключове (PRIMARY KEYS) за уникална идентификация
Ограничения (constraints) за валидност на данните
Транзакции за атомарност на операциите
===================================================================================
Транзакцията представлява логическа единица работа, която включва една или повече операции с базата данни. Тя се характеризира със свойствата ACID:
1.Атомарност (Atomicity)
Транзакцията е неделима - или всички операции се изпълняват успешно, или нито една
Ако възникне грешка, всички промени се отменят (ROLLBACK)
Пример: Банков превод - или сумата се изтегля от една сметка и постъпва в друга, или операцията изобщо не се извършва
2.Консистентност (Consistency)
Базата данни преминава от едно валидно състояние в друго
Всички ограничения (constraints) се спазват
Референциалната цялост се запазва
3.Изолация (Isolation)
Транзакциите са изолирани една от друга
Промените от една незавършена транзакция не са видими за другите транзакции
Различни нива на изолация определят как транзакциите си взаимодействат
4.Дълготрайност (Durability)
След успешно приключване, промените са постоянни
Дори при срив на системата, данните се запазват
===================================================================================
BEGIN TRANSACTION;
-- Изтегляне на пари от първата сметка
UPDATE сметки
SET баланс = баланс - 1000
WHERE сметка_id = 1;
-- Внасяне на пари във втората сметка
UPDATE сметки
SET баланс = баланс + 1000
WHERE сметка_id = 2;
-- Ако всичко е наред, потвърждаваме промените
COMMIT;
-- Ако има проблем
-- ROLLBACK;
===================================================================================
Основни команди за работа с транзакции:
1.BEGIN TRANSACTION - започва нова транзакция
2.COMMIT - потвърждава промените
3.ROLLBACK - отменя всички промени
4.SAVEPOINT - създава точка, до която може да се върнем
5.ROLLBACK TO SAVEPOINT - връща до определена точка
Нива на изолация:
1.READ UNCOMMITTED
Най-ниско ниво
Вижда се "мръсно" четене на незавършени транзакции
Рядко се използва
2.READ COMMITTED
Вижда само потвърдени промени
Стандартно ниво в много системи
Предотвратява "мръсно" четене
3.REPEATABLE READ
Гарантира, че повторното четене връща същите данни
Предотвратява нежелани промени по време на транзакция
4.SERIALIZABLE
Най-високо ниво на изолация
Транзакциите се изпълняват сякаш са последователни
Най-безопасно, но с най-ниска производителност
Примери за използване на транзакции:
Финансови операции
Обработка на поръчки
Актуализация на свързани таблици
Прехвърляне на данни между системи
Сложни бизнес процеси
Важни практики:
Транзакциите трябва да са възможно най-кратки
Избягвайте дълги транзакции, които блокират ресурси
Внимавайте с нивата на изолация
Винаги предвиждайте обработка на грешки
Тествайте поведението при конкурентен достъп
===================================================================================
-- Таблица "служители"
CREATE TABLE служители (
id INT PRIMARY KEY,
име VARCHAR(50),
отдел_id INT
);
-- Таблица "отдели"
CREATE TABLE отдели (
id INT PRIMARY KEY,
име_отдел VARCHAR(50)
);
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.INNER JOIN (Вътрешно свързване)
SELECT с.име, о.име_отдел
FROM служители с
INNER JOIN отдели о ON с.отдел_id = о.id;
Връща само редовете, където има съвпадение в двете таблици
Ако служител няма отдел или отдел няма служители, тези редове не се показват
Най-често използваният тип JOIN
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2.LEFT JOIN (Ляво външно свързване)
SELECT с.име, о.име_отдел
FROM служители с
LEFT JOIN отдели о ON с.отдел_id = о.id;
Връща ВСИЧКИ редове от лявата таблица (служители)
Ако няма съвпадение в дясната таблица, полетата се попълват с NULL
Полезно когато искате да видите всички служители, дори тези без отдел
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3.RIGHT JOIN (Дясно външно свързване)
SELECT с.име, о.име_отдел
FROM служители с
RIGHT JOIN отдели о ON с.отдел_id = о.id;
Връща ВСИЧКИ редове от дясната таблица (отдели)
Ако няма съвпадение в лявата таблица, полетата се попълват с NULL
Полезно когато искате да видите всички отдели, дори празните
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4.FULL JOIN (Пълно външно свързване)
SELECT с.име, о.име_отдел
FROM служители с
FULL JOIN отдели о ON с.отдел_id = о.id;
Връща ВСИЧКИ редове от ДВЕТЕ таблици
Ако няма съвпадение в която и да е таблица, липсващите полета са NULL
Показва пълната картина на данните
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5.CROSS JOIN (Кръстосано свързване)
SELECT с.име, о.име_отдел
FROM служители с
CROSS JOIN отдели о;
Създава Декартово произведение - всеки ред от първата таблица със всеки ред от втората
Не изисква условие за свързване
Рядко се използва на практика поради големия брой резултати
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6.SELF JOIN (Самосвързване)
SELECT с1.име AS служител, с2.име AS мениджър
FROM служители с1
LEFT JOIN служители с2 ON с1.мениджър_id = с2.id;
Свързване на таблица със самата себе си
Полезно при йерархични връзки (например служител-мениджър)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++