Перейти до вмісту

SQL

Матеріал з K2 ERP Wiki

DELETE

!Перевага SQL — одна з найважливіших мов в IT. total_amount DECIMAL(12, 2),

SQL-приклад:

ORDER BY month; WHERE id = 1; == DISTINCT ==

customers.name,

поверни результат; !Що зберігає

== Важливі акценти ==

Додавання кількох рядків:

  • документів;
  • проводок;
  • складу;
  • залишків;
  • партій товарів;
  • контрагентів;
  • договорів;
  • оплат;
  • актів;
  • звітів;
  • прав доступу;
  • аналітики. '''SQL''' — це мова структурованих запитів, яка застосовують, коли потрібно для роботи з реляційними базами даних: створення таблиць, додавання даних, пошуку, фільтрації, сортування, оновлення версій, видалення, обʼєднання таблиць, створення звітів, аналітики й керування доступом. !Теза

Типові аналітичні задачі: перебери всі рядки;

) AS order_number

{| class="wikitable" SELECT *

SELECT customers.*

name VARCHAR(255) NOT NULL,

SELECT *

  • customers;
  • orders. COMMIT;

== ACID == WITH customer_sales AS ( FROM customers |- |'''customers''' |Контрагентів |- |'''products''' |Товари й послуги |- |'''warehouses''' |Склади |- |'''stock_movements''' |Рухи товарів |- |'''invoices''' |Рахунки |- |'''payments''' |Оплати |- |'''documents''' |Документи |- |'''users''' |Користувачів |- |'''roles''' |Ролі доступу |}

== Недоліки SQL == == Унікальний індекс ==

У різних СУБД синтаксис здатна відрізнятися.

Якщо в системі виступає як клієнти, товари, замовлення, оплати, документи або звіти — десь поруч майже завжди виступає як SQL.

WHERE id = 1;

FROM orders

JOIN orders ON orders.customer_id = customers.id ORDER BY created_at DESC

Subquery

як приклад, так можна знайти клієнтів без замовлень:

CREATE VIEW active_customers AS

ROLLBACK;

SELECT застосовується для для отримання даних.

SELECT DISTINCT city

  • звітів;
  • data warehouse;
  • BI;
  • кешованих таблиць;
  • високонавантажених систем.== SQL у BI ==
SELECT $$; name VARCHAR(255) NOT NULL FROM orders
1 Анна anna@example.com Ноутбук
2 Анна anna@example.com Миша

!Для чого

  • customers;
  • products;
  • orders;
  • order_items. id AS order_id,

Безпечний принцип:

!Пояснення
FROM products
 orders.id,
{| class="wikitable"
{| class="wikitable"
FROM products
!Приклади
== LIMIT ==
SELECT *

Первинний ключ потрібен, щоб:

ACID — це набір властивостей транзакцій. |- |A |Atomicity |Транзакція виконується на 100% або не виконується взагалі |- |C |Consistency |База переходить з одного правильного стану в інший |- |I |Isolation |Паралельні транзакції не мають ламати одна одну |- |D |Durability |Після COMMIT інформаційні дані мають зберегтися навіть після збою |}

FROM customers;

Приклад звіту по продажах за місяць:

{| class="wikitable"
 UPDATE orders
SELECT *
Небезпечний приклад:<pre>
'''NULL''' означає відсутність значення.

NULL — це не нуль і не порожній рядок.

DELETE без WHERE здатна видалити всі рядки таблиці.

SQL — це фундаментальна мова роботи з даними. Приклад:

Коротко

); SELECT * Вона потрібна для:

Мінімальний набір для практики SQL

Приклад поганої структури: !Літера

FROM orders SELECT orders.total_amount

SQL не описує покроково, як саме базі даних знайти інформаційні дані.

ORM здатна сховати SQL, але не здатна скасувати потребу розуміти базу даних.

як приклад: |- |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 |}

WHERE email IS NULL;

(2, 1, 800.00),

Змінити назву колонки:

З аналізом виконання:

|- |'''СУБД для старту''' |PostgreSQL або SQLite |- |'''GUI-клієнт''' |DBeaver, DataGrip, pgAdmin |- |'''Практичні таблиці''' |customers, products, orders, order_items |- |'''Обовʼязкові теми''' |SELECT, JOIN, GROUP BY, індекси, транзакції |- |'''Для backend''' |SQL + ORM + migrations |- |'''Для аналітики''' |SQL + BI + window functions |}

FROM customers

Сортування від більшого до меншого:

'''Trigger''' або тригер — це дія, яка автоматизовано виконується при певній події в таблиці. {| class="wikitable"

SELECT * WHERE city IN ('Київ', 'Львів', 'Одеса');

Subquery або підзапит — це запит всередині іншого запиту. У backend SQL зазвичай застосовується для через: SQL найчастіше застосовується для в реляційних базах даних. ); WHERE id = 2; !Приклади

WHERE total_amount > 10000
id INTEGER PRIMARY KEY,

Ніколи не треба склеювати SQL-запит із сирими даними користувача.

INSERT

);

email VARCHAR(255) UNIQUE,

SELECT !Чому );

WHERE email = 'anna@example.com';

DROP TABLE видаляє структуру таблиці разом із даними.

SQL — це мова, якою програма, аналітик або адміністратор “розмовляє” з базою даних.

Цей запит знайде імена, які починаються на “Ан”.
SET status = 'closed'

'''ORDER BY''' сортує результат. Перед виконанням потрібно мати backup або чітке розуміння наслідків.'''</blockquote> )

WHERE id = order_id;

SELECT * == Денормалізація == ALTER TABLE customers WHERE total_sales > 10000; ORDER BY name; Приклад ідеї:<pre>

GROUP BY customer_id == Транзакції == SQL-команди часто ділять на кілька груп. Він описує, '''що саме''' потрібно отримати.== UPDATE == '''Primary Key''' або '''первинний ключ''' — це унікальний ідентифікатор рядка в таблиці.<pre> == Міграції бази даних == '''ORM''' або '''Object-Relational Mapping''' — це інструмент, який дає можливість працювати з базою через обʼєкти коду. customer_id INTEGER NOT NULL, як приклад, виступає як таблиці: UPDATE customers BEGIN; !Принцип

SUM(total_amount) AS total_sales
SELECT customer_id

FROM users SELECT *

у SQL пишуть:

!Пояснення == Агрегатні функції ==

COUNT(*) AS orders_count,

!Напрям !Компонент

SQL — це мова питань до бази даних.
price DECIMAL(12, 2) NOT NULL
('Олег', 'Львів', 'oleh@example.com'),
У реальному коді критично використовувати параметризовані запити, щоб уникати SQL Injection. FROM customers
  • займають місце;
  • сповільнюють INSERT, UPDATE, DELETE;
  • потребують правильного вибору колонок.
<blockquote>'''SQL і NoSQL — це не “краще” і “гірше”. Перед виконанням небезпечних запитів потрібно перевіряти умову.'''</blockquote> |- |ERP | style="background:#d4edda; color:#155724; font-weight:bold;" |Дуже добре |- |CRM | style="background:#d4edda; color:#155724; font-weight:bold;" |Дуже добре |- |Фінансовий обліковий облік | style="background:#d4edda; color:#155724; font-weight:bold;" |Дуже добре |- |Інтернет-магазин | style="background:#d4edda; color:#155724; font-weight:bold;" |Добре |- |Backend API | style="background:#d4edda; color:#155724; font-weight:bold;" |Добре |- |BI-звіти | style="background:#d4edda; color:#155724; font-weight:bold;" |Дуже добре |- |Транзакційні системи | style="background:#d4edda; color:#155724; font-weight:bold;" |Дуже добре |- |Гнучкі документи без сталої структури | style="background:#fff3cd; color:#856404; font-weight:bold;" |Можливо, але варто розглянути NoSQL |- |Графові задачі | style="background:#fff3cd; color:#856404; font-weight:bold;" |Можливо, але інколи краще graph database |- |Великі неструктуровані файли | style="background:#f8d7da; color:#721c24; font-weight:bold;" |Не базовий вибір |} {| class="wikitable" SUM(total_amount) AS total_sales id INTEGER PRIMARY KEY, !Рекомендація |- |'''NoSQL''' |Гнучкіші моделі даних, але не завжди така ж сила транзакцій і JOIN |- |'''MongoDB''' |Добре для документів; SQL краще для класичних звʼязаних бізнес-даних |- |'''Redis''' |Дуже швидкий key-value/cache; SQL краще для постійних структурованих даних |- |'''Elasticsearch''' |Сильний для пошуку; SQL сильний для обліку й транзакцій |- |'''Graph databases''' |Сильні для графових звʼязків; SQL сильний для таблиць і звітів |} Типи даних можуть відрізнятися між СУБД, але загальна логіка схожа. GROUP BY customer_id; WHERE email IS NOT NULL; == Кому варто вивчати SQL == FOREIGN KEY (customer_id) REFERENCES customers(id) == ORM і SQL == == SQL у ERP == План виконання оптимізує зрозуміти:

Рекомендований шлях навчання SQL

(3, 2, 3000.00);
PARTITION BY customer_id

VALUES ('Анна', 'Київ', 'anna@example.com');

(1, 'Анна', 'Київ'), LIMIT обмежує кількість рядків. структурована мова запитів виступає ключовою рисою SQL розшифровується як Structured Query Language. |-
Увага Поганий SQL здатна сильно сповільнити систему Без індексів, правильних JOIN і оптимізації база здатна працювати дуже повільно.== Історія K2 ERP == LEFT JOIN корисний, коли потрібно показати всі записи з основної таблиці, навіть якщо повʼязаних записів немає.
{| class="wikitable"
{| class="wikitable"
SET balance = balance + 100
!Таблиця
!Задача
'''Віконні функції''' дозволяють робити аналітичні обчислення без згортання рядків. SUM(total_amount) AS total_sales,
HAVING SUM(total_amount) > 10000;
Основні принципи оптимізації:
FROM users

!Назва
INSERT INTO customers (name, city, email)
В ERP-системах SQL застосовується для для:
WHERE status = 'paid'

!Приклад
!Пояснення
== Нормалізація ==
 AVG(total_amount) AS average_order
WHERE is_active = true;
!name
|-
|'''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'''
|Довгий текст
|SEO-опис, коментар
|-
|'''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>
|}

SELECT *
== Оптимізація SQL ==

LIKE

FROM customers відкрий таблицю;

Де застосовується для
  • однозначно знайти рядок;
  • звʼязувати таблиці;
  • уникати дублювання;
  • будувати зовнішні ключі. !Група

CTE

SELECT GROUP BY customers.name

DELETE видаляє інформаційні дані. |-

критично SQL у різних базах відрізняється PostgreSQL, MySQL, SQL Server і Oracle мають різний синтаксис для частини можливостей.

SQL-запит здатна бути основою dashboard. !id
Приклад таблиці клієнтів:
 SUM(total_amount) AS total_sales
|-
|'''[[PostgreSQL]]'''
|Open Source
|Backend, ERP, CRM, аналітичні інструменти, складні бізнес-системи
|-
|'''[[MySQL]]'''
|Open Source / commercial ecosystem
|Web, CMS, інтернет-магазини, hosting
|-
|'''[[MariaDB]]'''
|Open Source
|Web, hosting, заміна MySQL
|-
|'''[[Microsoft SQL Server]]'''
|Commercial / enterprise
|Корпоративні системи, Windows-інфраструктура, .NET
|-
|'''[[Oracle Database]]'''
|Commercial / enterprise
|Банки, великі корпорації, критичні системи
|-
|'''[[SQLite]]'''
|Embedded / file database
|Мобільні застосунки, desktop, локальні бази, тести
|-
|'''[[IBM Db2]]'''
|Enterprise
|Великі корпоративні й legacy-системи
|}

!Тип
== SELECT ==
SELECT
SELECT *
 customer_id,
|-
|Реляційна модель даних
|Документна, key-value, graph, column-family та інші моделі
|-
|Таблиці, рядки, колонки
|Документи, ключі, графи, колонки
|-
|Сильна структура
|Гнучкіша структура
|-
|JOIN і транзакції
|Залежить від конкретної NoSQL-бази
|-
|Добре для обліку, ERP, CRM, фінансів
|Добре для гнучких, великих або спеціалізованих даних
|}
 ('Марія', 'Київ', 'maria@example.com');

<blockquote>'''База без backup — це не база, а ризикована тимчасова таблиця.'''</blockquote>
FROM customers
== Головна ідея SQL ==
 city VARCHAR(100)
 DATE_TRUNC('month', created_at) AS month,
UPDATE змінює інформаційні дані. реліз системи SQL:2023 була опублікована у 2023 році. як приклад, сума продажів по кожному клієнту:

ORDER BY price ASC;

Window functions

WHERE email = 'anna@example.com';

SQL дуже важливий для аналітики.
 orders.total_amount
 ROW_NUMBER() OVER (
SELECT
== INNER JOIN ==

!Пояснення
 id INTEGER PRIMARY KEY,
== Для чого застосовується для SQL ==
CTE робить складні запити читабельнішими. CTE або Common Table Expression — це тимчасовий іменований результат запиту.
total_amount DECIMAL(12, 2) NOT NULL,

FROM customers !Назва '''CREATE TABLE''' створює таблицю. |- | style="background:#d4edda; color:#155724; font-weight:bold;" |Ключове |'''SQL простий на старті''' |Базові SELECT, INSERT, UPDATE, DELETE можна вивчити оперативно. |}

!SQL FROM customers

INNER JOIN orders ON orders.customer_id = customers.id;

WHERE id IN ( !Параметр WHERE email = ?;

customer_id,
Backend Отримання й збереження даних застосунку Користувачі, замовлення, товари, документи
ERP обліковий облік, складський облік, фінансовий блок, документи, звіти Накладні, рахунки, залишки, проводки
CRM Клієнти, угоди, контакти, історія продукту взаємодії Картка клієнта, pipeline, задачі
аналітичні інструменти Вибірки, групування, підрахунки, звіти продажі та реалізація за місяць, топ товарів, LTV
BI інформаційні дані для dashboards і звітності Power BI, Metabase, Superset, Tableau
Data Engineering Перетворення й підготовка даних ETL, ELT, data warehouse
Тестування Перевірка даних у базі QA-запити, тестові вибірки
Адміністрування Керування структурами, правами, індексами CREATE TABLE, GRANT, INDEX
orders.total_amount
id INTEGER PRIMARY KEY, total_amount,
  • рядки;
  • колонки;
  • типи даних;
  • первинні ключі;
  • зовнішні ключі;
  • обмеження;
  • індекси. |-
Ключове SQL дуже глибокий JOIN, індекси, транзакції, віконні функції, оптимізація запитів і плани виконання потребують досвіду. Після цього зʼявилися мови для роботи з реляційними базами даних, серед яких найважливішою стала SQL.== Stored procedures == BETWEEN перевіряє діапазон. Це одна з найнебезпечніших помилок у SQL.

HAVING фільтрує результат після групування. LEFT JOIN orders ON orders.customer_id = customers.id

Технологія Приклад SQL у коді:

{| class="wikitable"
WHERE orders.id IS NULL;
CREATE TABLE customers (
!Пояснення
|-
|'''PHP'''
|Eloquent, Doctrine
|-
|'''Python'''
|SQLAlchemy, Django ORM
|-
|'''JavaScript / TypeScript'''
|Prisma, TypeORM, Sequelize, Drizzle
|-
|'''Java'''
|Hibernate
|-
|'''C#'''
|Entity Framework
|}
DROP TABLE customers;

== View ==
{| class="wikitable"

Типові таблиці ERP:

* продажі та реалізація за період;
* середній чек;
* кількість клієнтів;
* повторні покупки;
* топ товарів;
* залишки;
* динаміка доходу;
* cohort analysis;
* funnel analysis;
* звіти для керівництва. Це саме відсутність значення.'''</blockquote>
== Тригери ==
== Джерела ==
Приклади ORM:

* чи застосовується для індекс;
* які таблиці читаються;
* де повільне місце;
* як оптимізувати запит. Саме тому його варто вивчати не тільки програмістам, а й аналітикам, тестувальникам, ERP-консультантам, DevOps-інженерам і менеджерам продуктів. VALUES
Якщо вставити інформаційні дані напряму, можна отримати вразливість. JOIN customers ON customers.id = orders.customer_id;
name VARCHAR(255) NOT NULL,

Основні типи даних SQL

DISTINCT прибирає дублікати. ADD COLUMN phone VARCHAR(50);

Типова міграція:
!Етап
|-
|'''Backend-розробникам'''
|Майже кожен backend функціонує з базою даних
|-
|'''Frontend-розробникам'''
|Корисно розуміти, звідки беруться інформаційні дані
|-
|'''Аналітикам'''
|SQL — базовий інструмент роботи з даними
|-
|'''QA'''
|Потрібно перевіряти інформаційні дані в базі
|-
|'''DevOps'''
|Потрібно розуміти backup, restore, performance, migrations
|-
|'''ERP-консультантам'''
|SQL потрібен для звітів, перевірок і аналізу даних
|-
|'''Product managers'''
|SQL оптимізує самостійно перевіряти метрики
|}

!order_id
FROM orders
ORM спрощує розробку, але знання SQL все одно потрібне.== Простими словами ==

== JOIN ==
== SQL і NoSQL ==
SQL був стандартизований ANSI у 1986 році, а потім прийнятий ISO.== Backup і Restore ==
== SQL Injection ==
|-
|'''Назва'''
|SQL
|-
|'''Повна назва'''
|Structured Query Language
|-
|'''Тип'''
|Декларативна мова запитів до баз даних
|-
|'''Основна сфера'''
|Реляційні бази даних, аналітичні інструменти, backend, ERP, CRM, BI, формування звітів
|-
|'''Перші розробки'''
|1970-ті роки
|-
|'''Перший стандарт ANSI'''
|1986 рік
|-
|'''Сучасний міжнародний стандарт'''
|ISO/IEC 9075:2023
|-
|'''Популярні СУБД'''
|PostgreSQL, MySQL, MariaDB, Microsoft SQL Server, Oracle Database, SQLite
|-
|'''Складність для новачків'''
|Низька для базових запитів, середня для складної аналітики й оптимізації
|-
|'''Основне призначення'''
|Отримувати, змінювати, структурувати й аналізувати інформаційні дані
|}

'''Нормалізація''' — це підхід до проєктування бази, щоб зменшити дублювання даних і покращити цілісність.<pre>

== Primary Key ==
CREATE PROCEDURE close_order(order_id INTEGER)
FROM customers
Створення індексу:<pre>
 SUM(total_amount) OVER (
|-
|'''Backup'''
|Резервна копія даних
|-
|'''Restore'''
|Відновлення даних із резервної копії
|-
|'''Point-in-time recovery'''
|Відновлення на конкретний момент часу
|-
|'''Dump'''
|Експорт структури й даних у файл
|}
<pre>

== GROUP BY ==
SELECT
!Статус
== SQL у backend-розробці ==
|-
|'''Стандартність'''
|SQL підтримується багатьма СУБД
|-
|'''Зрозумілість'''
|Базові запити читаються досить без зусиль
|-
|'''Потужність'''
|JOIN, GROUP BY, CTE, віконні функції дають сильні функції ERP
|-
|'''Надійність'''
|Реляційні бази добре підходять для критичних даних
|-
|'''Транзакції'''
|ACID забезпечує цілісність даних
|-
|'''аналітичні інструменти'''
|SQL дуже сильний для звітів і вибірок
|-
|'''Поширеність'''
|SQL потрібен у backend, BI, ERP, CRM, data engineering
|}

Але індекси мають і мінуси: FROM orders;

Різні діалекти PostgreSQL, MySQL, SQL Server і Oracle мають відмінності
Складна оптимізація Швидкі запити потребують знання індексів і планів виконання
Не завжди інтуїтивно для дуже гнучких даних Для сильно змінної структури інколи краще NoSQL
JOIN можуть бути складними Великі схеми потребують уважного проєктування
Можливі небезпечні помилки UPDATE або DELETE без WHERE можуть пошкодити інформаційні дані
Потрібна дисципліна схеми Погана модель даних створює проблеми на роки

Синтаксис сильно залежить від конкретної СУБД.

Звіт:

SELECT * Денормалізація здатна бути корисною для:

(3, 'Марія', 'Київ');

== Індекси == ALTER TABLE customers CREATE INDEX idx_customers_email

EXPLAIN !Вид JOIN

Додати колонку:<pre> У PostgreSQL:<pre> !Помилка '''WHERE''' фільтрує рядки. SELECT '''DROP TABLE''' видаляє таблицю. CREATE TABLE orders (

== Приклад навчальної бази == !email

);

  • створювати таблиці;
  • додавати колонки;
  • змінювати індекси;
  • оновлювати схему;
  • синхронізувати базу між середовищами;
  • зберігати історію змін.

інформаційні дані:


== ALTER TABLE ==

ORDER BY created_at

Foreign Key

Якщо сталася помилка:

== SQL у Data Analytics == VALUES

як приклад, замовлення належить клієнту:<pre>

Як застосовується для SQL

SELECT id, name, email

INNER JOIN Повертає тільки рядки, які мають відповідність в обох таблицях LEFT JOIN Повертає всі рядки з лівої таблиці й відповідні з правої, якщо вони виступає як RIGHT JOIN Повертає всі рядки з правої таблиці й відповідні з лівої FULL JOIN Повертає всі рядки з обох таблиць, навіть якщо відповідності немає CROSS JOIN Створює всі можливі комбінації рядків Пояснення

Тригери можуть бути корисні, але ними не варто зловживати, бо прихована логіка в базі ускладнює підтримку. * Power BI;

  • Tableau;
  • Metabase;
  • Apache Superset;
  • Looker;
  • Redash. INSERT INTO orders (id, customer_id, total_amount)

Query plan або план виконання — це пояснення, як база даних буде виконувати запит. ON customers(email);

Терміни

SELECT *

FOREIGN KEY (customer_id) REFERENCES customers(id)

Щоб отримати замовлення разом із іменем клієнта:


== Query plan ==
!customer_name
FROM active_customers;
WHERE name LIKE 'Ан%';
як приклад, замість того щоб вручну пояснювати:<pre>
 customer_id,
відсортуй їх за іменем;
 customers.name,
{| class="wikitable"

ON customers(email);
FROM customers;

INSERT INTO customers (name, city, email)

* перед INSERT;
* після UPDATE;
* перед DELETE;
* після зміни статусу.== Типові помилки новачків ==
Міграції потрібні, щоб:

Вибір конкретних колонок:

SELECT *

WHERE city = 'Київ'

GROUP BY customer_id

== HAVING == FROM customers == NULL ==

id INTEGER PRIMARY KEY,

EXPLAIN ANALYZE

CREATE TABLE orders ( '''Індекс''' — це спеціальна структура, яка прискорює пошук у таблиці.<pre> |- |'''DDL''' |Data Definition Language |SEO-опис структури бази |CREATE, ALTER, DROP |- |'''DML''' |Data Manipulation Language |Робота з даними |SELECT, INSERT, UPDATE, DELETE |- |'''DCL''' |Data Control Language |Права доступу |GRANT, REVOKE |- |'''TCL''' |Transaction Control Language |Транзакції |COMMIT, ROLLBACK, SAVEPOINT |}

FROM orders

ORDER BY created_at

ORDER BY price DESC; '''INSERT''' додає інформаційні дані.<pre> CREATE TABLE products ( !Що вивчати !Для чого

CREATE TABLE customers ( FROM customers

UPDATE без WHERE здатна змінити всі рядки таблиці.

'''JOIN''' застосовується для для обʼєднання даних із кількох таблиць. !product_name '''View''' або представлення — це збережений запит, який можна використовувати як таблицю.== CREATE TABLE ==

FROM orders

Тип

SELECT *

Популярні BI-інструменти:


== Висновок ==

Кілька умов:

== Основні типи SQL-команд == == SQL і реляційні бази даних == Реляційна база даних зберігає інформаційні дані у вигляді таблиць. !Чи підходить SQL?<pre> SELECT GROUP BY DATE_TRUNC('month', created_at)

CREATE TABLE customers ( ORDER BY total_sales DESC;

!Що робить CREATE UNIQUE INDEX idx_customers_email_unique SQL часто порівнюють із NoSQL. !ORM / інструмент '''Міграції''' — це контрольовані зміни структури бази даних.<pre> ) AS running_total

Індекси корисні для: Перевірка NULL:

'''IN''' перевіряє, чи значення входить у список. |-
| style="background:#d4edda; color:#155724; font-weight:bold;" |Ключове
|'''SQL виступає як стандартом для реляційних баз'''
|Різні СУБД мають власні діалекти, але базові принципи SQL спільні. AND total_amount > 1000;

{| class="wikitable"
додати гроші на рахунок B;

* прямі SQL-запити;
* ORM;
* query builder;
* stored procedures;
* migrations.<pre>
== ORDER BY ==
!Значення

!Що робить
== WHERE ==

 SUM(orders.total_amount) AS total_sales
== Популярні реляційні СУБД ==
!customer_email
VALUES
 customer_id,
SELECT
WHERE id = 1;
 created_at,

SQL описує результат, а база даних сама вирішує, як найкраще його отримати.

GROUP BY групує рядки. Це різні інструменти для різних задач.

(1, 1, 1200.00),
  • пошуку;
  • JOIN;
  • фільтрації;
  • сортування;
  • унікальності. BI-системи часто використовують SQL для підготовки даних. Хто розуміє SQL, той краще розуміє, як живе інформаційні матеріали всередині бізнес-систем.

знайди клієнтів із Києва; SELECT * FROM customers

Функція

SUM(total_amount) AS sales

Використовувати параметризовані запити, prepared statements або ORM.

SELECT
SET balance = balance - 100
INSERT INTO customers (id, name, city)
SELECT id, name, email
== BETWEEN ==
UPDATE accounts
WHERE city = 'Київ';

Основні види JOIN

Для баз даних критично важливі резервні копії. Транзакція — це набір операцій, які мають виконатися на 100% або не виконатися взагалі.


 city VARCHAR(100),
'''ALTER TABLE''' змінює структуру таблиці. Сучасний міжнародний стандарт має назву '''ISO/IEC 9075'''. {| class="wikitable"

Використання:

!Кому Ідея реляційної моделі даних була запропонована Едгаром Коддом у 1970 році. customers.name,

<pre>

id INTEGER PRIMARY KEY,

Унікальний індекс не дає можливість дублювати значення. як приклад, у Microsoft SQL Server часто застосовується для TOP або OFFSET FETCH. LIMIT 10;

LEFT JOIN

name VARCHAR(255) NOT NULL,

Ключове SQL потрібен майже всім розробникам Backend, аналітичні інструменти, ERP, CRM, BI, DevOps і тестування часто працюють із базами даних. SELECT * Foreign Key або зовнішній ключ — це звʼязок між таблицями.

|-
|'''COUNT'''
|Рахує кількість рядків
|-
|'''SUM'''
|Обчислює суму
|-
|'''AVG'''
|Обчислює середнє значення
|-
|'''MIN'''
|Знаходить мінімум
|-
|'''MAX'''
|Знаходить максимум
|}
LEFT JOIN orders ON orders.customer_id = customers.id;
{| class="wikitable"

Перевірка не NULL:

LANGUAGE SQL RENAME COLUMN phone TO phone_number; !СУБД == Коли SQL — хороший вибір ==

Класичний приклад — переказ грошей:<pre> SQL простий для першого запиту, але дуже глибокий для професійної роботи. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP == IN == {| class="wikitable" !Порівняння з SQL

FROM orders {| class="wikitable sortable" FROM products UPDATE accounts {| class="wikitable"

customer_id INTEGER NOT NULL,

FROM customers

total_amount,

FROM customers Краще розділити:

Приклад накопичувальної суми:

FROM customers;

NoSQL

SELECT *
Мова
  • backend-розробки;
  • ERP і CRM;
  • аналітики;
  • звітності;
  • BI;
  • data engineering;
  • тестування;
  • адміністрування баз даних;
  • фінансових і облікових систем.
DELETE FROM customers WHERE created_at BETWEEN '2026-01-01' AND '2026-01-31'; created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, );
1 Анна Київ anna@example.com
2 Олег Львів oleh@example.com
3 Марія Київ maria@example.com

SQL Injection — це атака, коли зловмисний текст потрапляє в SQL-запит і змінює його логіку. FROM orders; Таблиця має: Недолік customers.name, LIKE застосовується для для пошуку за шаблоном. SELECT * зняти гроші з рахунку A;

конкурентні переваги SQL

SET city = 'Одеса' FROM customers Але її треба використовувати обережно. Приклад нумерації замовлень клієнта:

FROM customer_sales

city


SELECT * всюди

Зайві інформаційні дані, гірша продуктивність, залежність від структури таблиці


UPDATE без WHERE

здатна змінити всі записи


DELETE без WHERE

здатна видалити всі записи


Ігнорування індексів

Запити стають повільними


Неправильні JOIN

інформаційні дані дублюються або губляться


Плутанина з NULL

NULL не дорівнює нулю або порожньому рядку


Склеювання SQL із введенням користувача

Ризик SQL Injection


);
якщо друга дія не вдалася — скасувати першу. Stored procedure — це збережена процедура в базі даних. !Чому це проблема

SQL у порівнянні з іншими технологіями

(2, 'Олег', 'Львів'), FROM orders;

DROP TABLE

Створювати правильні індекси Індекси прискорюють пошук, JOIN і сортування Не вибирати зайве Замість SELECT * краще вибирати потрібні колонки Аналізувати EXPLAIN План виконання показує реальну роботу запиту Уникати N+1 queries Часто виникає через ORM Фільтрувати раніше Чим менше рядків обробляється, тим краще Правильно проєктувати схему Погана структура таблиць створює складні й повільні запити WHERE email = '$email'; AS $$ Денормалізація — це свідоме дублювання даних для швидшого читання або простішої аналітики. FROM orders SELECT * * ISO/IEC 9075-1:2023 — SQL Framework: https://www.iso.org/standard/76583.html * SQL Standard ISO/IEC 9075:2023: https://blog.ansi.org/ansi/sql-standard-iso-iec-9075-2023-ansi-x3-135/ * PostgreSQL Documentation: https://www.postgresql.org/docs/ * MySQL Documentation: https://dev.mysql.com/doc/ * Microsoft SQL Server Documentation: https://learn.microsoft.com/en-us/sql/ * SQLite Documentation: https://www.sqlite.org/docs.html * DB-Engines Ranking: https://db-engines.com/en/ranking * Stack Overflow Developer Survey: https://survey.stackoverflow.co/