Sams Teach Yourself SQL in 24 Hours, 3rd Edition

Sams Teach Yourself SQL in 24 Hours

By Ron Plew and Ryan Stephens

GROUP BY Versus ORDER BY

You should understand that the GROUP BY clause works the same as the ORDER BY clause in that both are used to sort data. The ORDER BY clause is specifically used to sort data from a query; the GROUP BY clause also sorts data from a query to properly group the data. Therefore, the GROUP BY clause can be used to sort data the same as the ORDER BY clause.

There are some differences and disadvantages of using GROUP BY for sorting operations:

  • All non-aggregate columns selected must be listed in the GROUP BY clause.
  • Integers cannot be used in the GROUP BY to represent columns after the SELECT keyword, similar to using the ORDER BY clause.
  • The GROUP BY clause is generally not necessary unless using aggregate functions.

An example of performing sort operations utilizing the GROUP BY clause in place of the ORDER BY clause is shown next:

   input_icon.gif

   SELECT LAST_NAME, FIRST_NAME, CITY

   FROM EMPLOYEE_TBL

   GROUP BY LAST_NAME;

   output_icon.gif
SELECT LAST_NAME, FIRST_NAME, CITY
                  *
ERROR at line 1:
ORA-00979: not a GROUP BY expression

In this example, an error was received from the database server stating that FIRST_NAME is not a GROUP BY expression. Remember that all columns and expressions in the SELECT must be listed in the GROUP BY clause, with the exception of aggregate columns (those columns targeted by an aggregate function

In the next example, the previous problem is solved by adding all expressions in the SELECT to the GROUP BY clause,:

   input_icon.gif

   SELECT LAST_NAME, FIRST_NAME, CITY

   FROM EMPLOYEE_TBL

   GROUP BY LAST_NAME, FIRST_NAME, CITY;

   output_icon.gif
LAST_NAM FIRST_NA CITY
-------- -------- ------------
GLASS    BRANDON  WHITELAND
GLASS    JACOB    INDIANAPOLIS
PLEW     LINDA    INDIANAPOLIS
SPURGEON TIFFANY  INDIANAPOLIS
STEPHENS TINA     GREENWOOD
WALLACE  MARIAH   INDIANAPOLIS

6 rows selected.

In this example, the same columns were selected from the same table, but all columns in the GROUP BY clause are listed as they appeared after the SELECT keyword. The results were ordered by LAST_NAME first, FIRST_NAME second, and CITY third. These results could have been accomplished easier with the ORDER BY clause; however, it may help you better understand how the GROUP BY works if you can visualize how it must first sort data to group data results.

The following example shows a SELECT from EMPLOYEE_TBL and uses the GROUP BY to order by CITY, which leads into the next example:

   input_icon.gif

   SELECT CITY, LAST_NAME

   FROM EMPLOYEE_TBL

   GROUP BY CITY, LAST_NAME;

   output_icon.gif
CITY         LAST_NAME
------------ ---------
GREENWOOD    STEPHENS
INDIANAPOLIS GLASS
INDIANAPOLIS PLEW
INDIANAPOLIS SPURGEON
INDIANAPOLIS WALLACE
WHITELAND    GLASS

6 rows selected.

Notice the order of data in the previous results, as well as the LAST_NAME of the individual for each CITY. All employee records in the EMPLOYEE_TBL table are now counted, and the results are grouped by CITY but ordered by the count on each city first.

   input_icon.gif

   SELECT CITY, COUNT(*)

   FROM EMPLOYEE_TBL

   GROUP BY CITY

   ORDER BY 2,1;

   output_icon.gif
CITY           COUNT(*)
-------------- --------
GREENWOOD             1
WHITELAND             1
INDIANAPOLIS          4

Notice the order of the results. The results were first sorted by the count on each city (14), and then by city. The count for the first two cities in the output is 1. Because the count is the same, which is the first expression in the ORDER BY clause, the city is then sorted; GREENWOOD is placed before WHITELAND.

Although GROUP BY and ORDER BY perform a similar function, there is one major difference. The GROUP BY is designed to group identical data, whereas the ORDER BY is designed merely to put data into a specific order. GROUP BY and ORDER BY can be used in the same SELECT statement, but must follow a specific order. The GROUP BY clause is always placed before the ORDER BY clause in the SELECT statement.

+ Share This