Files
vault/Career/Database - SQL/Using Joins, Constraints, Normalization, and Subqueries.md
Zaine 5d3ed14275
Some checks failed
Build Quartz Notes / build (push) Failing after 2m40s
updates
2026-06-04 14:47:44 +01:00

270 lines
3.7 KiB
Markdown
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
note type:
- sql
- database
- theory
date: 2026-06-03
done:
link: https://app.pluralsight.com/ilx/video-courses/sql-joins-constraints-normalization-subqueries/course-overview
---
# Common Aggregate Functions
|title|cost|duration|
|---|---|---|
|Gone with the wind|390000|220|
|Frankenstein|3000000|50|
|Creature from the black lagoon|500000|79|
|NULL|100|10|
## 1. COUNT()
## Count all rows
`SELECT COUNT(*) FROM Movies;`
**Output:**
```
4
```
- Counts all rows, including rows where columns are `NULL`.
### Count non-NULL values in a column
`SELECT COUNT(title) FROM Movies;`
**Output:**
```
3
```
- `NULL` title is **not counted**.
## 2. MIN()
`SELECT MIN(cost) FROM Movies;`
**Output:**
```
100
```
- Returns the smallest value in the column.
## 3. MAX()
`SELECT MAX(cost) FROM Movies;`
**Output:**
```
3000000
```
- Returns the largest value.
## 4. SUM()
`SELECT SUM(cost) FROM Movies;`
**Output:**
```
3890100
```
Calculation:
```
390000 + 3000000 + 500000 + 100 = 3890100
```
- Adds all values in the column.
- Ignores `NULL` values (none in `cost` here).
## 5. AVG()
`SELECT AVG(cost) FROM Movies;`
**Output:**
```
972525
```
Calculation:
```
3890100 / 4 = 972525
```
- Computes the average of all values.
---
## Using Multiple Aggregates
```
SELECT
    COUNT(*) AS total_movies,
    MIN(cost) AS cheapest,
    MAX(cost) AS most_expensive,
    SUM(cost) AS total_cost,
    AVG(cost) AS average_cost
FROM Movies;
```
**Output:**
```
total_movies | cheapest | most_expensive | total_cost | average_cost
4 | 100 | 3000000 | 3890100 | 972525
```
# Filtering Aggregates
| title | cost | duration | genre |
| ------------------------------ | ------- | -------- | ------ |
| Gone with the wind | 390000 | 220 | Drama |
| Frankenstein | 3000000 | 50 | Horror |
| Creature from the black lagoon | 500000 | 79 | Horror |
| Casablanca | 1000000 | 102 | Drama |
| Toy Story | 2000000 | 81 | Family |
| NULL | 100 | 10 | Horror |
## GROUP BY
`GROUP BY` groups rows so aggregates are calculated per group rather than across the whole table.
```
SELECT genre, SUM(cost) AS total_cost
FROM Movies
GROUP BY genre;
```
Output:
```
genre | total_cost
Drama | 1390000
Horror | 3500100
Family | 2000000
```
```
SELECT genre, AVG(duration) AS avg_duration
FROM Movies
GROUP BY genre;
```
Output:
```
genre | avg_duration
Drama | 161
Horror | 46.33
Family | 81
```
---
## WHERE (filtering rows before aggregation)
`WHERE` filters rows **before** grouping and aggregation.
```
SELECT genre, COUNT(*) AS num_movies
FROM Movies
WHERE duration > 60
GROUP BY genre;
```
Output:
```
genre | num_movies
Drama | 2
Horror | 1
Family | 1
```
Explanation:
- The row with duration = 10 is excluded before grouping.
## HAVING (filtering groups after aggregation)
`HAVING` filters results **after aggregation**.
```
SELECT genre, SUM(cost) AS total_cost
FROM Movies
GROUP BY genre
HAVING SUM(cost) >= 2000000;
```
Output:
```
genre | total_cost
Horror | 3500100
Family | 2000000 -- note: included only if >= was used
```
If strictly `> 2000000`, only:
```
Horror | 3500100
```
```
SELECT genre, COUNT(*) AS num_movies
FROM Movies
GROUP BY genre
HAVING COUNT(*) > 2;
```
Output:
```
genre | num_movies
Horror | 3
```
## Combined Example
```
SELECT genre, AVG(cost) AS avg_cost
FROM Movies
WHERE duration > 60
GROUP BY genre
HAVING AVG(cost) > 1000000;
```
Steps:
1. WHERE filters rows (duration > 60)
2. GROUP BY groups remaining data
3. HAVING filters grouped results
Output:
```
genre | avg_cost
Family | 2000000
```