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;