~/VibeHandbook

Языки

iso.org

SQL

Что это

SQL (Structured Query Language) — это стандартный язык для запросов и работы с реляционными базами данных, такими как PostgreSQL, MySQL, SQLite и SQL Server. Он декларативен — вы описываете нужный результат, а движок базы данных сам определяет, как эффективно его получить.

Сильные стороны

  • Декларативность: вы заявляете, что хотите, а не как перебирать строки.
  • Проверен десятилетиями, со зрелыми движками и строгими гарантиями согласованности.
  • Операции над множествами (соединения, агрегаты, оконные функции) лаконичны и быстры.
  • Переносимость — основной SQL работает в большинстве реляционных баз данных.

Компромиссы

  • Диалекты различаются (Postgres против MySQL против SQLite), поэтому переносимость не полная.
  • Легко написать медленные запросы; производительность зависит от индексов и планов запросов.
  • Не язык общего назначения — управление потоком и логика реализуются неуклюже.
  • Изменения схемы (миграции) требуют осторожности в продакшене.

Когда обращаться

Обращайтесь к SQL всякий раз, когда ваши данные реляционны и запрашиваются по структуре: отчётность, аналитика, бэкенды приложений и любая система, где важны целостность данных и соединения. Это правильный инструмент для агрегаций и произвольных вопросов к структурированным данным, и он сочетается почти с любым серверным языком.

Подходит для vibe coding

ИИ-ассистенты сильны в SQL и удивительно хорошо переводят вопросы на простом языке в запросы, но они могут гадать о вашей схеме. Направьте ИИ, вставив фактические определения таблиц (выражения CREATE TABLE) и назвав вашу конкретную базу данных (Postgres, SQLite и т. д.), чтобы он использовал правильный диалект и функции. Попросите его объяснить запрос и предложить индексы для медленных, и всегда заставляйте его параметризовать пользовательский ввод, а не склеивать значения в строку — это предотвращает SQL-инъекции. Проверяйте сгенерированные запросы на небольшой выборке, прежде чем запускать их в продакшене.

SELECT u.name, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE u.active = true
GROUP BY u.name
HAVING COUNT(o.id) > 5
ORDER BY order_count DESC;