Модуль 9 · Урок 34
SELECT, filters, NULL, ORDER BY і LIMIT
QA-запит має бути не просто syntactically valid, а точним, bounded і відтворюваним: explicit scope, correct predicates, deterministic order та зрозумілий expected result.
Пишіть projection і scope явно
Називайте потрібні columns замість `SELECT *`, вказуйте schema/table aliases і мінімальний dataset. Це зменшує exposure, робить evidence стабільнішим після schema changes і полегшує review. Predicate починайте з requirement partitions, а не з того, що випадково повернула database.
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.
Офіційні джерела
Закріпіть матеріал уроку
Три сценарні питання. Для зарахування уроку потрібно дати щонайменше дві правильні відповіді.