Структура запроса SQL и порядок выполнения блоков
Многие думают, что SQL читается сверху вниз — как написано, так и выполняется. Но это не так.
SQL-запрос устроен хитро: порядок написания ≠ порядок выполнения.
Классический скелет запроса выглядит так:
SELECT — какие поля выбрать
FROM — из какой таблицы
JOIN — если нужно соединение
WHERE — фильтрация строк до агрегации
GROUP BY — группировка
HAVING — фильтрация групп (после агрегации)
ORDER BY — сортировка
LIMIT — ограничение количества строк
SELECT — это конструктор. Ты как будто сначала берёшь детали, потом отбираешь нужные, потом собираешь по группам, и только потом смотришь итог.
Мы привыкли, что текст читается слева направо, сверху вниз. Но не везде так:
-
в арабском и иврите — читают справа налево,
-
в китайском — традиционно писали сверху вниз.
Это не ошибка, не странность, а особенность языка, которая исторически так сложилась.
SQL — тоже «язык», и у него есть свои правила: мы пишем запрос сверху вниз, начиная с SELECT
А выполняется сам запрос совсем в другом порядке.
Об этом уже есть пост в моем новом канале На связи: SQL. Это канал про нюансы SQL, практические задачки и многое другое, что связано с аналитикой. Его я создала недавно абсолютно с нуля. Так что, если интересно, то подписывайся. А вот и ссылка на пост про последовательность выполнения запросов.
Где ещё встречается разница между тем, как пишут и как «читают»:
-
Музыка 🎼
В нотах всё аккуратно записано: сверху вниз, слева направо. Но музыкант, читая ноты, должен сначала понять тональность, размер, темп, и только потом играть каждую ноту по порядку. То есть фактически исполняется не в том же порядке, как просто «прочитал глазами». -
Рецепты в кулинарии 👩🍳
В рецепте шаги написаны линейно: 1, 2, 3. Но когда готовишь, иногда сначала ставишь воду кипятиться, пока режешь овощи. Т.е. порядок написанного ≠ фактический порядок действий. -
Юридические документы 📑
Контракт читается сверху вниз, но при толковании юристы сначала смотрят на определения терминов, потом на условия, потом на исключения. -
Программирование в целом 💻
В коде написано: «вызови функцию А, потом Б». Но компилятор или интерпретатор сначала обрабатывает импорт библиотек, парсит синтаксис, оптимизирует, и только потом «доходит» до исполнения.
В SQL — такая же история: пишем запрос сверху вниз, но база данных «читает» его по-своему. Про фактический порядок выполнения я написал подробно в своём канале На связи: SQL, так что если интересно — загляните 😉