Functions Review
- Recall that functions can be used to create new columns by performing computations on existing columns
Some examples…
SELECT CONCAT(text1, text2) FROM Table1; SELECT ROUND(number, decimals) FROM Table1;
- The function is applied to each row of the table
- Different columns can contribute to the calculation
- However different rows can not contribute to the calculation
Each row is isolated from other rows
Aggregate Functions
- Aggregate functions use all of the values in a row to compute a new value
Think average and sum in a spread sheet
SELECT SUM(number) FROM Table1;
- This retrieves a table with one row
As usual, the column header can be named
SELECT SUM(number) AS TOTAL FROM Table1
Some other aggregate functions
SELECT AVG(number) FROM Table1; SELECT MAX(number) FROM Table1; SELECT MIN(number) FROM Table1; SELECT COUNT(number) FROM Table1;
Can have multiple aggregate functions in one query
SELECT MIN(number), MAX(number) FROM Table1;
Can not have nested aggregate functions
SELECT AVG(MAX(number)) FROM Table1;
- But since all the aggregate functions evaluate to a single value this is a little strange and not very useful anyway
Note that it can’t be combined with a non-aggregate column
SELECT text, SUM(number) FROM Table;
- Because the retrieved columns are different sizes
It can be combined with a literal
SELECT 'Total: ', SUM(number) FROM Table;
Aggregate functions can be combined with other functions and operators
SELECT AVG(number * 2) FROM Table1; SELECT ROUND(AVG(number)) FROM Table1;
Can use filters with aggregate functions
SELECT SUM(number) FROM Table1 where number > 3;
- The filter is applied before aggregate function
Can join tables with aggregate functions
SELECT SUM(number) FROM Table1 INNER JOIN Table2 USING (id);
- Again the join is performed before the aggregate function
To use aggregate function on union, need a subquery
SELECT SUM(number) FROM (SELECT number1 AS number FROM Table1 UNION SELECT number2 FROM Table2) AS AllNumbers;
Can’t apply an aggregate function to query
SUM(SELECT number FROM Table1); -- Error
Using aggregate functions in a subquery allows the creation of more interesting filters
SELECT number FROM Table1 WHERE number > (SELECT AVG(number) FROM Table1);
- Note that the aggregate functions include duplicate values
- This may not be desired when counting
To count unique rows, use DISTINCT in the query
SELECT DISTINCT COUNT(number) FROM Table1 WHERE number < 4; -- Error
The distinct should modify the aggregate function
SELECT COUNT(DISTINCT number) FROM Table1 WHERE number < 4;
- If types are unexpected, it will convert them
- If value is null, it will ignore
Note that if all rows are null the result will be null
SELECT SUM(number) FROM Table1 WHERE number IS NULL;
If you want to include null values in count there is a special syntax
SELECT COUNT(*) FROM Table1;