SELECT и WHERE
Тема дорожной карты · PostgreSQL
Оператор SELECT — фундаментальная операция чтения в PostgreSQL, извлекающая строки из одной или нескольких таблиц, представлений или подзапросов; предложение WHERE фильтрует эти строки на основе булевых предикатов, возвращая только нужные данные. PostgreSQL обрабатывает запросы SELECT через основанный на стоимости планировщик запросов, который учитывает доступные индексы, статистику таблиц и методы соединения для формирования эффективного плана выполнения, доступного для анализа с помощью EXPLAIN ANALYZE. Предложение WHERE поддерживает богатый набор операторов: сравнения, LIKE, ILIKE, IN, BETWEEN, IS NULL и предикаты полнотекстового поиска, а также подзапросы и коррелированные выражения, делающие запросы SELECT PostgreSQL весьма выразительными. Правильное индексирование столбцов, используемых в предложениях WHERE, является наиболее эффективным методом настройки производительности для нагрузок с интенсивным чтением в PostgreSQL, поскольку позволяет заменить дорогостоящее последовательное сканирование на индексное. Овладение синтаксисом SELECT и WHERE — включая псевдонимы столбцов, выражения, DISTINCT, ORDER BY, LIMIT и OFFSET — является отправной точкой для всех операций администрирования баз данных PostgreSQL и разработки приложений.
Как это работает
SELECT и WHERE использует SQL: SELECT, INSERT, UPDATE, DELETE. Расширения Postgres: INSERT ... ON CONFLICT (col) DO UPDATE (upsert), INSERT ... RETURNING (получить строку без второго SELECT), UPDATE ... WHERE ... RETURNING, DELETE ... RETURNING, CTE (WITH ... AS), включая writable CTE (WITH inserted AS (INSERT ...) SELECT ...). Параметризованные запросы ($1, $2 в libpq / ? в драйверах) обязательны для безопасности.
Когда применять
INSERT ... ON CONFLICT — для идемпотентных записей (без read-then-write race). RETURNING — когда нужна строка сразу после записи. CTE — для читаемости сложных запросов; оптимизатор инлайнит простые non-recursive CTE с 12. Всегда параметризуйте — конкатенация строк это #1 путь SQL-инъекции. Многошаговые операции — в транзакцию.
Типичные ошибки
Ловушки SELECT и WHERE: DELETE FROM tbl без WHERE (пуф — данных нет); UPDATE без WHERE с тем, что ожидали (используйте BEGIN; + SELECT count(*) WHERE ...; потом UPDATE); огромные IN-списки WHERE id IN (1,2,...,10000) вместо = ANY(array) или join (парсер взрывается); нет транзакций для multi-row бизнес-операций (partial writes на крэше).