Типи даних можуть відрізнятися між СУБД, але загальна логіка схожа.; UPDATE orders
Використання:== Важливі акценти ==
FROM customers;
Таблиця має:
Але індекси мають і мінуси:
SELECT customers.*
INSERT INTO customers (name, city, email)
Унікальний індекс не надає можливість дублювати значення.;DROP TABLE видаляє структуру таблиці разом із даними.;== NULL ==
- займають місце;
- сповільнюють INSERT, UPDATE, DELETE;
- потребують правильного вибору колонок.;
SQL-запит має змогу бути основою dashboard.; * створювати таблиці;
* додавати колонки;
* змінювати індекси;
* оновлювати схему;
* синхронізувати базу між середовищами;
* зберігати історію змін.; Це саме відсутність значення.'''</blockquote>
== Window functions ==
== CTE ==
'''Віконні функції''' дозволяють робити аналітичні обчислення без згортання рядків.;<pre>
!Літера
ROW_NUMBER() OVER (
|-
|'''Backend-розробникам'''
|Майже кожен backend функціонує з базою даних
|-
|'''Frontend-розробникам'''
|Корисно розуміти, звідки беруться інформаційні дані
|-
|'''Аналітикам'''
|SQL — базовий інструмент роботи з даними
|-
|'''QA'''
|Потрібно перевіряти інформаційні дані в базі
|-
|'''DevOps'''
|Потрібно розуміти backup, restore, performance, migrations
|-
|'''ERP-консультантам'''
|SQL потрібен для звітів, перевірок і аналізу даних
|-
|'''Product managers'''
|SQL сприяє самостійно перевіряти метрики
|}
VALUES
!Чи підходить SQL?;<pre>
CREATE TABLE customers (
Нормалізація
SQL Injection
FROM customers
Приклад ідеї:FROM customers
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FROM customers
SELECT id, name, email
!Компонент
name VARCHAR(255) NOT NULL,
!Пояснення
== HAVING ==
== Висновок ==
EXPLAIN ANALYZE
);
orders.total_amount
SELECT *
!Теза
id AS order_id,
GROUP BY DATE_TRUNC('month', created_at)
!Значення
Якщо вставити інформаційні дані напряму, можна отримати вразливість.; Денормалізація — це свідоме дублювання даних для швидшого читання або простішої аналітики.;== Джерела ==
== Денормалізація ==
FROM customers
Типові аналітичні задачі:
- backend-розробки;
- ERP і CRM;
- аналітики;
- звітності;
- BI;
- data engineering;
- тестування;
- адміністрування баз даних;
- фінансових і облікових систем.;<blockquote>'''Якщо в системі є собою клієнти, товари, замовлення, оплати, документи або звіти — десь поруч майже завжди є собою SQL.'''</blockquote>
WHERE total_sales > 10000;
DROP TABLE customers;
DROP TABLE
Основні типи даних SQL
NoSQL
У PostgreSQL:SELECT *
Приклад накопичувальної суми:);
Змінити назву колонки:'''Нормалізація''' — це підхід до проєктування бази, щоб зменшити дублювання даних і покращити цілісність.;<pre>
SELECT *
FOREIGN KEY (customer_id) REFERENCES customers(id)
FROM products
== DISTINCT ==
'''CTE''' або '''Common Table Expression''' — це тимчасовий іменований результат запиту.; HAVING SUM(total_amount) > 10000;
'''IN''' перевіряє, чи значення входить у список.; city VARCHAR(100)
SET city = 'Одеса'
WHERE id = 1;
!Назва
customer_id,
!Тип
SUM(orders.total_amount) AS total_sales
Тригери можуть бути корисні, але ними не варто зловживати, бо прихована логіка в базі ускладнює підтримку.; $$;
== Рекомендований шлях навчання SQL ==
WHERE email IS NULL;
!id
(2, 1, 800.00),
SELECT
== Індекси ==
UPDATE accounts
CREATE TABLE orders (
Приклад звіту по продажах за місяць:
Недоліки SQL
SELECT *
Subquery або підзапит — це запит всередині іншого запиту.;
ORDER BY created_at
* продажі та реалізація за період;
* середній чек;
* кількість клієнтів;
* повторні покупки;
* топ товарів;
* залишки;
* динаміка доходу;
* cohort analysis;
* funnel analysis;
* звіти для керівництва.; customers.name,
Перевірка NULL:<pre>
SELECT
ORDER BY created_at DESC
JOIN customers ON customers.id = orders.customer_id;
{| class="wikitable"
)
DELETE FROM customers
Приклади ORM:
WHERE city = 'Київ';
- пошуку;
- JOIN;
- фільтрації;
- сортування;
- унікальності.; LIMIT 10;
LIMIT обмежує кількість рядків.; |-
| істотно
|
SQL у різних базах відрізняється
|
PostgreSQL, MySQL, SQL Server і Oracle мають різний синтаксис для частини можливостей.; поверни результат;
Коли SQL — хороший вибір
Сортування від більшого до меншого:{| class="wikitable"
CREATE INDEX idx_customers_email
Кілька умов:як ілюстрація, сума продажів по кожному клієнту:<pre>
як ілюстрація, замовлення належить клієнту:<pre>
!Рекомендація
id INTEGER PRIMARY KEY,
'''JOIN''' застосовується для обʼєднання даних із кількох таблиць.;<pre>
!Перевага
|-
|1
|Анна
|Київ
|anna@example.com
|-
|2
|Олег
|Львів
|oleh@example.com
|-
|3
|Марія
|Київ
|maria@example.com
|}
INSERT INTO customers (name, city, email)
SQL розшифровується як Structured Query Language — структурована мова запитів.; Перед виконанням потрібно мати backup або чітке розуміння наслідків.WHERE name LIKE 'Ан%';
(1, 'Анна', 'Київ'),
ORDER BY created_at
| Пояснення
FROM orders;
ORDER BY
З аналізом виконання:!Мова
== Простими словами ==
CREATE TABLE products (
Безпечний принцип:<pre>
'''LIKE''' застосовується для пошуку за шаблоном.;<pre>
SELECT *
|-
|'''customers'''
|Контрагентів
|-
|'''products'''
|Товари й послуги
|-
|'''warehouses'''
|Склади
|-
|'''stock_movements'''
|Рухи товарів
|-
|'''invoices'''
|Рахунки
|-
|'''payments'''
|Оплати
|-
|'''documents'''
|Документи
|-
|'''users'''
|Користувачів
|-
|'''roles'''
|Ролі доступу
|}
DELETE без WHERE має змогу видалити всі рядки таблиці.; |-
|
Ключове
|
SQL простий на старті
|
Базові SELECT, INSERT, UPDATE, DELETE можна вивчити оперативно.; !Для чого
SUM(total_amount) AS sales
SELECT
LIKE
ALTER TABLE customers
SUM(total_amount) OVER (
AND total_amount > 1000;
|
| Backup
|
Резервна копія даних
|
| Restore
|
Відновлення даних із резервної копії
|
| Point-in-time recovery
|
Відновлення на конкретний момент часу
|
| Dump
|
Експорт структури й даних у файл
|
Кому варто вивчати SQL
|
Помилка
BETWEEN перевіряє діапазон.;SQL-приклад:!customer_name
SELECT *
Додати колонку:<pre>
WHERE orders.id IS NULL;
== UPDATE ==
SELECT *
CREATE TABLE customers (
FROM customers
GROUP BY customers.name
'''ORM''' або '''Object-Relational Mapping''' — це інструмент, який надає можливість працювати з базою через обʼєкти коду.; * прямі SQL-запити;
- ORM;
- query builder;
- stored procedures;
- migrations.; SELECT *
VALUES
== SQL у backend-розробці ==
total_amount DECIMAL(12, 2),
!Як застосовується SQL
Транзакція — це набір операцій, які мають виконатися в цілому або не виконатися взагалі.;== ACID ==
CTE робить складні запити читабельнішими.; Це різні інструменти для різних задач.
SELECT
|
Що робить
FROM customer_sales
ORDER BY name;
Приклад нумерації замовлень клієнта:ACID — це набір властивостей транзакцій.; !Пояснення
== WHERE ==
SQL дуже важливий для аналітики.;<pre>
== Типові помилки новачків ==
!Функція
|-
|'''Стандартність'''
|SQL підтримується багатьма СУБД
|-
|'''Зрозумілість'''
|Базові запити читаються досить без ускладнень
|-
|'''Потужність'''
|JOIN, GROUP BY, CTE, віконні функції дають сильні функціональні можливості
|-
|'''Надійність'''
|Реляційні бази добре підходять для критичних даних
|-
|'''Транзакції'''
|ACID гарантує цілісність даних
|-
|'''аналітичні інструменти'''
|SQL дуже сильний для звітів і вибірок
|-
|'''Поширеність'''
|SQL потрібен у backend, BI, ERP, CRM, data engineering
|}
У різних СУБД синтаксис має змогу відрізнятися.; Створення індексу:== Оптимізація SQL ==
CREATE VIEW active_customers AS
== Коротко ==
Реляційна база даних зберігає інформаційні дані у вигляді таблиць.; WHERE total_amount > 10000
SELECT
|-
|1
|Таблиці, рядки, колонки
|-
|2
|SELECT, WHERE, ORDER BY, LIMIT
|-
|3
|INSERT, UPDATE, DELETE
|-
|4
|Типи даних
|-
|5
|Primary Key і Foreign Key
|-
|6
|JOIN
|-
|7
|GROUP BY, HAVING, агрегатні функції
|-
|8
|Subquery і CTE
|-
|9
|Індекси
|-
|10
|Транзакції
|-
|11
|Window functions
|-
|12
|EXPLAIN і оптимізація
|-
|13
|Міграції, backup, restore
|}
customer_id INTEGER NOT NULL,
'''Міграції''' — це контрольовані зміни структури бази даних.; Хто розуміє SQL, той краще розуміє, як живе відомості всередині бізнес-систем.'''</blockquote>
Цей запит знайде імена, які починаються на “Ан”.; FROM products
SELECT застосовується для отримання даних.; CREATE TABLE створює таблицю.; |-
|
1
|
Анна
|
anna@example.com
|
Ноутбук
|
| 2
|
Анна
|
anna@example.com
|
Миша
|
- customers;
- products;
- orders;
- order_items.; У backend SQL зазвичай застосовується через:
JOININSERT додає інформаційні дані.; {| class="wikitable"
customer_id,
Приклад SQL у коді:WHERE id = 1;
GROUP BY customer_id;
UPDATE без WHERE має змогу змінити всі рядки таблиці.; ORDER BY price DESC;
SELECT *
ADD COLUMN phone VARCHAR(50);
!Що зберігає
INNER JOIN orders ON orders.customer_id = customers.id;
name VARCHAR(255) NOT NULL
SUM(total_amount) AS total_sales,
|-
|'''INTEGER'''
|Цілі числа
|<code>10</code>
|-
|'''BIGINT'''
|Великі цілі числа
|<code>123456789</code>
|-
|'''DECIMAL / NUMERIC'''
|Точні числа, фінансовий блок
|<code>1234.56</code>
|-
|'''FLOAT / DOUBLE'''
|Дробові числа з плаваючою точкою
|<code>3.14</code>
|-
|'''VARCHAR'''
|Рядок змінної довжини
|<code>'Hello'</code>
|-
|'''TEXT'''
|Довгий текст
|характеристика, коментар
|-
|'''DATE'''
|Дата
|<code>2026-05-06</code>
|-
|'''TIMESTAMP'''
|Дата й час
|<code>2026-05-06 12:30:00</code>
|-
|'''BOOLEAN'''
|Так/ні
|<code>true</code>, <code>false</code>
|-
|'''JSON / JSONB'''
|JSON-дані
|<code>{"name": "Anna"}</code>
|}
customer_id,
== BETWEEN ==
Якщо сталася помилка: SELECT
як ілюстрація, так можна знайти клієнтів без замовлень: !product_name
{| class="wikitable"
- однозначно знайти рядок;
- звʼязувати таблиці;
- уникати дублювання;
- будувати зовнішні ключі.;<pre>
BI-системи часто використовують SQL для підготовки даних.;<pre>
DATE_TRUNC('month', created_at) AS month,
Ідея реляційної моделі даних була запропонована Едгаром Коддом у 1970 році.; |-
| style="background:#d4edda; color:#155724; font-weight:bold;" |Ключове
|'''SQL дуже глибокий'''
|JOIN, індекси, транзакції, віконні функції, оптимізація запитів і плани виконання потребують досвіду.;<pre>
SELECT *
!Терміни
== INSERT ==
BEGIN;
SELECT *
COMMIT;
SELECT id, name, email
В ERP-системах SQL застосовується для:
SELECT *
CREATE PROCEDURE close_order(order_id INTEGER)
CREATE TABLE customers (
Міграції потрібні, щоб:
| Задача
SELECT
name VARCHAR(255) NOT NULL,
SQL описує результат, а база даних сама вирішує, як найкраще його отримати.
SELECT *
total_amount,
LEFT JOIN корисний, коли потрібно показати всі записи з основної таблиці, навіть якщо повʼязаних записів немає.; як ілюстрація, у Microsoft SQL Server часто застосовується TOP або OFFSET FETCH.; |-
|
INNER JOIN
|
Повертає тільки рядки, які мають відповідність в обох таблицях
|
| LEFT JOIN
|
Повертає всі рядки з лівої таблиці й відповідні з правої, якщо вони є собою
|
| RIGHT JOIN
|
Повертає всі рядки з правої таблиці й відповідні з лівої
|
| FULL JOIN
|
Повертає всі рядки з обох таблиць, навіть якщо відповідності немає
|
| CROSS JOIN
|
Створює всі можливі комбінації рядків
|
JOIN orders ON orders.customer_id = customers.id
ORM спрощує розробку, але знання SQL все одно потрібне.; COUNT(*) AS orders_count,
customers.name,
!email
{| class="wikitable"
SELECT
SUM(total_amount) AS total_sales
== Foreign Key ==
'''ORDER BY''' сортує результат.;
SELECT
DELETE видаляє інформаційні дані.; |-
|
| Ключове
|
SQL є собою стандартом для реляційних баз
|
Різні СУБД мають власні діалекти, але базові принципи SQL спільні.;у SQL пишуть:customer_id,
перебери всі рядки;
!Принцип
Ніколи не треба склеювати SQL-запит із сирими даними користувача.
Stored procedure — це збережена процедура в базі даних.; {| class="wikitable"
|
| Назва
|
SQL
|
| Повна назва
|
Structured Query Language
|
| Тип
|
Декларативна мова запитів до баз даних
|
| Основна сфера
|
Реляційні бази даних, аналітичні інструменти, backend, ERP, CRM, BI, формування звітів
|
| Перші розробки
|
1970-ті роки
|
| Перший стандарт ANSI
|
1986 рік
|
| Сучасний міжнародний стандарт
|
ISO/IEC 9075:2023
|
| Популярні СУБД
|
PostgreSQL, MySQL, MariaDB, Microsoft SQL Server, Oracle Database, SQLite
|
| Складність для новачків
|
Низька для базових запитів, середня для складної аналітики й оптимізації
|
| Основне призначення
|
Отримувати, змінювати, структурувати й аналізувати інформаційні дані
|
View
SQL у порівнянні з іншими технологіями
SUM(total_amount) AS total_sales
Primary Key або первинний ключ — це унікальний ідентифікатор рядка в таблиці.;== CREATE TABLE ==
як ілюстрація, є собою таблиці:
UPDATE змінює інформаційні дані.; |}
SELECT *
!name
!Що вивчати
VALUES
orders.id,
) AS running_total
знайди клієнтів із Києва;
|-
|'''Backend'''
|Отримання й збереження даних застосунку
|Користувачі, замовлення, товари, документи
|-
|'''ERP'''
|обліковий облік, складський облік, фінансовий блок, документи, звіти
|Накладні, рахунки, залишки, проводки
|-
|'''CRM'''
|Клієнти, угоди, контакти, історичний розвиток взаємодії
|Картка клієнта, pipeline, задачі
|-
|'''аналітичні інструменти'''
|Вибірки, групування, підрахунки, звіти
|продажі та реалізація за місяць, топ товарів, LTV
|-
|'''BI'''
|інформаційні дані для dashboards і звітності
|Power BI, Metabase, Superset, Tableau
|-
|'''Data Engineering'''
|Перетворення й підготовка даних
|ETL, ELT, data warehouse
|-
|'''Тестування'''
|Перевірка даних у базі
|QA-запити, тестові вибірки
|-
|'''Адміністрування'''
|Керування структурами, правами, індексами
|CREATE TABLE, GRANT, INDEX
|}
LEFT JOIN orders ON orders.customer_id = customers.id;
CREATE UNIQUE INDEX idx_customers_email_unique
name VARCHAR(255) NOT NULL,
== Унікальний індекс ==
* рядки;
* колонки;
* типи даних;
* первинні ключі;
* зовнішні ключі;
* обмеження;
* індекси.;
Індекси корисні для:
INSERT INTO orders (id, customer_id, total_amount)
SQL простий для першого запиту, але дуже глибокий для професійної роботи.; це мова структурованих запитів, яка застосовується; додатково реалізовано додавання даних, пошуку, фільтрації, сортування, актуалізація, видалення, обʼєднання таблиць, створення звітів, аналітики й керування доступом виступає ключовою рисою роботи з реляційними базами даних: створення таблиць забезпечується через SQL.; |-
| Увага
|
Поганий SQL має змогу сильно сповільнити систему
|
Без індексів, правильних JOIN і оптимізації база має змогу працювати дуже повільно.; (2, 'Олег', 'Львів'),
FROM users
як ілюстрація:
|
| Різні діалекти
|
PostgreSQL, MySQL, SQL Server і Oracle мають відмінності
|
| Складна оптимізація
|
Швидкі запити потребують знання індексів і планів виконання
|
| Не завжди комфортно для дуже гнучких даних
|
Для сильно змінної структури інколи краще NoSQL
|
| JOIN можуть бути складними
|
Великі схеми потребують уважного проєктування
|
| Можливі небезпечні помилки
|
UPDATE або DELETE без WHERE можуть пошкодити інформаційні дані
|
| Потрібна дисципліна схеми
|
Погана модель даних створює проблеми на роки
|
Популярні реляційні СУБД
Приклад таблиці клієнтів:
ORDER BY month;
| SELECT * всюди
|
Зайві інформаційні дані, гірша продуктивність, залежність від структури таблиці
|
| UPDATE без WHERE
|
має змогу змінити всі записи
|
| DELETE без WHERE
|
має змогу видалити всі записи
|
| Ігнорування індексів
|
Запити стають повільними
|
| Неправильні JOIN
|
інформаційні дані дублюються або губляться
|
| Плутанина з NULL
|
NULL не дорівнює нулю або порожньому рядку
|
| Склеювання SQL із введенням користувача
|
Ризик SQL Injection
|
customers.name,