8 питань

Питання на співбесіді з SQL

Питання рівня Junior

  1. 1. Які бувають типи JOIN і чим вони відрізняються?

    Відповідь

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

    Додаткове питання: Як знайти клієнтів, у яких немає жодного замовлення?

    Розбір теми в курсі: SQL і PostgreSQL

  2. 2. Що таке первинний і зовнішній ключ?

    Відповідь

    Первинний ключ однозначно ідентифікує рядок у таблиці: значення унікальні й не можуть бути NULL, і в таблиці він один. Зовнішній ключ це колонка, яка посилається на первинний або унікальний ключ іншої таблиці. Він гарантує цілісність: не можна вставити посилання на неіснуючий рядок. Поведінку при видаленні батьківського рядка задають через ON DELETE CASCADE, SET NULL або RESTRICT.

    Додаткове питання: Чим природний ключ відрізняється від сурогатного і що ви оберете?

    Розбір теми в курсі: SQL і PostgreSQL

  3. 3. Як працює GROUP BY разом з агрегатними функціями?

    Відповідь

    GROUP BY об'єднує рядки з однаковими значеннями вказаних колонок в одну групу. Агрегатні функції COUNT, SUM, AVG, MIN, MAX рахуються окремо для кожної групи. У SELECT можна вказувати лише колонки з GROUP BY або агрегати. Наприклад, SELECT customer_id, COUNT(*) FROM orders GROUP BY customer_id рахує замовлення кожного клієнта.

    Додаткове питання: Чим COUNT(*) відрізняється від COUNT(column)?

    Розбір теми в курсі: SQL і PostgreSQL

  4. 4. У чому різниця між WHERE і HAVING?

    Відповідь

    WHERE фільтрує окремі рядки до групування, тому в ньому не можна використовувати агрегатні функції. HAVING фільтрує вже сформовані групи після GROUP BY і працює з агрегатами. Наприклад, HAVING COUNT(*) > 5 залишить лише клієнтів з більш ніж п'ятьма замовленнями. Умови на звичайні колонки краще писати у WHERE, бо так обробляється менше рядків.

    Додаткове питання: У якому порядку логічно виконуються частини запиту SELECT?

    Розбір теми в курсі: SQL і PostgreSQL

  5. 5. Як у SQL працює NULL і як його правильно перевіряти?

    Відповідь

    NULL означає відсутність значення, а не нуль чи порожній рядок. Будь-яке порівняння з NULL дає UNKNOWN, тому col = NULL ніколи не спрацює, треба писати IS NULL або IS NOT NULL. Агрегати на кшталт SUM і AVG ігнорують NULL. Підставити значення за замовчуванням можна через COALESCE.

    Додаткове питання: Чому NOT IN з підзапитом, що повертає NULL, може дати порожній результат?

    Розбір теми в курсі: SQL і PostgreSQL

Питання рівня Middle

  1. 1. Що таке індекс, як він прискорює запити і яка в нього ціна?

    Відповідь

    Індекс це окрема структура даних, у PostgreSQL за замовчуванням B-tree, яка дозволяє знайти рядки без повного сканування таблиці. Він прискорює WHERE, JOIN і ORDER BY по проіндексованих колонках. Ціна в тому, що індекс займає місце і сповільнює INSERT, UPDATE і DELETE, бо його теж треба оновлювати. У складеному індексі важливий порядок колонок, а перевіряють використання індексу через EXPLAIN ANALYZE.

    Додаткове питання: Чому запит з WHERE lower(email) = ... може не використати звичайний індекс по email?

    Розбір теми в курсі: SQL і PostgreSQL

  2. 2. Що таке транзакція і що означає ACID?

    Відповідь

    Транзакція це група операцій, яка виконується як одне ціле: або всі зміни фіксуються через COMMIT, або всі скасовуються через ROLLBACK. Atomicity означає саме це «все або нічого». Consistency гарантує, що база переходить з одного коректного стану в інший з дотриманням обмежень. Isolation визначає, наскільки паралельні транзакції бачать зміни одна одної, а Durability гарантує, що зафіксовані дані не зникнуть після збою.

    Додаткове питання: Які рівні ізоляції є в PostgreSQL і який стоїть за замовчуванням?

    Розбір теми в курсі: SQL і PostgreSQL

  3. 3. Що таке проблема N+1 запитів і як її виправити?

    Відповідь

    N+1 виникає, коли код спершу отримує список із N записів одним запитом, а потім для кожного робить ще один запит за пов'язаними даними. Це N+1 звернень до бази замість одного чи двох, і на великих списках затримка стає помітною. Виправляють через JOIN, один запит із WHERE id IN (...) або eager loading в ORM. Помітити проблему допомагає лог SQL-запитів.

    Додаткове питання: Як ця проблема проявляється в GraphQL і що таке DataLoader?

    Розбір теми в курсі: SQL і PostgreSQL

Тренуй ці питання

Вчи картки, відповідай текстом або голосом і отримуй оцінку AI. Потрібен вхід в акаунт.

Відповідай уголос і отримуй оцінку

Тут питання з еталонними відповідями. У застосунку ShortLesson ти відповідаєш сам, текстом або голосом, а AI оцінює відповідь за критеріями і ставить додаткове питання, як на справжній співбесіді.

Застосунок незабаром з'явиться в магазинах.

Інші теми