in reply to Perl/Tk freezes while waiting the data to arrive on mysql server

The SQL statement is not really valid.

COUNT(*) is an aggregate function, meaning, it will aggregate data from all records (in the group) and return one record for it. Without a GROUP BY clause, there is only one group: the entire table. This means that the query will return exactly one record, and that will be the count of records in the table. Because of that, the ORDER BY clause makes no sense. Both because one record does not need an ordering, and because the column mentioned in the ORDER BY clause does not appear in the column list. (Columns not specifically mentioned in an aggregate query's GROUP BY clause are not valid to be referred to outside an aggregate function.)

To make that statement valid (and sensical) it would be written: SELECT Id, COUNT(*) FROM Items GROUP BY Id ORDER BY Id; (ASC is the default and nearly always left out.)

  • Comment on Re: Perl/Tk freezes while waiting the data to arrive on mysql server

Replies are listed 'Best First'.
Re^2: Perl/Tk freezes while waiting the data to arrive on mysql server
by graff (Chancellor) on Jan 02, 2015 at 05:09 UTC
    It's typical for a column called "id" (or "Id") to be the primary key field of the given table, so grouping by Id would be even more silly than using an "order by" clause on a query that returns just one row.

    Also, in the case of mysql, an "order by" clause can refer to any column in the table being queried, regardless whether that column is used in any way elsewhere in the query.

    So while it's true that the OP should remove the unnecessary "order by" clause, having it in there is a harmless mistake in this case.

      It's typical for a column called "id" (or "Id") to be the primary key field of the given table, so grouping by Id would be even more silly than using an "order by" clause on a query that returns just one row.

      I thought i addressed that with Because of that, the ORDER BY clause makes no sense. Perhaps i need to be clear next time.

      "id" (or "Id")

      Databases capitalize all non-quoted object names. (SQL-generators use quotes to be safe.) So, it's just a matter of personal preference. As an aside, typical SQL developers' convention is the refer to clauses without the quotes, with some capitalizing them for clarity.

      an "order by" clause can refer to any column in the table being queried, regardless whether that column is used in any way elsewhere in the query.

      I don't know about mysql, but a query with an aggregate function cannot refer to any column--even in the ORDER BY-- unless it is specified in the GROUP BY. Logically, it makes no sense. That is, unless you are grouping by it, the column doesn't exist in the data set!

      having it in there is a harmless mistake in this case.

      I don't know mysql, but on every other RDBMS it would be generating an error.