Я думаю, что вы искали это:
^SELECT (.+) FROM (.+?)( ORDER BY (.+))?$
Обратите внимание, что я принудительно установил начальную и конечную точки строки. Таким образом, будет оцениваться необязательный порядок по, а если его нет, остальная часть кода будет включена во вторую группу совпадений.
P.S. Вы можете, конечно, отредактировать его так, как хотите. Я также поместил последние .+
в группу, чтобы вы могли легко получить доступ к ордеру по параметрам ... если вам это не нужно - вы можете удалить их:
То же самое с первым в SELECT, но я думаю, вы уже это знаете:)