Порядок выполнения операторов
Вы уже научились присоединять таблицы и назначать псевдонимы, но, чтобы не совершать ошибок, нужно знать порядок выполнения операторов.
Вы написали не один запрос и знаете, какой оператор указывать в начале, а какой — в конце. Повторим основные правила:
- Запрос обычно начинают с
SELECT, затем пишутFROM, а за ними следуют разныеWHEREиGROUP BY. - Некоторые операторы пишут в самом конце запроса, например
ORDER BYиLIMIT. Если есть оба оператора —LIMITнужно указать последним. - Оператор
HAVINGвсегда указывают послеGROUP BY, но никогда перед ним.
Эти правила вам должны быть знакомы, но порядок выполнения операторов может быть совсем другим.
Операторы действуют в таком порядке:
- Сначала нужно определить, откуда брать данные, поэтому первым идёт оператор
FROM. На этом же этапе объединяются таблицы операторамиJOINи назначаются для них псевдонимы. Важно учесть, что присоединение предшествует фильтрации и группировке. Это означает, что большие таблицы будут объединяться очень долго. Как решить такую проблему, вы узнаете в следующей теме. - Данные выбраны, и наступает очередь оператора
WHERE. Остаются только те данные, которые соответствуют условиям. - После срезов данные группируются оператором
GROUP BYи подсчитываются агрегирующими функциями. Обратите внимание, чтоWHEREпредшествуетGROUP BY, и это не позволяет сделать срез по группам. В момент получения среза данные ещё не сгруппировались. - Теперь наступает очередь
HAVING— отбираются уже сгруппированные данные. - Только на этом этапе происходит выбор данных с помощью оператора
SELECT, а полям в итоговой таблице присваиваются псевдонимы. По этой причине псевдонимы нельзя использовать послеWHEREиHAVING— они ещё не назначены. В некоторых СУБД псевдонимы нельзя использовать и послеGROUP BY. В PostgreSQL есть расширение, которое устраняет эту проблему. - После
SELECTсрабатывает ключевое словоDISTINCT, которое отбирает уникальные значения. - Нужные данные отобраны, и происходит сортировка. Оператор
ORDER BYдействует предпоследним. - Замыкающим будет оператор
LIMIT.