Огляд мови SQL та запитів
Огляд мови SQL та запитів
Навіщо нам потрібна спеціалізована мова?
Уявіть, що ви в бібліотеці і хочете знайти книгу. Ви могли б:
- Написати програму на C#/Java, яка:
- Відкриє файл з каталогом
- Прочитає кожен рядок
- Порівняє з назвою книги
- Поверне результат
- Або просто сказати бібліотекарю: "Дайте мені Кобзар Шевченка"
SQL — це і є та "мова спілкування з бібліотекарем" (базою даних). Ви кажете ЩО потрібно, а не ЯК це отримати.
Імперативна vs Декларативна парадигма
// Ви ВКА "ЯК" отримати дані
List<Student> result = new List<Student>();
foreach (var student in students)
{
if (student.Age > 18 && student.Grade >= 90)
{
result.Add(student);
}
}
return result.OrderBy(s => s.LastName).ToList();
Ви контролюєте:
- Як перебирати дані (foreach)
- Як фільтрувати (if)
- Як сортувати (OrderBy)
-- Ви вказуєте "ЩО" потрібно
SELECT *
FROM Students
WHERE Age > 18 AND Grade >= 90
ORDER BY LastName;
СУБД вирішує:
- Використати індекси чи ні
- У якому порядку фільтрувати
- Який алгоритм сортування
Історія SQL: Від SEQUEL до SQL:2016
Часова лінія розвитку
Ключові віхи
SQL-86 (1986) — Перший стандарт:
- SELECT, INSERT, UPDATE, DELETE
- CREATE TABLE, DROP TABLE
- Базовий WHERE, GROUP BY
SQL-92 (1992) — Найважливіша версія:
- JOIN syntax (INNER, LEFT, RIGHT, FULL)
- Subqueries
- UNION
- Стала основою для більшості СУБД
SQL:1999 (1999) — Об'єктно-орієнтовані features:
- Triggers
- Recursive queries (WITH)
- BOOLEAN type
SQL:2003 (2003) — XML та аналітика:
- XML data type
- WINDOW functions (ROW_NUMBER, RANK)
- MERGE statement
SQL:2016 (2016) — JSON та Big Data:
- JSON support
- Pattern matching
- Поліморфні table functions
Діалекти SQL: Різні виробники
Хоча існують стандарти, кожен виробник СУБД має свій діалект SQL із унікальними розширеннями.
Порівняння діалектів
| СУБД | Діалект | Виробник | Особливості |
|---|---|---|---|
| SQL Server | T-SQL | Microsoft | Дуже багатофункціональний, stored procedures, CLR integration |
| Oracle | PL/SQL | Oracle | Найстаріший, найпотужніший для ентерпрайзу |
| MySQL | SQL/PSM | Oracle (раніше Sun) | Простий, популярний у веб-розробці |
| PostgreSQL | PLpgSQL | PostgreSQL Global Development Group | Open-source, стандартосумісний |
| DB2 | SQLPL | IBM | Enterprise-oriented, mainframe roots |
| MS Access | Jet SQL | Microsoft | Спрощений для desktop БД |
Приклад відмінностей
-- Обмеження результату
SELECT TOP 10 * FROM Products;
-- Змінні
DECLARE @count INT = 0;
-- String concatenation
SELECT FirstName + ' ' + LastName AS FullName;
-- Auto-increment
CREATE TABLE Users (
Id INT IDENTITY(1,1)
);
-- Обмеження результату
SELECT * FROM Products WHERE ROWNUM <= 10;
-- Змінні
DECLARE
v_count NUMBER := 0;
BEGIN
END;
-- String concatenation
SELECT FirstName || ' ' || LastName AS FullName;
-- Auto-increment (manual, or use SEQUENCE)
CREATE SEQUENCE user_seq;
-- Обмеження результату
SELECT * FROM Products LIMIT 10;
-- Змінні
SET @count = 0;
-- String concatenation
SELECT CONCAT(FirstName, ' ', LastName) AS FullName;
-- Auto-increment
CREATE TABLE Users (
Id INT AUTO_INCREMENT
);
T-SQL: Діалект Microsoft SQL Server
Основні можливості T-SQL
- Змінні та присвоєння
- Контрольні структури (IF, WHILE, CASE)
- Обробка помилок (TRY...CATCH)
- Stored Procedures та Functions
- Тригери
- Курсори
- Динамічний SQL
Синтаксис змінних
-- Оголошення змінної
DECLARE @studentName NVARCHAR(50);
DECLARE @age INT = 20;
-- Множинне оголошення
DECLARE
@firstName NVARCHAR(50),
@lastName NVARCHAR(50),
@fullName NVARCHAR(100);
-- Присвоєння через SET
SET @studentName = 'Іван';
-- Присвоєння через SELECT
SELECT @fullName = FirstName + ' ' + LastName
FROM Students
WHERE StudentId = 1;
Контрольні структури
DECLARE @grade INT = 85;
IF @grade >= 90
PRINT 'Відмінно!';
ELSE IF @grade >= 75
PRINT 'Добре!';
ELSE
PRINT 'Потрібно поліпшити';
DECLARE @counter INT = 1;
WHILE @counter <= 10
BEGIN
PRINT 'Iteration: ' + CAST(@counter AS NVARCHAR);
SET @counter = @counter + 1;
END;
SELECT
ProductName,
Price,
CASE
WHEN Price < 100 THEN 'Budget'
WHEN Price < 500 THEN 'Mid-range'
ELSE 'Premium'
END AS PriceCategory
FROM Products;
Оператори
| Оператор | Значення | Приклад |
|---|---|---|
+ | Додавання | SELECT 5 + 3 → 8 |
- | Віднімання | SELECT 10 - 4 → 6 |
* | Множення | SELECT 6 * 7 → 42 |
/ | Ділення | SELECT 20 / 4 → 5 |
% | Остача | SELECT 17 % 5 → 2 |
| Оператор | Значення | Приклад |
|---|---|---|
= | Дорівнює | WHERE Age = 18 |
> | Більше | WHERE Price > 100 |
< | Менше | WHERE Quantity < 10 |
>= | Більше або дорівнює | WHERE Grade >= 90 |
<= | Менше або дорівнює | WHERE Age <= 65 |
<> або != | Не дорівнює | WHERE Status <> 'Deleted' |
| Оператор | Значення | Приклад |
|---|---|---|
AND | Логічне І | WHERE Age > 18 AND Grade >= 90 |
OR | Логічне АБО | WHERE City = 'Kyiv' OR City = 'Lviv' |
NOT | Логічне НІ | WHERE NOT IsDeleted |
IN | У множині | WHERE Status IN ('Active', 'Pending') |
BETWEEN | У діапазоні | WHERE Price BETWEEN 100 AND 500 |
LIKE | Шаблон | WHERE Email LIKE '%@gmail.com' |
Функції T-SQL
-- Підрахунок
SELECT COUNT(*) FROM Students;
-- Сума
SELECT SUM(Price) FROM Orders;
-- Середнє
SELECT AVG(Grade) FROM Exams;
-- Мінімум/Максимум
SELECT MIN(Price), MAX(Price) FROM Products;
-- Об'єднання
SELECT CONCAT(FirstName, ' ', LastName);
-- Довжина
SELECT LEN('Hello'); -- 5
-- Підрядок
SELECT SUBSTRING('Hello World', 1, 5); -- 'Hello'
-- Заміна
SELECT REPLACE('Hello World', 'World', 'SQL');
-- Поточна дата/час
SELECT GETDATE(); -- 2024-02-06 14:30:00
-- Додати дні
SELECT DATEADD(DAY, 7, GETDATE());
-- Різниця в днях
SELECT DATEDIFF(DAY, '2024-01-01', '2024-02-06'); -- 36
-- Частина дати
SELECT YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE());
Коментарі
-- Однорядковий коментар
/*
Багаторядковий
коментар
*/
SELECT
ProductName, -- Назва товару
Price -- Ціна
FROM Products;
DDL, DML, DCL: Категорії операторів
SQL оператори поділяються на три основні категорії залежно від призначення.
DDL (Data Definition Language) — Мова опису даних
Призначення: Робота зі структурою бази даних.
Приклади:
-- CREATE: Створення таблиці
CREATE TABLE Students (
StudentId INT PRIMARY KEY,
FirstName NVARCHAR(50),
LastName NVARCHAR(50)
);
-- ALTER: Додавання стовпця
ALTER TABLE Students
ADD Email NVARCHAR(100);
-- ALTER: Зміна типу даних
ALTER TABLE Students
ALTER COLUMN Email NVARCHAR(150);
-- DROP: Видалення таблиці
DROP TABLE OldData;
-- TRUNCATE: Очищення таблиці (залишає структуру)
TRUNCATE TABLE TempData;
DML (Data Manipulation Language) — Мова керування даними
Призначення: Робота з даними всередині таблиць.
Приклади:
-- SELECT: Вибірка даних
SELECT FirstName, LastName, Grade
FROM Students
WHERE Grade >= 90;
-- INSERT: Вставка нового запису
INSERT INTO Students (FirstName, LastName, Grade)
VALUES ('Іван', 'Петренко', 95);
-- UPDATE: Оновлення існуючих записів
UPDATE Students
SET Grade = 100
WHERE StudentId = 1;
-- DELETE: Видалення записів
DELETE FROM Students
WHERE Grade < 60;
DCL (Data Control Language) — Мова керування доступом
Призначення: Керування правами доступу до об'єктів БД.
Приклади:
-- GRANT: Надати права на SELECT
GRANT SELECT ON Students TO [UserName];
-- GRANT: Надати повні права
GRANT ALL PRIVILEGES ON DATABASE::University TO [AdminUser];
-- DENY: Явна заборона (перекриває GRANT!)
DENY DELETE ON Students TO [UserName];
-- REVOKE: Забрати надані права
REVOKE SELECT ON Students FROM [UserName];
Базовий синтаксис SELECT
Хоча детальний розбір SQL запитів буде в наступних темах, розглянемо базову структуру:
SELECT <стовпці>
FROM <таблиця>
WHERE <умови>
ORDER BY <сортування>;
Приклад:
SELECT LastName, FirstName, BirthDate
FROM Students
WHERE MONTH(BirthDate) = 11
ORDER BY LastName ASC;
Анатомія запиту:
SELECT LastName, FirstName, BirthDate— які стовпці вибратиFROM Students— з якої таблиціWHERE MONTH(BirthDate) = 11— умова фільтрації (листопад)ORDER BY LastName ASC— сортування за прізвищем (A→Z)
Практичні завдання
Завдання 1: Теоретичне розуміння
Поясніть різницю між:
- DDL та DML
- DELETE та TRUNCATE
- GRANT та DENY
💡 Розв'язок
1. DDL vs DML:
- DDL змінює структуру (CREATE TABLE)
- DML змінює дані (INSERT, UPDATE)
2. DELETE vs TRUNCATE:
- DELETE — DML, видаляє рядки (можна з WHERE), можна відкотити
- TRUNCATE — DDL, очищує всю таблицю, неможливо відкотити, швидше
3. GRANT vs DENY:
- GRANT надає права
- DENY явно забороняє (має пріоритет над GRANT)
Завдання 2: Визначення категорії
До якої категорії (DDL/DML/DCL) належать ці команди?
1. CREATE INDEX IX_Students_Email ON Students(Email);
2. UPDATE Products SET Price = Price * 1.1;
3. REVOKE INSERT ON Orders FROM [User];
4. ALTER TABLE Customers ADD Phone NVARCHAR(20);
5. SELECT * FROM Employees WHERE Salary > 50000;
💡 Розв'язок
- DDL (CREATE INDEX — структура)
- DML (UPDATE — дані)
- DCL (REVOKE — права)
- DDL (ALTER — структура)
- DML (SELECT — дані)
Резюме
- SQL — декларативна мова: Ви описуєте ЧО потрібно, не ЯК
- Історія: SQL-86 → SQL-92 (JOIN) → SQL:1999 (triggers) → SQL:2016 (JSON)
- Діалекти: T-SQL (MS SQL Server), PL/SQL (Oracle), кожен має особливості
- T-SQL розширення: Змінні, IF/WHILE, функції, процедури
- Три категорії:
- DDL: структура (CREATE, ALTER, DROP)
- DML: дані (SELECT, INSERT, UPDATE, DELETE)
- DCL: права (GRANT, DENY, REVOKE)
Попередні теми: