Модуль 9 · Урок 34

SELECT, filters, NULL, ORDER BY і LIMIT

QA-запит має бути не просто syntactically valid, а точним, bounded і відтворюваним: explicit scope, correct predicates, deterministic order та зрозумілий expected result.

SELECTWHERE & NULLORDER BYLIMIT

Пишіть projection і scope явно

Називайте потрібні columns замість `SELECT *`, вказуйте schema/table aliases і мінімальний dataset. Це зменшує exposure, робить evidence стабільнішим після schema changes і полегшує review. Predicate починайте з requirement partitions, а не з того, що випадково повернула database.

QA query header
Purpose → environment/schema version → allowed tables → timezone → expected row/value → maximum rows/runtime → evidence/redaction rule.

NULL і three-valued logic

Порівняння `column = NULL` не дає true; використовуйте `IS NULL` або `IS NOT NULL`. У SQL predicate може бути true, false або unknown, і WHERE залишає лише true. Додавайте parentheses для змішаних AND/OR — operator precedence не повинна бути прихованим oracle.

РизикБезпечна перевірка
NULL vs emptyОкремі cases для NULL, empty string, whitespace і absent input upstream.
Implicit castЗвірити data type; не порівнювати text date/number як справжній date/number.
TimezoneФіксувати zone й boundaries; `timestamptz` display залежить від session timezone.
PatternРозуміти `%`/`_`, escaping, case/collation semantics.

ORDER BY робить sample deterministic

Без `ORDER BY` database може повернути rows у будь-якому порядку. Для pagination/sample додайте стабільний unique tie-breaker: наприклад `ORDER BY created_at, member_id`. `LIMIT` без unique ordering не визначає, які саме rows потраплять у підмножину; великий OFFSET також може бути дорогим.

LIMIT не є повним захистом

Невдалий JOIN або filter може бути expensive до застосування LIMIT. На дозволеній системі використовуйте statement timeout, explain-only review, narrow indexes/filters і stop rule за домовленістю з owner.

Практика

Запустіть `qa-readonly-checks.sql` тільки у synthetic local BookFlow. Порівняйте result із `expected-results.csv`, змініть один predicate так, щоб продемонструвати NULL/AND-OR помилку, а потім виправте її й запишіть evidence.

Офіційні джерела

Практична перевірка · урок 34 з 44

Закріпіть матеріал уроку

Три сценарні питання. Для зарахування уроку потрібно дати щонайменше дві правильні відповіді.

1. Чому QA evidence краще з explicit columns?
2. Як перевірити SQL NULL?
3. Які rows залишає WHERE?