Кратенькая лекция по SQL-образному мышлению.
SELECT выполняется следующим образом
1. Берутся все таблицы из FROM и строится их декартово произведение
2. Если есть конструкции JOIN, то из полученного декартова произведения убираются все строки, не попадающие в условия ON. (связывание)
3. К оставшимся строкам применяются условия WHERE (базовый горизонтальный фильтр) - убираются все несоответствующие.
4. К оставшимся строкам применяется группировка GROUP BY, вычисляются агрегатные функции COUNT, SUM, MIN, MAX и т.п.
5. К оставшимся строкам применяются условия HEAVING (групповой горизонтальный фильтр) - убираются все несоответствующие.
6. Проводится выборка тех полей, которые требуются для результата (вертикальный фильтр).
7. Определяются значения вычиляемых полей, применяются всякие DISTINCT и т.п..
8. Применяется сортировка ORDER BY.
По этой схеме (в обратном порядке) можно провести анализ желаемого результата - придём к исходным данным, которые нужны для получения результата. По ходу анализа выявляются потребности в подзапросах. Так рождается идея построения запроса. Когда получен окончательный запрос, дающий правильный результат - производится его оптимизация (чтобы он решал задачу, но быстрее и был проще). С опытом анализ происходит интуитивно: достаточно одного взгляда на имеющиеся и требуемые данные, чтобы ответить: 1) возможно ли получить ответ, 2) как примерно это делать.
самое то в FAQ по SQL