Top Coursera Specialization courses

Learn SQL Tutorial for Beginners!

Part: Aggregate functions


SQL defines aggregate functions which can summarize a whole column using an aggregative operation. The two most basic aggregate functions are SUM and COUNT, which can sum the total value of a column or count the number of non-null entries that exist respectively. Another extremely useful function is the average function AVG which simply takes the SUM and divides it with the COUNT.

Here’s an example of the aggregate functions in action on a list of students and their grades:


    .exec
    CREATE TABLE grades (name TEXT, grade INTEGER);
    
    INSERT INTO grades (name, grade) VALUES
        ("John", 97), ("Eric", 88), ("Jessica", 98), ("Mike", 82), ("Jeff", NULL);
           
    SELECT "total students", COUNT(name) FROM grades;
    SELECT "total grades", COUNT(grade) FROM grades;
    SELECT "sum of grades", SUM(grade) FROM grades;
    SELECT "grade average", AVG(grade) FROM grades;
    SELECT "lowest grade", MIN(grade) FROM grades;
    SELECT "highest grade", MAX(grade) FROM grades;
    SELECT "names", GROUP_CONCAT(name) FROM grades;

Aggregating numbers can be done using mathematical functions such as SUM, COUNT, AVG, MIN, MAX, etc.

Aggregating strings is usually done using a function such as GROUP_CONCAT which simply concatenates the fields. It’s not trivial to aggregate strings, and usually also not that useful for analytical purposes.

Aggregate functions in Group By statements

When grouping rows, aggregate functions must be used on all fields which are not part of the fields being grouped. This is because referring to a column in a group by result is ambiguous. A reference to a column in a group by statement must be done using an aggregate function.

A logical example for this can be given using an example. Let’s say we have the following database:


    CREATE TABLE grades (name TEXT, class INTEGER, grade INTEGER);
    
    INSERT INTO grades (name, class, grade) VALUES
        ("John", 1, 97), ("Eric", 1, 88), ("Jessica", 1, 98), ("Mike", 1, 82), ("Jeff", 1, NULL),
        ("Ben", 2, 93), ("Andrew", 2, 82), ("Jason", 2, 87), ("Carol", 2, 99), ("Fred", 2, 79);

Once we group the results by the class number, we create two types of fields in the grouped by result:

  • Group by fields: class
  • Aggregate fields: name, grade

The group by fields can simply be selected, whereas the aggregate fields (which are not part of the group by clause) must be summarized using an aggregate function.

Let’s calculate the grade average and list of names for each class using a GROUP BY statement:


    .exec
    CREATE TABLE grades (name TEXT, class INTEGER, grade INTEGER);
    
    INSERT INTO grades (name, class, grade) VALUES
        ("John", 1, 97), ("Eric", 1, 88), ("Jessica", 1, 98), ("Mike", 1, 82), ("Jeff", 1, NULL),
        ("Ben", 2, 93), ("Andrew", 2, 82), ("Jason", 2, 87), ("Carol", 2, 99), ("Fred", 2, 79);
 
    .mode column
    .headers on
    SELECT class, GROUP_CONCAT(name), AVG(grade)
    FROM grades
    GROUP BY class;

This tutorial is based on Interactive Tutorials license


If you want to submit a tutorial, please do contact us via info at coursesim.

If you want to report a tutorial please contact us in the same way as above so we can adjust or take it down.