Документация по SQLite
Краткий справочник по SQLite с примерами. Прочитай концепцию, посмотри код, а затем потренируйся в курсе Coddy.
Начать пошаговый курс по SQLiteПервые шаги
- Что такое SQLiteSQLite — это бессерверная SQL-база данных, которая живёт в одном файле и работает прямо внутри вашего приложения. Разбираемся, чем она отличается от обычной СУБД и где её удобно использовать.
- SQLite vs MySQLЧем на самом деле отличаются SQLite и MySQL: архитектура, конкурентный доступ, типы данных и сценарии, под которые заточена каждая из этих баз.
- SQLite vs PostgreSQLЧем на самом деле отличаются SQLite и PostgreSQL: архитектура, конкурентный доступ, типы данных и под какие задачи подходит каждая из СУБД.
- Когда нужен SQLiteРазбираемся, в каких задачах SQLite — отличный выбор, а где лучше сразу взять PostgreSQL или MySQL.
- Установка SQLiteРазбираемся, как установить SQLite на Windows, macOS и Linux: качаем утилиту командной строки, прописываем PATH и проверяем, что всё работает.
- SQLite CLIРазбираемся с консолью sqlite3: как открыть базу, выполнять запросы, использовать dot-команды и импортировать или экспортировать данные прямо из терминала.
- GUI для SQLiteОбзор графических инструментов для работы с базами SQLite: DB Browser for SQLite, SQLiteStudio и онлайн-просмотрщики .db-файлов.
- Создание БДРазбираемся, как создать базу данных SQLite: модель «база = файл», команда `sqlite3` и почему здесь нет `CREATE DATABASE`.
- База в памятиРазбираемся, как работает in-memory база данных SQLite, когда стоит брать `:memory:` и чем такой режим отличается от обычной БД в файле.
Таблицы и типы
- CREATE TABLEРазбираем CREATE TABLE в SQLite: описание колонок, ограничения, IF NOT EXISTS, временные таблицы и CREATE TABLE AS SELECT с примерами.
- Типы данныхКак SQLite на самом деле хранит значения: пять классов хранения, почему типизация динамическая и какие подводные камни ждут тех, кто пришёл из Postgres или MySQL.
- Type AffinityРазбираем систему type affinity в SQLite: пять видов сродства типов, правила выбора по объявлению колонки и почему в колонку INTEGER спокойно ложится строка.
- STRICT таблицыРазбираемся, как STRICT-таблицы в SQLite отключают гибкое хранение, отсекают значения неподходящего типа и наконец дают ту самую проверку типов, которую вы и ожидали.
- Первичный ключРазбираемся, как устроены первичные ключи в SQLite: особый INTEGER PRIMARY KEY, составные ключи, AUTOINCREMENT и подводные камни, на которых спотыкаются новички.
- ROWIDЧто такое ROWID в SQLite, почему INTEGER PRIMARY KEY превращается в его псевдоним и зачем вообще нужны таблицы WITHOUT ROWID.
- NOT NULL и DEFAULTРазбираемся, как в SQLite работают NOT NULL и DEFAULT: что они реально проверяют, как подставить CURRENT_TIMESTAMP и какие подводные камни ждут при изменении существующих таблиц.
- CHECK в SQLiteРазбираем ограничение CHECK в SQLite: проверки на уровне столбца и таблицы, именованные ограничения, правила для нескольких колонок и подводные камни с NULL.
- UNIQUE в SQLiteРазбираем ограничение UNIQUE в SQLite: на уровне столбца и таблицы, составные ключи, поведение с NULL и что делать, когда вылетает ошибка уникальности.
- DROP и ALTER TABLEРазбираем, как удалять, переименовывать и изменять таблицы в SQLite: что умеет ALTER TABLE, чего не умеет, и как пересобрать таблицу, когда штатных средств не хватает.
Вставка и изменение данных
- INSERTРазбираемся, как работает INSERT в SQLite: вставка одной строки, нескольких строк, INSERT...SELECT, значения по умолчанию и модификаторы OR IGNORE и OR REPLACE.
- UPDATEРазбираем UPDATE в SQLite: синтаксис, обязательный WHERE, обновление нескольких столбцов сразу и UPDATE ... FROM для переноса данных между таблицами.
- DELETEРазбираем DELETE в SQLite: как написать безопасный WHERE, удалить все строки, настроить каскадное удаление и получить удалённые записи через RETURNING.
- UPSERTРазбираем UPSERT в SQLite: как работает ON CONFLICT, что такое таблица excluded, в чём разница между DO UPDATE и DO NOTHING и почему это лучше INSERT OR REPLACE.
- RETURNINGРазбираемся, как работает RETURNING в SQLite: получаем изменённые строки сразу из INSERT, UPDATE или DELETE — без повторного запроса к базе.
- Импорт CSVРазбираемся, как загрузить CSV-файл в SQLite через команду .import: что делать с заголовками, как дописать данные в существующую таблицу, поменять разделитель и обойти типичные ошибки.
- Экспорт данныхРазбираемся, как выгрузить данные из SQLite через консоль sqlite3: CSV с заголовками, JSON, полный SQL-дамп и бэкап отдельной таблицы.
Запросы к данным
- SELECT: основыРазбираем SELECT в SQLite: как выбирать столбцы, считать выражения, давать псевдонимы через AS и какая модель мышления стоит за каждым запросом.
- WHEREРазбираемся, как WHERE отбирает строки в SQLite: операторы сравнения, AND/OR, LIKE, IN, BETWEEN и подвох с NULL, на который попадаются почти все.
- Операторы и NULLРазбираемся, как операторы SQLite ведут себя с NULL: почему `=` и `<>` работают не так, как кажется, и зачем нужны IS NULL, IS NOT NULL, COALESCE и IFNULL.
- ORDER BYРазбираем ORDER BY в SQLite: сортировка по возрастанию и убыванию, по нескольким столбцам, что делать с NULL и как сортировать без учёта регистра.
- LIMIT и OFFSETРазбираемся, как работают LIMIT и OFFSET в SQLite: ограничение строк, пропуск, безопасная пагинация и подводные камни производительности на больших таблицах.
- DISTINCTРазбираемся, как работает SELECT DISTINCT в SQLite: одна и несколько колонок, поведение с NULL, COUNT(DISTINCT) и когда вместо него лучше взять GROUP BY.
- CASE-выраженияКак работает CASE в SQLite — простая и поисковая формы, использование в SELECT, ORDER BY и WHERE, и когда вместо CASE удобнее IIF.
Функции и агрегаты
- Строки в SQLiteРазбираем строковые функции SQLite на практике: конкатенация через ||, SUBSTR, INSTR, REPLACE, TRIM и приёмы для очистки и преобразования текста прямо в запросах.
- Числовые функцииРазбираемся с арифметикой в SQLite: ROUND, ABS, CEIL, FLOOR, MOD, POWER, SQRT, RANDOM — и та самая ловушка с целочисленным делением, в которую попадают все.
- Дата и времяКак SQLite хранит и обрабатывает даты: пять функций работы с датой и временем, форматы, модификаторы и выбор типа хранения, который не убьёт производительность.
- Агрегатные функцииКак агрегатные функции в SQLite сворачивают множество строк в одно значение — COUNT, SUM, AVG, MIN, MAX, GROUP_CONCAT, плюс DISTINCT, FILTER и правила работы с NULL.
- GROUP BY и HAVINGРазбираемся, как GROUP BY группирует строки в SQLite, а HAVING фильтрует уже агрегированные результаты. Заодно ставим точку в споре WHERE vs HAVING.
Связи и JOIN-ы
- Внешние ключиРазбираемся, как работают foreign key в SQLite: синтаксис REFERENCES, включение проверок через PRAGMA и выбор подходящего поведения ON DELETE.
- INNER JOINРазбираем INNER JOIN в SQLite: как он работает на самом деле, что писать в ON, как соединить три таблицы и когда удобнее USING.
- LEFT JOINРазбираем LEFT JOIN в SQLite: как сохранить все строки из левой таблицы, что делать с NULL, чем отличается фильтрация в WHERE и ON и как джойнить несколько таблиц.
- Self JoinРазбираем self join в SQLite: как через алиасы соединить таблицу саму с собой, примеры с сотрудниками и руководителями, иерархические данные.
- ПодзапросыРазбираемся, как вложить один SELECT в другой в SQLite: скалярные подзапросы, IN и EXISTS, производные таблицы, коррелированные подзапросы и когда вместо подзапроса лучше написать JOIN.
- CTEРазбираем Common Table Expressions в SQLite: как через WITH давать имена подзапросам, объединять несколько CTE и писать запросы, читаемые сверху вниз.
- Рекурсивные CTEРазбираем рекурсивные CTE в SQLite: связка anchor + recursive, обход дерева родитель-потомок, генерация числовых рядов и защита от бесконечного цикла.
Индексы и производительность
- ИндексыРазбираем, как работают индексы в SQLite, когда они реально ускоряют запросы, а когда только мешают, и как проверить, что планировщик их действительно использует.
- Составные индексыРазбираемся, как работают многоколоночные индексы в SQLite, почему порядок колонок критичен и когда составной индекс реально ускоряет запросы, а когда просто занимает место.
- Частичные индексыРазбираемся, как работают частичные индексы в SQLite: индексируем только нужные строки и применяем приёмы (soft delete, частичная уникальность, горячие подмножества), которые реально дают выигрыш.
- EXPLAIN QUERY PLANРазбираемся, как с помощью EXPLAIN QUERY PLAN в SQLite понять, использует ли запрос индекс, что значат SCAN и SEARCH и как читать план для JOIN-ов.
- ANALYZE и VACUUMКак `ANALYZE` и `VACUUM` помогают держать базу SQLite быстрой и компактной — что каждая команда делает, когда их запускать и какие варианты стоит знать.
Продвинутые возможности
- ТранзакцииРазбираемся, как работают транзакции в SQLite: BEGIN, COMMIT, ROLLBACK, режим автокоммита и в чём разница между DEFERRED, IMMEDIATE и EXCLUSIVE.
- SAVEPOINTКак работают точки сохранения в SQLite — именованные метки внутри транзакции, к которым можно откатиться, не теряя всю транзакцию целиком.
- Представления (VIEW)Разбираем представления в SQLite: как сохранить запрос как виртуальную таблицу, зачем нужны временные VIEW и почему по умолчанию они доступны только для чтения.
- ТриггерыРазбираемся, как работают триггеры в SQLite: BEFORE и AFTER, INSTEAD OF на представлениях, ссылки OLD и NEW и в каких задачах триггер действительно уместен.
- JSON в SQLiteРазбираем, как SQLite хранит и обрабатывает JSON: достаём поля через json_extract, обновляем значения, разворачиваем массивы json_each и ускоряем выборки индексами по JSON-путям.
- Полнотекстовый поискРазбираемся, как прикрутить полнотекстовый поиск к SQLite через FTS5: виртуальные таблицы, оператор MATCH, ранжирование по BM25 и синхронизация индекса с основными данными.
- Оконные функцииРазбираемся с оконными функциями в SQLite: OVER, PARTITION BY, ранжирование, LAG и LEAD, а также фреймы для накопительных сумм.
- Generated колонкиРазбираемся с вычисляемыми колонками в SQLite: как объявить их через GENERATED ALWAYS AS, чем VIRTUAL отличается от STORED и как навесить на них индекс.
- ATTACH DATABASEКак ATTACH DATABASE позволяет открыть несколько SQLite-файлов в одном соединении, обращаться к ним по префиксам схем и аккуратно отвязывать после работы.
Безопасность и интеграция с приложениями
- Prepared statementsЧто такое prepared statements в SQLite, зачем они нужны и как устроен жизненный цикл prepare/bind/step/finalize, который оборачивает любой драйвер.
- Биндинг параметровКак работает биндинг параметров в SQLite — позиционные плейсхолдеры, именованные параметры и правила, по которым значения безопасно передаются из приложения.
- SQL-инъекцииПочему конкатенация строк — это дыра в безопасности, как работают SQL-инъекции на практике и как параметризованные запросы в SQLite ставят на них крест.
- Подключение к SQLiteКак приложение открывает базу SQLite: путь к файлу, строки подключения, драйверы для разных языков и настройки, которые лучше выставить сразу.
- МиграцииРазбираем, как безопасно развивать схему SQLite: версионирование через PRAGMA user_version, упорядоченные скрипты миграций и транзакции для отката изменений.
- WAL и параллелизмКак режим WAL меняет работу с конкурентным доступом в SQLite: читатели больше не мешают писателю, и наоборот. Разбираемся, зачем нужны файлы -wal и -shm.
Эксплуатация и операции
- Backup и RestoreКак безопасно делать бэкапы и восстановление базы SQLite — команда .backup, VACUUM INTO, online backup API и почему просто скопировать файл — плохая идея.
- PRAGMA настройкиРазбираем PRAGMA, которые реально влияют на работу SQLite: journal_mode, synchronous, foreign_keys, busy_timeout, cache_size — и какие значения ставить на боевом сервере.
- Частые ошибкиРазбираем ошибки SQLite, с которыми реально сталкиваешься в продакшене: database is locked, readonly database, malformed image и нарушения constraint — с готовыми решениями.