Матеріали курсу
Ця сторінка містить допоміжні матеріали курсу SQL для продакт-менеджера.
Розділ 1. Вступ
1.1 Хто я, для кого та про що цей курс.
Про що цей курс.
У курсі розповідається як влаштована сучасна аналітика в ІТ компаніях, яку участь у ній бере продакт-менеджер.
Теоретично і практично висвітлюється мова структурованих запитів SQL, а саме те, як за допомогою цієї мови можна обробляти і отримувати дані з баз даних в аналітичних цілях.
Для кого розрахований курс.
Основна аудиторія продакт-менеджери, курс також може бути корисним для людей, які хочуть опанувати SQL для аналізу даних.
Які знання та навички можуть бути отримані в результаті проходження курсу.
- Як влаштована сучасна аналітика в IT компаніях.
- Що таке SQL, чим він може бути корисний продакт-менеджеру.
- Як підключатись до баз даних.
- Як зберігається інформація у базах даних та які основні типи даних існують.
- Як обробляти та отримувати дані з бази даних за допомогою SQL. (На прикладі бази даних Postgres)
Про автора курсу.
Мене звати Антон Король. Мій шлях роботи з даними почався у 2018 році, у якості аналітика даних, за 4 роки мені вдалося попрацювати майже з двома десятками продакт-менеджерів і даними таких проєктів як prom.ua, bigl.ua, vchasno.ua та інші.
З 2022 року я займаюсь інженерією даних на проєкті prom.ua, проєктую та створюю аналітичні сховища даних, розбудовую інфраструктуру для їх обчислення.
1.2 Матеріали курсу та як з ними працювати.
Матеріали цієї сторінки будуть містити різну інформацію, яка може бути корисною для проходження курсу.
Кожен розділ містить інформацію відповідно до відео, яке має таку ж саму назву. Зазвичай тут можна буде знайти:
- Посилання на матеріал, який я використовую у відеолекціях;
- Посилання на додаткові тексти, статті, відео, які при бажанні допоможуть глибше ознайомитись з темою;
- Код, який я демонструю у відеолекціях;
- Домашні завдання, підказки та варіанти його вирішення;
- Дуже коротку вижимку відеолекцій.
Я розраховую, що ця інформація допоможе краще засвоїти матеріал та зекономити час.
1.3 Сучасна аналітика у сучасних компаніях.
Зазвичай на проєктах аналітичними даними займаються люди, які займають наступні ролі:
- Data Engineer - створює та підтримує інфраструктуру для роботи з даними.
- Data Analyst - шукає інсайти, генерує та валідує гіпотези, розробляє і підтримує звітність.
- Data Scientist - використовує машинне навчання для аналізу даних та покращення функціонала проєкту.
Рух аналітичних даних в ідеалі виглядає наступним чином:
graph LR
A[API] --> B(Data Lake);
C[Бази даних] --> B(Data Lake);
D[Файли] --> B(Data Lake);
E[Зовнішні сервіси] --> B(Data Lake);
F[...] --> B(Data Lake);
B[Data Lake] --> G(Data Warehouse);
B[Data Lake] --> H(Data Warehouse);
B[Data Lake] --> I(...);
G(Data Warehouse) --> K(BI Tool);
H(Data Warehouse) --> K(BI Tool);
I(...) --> K(BI Tool);
- Сирі дані з різних джерел систематизовано завантажуються у Data Lake (Озеро даних);
- Нормалізовані та очищені дані завантажуються до Data Warehouse (Аналітичне сховище даних);
- На основі даних з Data Warehouse будуються звіти, візуалізації.
В залежності від специфіки проєкту схема може відрізнятися, наприклад у проєктів з малою кількістю даних може не бути озера даних, натомість вони одразу записуються в аналітичне сховище, кількість аналітичних сховищ може варіюватися від одного загального сховища до декількох спеціалізованих.
1.4 Продакт-менеджер у рамках сучасної аналітики та навіщо йому потрібен SQL.
В рамках роботи менеджер зазвичай отримує аналітичну інформацію по проєкту з:
- Дашбордів, звітів, візуалізацій.
- Взаємодії з аналітиками, саентістами та іншими менеджерами.
- З зовнішніх джерел (аутсорсингові аналітичні агентства тощо).
Знання SQL розширюють цей перелік, даючи можливість менеджеру безпосередньо підключатись до аналітичних сховищ даних та переглядати інформацію, яка його цікавить. Також це сприяє:
- Більш швидкому отриманню інформації. Менеджер самостійно може робити, переглядати прості вибірки та агрегації даних у сховищі, вивільняючи від них беклог аналітиків, щоб вони могли сконцентруватися на складних задачах.
- Кращому розумінню сутностей проєкту та взаємозв'язків між ними. Безпосередня робота з даними дозволяє швидше, якісніше і детальніше зрозуміти з чого складається проєкт, як він функціонує, що в свою чергу покращує якість управлінських рішень.
1.5 Які існують бази даних та як з ними взаємодіяти.
З технічної точки зори існують різні класифікації баз даних, якщо дивитись простіше, то їх умовно можна поділити на два типи:
- Загального призначення - зазвичай до них відносяться реляційні бази даних PostgreSQL, MySQL, Oracle Database, Microsoft SQL Server, завдяки широкому функціоналу вони є найпоширенішими у світі, використовуються як основні та допоміжні бази проєктів.
- Спеціалізованого призначення - спеціалізуються на ефективному виконанні певних можливостей/функціоналу, наприклад, для швидких агрегацій у реальному часі Apache Druid, ClickHouse, у якості аналітичних сховищ для великих даних (big data) BigQuery, Redshift, Snowflake, зазвичай такі бази є допоміжними, вони використовуються для закриття окремих, специфічних потреб проєкту.
Для взаємодії з базою даних використовується SQL (Structured Query Language) мова структурованих запитів. Наразі SQL скоріше представляє собою стандарт, останньою ітерацією якого є ISO/IEC 9075:2016. Керуючись стандартом різні вендори баз даних роблять свої версії SQL, які називаються діалектами. Це означає що один і той самий запит може бути написаний по різному у PostgreSQL та MySQL, оскільки в них різні діалекти, але гарна новина полягає в тому, що більшість діалектів на 80%-85% майже ідентичні.
- Stack Overflow Annual Developer Survey 2022 | Статистика професійного використання баз даних.
- Stack Overflow Annual Developer Survey | Статистика за інші роки.
1.6 Встановлення pgAdmin4 для роботи з базою даних PostgreSQL.
Курс передбачає роботу з SQL та базою даних PostgreSQL, для цього рекомендується встановити графічний інтерфейс pgAdmin4.
Завантажити pgAdmin4 для Windows. Завантажити pgAdmin4 для MacOS. Завантажити pgAdmin4 для Ubuntu.
pgAdmin4 був створений для роботи тільки з базами даних PostgreSQL, його буде достатньо для проходження цього курсу, але якщо в майбутньому у вас буде потреба одночасної роботи з різними базами, як альтернативу можна розглянути dbeaver.io або DataGrip.
1.7 Підключення та огляд бази даних, де знайти дані.
Для підключення до навчальної бази даних PostgreSQL, використовуйте наступні значення:
Database:
- host: 209.38.222.64
- port: 5433
- database: sql-course-prjctr
- user: student
- password: student-password
Дані в базі даних зберігаються у вигляді таблиць table
, які входять у схеми schema
, тобто до схем можна відноситись як до папок, які містять в собі таблиці.
Навчальна база даних містить згенеровані дані умовного інтернет-магазину в Україні, за 2023 рік, таблиці з навчальними даними містяться у схемі data
, перелік та опис таблиць представлений нижче.
Перелік та опис таблиць (натисніть для перегляду)
data.order
- таблиця с замовленнями інтернет-магазину.
Колонка | Опис |
---|---|
order_id |
ID замовлення. |
date_created |
Дата та час створення замовлення. |
price |
Загальна сума замовлення. |
status |
Поточний статус замовлення. |
device_type |
Тип дейвайсу, на якому було створено замовлення. |
delivery_type |
Тип доставки замовлення. |
delivery_location_id |
ID локації доставки замовлення. |
payment_type |
Тип оплати замовлення. |
data.order_item
- таблиця з товарами в замовленнях інтернет-магазину.
Колонка | Опис |
---|---|
order_id |
ID замовлення. |
order_date |
Дата та час створення замовлення. |
product_id |
ID товару в замовленні. |
category_id |
ID категорії товару в замовленні. |
quantity |
Кількість одиниць товару в замовленні. |
unit_price |
Ціна за одиницю товару в замовленні. |
is_gift |
Статус, який відображає чи йде товар у якості подарунка. |
data.opinion
- таблиця з відгуками покупців по замовленнях інтернет-магазину.
Колонка | Опис |
---|---|
opinion_id |
ID відгуку. |
date_created |
Дата та час створення відгуку. |
order_id |
ID замовлення, до якого належить відгук. |
rating |
Оцінка, яку містить відгук. |
contain_image |
Статус, який відображає чи містить відгук зображення. |
data.product
- таблиця з товарами інтернет-магазину та їх поточним станом.
Колонка | Опис |
---|---|
product_id |
ID товару. |
category_id |
Категорія товару. |
status |
Поточний статус товару. |
type |
Тип товару. |
data.category
- таблиця з категоріями товарів, які продає інтернет-магазин та їх поточним станом.
Колонка | Опис |
---|---|
category_id |
ID категорії. |
name |
Назва категорії. |
status |
Поточний статус категорії. |
type |
Тип категорії. |
data.location
- таблиця з містами, куди доставляє інтернет-магазин.
Колонка | Опис |
---|---|
location_id |
ID міста. |
location |
Назва міста. |
region |
Регіон міста. |
country |
Країна міста. |
latitude |
Широта (координати місцезнаходження міста). |
longitude |
Довгота (координати місцезнаходження міста). |
population |
Кількість населення міста. |
Залежність таблиць між собою (натисніть для перегляду)
Розділ 2. Основи SQL
2.1 Що представляє собою SQL.
SQL (Structured Query Language) мова структурованих запитів для взаємодії з базами даних, складається з 5 компонентів:
graph TD
SQL --> DQL[DQL <br> Data Query Language <br><hr><br><ul><li align='left'>SELECT</li><br>]
SQL --> DDL[DDL <br> Data Definition Language <br><hr><br><ul><li align='left'>CREATE</li><br><li align='left'>DROP</li><br><li align='left'>ALTER</li><br><li align='left'>TRUNCATE</li></ul><br>]
SQL --> DCL[DCL <br> Data Control Language <br><hr><br><ul><li align='left'>GRANT</li><br><li align='left'>REVOKE</li></ul><br>]
SQL --> DML[DML <br> Data Manipulation Language <br><hr><br><ul><li align='left'>INSERT</li><br><li align='left'>UPDATE</li><br><li align='left'>DELETE</li></ul><br>]
SQL --> TCL[TCL <br> Transaction Control Language <br><hr><br><ul><li align='left'>COMMIT</li><br><li align='left'>ROLLBACK</li><br><li align='left'>SAVEPOINT</li></ul><br>]
-
DQL (Data query language) - виконання запитів до даних у базі даних.
-
DDL (Data Definition Language) - створення або зміна об’єктів бази даних, таких як таблиці, індекси та користувачі.
-
DCL (Data Control Language) - контроль доступу до даних, що зберігаються в базі даних.
-
DML (Data Manipulation Language) - додавання, оновлення та видалення даних у базі даних.
-
TCL (Transaction Control Language) - управління та контроль транзакцій у базі даних.
В окремих теоретичних матеріалах DQL є частиною DML, оскільки вони можуть використовувати окремі елементи один одного, але цей нюанс не є принциповим.
Курс передбачає розгляд DQL та частину DML, яка відповідає за обробку даних. Цих знань буде достатньо для обробки та отримання необхідних даних з бази, для їх подальшого аналітичного аналізу.
2.2 Огляд основних типів даних.
Для стандартизації даних, їх зберігають у заздалегіть визначених типах, перелік основних типів даних наведений нижче.
Категорія | Приклади типів даних | Опис / Приклади значень |
---|---|---|
Текст | text , varchar , character |
'Kyiv' , 'Ukraine' , 'Eurovision 2023' |
Число | integer , smallint , bigint |
91 , -8 , 312315 |
Число з плаваючою точкою | numeric , decimal , double precision |
1.0 , 2.3151 , -3.0123 |
Дата та час | date , timestamp |
'2022-12-31' , '2023-05-14 18:49:09.403363' |
Логічний | boolean |
true , false |
Масив | integer[] , text[] , numeric[] |
Набір значень в рамках визначеного типу.[1, 5, -100] , ['Venus', 'Earth', 'Mars'] , [-0.13, 87.31, 562.013] |
Словник | json |
Пара або список пар у форматі "ключ-значення".{'age':48} , {'type':'car', 'price':35000, 'currency':'USD'} |
Інші специфічні типи | bytea , inet , xml, path , interval |
... |
Додатково слід зазначити, що у базі даних можна зустрічати значення NULL
, воно може належати до будь-якого типу, це значення вказує на відсутність даних у конкретному полі.
- PostgreSQL Офіційна документація | Типи даних.
- PostgreSQL Офіційна документація | Числові типи.
- PostgreSQL Офіційна документація | Текстові типи.
- PostgreSQL Офіційна документація | Типи дати та часу.
2.3 Як отримувати дані з таблиці (SELECT).
Приклад запиту до схеми data
, таблиці order
, який поверне усі записи цієї таблиці:
Такий самий запит, але з визначеним переліком колонок order_id
, date_created
, price
, дані будуть повернуті тільки по цим колонкам:
У коді SQL можна залишати коментарі після --
, вони ніяк не впливають на виконання коду, приклад коду з коментарями:
select distinct
повертає тільки унікальні рядки, тобто якщо існують рядки з однаковою комбінацією значень, запит поверне тільки один такий рядок.
Приклад запиту, який поверне унікальні значення колонки region
з таблиці location
у схемі data
:
За допомогою оператору as
, можна присвоювати псевдоніми alias
колонкам та таблицям, простіше кажучи змінювати їх назву.
Приклад запиту, який поверне колонку date_created
з таблиці order
у схемі data
, змінивши її назву з date_created
на created_at
:
limit
дозволяє обмежити кількість рядків, які будуть повернуті у результаті запиту, він пишеться в самому кінці запиту.
Приклад запиту, який поверне 200 записів order_id
з таблиці order
у схемі data
:
Домашнє завдання (натисніть для перегляду)
- Напишіть запит, який поверне 50 записів усіх колонок з таблиці
category
у схеміdata
. - Напишіть запит, який поверне усі записи колонок
location
,region
,population
з таблиціlocation
у схеміdata
, змінивиши назву колонкиlocation
наcity
.
Приклад вирішення домашнього завдання (натисніть для перегляду)
-
Напишіть запит, який поверне 50 записів усіх колонок з таблиці
category
у схеміdata
. -
Напишіть запит, який поверне усі записи колонок
location
,region
,population
з таблиціlocation
у схеміdata
, змінивиши назву колонкиlocation
наcity
.
2.4 Конвертація даних (CAST).
Конвертація дозволяє змінити тип даних, при умові що початкове значення сумісне з типом, в який воно конвертується.
Конвертація відбувається за допомогою функції cast()
, у форматі cast(дані as тип)
, наприклад:
Приклад запиту, який поверне записи колонки date_created
з таблиці order
у схемі data
, конвертувавши їх у тип date
:
Вендори баз даних іноді реалізовують додаткові/альтернативні способи конвертації даних, наприклад у базах даних PostgreSQL можна конвертувати дані за допомогою ::
, не використовуючи функцію cast()
, це сприяє швидшому написанню і кращій читабельності коду:
Домашнє завдання (натисніть для перегляду)
- Використовуючи функцію
cast()
, напишіть запит, який конвертує і поверне значення колонкиorder_date
у типіdate
з таблиціorder_item
у схеміdata
, присвойте цій колонці псевдонімday_created
. - Використовуючи альтернативний спосіб конвертації даних PostgreSQL
::
, напишіть запит, який конвертує і поверне значення колонкиunit_price
у типіinteger
з таблиціorder_item
у схеміdata
, присвойте цій колонці псевдонімprice_per_unit
.
Приклад вирішення домашнього завдання (натисніть для перегляду)
-
Використовуючи функцію
cast()
, напишіть запит, який конвертує і поверне значення колонкиorder_date
у типіdate
з таблиціorder_item
у схеміdata
, присвойте цій колонці псевдонімday_created
. -
Використовуючи альтернативний спосіб конвертації даних PostgreSQL
::
, напишіть запит, який конвертує і поверне значення колонкиunit_price
у типіinteger
з таблиціorder_item
у схеміdata
, присвойте цій колонці псевдонімprice_per_unit
.
2.5 Сортування даних (ORDER BY).
Сортування даних допомагає простіше сприймати дані та іноді використовується в певних функціях. Є два способи сортування:
- Від малого до великого, тобто від
1-9
абоA-Z
, помічається словомasc
, скорочення від слова ascending. - Від великого до малого, тобто від
9-1
абоZ-A
, помічається словомdesc
, скорочення від слова descending.
У SQL сортування відбувається завдяки ключовому слову order by
, у форматі order by колонка спосіб_сортування
, якщо спосіб сортування не вказати, за замовчуванням він буде asc
.
Приклад запиту, який поверне перелік населених пунктів України, відсортованих за кількістю населення від найбільших до найменших:
Через кому можна одночасно сортувати по декількох колонках.
Приклад того самого запиту, але відсортованого спочатку по регіонах, а потім за кількістю населення:
У базах даних PostgreSQL можна сортувати колонки вказуючи не тільки їх назви, а і позицію у запиті:
Усі типи даних підтримують сортування, наприклад наступний запит поверне 200 найсвіжіших замовлень, які є в таблиці:
Домашнє завдання (натисніть для перегляду)
- Напишіть запит, який поверне усі записи колонок
location
,region
,population
з таблиціlocation
у схеміdata
, одночасно відсортувавиши їх поregion
desc
, та поlocation
asc
.
Приклад вирішення домашнього завдання (натисніть для перегляду)
- Напишіть запит, який поверне усі записи колонок
location
,region
,population
з таблиціlocation
у схеміdata
, одночасно відсортувавиши їх поregion
desc
, та поlocation
asc
.
2.6 Фільтрація даних, оператори порівняння (WHERE).
Фільтрація є одним із ключових аспектів роботи з даними, вона дозволяє отримати дані, які відповідають конкретним критеріям.
Дані фільтруються за допомогою операторів порівняння та логічних операторів.
Оператори порівняння (натисніть для перегляду)
Оператор | Опис |
---|---|
X < Y |
X менше Y. |
X > Y |
X більше Y. |
X <= Y |
X менше або дорівнює Y. |
X >= Y |
X більше або дорівнює Y. |
X = Y |
X дорівнює Y. |
A between X and Y |
A у межах X та Y. |
A is null |
Де A є NULL. |
A in(X, Y, ...) |
Де A дорівнює X або Y або .... |
like |
Виконує фільтрацію колонки згідно з вказаним патерном. |
not |
Робить дію інших операторів протилежною. |
Логічні оператори (натисніть для перегляду)
Оператор | Опис |
---|---|
and |
Логічний оператор для об'єднання умов фільтрації. |
or |
Логічний оператор для розділення умов фільтрації. |
Оператори порівняння дозволяють створити умови фільтрації, умови фільтрації вказуються після оператора where
.
Приклад запиту, який поверне усі записи замовлень у статусі completed
:
Логічні оператори дають можливість логічно об'єднати або розділити декілька умов в рамках одного запиту.
Якщо у запиті необхідне одночасне виконання декількох умов, ці умови об'єднуються між собою логічним оператором and
.
Приклад запиту, який поверне усі записи замовлень у статусі completed
, від 10000 грн (включно):
Приклад запиту, який поверне записи замовлень з доставкою від "Нова пошта" та "Укрпошта", за серпень 2023 року:
Логічний оператор or
дозволяє розділити (ізолювати) декілька умов.
Приклад запиту, який поверне записи замовлень у статусі completed
з оплатою card_online
або у статусі canceled
з оплатою cash
:
Домашнє завдання (натисніть для перегляду)
- Напишіть запит, який поверне усі записи з таблиці
location
у схеміdata
,region
яких належить доЛьвівська область
,Харківська область
,Миколаївська область
, відсортуйте результат по колонціregion
. - Напишіть запит, який поверне усі записи колонок
location
,region
,population
з таблиціlocation
у схеміdata
,region
яких належить доКиївська область
іpopulation
від 20000, відсортуйте результат по колонціpopulation
від найбільшого до найменшого.
Приклад вирішення домашнього завдання (натисніть для перегляду)
-
Напишіть запит, який поверне усі записи з таблиці
location
у схеміdata
,region
яких належить доЛьвівська область
,Харківська область
,Миколаївська область
, відсортуйте результат по колонціregion
.Альтернативний спосіб. -
Напишіть запит, який поверне усі записи колонок
location
,region
,population
з таблиціlocation
у схеміdata
,region
яких належить доКиївська область
іpopulation
від 20000, відсортуйте результат по колонціpopulation
від найбільшого до найменшого.
2.7 Фільтрація по тексту (LIKE).
Для фільтрації по тексту використовуються оператори порівняння =
, in
та like
.
=
використовується коли необхідно знайти текст по повному збігу, наприклад наступний запит поверне записи де region
має значення Київська область
:
in
теж шукає повний збіг, але дає можливість одночасно вказувати пошук по декількох збігах, наприклад наступний запит поверне записи де region
має значення Київська область
та Вінницька область
:
like
є складнішим оператором, котрий дозволяє шукати дані по вказаному патерну, який формується на основі двох знаків:
- Знак відсотка
%
- означає відповідність будь-якій послідовності з нуля чи більше символів. - Знак підкреслення
_
- означає відповідність будь-якому окремому символу.
Приклади патернів:
location like 'Ки%'
- шукатиме значення уlocation
, які починаються наКи
.location like '%ий'
- шукатиме значення уlocation
, які закінчуються наий
.location like '%риж%'
- шукатиме значення уlocation
, які містятьриж
.location like 'Ки_в'
- шукатиме значення уlocation
, які починаються наКи
, закінчуються нав
, між собою мають 1 символ.
Приклад запиту, який поверне усі записи локації, які починаються на Ки
:
Домашнє завдання (натисніть для перегляду)
- Напишіть запит, який поверне усі записи з таблиці
location
у схеміdata
, деlocation
містятьив
. - Напишіть запит, який поверне усі записи з таблиці
location
у схеміdata
, деlocation
починаються наКи
. - Напишіть запит, який поверне усі записи з таблиці
location
у схеміdata
, які починаються наВі
, закінчуються наниця
, між собою мають 1 символ.
Приклад вирішення домашнього завдання (натисніть для перегляду)
-
Напишіть запит, який поверне усі записи з таблиці
location
у схеміdata
, деlocation
міститьив
. -
Напишіть запит, який поверне усі записи з таблиці
location
у схеміdata
, деlocation
починаються наРа
. -
Напишіть запит, який поверне усі записи з таблиці
location
у схеміdata
, які починаються наВі
, закінчуються наниця
, між собою мають 1 символ.
2.8 Особливості складної фільтрації.
Під складною фільтрацією мається на увазі фільтрація, яка використовує логічні оператори and
та or
, нижче наведені приклади некоректного написання складних запитів та варіанти їх виправлення.
- Запит, який повинен повернути перелік локацій з таблиці
location
у схеміdata
,region
яких відноситься доЧернігівська область
,Одеська область
таСумська область
:
Так неправильно
Так правильно
- Запит, який повинен повернути перелік виконаних замовлень (
status
дорівнюєcompleted
) з таблиціorder
у схеміdata
, з сумою замовлень 500 та менше грн, деpayment_type
дорівнюєcash
таdelivery_type
дорівнюєpickup
абоdelivery_type
міститьnovaposhta
чиukrposhta
:
Так неправильно
Так правильно, але це неоптимально
Так правильно
2.9 Сегментація даних (CASE).
Сегментація даних допомагає системніше аналізувати дані та будувати розрахункові моделі, вона полягає в тому щоб розділити дані на групи, які визначаються на основі умов.
SQL дає можливість сегментувати дані виразом case
, він має наступну структуру:
Як приклад, наступний запит сегментує усі замовлення з таблиці order
у схемі data
на 3 групи:
- Замовлення до 500 грн, назва сегмента
low_price
; - Замовлення від 500 до 2000 грн, назва сегмента
mid_price
; - Замовлення від 2000 грн, назва сегмента
high_price
.
Оскільки перевірка сегментів у виразі case
відбувається з гори до низу, запит можна спростити наступним чином:
Вираз case
не обмежується присвоюванням текстового значення, він також може здійснювати розрахунки та виконувати функції.
Як приклад, наступний запит розрахує відсоток комісії з оплати карткою, для виконаних замовлень, у таблиці order
, в схемі data
для:
- Оплати карткою онлайн
payment_type = card_online
, комісія 3%; - Оплати карткою через термінал при отриманні
payment_type = card_on_arrival
, комісія 2%; - Усіх інших способів оплати, комісія 0%;
Для розрахунку суми комісії, можна одразу виконати арифметичну дію множення:
Домашнє завдання (натисніть для перегляду)
- Напишіть запит, який розрахує вартість доставки для замовлень у статусі
status
виконанеcompleted
, в залежності від логістаdelivery_type
, в таблиціlocation
, у схеміdata
, тариф логістаukrposhta
становить 50 грн, аnovaposhta
70 грн, назвіть цю колонкуdelivery_cost
.
Приклад вирішення домашнього завдання (натисніть для перегляду)
- Напишіть запит, який розрахує вартість доставки для замовлень у статусі
status
виконанеcompleted
, в залежності від логістаdelivery_type
, в таблиціlocation
, у схеміdata
, тариф логістаukrposhta
становить 50 грн, аnovaposhta
70 грн, назвіть цю колонкуdelivery_cost
.
Розділ 3. Агрегації даних
3.1 Агрегатні функції та групування даних (GROUP BY).
Агрегатні функції виконують обчислювальні операції на наборі записів. Основними агрегатними функціями є:
avg()
– повертає середнє значення.sum()
– повертає суму значень.count()
– повертає кількість значень.max()
– повертає максимальне значення.min()
– повертає мінімальне значення.
Приклад запиту, який розрахує агреговану інформацію по замовленнях, з таблиці order
, у схемі data
:
Функція count()
додатково вміє розраховувати кількість унікальних записів за допомогою ключового слова distinct
.
Приклад запиту, який розрахує кількість унікальних, замовлених товарів, з таблиці order_item
, у схемі data
:
group by
дозволяє агрегувати дані в рамках визначених груп, у форматі group by колонка
.
Приклад запиту, який розрахує кількість та суму замовлень по способах доставки, з таблиці order_item
, у схемі data
:
У базах даних PostgreSQL можна групувати дані вказуючи не тільки назви колонок, а і їх позицію у запиті:
Через кому можна одночасно групувати по декількох групах. Той самий запит, але згрупований по способу доставки та даті замовлення:
Домашнє завдання (натисніть для перегляду)
- Напишіть запит, який розрахує кількість відгуків
opinion_id
та їх середню оцінкуrating
, з таблиціopinion
, у схеміdata
. - Напишіть запит, який розрахує кількість відгуків
opinion_id
по кожній оцінціrating
, з таблиціopinion
, у схеміdata
, відсортуйте результат за кількістю відгуків.
Приклад вирішення домашнього завдання (натисніть для перегляду)
- Напишіть запит, який розрахує кількість відгуків
opinion_id
та їх середню оцінкуrating
, з таблиціopinion
, у схеміdata
. - Напишіть запит, який розрахує кількість відгуків
opinion_id
по кожній оцінціrating
, з таблиціopinion
, у схеміdata
, відсортуйте результат за кількістю відгуків.
3.2 Додаткові можливості фільтрації при агрегаціях (FILTER, HAVING).
У запиті з агрегаціями можна використовувати звичайну фільтрацію даних через where
, вона застосовується до всіх даних у запиті.
Приклад розрахунку кількості та суми замовлень по днях, за травень 2023 року, з таблиці order
, у схемі data
:
Іноді загальної фільтрації через where
може бути недостатньо, в такому випадку до конкретної агрегації можна застосувати додатковий фільтр filter
, його застосування виглядає наступним чином агрегатна_функція() filter(where умова)
.
Наступний запит розрахує загальну, виконану, відмінену кількість замовлень по днях, за травень 2023 року:
За допомогою having
можна відфільтрувати результат агрегації, у форматі having агрегатна_функція() оператор_порівняння значення
.
Приклад того самого запиту, але тільки по днях, де сума замовлень більше або дорівнює 50:
Домашнє завдання (натисніть для перегляду)
- Напишіть запит, який розрахує суму замовлень
price
по способах доставкиdelivery_type
в окремих колонках, використовуючи фільтрацію при агрегаціїfilter
, з таблиціorder
, у схеміdata
, тільки по днях, де загальна сума замовлень за день більше 100000.
Приклад вирішення домашнього завдання (натисніть для перегляду)
- Напишіть запит, який розрахує суму замовлень
price
по способах доставкиdelivery_type
в окремих колонках, використовуючи фільтрацію при агрегаціїfilter
, з таблиціorder
, у схеміdata
, тільки по днях, де загальна сума замовлень за день більше 100000.
Розділ 4. Об'єднання даних
4.1 Реляційність у базах даних та навіщо об'єднувати таблиці.
Реляційна модель базується на зберіганні даних по об'єктах в окремих таблицях, тобто кожна таблиця представляє окремий об'єкт, а колонки в ній це набір атрибутів об'єкта. Завдяки спільним атрибутам об'єктів, вони можуть бути пов'язані між собою, в цьому і полягає відношення (relation) їх один до одного.
Навчальна база даних цього курсу є типовим представником реляційної моделі зберігання і використання даних.
Відношення таблиць між собою (натисніть для перегляду)
SQL надає можливості об'єднувати дані з різних таблиць, це дозволяє збагачувати їх додатковими атрибутами.
4.2 Які існують можливості об'єднання даних і на чому варто зосередитись.
Операції по об'єднанню даних поділяються на горизонтальні та вертикальні.
Горизонтальні операції об'єднання зазвичай відбуваються на основі спільного атрибута(ів) таблиць. Наприклад, таблиці data.order
, data.order_item
, data.opinion
у якості спільного атрибута мають колонку order_id
і тому можуть бути між собою горизонтально об'єднані на основі цього атрибута.
Основні операції горизонтального об'єднання: left join
, right join
, inner join
, full outer join
, cross join
.
Далі, в рамках курсу описується принцип роботи кожного з них, але слід зазначити, що більше за всіх використовуються саме left join
та inner join
, тому їм краще приділити особливу увагу.
Вертикальні операції об'єднання, об'єднують результати запитів, можуть бути здійснені тільки в тому випадку, коли результати запитів мають однакову кількість колонок та послідовність їх типів.
Такого роду об'єднання можуть бути корисні при об'єднанні однакових даних за різні періоди або по різних сегментах.
Основні операції вертикального об'єднання: union
, union all
, intersect
, except
.
Далі, в рамках курсу описується принцип роботи кожного з них, але слід зазначити, що більше за всіх використовуються саме union
та union all
, тому їм краще приділити особливу увагу.
4.3 LEFT JOIN, RIGHT JOIN.
left join
приєднує до лівої таблиці дані правої таблиці, на основі вказаної умови (зазвичай спільного атрибута(ів)). Таке об'єднання залишає усі записи лівої таблиці, при цьому приєднує тільки ті записи правої таблиці, по яких виконується умова об'єднання (наприклад збіг атрибутів), якщо таких записів не знайдено, то буде проставлено значення null
.
Щоб виконати об'єднання left join
, потрібно виконати 4 кроки:
- У
select
вказати колонки таблиць, які необхідно вивести в результаті запиту. - У
from
вказати ліву таблицю. - У
left join
вказати праву таблицю. - Після ключового слова
on
вказати умову об'єднання таблиць.
Приклад запиту, який виконає об'єднання left join
таблиці data.order
з data.opinion
, на основі спільного атрибута order_id
:
Результат запиту поверне перелік усіх замовлень та рейтинг відгуку по ним, якщо відгуку по замовленню не існує, буде значення null
.
У прикладі запиту також можна побачити, що таблицям присвоюються псевдоніми через оператор as
, так таблиці data.order
присвоюється псевдонім ord
, а data.opinion
псевдонім opn
, це робиться, щоб зручніше посилатись на колонки цих таблиць у запиті.
Об'єднання right join
працює аналогічно left join
, єдина їх відмінність в тому, що right join
приєднує дані лівої таблиці до правої.
Домашнє завдання (натисніть для перегляду)
- Використовуючи
left join
напишіть запит, який приєднає до таблиціdata.product
таблицюdata.category
на основі атрибутаcategory_id
, в цьому запиті виведіть колонкиproduct_id
,category_id
з таблиціdata.product
, колонкуname
з таблиціdata.category
, колонціname
присвойте ім'яcategory_name
. - Використовуючи
left join
напишіть запит, який приєднає до таблиціdata.order
таблицюdata.location
на основі атрибутаdelivery_location_id = location_id
, в цьому запиті виведіть колонкиorder_id
,date_created
,price
,delivery_type
з таблиціdata.order
, колонкиlocation
,region
з таблиціdata.location
, колонціlocation
присвойте ім'яdelivery_location
, а колонціregion
delivery_region
.
Приклад вирішення домашнього завдання (натисніть для перегляду)
-
Використовуючи
left join
напишіть запит, який приєднає до таблиціdata.product
таблицюdata.category
на основі атрибутаcategory_id
, в цьому запиті виведіть колонкиproduct_id
,category_id
з таблиціdata.product
та колонкуname
з таблиціdata.category
, колонціname
присвойте ім'яcategory_name
. -
Використовуючи
left join
напишіть запит, який приєднає до таблиціdata.order
таблицюdata.location
на основі атрибутаdelivery_location_id = location_id
, в цьому запиті виведіть колонкиorder_id
,date_created
,price
,delivery_type
з таблиціdata.order
, колонкиlocation
,region
з таблиціdata.location
, колонціlocation
присвойте ім'яdelivery_location
, а колонціregion
delivery_region
.
4.4 INNER JOIN.
inner join
об'єднує дані двох таблиць, на основі вказаної умови (зазвичай спільного атрибута(ів)). Таке об'єднання залишає тільки ті записи обох таблиць, де були виконані умови об'єднання, усі інші записи повернуті не будуть.
Щоб виконати об'єднання inner join
, потрібно виконати 4 кроки:
- У
select
вказати колонки таблиць, які необхідно вивести в результаті запиту. - У
from
вказати ліву таблицю. - У
inner join
вказати праву таблицю. - Після ключового слова
on
вказати умову об'єднання таблиць.
Приклад запиту, який виконає об'єднання inner join
таблиці data.order
з data.opinion
, на основі спільного атрибута order_id
:
Результат запиту поверне тільки ті замовлення, по яких є відгуки, та тільки ті відгуки, по яких є замовлення, об'єднавши їх між собою.
Домашнє завдання (натисніть для перегляду)
- Використовуючи
inner join
напишіть запит, який об'єднає таблиціdata.order_item
таdata.opinion
на основі атрибутаorder_id
, в запиті виведіть колонкиorder_id
,product_id
,quantity
,unit_price
з таблиціdata.order_item
, колонкуrating
з таблиціdata.opinion
.
Приклад вирішення домашнього завдання (натисніть для перегляду)
- Використовуючи
inner join
напишіть запит, який об'єднає таблиціdata.order_item
таdata.opinion
на основі атрибутаorder_id
, в запиті виведіть колонкиorder_id
,product_id
,quantity
,unit_price
з таблиціdata.order_item
, колонкуrating
з таблиціdata.opinion
.
4.5 FULL OUTER JOIN.
full outer join
об'єднує дані двох таблиць, на основі вказаної умови (зазвичай спільного атрибута(ів)). Таке об'єднання залишає усі записи обох таблиць, об'єднуючи тільки ті з них, які виконують умови об'єднання, іншим присвоює значення null
у відсутніх атрибутах.
Щоб виконати об'єднання full outer join
, потрібно виконати 4 кроки:
- У
select
вказати колонки таблиць, які необхідно вивести в результаті запиту. - У
from
вказати ліву таблицю. - У
full outer join
вказати праву таблицю. - Після ключового слова
on
вказати умову об'єднання таблиць.
Приклад запиту, який виконає об'єднання full outer join
таблиці data.order
з data.opinion
, на основі спільного атрибута order_id
:
Результат запиту поверне перелік усіх записів з обох таблиць, об'єднавши ті з них, які виконують умови об'єднання.
4.6 CROSS JOIN.
cross join
об'єднує дані двох таблиць у вигляді декартового добутку. Таке об'єднання залишає усі записи обох таблиць, формуючи усі можливі комбінації з них.
Щоб виконати об'єднання cross join
, потрібно виконати 3 кроки:
- У
select
вказати колонки таблиць, які необхідно вивести в результаті запиту. - У
from
вказати ліву таблицю. - У
cross join
вказати праву таблицю.
Приклад запиту, який виконає об'єднання cross join
таблиці data.product
з data.category
:
Результат запиту поверне перелік усіх товарів з усіма можливими комбінаціями категорій.
4.7 UNION, UNION ALL.
union
об'єднує результати двох або більше запитів в один набір результатів, повертає унікальні записи.
union all
об'єднує результати двох або більше запитів в один набір результатів, повертає усі записи.
Щоб виконати об'єднання union
або union all
, запити повинні виконувати 2 вимоги:
- Кількість і порядок стовпців у запитах мають бути однаковими.
- Типи даних у запитах мають бути сумісними.
Приклад об'єднання запитів, використовуючи union
, який поверне кількість замовлень по днях за січень та грудень 2023 року:
Домашнє завдання (натисніть для перегляду)
- Використовуючи
union
напишіть запит, який поверне унікальні товариproduct_id
з таблиціdata.order_item
, які були замовлені за червень та серпень 2023 рокуorder_date
. - Використовуючи
union all
об'єднайте 2 запити. Перший запит повертає колонкиlocation
,population
з таблиціdata.location
де кількість населенняpopulation
більше 1000000. Другий запит повертає ті самі колонки з тієї самої таблиці містуlocation
Київ.
Приклад вирішення домашнього завдання (натисніть для перегляду)
-
Використовуючи
union
напишіть запит, який поверне унікальні товариproduct_id
з таблиціdata.order_item
, які були замовлені за червень та серпень 2023 рокуorder_date
. -
Використовуючи
union all
об'єднайте 2 запити. Перший запит повертає колонкиlocation
,population
з таблиціdata.location
де кількість населенняpopulation
більше 1000000. Другий запит повертає ті самі колонки з тієї самої таблиці містуlocation
Київ.
4.8 INTERSECT, EXCEPT.
intersect
об'єднує результати двох або більше запитів в один набір результатів, повертає записи які зустрічаються в усіх запитах.
except
повертає записи першого запиту, які не зустрічаються в другому запиті.
Щоб виконати об'єднання intersect
або except
, запити повинні виконувати 2 вимоги:
- Кількість і порядок стовпців у запитах мають бути однаковими.
- Типи даних у запитах мають бути сумісними.
Приклад запиту використовуючи intersect
, який поверне товари замовлені, як в січні, так і в грудні 2023 року:
4.9 Складні об'єднання даних.
Використовуючи логічні оператори and
та or
можна писати більш комплексні умови об'єднання.
Наступний запит, завдяки двом умовам об'єднання, поверне замовлення та відгуки, які були зроблені день в день:
В рамках одного запиту можна одночасно робити декілька об'єднань таблиць.
Приклад запиту, який до таблиці замовлень приєднує таблиці з товарами замовлень, категоріям та локаціями:
Використовуючи оператор where
, можна фільтрувати результати запитів з об'єднаннями, так само як і звичайні запити.
Наступний запит, поверне перелік замовлень з доставкою по Київській області:
Домашнє завдання (натисніть для перегляду)
- Використовуючи
left join
напишіть запит, який до таблиці з товарами замовленьdata.order_item
приєднає таблицю з категоріямиdata.category
, на основі атрибутаcategory_id
, виведіть колонкиorder_date
,order_id
,product_id
,category_id
з таблиціdata.order_item
, колонкуname
з таблиціdata.category
, відфільтруйте результат запиту по колонціname
, щоб отримати записи тільки по категорії'велосипеди'
. - Використовуючи
left join
напишіть запит, який до таблиці з відгукамиdata.opinion
приєднає таблицю з замовленнямиdata.order
і таблицю з локаціямиdata.location
, на основі атрибутівorder_id
іdelivery_location_id = location_id
відповідно, виведіть колонкиdate_created
,opinion_id
з таблиціdata.opinion
, колонкуdelviery_location_id
з таблиціdata.order
, колонкиlocation
,region
з таблиціdata.location
.
Приклад вирішення домашнього завдання (натисніть для перегляду)
-
Використовуючи
left join
напишіть запит, який до таблиці з товарами замовленьdata.order_item
приєднає таблицю з категоріямиdata.category
, на основі атрибутаcategory_id
, виведіть колонкиorder_date
,order_id
,product_id
,category_id
з таблиціdata.order_item
, колонкуname
з таблиціdata.category
, відфільтруйте результат запиту по колонціname
, щоб отримати записи тільки по категорії'велосипеди'
. -
Використовуючи
left join
напишіть запит, який до таблиці з відгукамиdata.opinion
приєднає таблицю з замовленнямиdata.order
і таблицю з локаціямиdata.location
, на основі атрибутівorder_id
іdelivery_location_id = location_id
відповідно, виведіть колонкиdate_created
,opinion_id
з таблиціdata.opinion
, колонкуdelviery_location_id
з таблиціdata.order
, колонкиlocation
,region
з таблиціdata.location
.
Розділ 5. Загальні табличні вирази
5.1 Що таке загальні табличні вирази (WITH).
CTE (Common Table Expression) загальний табличний вираз — це тимчасовий набір результатів, на який можна посилатись як на таблицю, їх тимчасовість полягає в тому, що вони існують лише під час виконання запиту.
Загальний табличний вираз має наступну структуру:
- Ключовим словом
with
ініціюється створення табличного виразу. - Табличному виразу присвоюється назва.
- У блоці
as()
вказується запит, результат якого буде перетворений на табличний вираз. - Пишеться запит, який посилається на табличний вираз.
Приклад запиту з використанням табличного виразу:
Можна створювати декілька табличних виразів, розділяючи їх комою:
Одні табличні вирази можуть посилитися на інші табличні вирази:
Табличні вирази можна поєднувати між собою та з таблицями:
Домашнє завдання (натисніть для перегляду)
-
Напишіть запит, який посилається на регулярний табличний вираз під назвою
cities
, складений з колонокlocation
,region
, таблиціdata.location
. -
Напишіть запит, який складається з двох регулярних табличних виразів:
cities
, складений з колонокlocation
,region
, таблиціdata.location
.regions
, який розраховує кількість містlocation
по регіонахregion
з виразуcities
.
Виведіть результат виразу
regions
, відсортувавши регіони за кількістю міст від більшого до меншого.
Приклад вирішення домашнього завдання (натисніть для перегляду)
-
Напишіть запит, який посилається на регулярний табличний вираз під назвою
cities
, складений з колонокlocation
,region
, таблиціdata.location
. -
Напишіть запит, який складається з двох регулярних табличних виразів:
cities
, складений з колонокlocation
,region
, таблиціdata.location
.regions
, який розраховує кількість містlocation
по регіонахregion
з виразуcities
.
Виведіть результат виразу
regions
, відсортувавши регіони за кількістю міст від більшого до меншого.
5.2 Підзапити як часткова альтернатива.
Підзапит (subquery) – це запит, вкладений в інший запит, вони можуть використовуватись в рамках операторів select
, from
, where
.
Приклад використання запиту в рамках оператору where
наведений нижче.
Результат запиту поверне перелік замовлень, сума яких вище загальної середньої суми замовлень:
Приклад використання запиту в рамках оператору from
наведений нижче.
Результат запиту поверне перелік виконаних замовлень, сума яких вище 1000.
Приклад використання запиту в рамках оператору select
наведений нижче.
Результат запиту сегментує замовлення, в залежності від відношення їх суми замовлення до середньої суми замовлень.
Домашнє завдання (натисніть для перегляду)
- Використовуючи підзапит в рамках оператору
where
, напишіть запит який поверне усі записи відгуків з таблиціdata.opinion
, які мають оцінку нижче середньої. - Використовуючи підзапит в рамках оператору
from
, напишіть запит який поверне кількість містlocation
по регіонахregion
з таблиціdata.location
(виконайте агрегацію у підзапиті).
Приклад вирішення домашнього завдання (натисніть для перегляду)
-
Використовуючи підзапит в рамках оператору
where
, напишіть запит який поверне усі записи відгуків з таблиціdata.opinion
, які мають оцінку нижче середньої. -
Використовуючи підзапит в рамках оператору
from
, напишіть запит який поверне кількість містlocation
по регіонахregion
з таблиціdata.location
(виконайте агрегацію у підзапиті).
5.3 Робимо складні запити простіше.
Завдяки загальним табличним виразам складні по логіці запити можна робити значно простіше, розділяючи їх на блоки.
Розрахунок кількості та середньої оцінки відгуків по категоріях:
Не використовуючи CTE
Використовуючи CTE
Розрахунок кількості замовлень по категоріях:
Не використовуючи CTE (з підзапитом)
Використовуючи CTE
Розділ 6. Базові функції PostgreSQL
6.1 Базові функції у SQL.
Існує два типи функцій SQL: агрегатні функції та скалярні (не агрегатні) функції. Агрегатні функції працюють із багатьма записами та повертають підсумок, тоді як скалярні функції працюють із кожним записом окремо.
Агрегатні функції розглядались у Розділ 3. Агрегації даних .
Варто зазначити, що функції не є стандартизованими для усіх видів баз даних, тобто для виконання одних і тих самих операції над даними, різні вендори баз даних мають свої власні назви функцій, в першу чергу це стосується саме скалярних (не агрегатних) функцій. Це означає, що, наприклад, код запиту, який використовує певну функцію в PostgreSQL може не працювати в MySQL або ClickHouse.
Більшість вендорів баз даних підтримує стандартний перелік функцій для роботи з:
- Числами (виконання різноманітних математичних операцій).
- Датою та часом (визначення місяця (тижня, року), встановлення та маніпулювання часовими зонами, генерація періодів тощо).
- Текстом (виокремлення частини символів з тексту, визначення довжини тексту, переведення символів в певний регістр тощо).
Нижче наведені посилання з переліком вбудованих функцій для різних баз даних:
- Офіційна документація | Вбудовані функції PostgreSQL.
- Офіційна документація | Вбудовані функції MySQL.
- Офіційна документація | Вбудовані функції ClickHouse.
- Офіційна документація | Вбудовані функції BigQuery.
6.2 Базові функції для дати та часу.
Базові функції для роботи з часом у PostgreSQL:
current_date
- повертає поточну дату (локальну дату сервера, на якому знаходиться база даних).date_trunc()
- повертає округлений вираз дати на основі вказаної частини.date_part()
- повертає виділену частину дати, яка була вказана.generate_series()
- повертає згенерований період, на основі вказаного старту, кінця та гранулярності.
Офіційна документація | Функції для дати та часу PostgreSQL.
Приклади використання date_trunc()
:
Приклади використання date_part()
:
Приклад використання generate_series()
:
Дані, які належать до типу дати та часу можна модифікувати додаючи або віднімаючи інтервали:
6.3 Базові функції для чисел та арифметика.
Базові функції для роботи з числами у PostgreSQL:
abs()
- повертає модуль числа.round()
- повертає округлене число на основі вказаної точності.trunc()
- повертає обрізане число на основі заданої точності.sqrt()
- повертає квадратний корінь числа.cbrt()
- повертає кубічний корінь числа.
Офіційна документація | Функції для чисел PostgreSQL.
Приклади використання abs()
:
Приклади використання round()
та trunc()
:
Приклади використання sqrt()
та cbrt()
:
Арифметичні дія з числами:
6.4 Базові функції для тексту.
Базові функції для роботи з текстом у PostgreSQL:
lower()
- повертає текст у нижньому регістрі.upper()
- повертає текст у верхньому регістрі.length()
- повертає кількість символів в тексті.left()
- повертає зазначену кількість символів з лівої сторони.right()
- повертає зазначену кількість символів з правої сторони.
Офіційна документація | Функції для тексту PostgreSQL.
Приклади використання lower()
та upper()
:
Приклади використання length
:
Приклади використання left()
та right()
:
Розділ 7. Застосовуємо все на практиці
7.1 Верхньорівневий звіт інтернет-магазину.
Код звіту (натисніть для перегляду)
7.2 Попит на категорії товарів інтернет-магазину.
Код звіту (натисніть для перегляду)
Розділ 8. Зрештою
8.1 Як писати чистий та зрозумілий SQL код.
1. Для структуризації запиту використовуйте відступи та зноси після select
, from
, where
,left join
...
Уникайте
Віддавайте перевагу
2. Робіть відступи з обох сторін між операторами порівняння та математичними, логічними операторами.
3. Використовуйте псевдоніми, які покращують читабельність та зрозумілість коду.
Уникайте
Віддавайте перевагу
4. Зносьте рядок, коли він занадто великий.
Уникайте
Віддавайте перевагу
5. Розділяйте смислові блоки великих запитів коментарями та зносами.
Уникайте
Віддавайте перевагу
8.2 Як перевіряти свій код на наявність логічних помилок.
Зазвичай логічні помилки виникають при неправильному використанні логічних операторів and
і or
при фільтрації або об'єднані даних, в результаті таких помилок трапляється втрата або дублікація записів, що призводить до некоректного результату запиту.
Такого роду помилки видають себе занадто великою або маленькою сумою чи кількістю певного атрибута, наприклад, явно завищена чи занижена сума замовлень за місяць.
Якщо причина помилки не є очевидною, можна спробувати наступне:
- Розкласти запит на декілька частин, після чого поступово поєднуючи їх перевіряти на якому з етапів з'являється помилка.
- Перевірити коректність обраних типів об'єднань даних та їх умови, якщо вони є в запиті, можливо
inner join
потрібно замінити наleft join
абоunion
наunion all
. - Перевірити фільтри вказані після оператору
where
, можливо там вказаний некоректний оператор порівняння, логічний оператор. - Так само перевірити фільтри агрегатних функцій, якщо вони є.
8.3 Що робити, якщо все забулося, де знайти інформацію, щоб все згадати.
Ресурси, які можуть бути корисними при згадуванні та практиці:
- Офіційна документація | PostgreSQL.
- Ресурс з прикладами та описом SQL | PostgreSQL Tutorial.
- Ресурс з вправами SQL, які можна робити онлайн | PostgreSQL Exercises.