>> I've read in several sources that the order of retrieved rows by a
SELECT statement is undefined unless you use GROUP BY or ORDER BY. <<
Not quite right. GROUP BY has no implied ordering; some of the
earlier SQL engines did grouping with a sort and that was a side
effect. Other products use hashing and you get the smaller buckets
The ORDER BY clause is part of a cursor and not a query; cursors
convert a result set into a sequential file structure, so that
ordering makes sense.
to let the shop owner decide in which order the products appear on a
web page. <<
Create a table with two columns like (upc, sort_order), join it to the
target table and do an ORDER BY on the sort_order column. The
sort_order column should be an integer. There are some other posting
that give you the code to move things around in the list, but they are
just simple algebra and a CASE expression in an UPDATE statement.