Chapter 23: PostgreSQL MIN and MAX Functions
Part 1: What are MIN and MAX?
MIN returns the minimum (smallest) value in a set of values.
MAX returns the maximum (largest) value in a set of values.
These are aggregate functions – they operate on a set of rows and return a single value.
The Basic Syntax
|
0 1 2 3 4 5 6 7 |
<span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>column_name<span class="token punctuation">)</span> <span class="token keyword">FROM</span> table_name<span class="token punctuation">;</span> <span class="token keyword">SELECT</span> <span class="token function">MAX</span><span class="token punctuation">(</span>column_name<span class="token punctuation">)</span> <span class="token keyword">FROM</span> table_name<span class="token punctuation">;</span> |
You can use them together in a single query:
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>column_name<span class="token punctuation">)</span> <span class="token keyword">AS</span> smallest<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>column_name<span class="token punctuation">)</span> <span class="token keyword">AS</span> largest <span class="token keyword">FROM</span> table_name<span class="token punctuation">;</span> |
Part 2: Setting Up Our Example Data
Let’s create a comprehensive dataset to explore all the ways MIN and MAX can be used:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
<span class="token comment">-- Create an e-commerce database with multiple tables</span> <span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> products <span class="token punctuation">(</span> product_id <span class="token keyword">SERIAL</span> <span class="token keyword">PRIMARY</span> <span class="token keyword">KEY</span><span class="token punctuation">,</span> name <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">,</span> category <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">,</span> price <span class="token keyword">DECIMAL</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span> cost <span class="token keyword">DECIMAL</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span> stock_quantity <span class="token keyword">INTEGER</span><span class="token punctuation">,</span> rating <span class="token keyword">DECIMAL</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span> review_count <span class="token keyword">INTEGER</span><span class="token punctuation">,</span> launch_date <span class="token keyword">DATE</span><span class="token punctuation">,</span> discontinued_date <span class="token keyword">DATE</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- Insert diverse product data</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> products <span class="token punctuation">(</span>name<span class="token punctuation">,</span> category<span class="token punctuation">,</span> price<span class="token punctuation">,</span> cost<span class="token punctuation">,</span> stock_quantity<span class="token punctuation">,</span> rating<span class="token punctuation">,</span> review_count<span class="token punctuation">,</span> launch_date<span class="token punctuation">,</span> discontinued_date<span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token string">'Wireless Headphones'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token number">89.99</span><span class="token punctuation">,</span> <span class="token number">45.00</span><span class="token punctuation">,</span> <span class="token number">45</span><span class="token punctuation">,</span> <span class="token number">4.7</span><span class="token punctuation">,</span> <span class="token number">1250</span><span class="token punctuation">,</span> <span class="token string">'2024-01-15'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Gaming Mouse'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token number">49.99</span><span class="token punctuation">,</span> <span class="token number">25.00</span><span class="token punctuation">,</span> <span class="token number">120</span><span class="token punctuation">,</span> <span class="token number">4.5</span><span class="token punctuation">,</span> <span class="token number">890</span><span class="token punctuation">,</span> <span class="token string">'2024-01-20'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Mechanical Keyboard'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token number">129.99</span><span class="token punctuation">,</span> <span class="token number">65.00</span><span class="token punctuation">,</span> <span class="token number">35</span><span class="token punctuation">,</span> <span class="token number">4.8</span><span class="token punctuation">,</span> <span class="token number">2100</span><span class="token punctuation">,</span> <span class="token string">'2024-01-10'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'4K Monitor'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token number">399.99</span><span class="token punctuation">,</span> <span class="token number">200.00</span><span class="token punctuation">,</span> <span class="token number">18</span><span class="token punctuation">,</span> <span class="token number">4.6</span><span class="token punctuation">,</span> <span class="token number">450</span><span class="token punctuation">,</span> <span class="token string">'2024-01-05'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'USB-C Hub'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token number">39.99</span><span class="token punctuation">,</span> <span class="token number">20.00</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">4.3</span><span class="token punctuation">,</span> <span class="token number">320</span><span class="token punctuation">,</span> <span class="token string">'2024-01-25'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Coffee Maker'</span><span class="token punctuation">,</span> <span class="token string">'Appliances'</span><span class="token punctuation">,</span> <span class="token number">79.99</span><span class="token punctuation">,</span> <span class="token number">40.00</span><span class="token punctuation">,</span> <span class="token number">30</span><span class="token punctuation">,</span> <span class="token number">4.4</span><span class="token punctuation">,</span> <span class="token number">180</span><span class="token punctuation">,</span> <span class="token string">'2024-01-12'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Blender'</span><span class="token punctuation">,</span> <span class="token string">'Appliances'</span><span class="token punctuation">,</span> <span class="token number">129.99</span><span class="token punctuation">,</span> <span class="token number">65.00</span><span class="token punctuation">,</span> <span class="token number">22</span><span class="token punctuation">,</span> <span class="token number">4.6</span><span class="token punctuation">,</span> <span class="token number">290</span><span class="token punctuation">,</span> <span class="token string">'2024-01-18'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Toaster'</span><span class="token punctuation">,</span> <span class="token string">'Appliances'</span><span class="token punctuation">,</span> <span class="token number">34.99</span><span class="token punctuation">,</span> <span class="token number">17.50</span><span class="token punctuation">,</span> <span class="token number">55</span><span class="token punctuation">,</span> <span class="token number">4.2</span><span class="token punctuation">,</span> <span class="token number">110</span><span class="token punctuation">,</span> <span class="token string">'2024-01-22'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Air Fryer'</span><span class="token punctuation">,</span> <span class="token string">'Appliances'</span><span class="token punctuation">,</span> <span class="token number">149.99</span><span class="token punctuation">,</span> <span class="token number">75.00</span><span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">,</span> <span class="token number">4.8</span><span class="token punctuation">,</span> <span class="token number">520</span><span class="token punctuation">,</span> <span class="token string">'2024-01-08'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Microwave'</span><span class="token punctuation">,</span> <span class="token string">'Appliances'</span><span class="token punctuation">,</span> <span class="token number">199.99</span><span class="token punctuation">,</span> <span class="token number">100.00</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> <span class="token number">4.5</span><span class="token punctuation">,</span> <span class="token number">230</span><span class="token punctuation">,</span> <span class="token string">'2024-01-28'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Desk Chair'</span><span class="token punctuation">,</span> <span class="token string">'Furniture'</span><span class="token punctuation">,</span> <span class="token number">249.99</span><span class="token punctuation">,</span> <span class="token number">125.00</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">4.7</span><span class="token punctuation">,</span> <span class="token number">180</span><span class="token punctuation">,</span> <span class="token string">'2024-01-03'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Standing Desk'</span><span class="token punctuation">,</span> <span class="token string">'Furniture'</span><span class="token punctuation">,</span> <span class="token number">499.99</span><span class="token punctuation">,</span> <span class="token number">250.00</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">4.9</span><span class="token punctuation">,</span> <span class="token number">320</span><span class="token punctuation">,</span> <span class="token string">'2024-01-07'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Bookshelf'</span><span class="token punctuation">,</span> <span class="token string">'Furniture'</span><span class="token punctuation">,</span> <span class="token number">159.99</span><span class="token punctuation">,</span> <span class="token number">80.00</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> <span class="token number">4.4</span><span class="token punctuation">,</span> <span class="token number">95</span><span class="token punctuation">,</span> <span class="token string">'2024-01-14'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Lamp'</span><span class="token punctuation">,</span> <span class="token string">'Furniture'</span><span class="token punctuation">,</span> <span class="token number">45.99</span><span class="token punctuation">,</span> <span class="token number">23.00</span><span class="token punctuation">,</span> <span class="token number">40</span><span class="token punctuation">,</span> <span class="token number">4.3</span><span class="token punctuation">,</span> <span class="token number">140</span><span class="token punctuation">,</span> <span class="token string">'2024-01-19'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Office Cabinet'</span><span class="token punctuation">,</span> <span class="token string">'Furniture'</span><span class="token punctuation">,</span> <span class="token number">189.99</span><span class="token punctuation">,</span> <span class="token number">95.00</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">4.5</span><span class="token punctuation">,</span> <span class="token number">65</span><span class="token punctuation">,</span> <span class="token string">'2024-01-24'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Running Shoes'</span><span class="token punctuation">,</span> <span class="token string">'Sports'</span><span class="token punctuation">,</span> <span class="token number">89.99</span><span class="token punctuation">,</span> <span class="token number">45.00</span><span class="token punctuation">,</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token number">4.6</span><span class="token punctuation">,</span> <span class="token number">420</span><span class="token punctuation">,</span> <span class="token string">'2024-01-02'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Yoga Mat'</span><span class="token punctuation">,</span> <span class="token string">'Sports'</span><span class="token punctuation">,</span> <span class="token number">24.99</span><span class="token punctuation">,</span> <span class="token number">12.50</span><span class="token punctuation">,</span> <span class="token number">150</span><span class="token punctuation">,</span> <span class="token number">4.5</span><span class="token punctuation">,</span> <span class="token number">380</span><span class="token punctuation">,</span> <span class="token string">'2024-01-09'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Dumbbells Set'</span><span class="token punctuation">,</span> <span class="token string">'Sports'</span><span class="token punctuation">,</span> <span class="token number">79.99</span><span class="token punctuation">,</span> <span class="token number">40.00</span><span class="token punctuation">,</span> <span class="token number">25</span><span class="token punctuation">,</span> <span class="token number">4.7</span><span class="token punctuation">,</span> <span class="token number">210</span><span class="token punctuation">,</span> <span class="token string">'2024-01-16'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Water Bottle'</span><span class="token punctuation">,</span> <span class="token string">'Sports'</span><span class="token punctuation">,</span> <span class="token number">14.99</span><span class="token punctuation">,</span> <span class="token number">7.50</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">4.4</span><span class="token punctuation">,</span> <span class="token number">160</span><span class="token punctuation">,</span> <span class="token string">'2024-01-21'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Gym Bag'</span><span class="token punctuation">,</span> <span class="token string">'Sports'</span><span class="token punctuation">,</span> <span class="token number">39.99</span><span class="token punctuation">,</span> <span class="token number">20.00</span><span class="token punctuation">,</span> <span class="token number">35</span><span class="token punctuation">,</span> <span class="token number">4.3</span><span class="token punctuation">,</span> <span class="token number">95</span><span class="token punctuation">,</span> <span class="token string">'2024-01-26'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'The Great Gatsby'</span><span class="token punctuation">,</span> <span class="token string">'Books'</span><span class="token punctuation">,</span> <span class="token number">11.99</span><span class="token punctuation">,</span> <span class="token number">6.00</span><span class="token punctuation">,</span> <span class="token number">85</span><span class="token punctuation">,</span> <span class="token number">4.5</span><span class="token punctuation">,</span> <span class="token number">1250</span><span class="token punctuation">,</span> <span class="token string">'2024-01-04'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'1984'</span><span class="token punctuation">,</span> <span class="token string">'Books'</span><span class="token punctuation">,</span> <span class="token number">10.99</span><span class="token punctuation">,</span> <span class="token number">5.50</span><span class="token punctuation">,</span> <span class="token number">92</span><span class="token punctuation">,</span> <span class="token number">4.7</span><span class="token punctuation">,</span> <span class="token number">2100</span><span class="token punctuation">,</span> <span class="token string">'2024-01-11'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'To Kill a Mockingbird'</span><span class="token punctuation">,</span> <span class="token string">'Books'</span><span class="token punctuation">,</span> <span class="token number">12.99</span><span class="token punctuation">,</span> <span class="token number">6.50</span><span class="token punctuation">,</span> <span class="token number">78</span><span class="token punctuation">,</span> <span class="token number">4.8</span><span class="token punctuation">,</span> <span class="token number">1850</span><span class="token punctuation">,</span> <span class="token string">'2024-01-17'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Pride and Prejudice'</span><span class="token punctuation">,</span> <span class="token string">'Books'</span><span class="token punctuation">,</span> <span class="token number">9.99</span><span class="token punctuation">,</span> <span class="token number">5.00</span><span class="token punctuation">,</span> <span class="token number">110</span><span class="token punctuation">,</span> <span class="token number">4.6</span><span class="token punctuation">,</span> <span class="token number">950</span><span class="token punctuation">,</span> <span class="token string">'2024-01-23'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'The Hobbit'</span><span class="token punctuation">,</span> <span class="token string">'Books'</span><span class="token punctuation">,</span> <span class="token number">14.99</span><span class="token punctuation">,</span> <span class="token number">7.50</span><span class="token punctuation">,</span> <span class="token number">65</span><span class="token punctuation">,</span> <span class="token number">4.9</span><span class="token punctuation">,</span> <span class="token number">3200</span><span class="token punctuation">,</span> <span class="token string">'2024-01-27'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">-- Add some discontinued products</span> <span class="token punctuation">(</span><span class="token string">'Old Smartphone'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token number">199.99</span><span class="token punctuation">,</span> <span class="token number">150.00</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">3.5</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">,</span> <span class="token string">'2022-01-15'</span><span class="token punctuation">,</span> <span class="token string">'2023-12-31'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'CRT Monitor'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token number">49.99</span><span class="token punctuation">,</span> <span class="token number">40.00</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">2.8</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token string">'2020-06-01'</span><span class="token punctuation">,</span> <span class="token string">'2021-12-31'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">-- Add some products with NULL values</span> <span class="token punctuation">(</span><span class="token string">'Prototype Device'</span><span class="token punctuation">,</span> <span class="token string">'Electronics'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token string">'2024-02-01'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Sample Item'</span><span class="token punctuation">,</span> <span class="token string">'Misc'</span><span class="token punctuation">,</span> <span class="token number">0.00</span><span class="token punctuation">,</span> <span class="token number">0.00</span><span class="token punctuation">,</span> <span class="token number">999</span><span class="token punctuation">,</span> <span class="token number">0.0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token string">'2024-02-01'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- Create orders table for more complex examples</span> <span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> orders <span class="token punctuation">(</span> order_id <span class="token keyword">SERIAL</span> <span class="token keyword">PRIMARY</span> <span class="token keyword">KEY</span><span class="token punctuation">,</span> product_id <span class="token keyword">INTEGER</span> <span class="token keyword">REFERENCES</span> products<span class="token punctuation">(</span>product_id<span class="token punctuation">)</span><span class="token punctuation">,</span> customer_name <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">,</span> quantity <span class="token keyword">INTEGER</span><span class="token punctuation">,</span> unit_price <span class="token keyword">DECIMAL</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span> order_date <span class="token keyword">DATE</span><span class="token punctuation">,</span> <span class="token keyword">status</span> <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> orders <span class="token punctuation">(</span>product_id<span class="token punctuation">,</span> customer_name<span class="token punctuation">,</span> quantity<span class="token punctuation">,</span> unit_price<span class="token punctuation">,</span> order_date<span class="token punctuation">,</span> <span class="token keyword">status</span><span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token string">'Alice Johnson'</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">89.99</span><span class="token punctuation">,</span> <span class="token string">'2024-02-01'</span><span class="token punctuation">,</span> <span class="token string">'delivered'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token string">'Bob Smith'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">89.99</span><span class="token punctuation">,</span> <span class="token string">'2024-02-03'</span><span class="token punctuation">,</span> <span class="token string">'delivered'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token string">'Carol White'</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">89.99</span><span class="token punctuation">,</span> <span class="token string">'2024-02-05'</span><span class="token punctuation">,</span> <span class="token string">'shipped'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token string">'David Brown'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">129.99</span><span class="token punctuation">,</span> <span class="token string">'2024-02-02'</span><span class="token punctuation">,</span> <span class="token string">'delivered'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token string">'Eva Green'</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">129.99</span><span class="token punctuation">,</span> <span class="token string">'2024-02-04'</span><span class="token punctuation">,</span> <span class="token string">'processing'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token string">'Frank Black'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">39.99</span><span class="token punctuation">,</span> <span class="token string">'2024-02-01'</span><span class="token punctuation">,</span> <span class="token string">'delivered'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token string">'Grace Lee'</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">129.99</span><span class="token punctuation">,</span> <span class="token string">'2024-02-03'</span><span class="token punctuation">,</span> <span class="token string">'shipped'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">9</span><span class="token punctuation">,</span> <span class="token string">'Henry Ford'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">149.99</span><span class="token punctuation">,</span> <span class="token string">'2024-02-05'</span><span class="token punctuation">,</span> <span class="token string">'pending'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">,</span> <span class="token string">'Iris West'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">249.99</span><span class="token punctuation">,</span> <span class="token string">'2024-02-02'</span><span class="token punctuation">,</span> <span class="token string">'delivered'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">,</span> <span class="token string">'Jack Ryan'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">249.99</span><span class="token punctuation">,</span> <span class="token string">'2024-02-04'</span><span class="token punctuation">,</span> <span class="token string">'processing'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">15</span><span class="token punctuation">,</span> <span class="token string">'Kate Moss'</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">189.99</span><span class="token punctuation">,</span> <span class="token string">'2024-02-01'</span><span class="token punctuation">,</span> <span class="token string">'delivered'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">18</span><span class="token punctuation">,</span> <span class="token string">'Leo King'</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">79.99</span><span class="token punctuation">,</span> <span class="token string">'2024-02-03'</span><span class="token punctuation">,</span> <span class="token string">'shipped'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">21</span><span class="token punctuation">,</span> <span class="token string">'Mona Lisa'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">11.99</span><span class="token punctuation">,</span> <span class="token string">'2024-02-05'</span><span class="token punctuation">,</span> <span class="token string">'pending'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">23</span><span class="token punctuation">,</span> <span class="token string">'Nina Simone'</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">12.99</span><span class="token punctuation">,</span> <span class="token string">'2024-02-02'</span><span class="token punctuation">,</span> <span class="token string">'delivered'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">25</span><span class="token punctuation">,</span> <span class="token string">'Oscar Wilde'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">14.99</span><span class="token punctuation">,</span> <span class="token string">'2024-02-04'</span><span class="token punctuation">,</span> <span class="token string">'shipped'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Part 3: Basic MIN and MAX Usage
1. Finding the Minimum Value
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token comment">-- Find the cheapest product price</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> cheapest_price <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> price <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token comment">-- Exclude zero and NULL prices</span> |
Result:
| cheapest_price |
|---|
| 9.99 |
2. Finding the Maximum Value
|
0 1 2 3 4 5 6 7 8 |
<span class="token comment">-- Find the most expensive product price</span> <span class="token keyword">SELECT</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> most_expensive_price <span class="token keyword">FROM</span> products<span class="token punctuation">;</span> |
Result:
| most_expensive_price |
|---|
| 499.99 |
3. Getting Both Extremes Together
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment">-- Get price range for all products</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> min_price<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> max_price<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> price_range <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> price <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">;</span> |
Result:
| min_price | max_price | price_range |
|---|---|---|
| 9.99 | 499.99 | 490.00 |
4. MIN and MAX on Different Data Types
With Dates:
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token comment">-- Find the oldest and newest products</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>launch_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> oldest_product<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>launch_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> newest_product <span class="token keyword">FROM</span> products<span class="token punctuation">;</span> |
Result:
| oldest_product | newest_product |
|---|---|
| 2020-06-01 | 2024-02-01 |
With Text (Alphabetical):
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token comment">-- Find first and last product names alphabetically</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span> <span class="token keyword">AS</span> first_alphabetically<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span> <span class="token keyword">AS</span> last_alphabetically <span class="token keyword">FROM</span> products<span class="token punctuation">;</span> |
Result:
| first_alphabetically | last_alphabetically |
|---|---|
| 1984 | Yoga Mat |
Notice: Numbers come before letters in ASCII sorting, so “1984” is first.
Part 4: MIN and MAX with WHERE Clauses
1. Filtered Extremes
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token comment">-- Find the most expensive electronics</span> <span class="token keyword">SELECT</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> most_expensive_electronics <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> category <span class="token operator">=</span> <span class="token string">'Electronics'</span> <span class="token operator">AND</span> price <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">;</span> |
Result:
| most_expensive_electronics |
|---|
| 399.99 |
2. Multiple Conditions
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment">-- Find the cheapest in-stock book</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> cheapest_book <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> category <span class="token operator">=</span> <span class="token string">'Books'</span> <span class="token operator">AND</span> stock_quantity <span class="token operator">></span> <span class="token number">0</span> <span class="token operator">AND</span> price <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">;</span> |
Result:
| cheapest_book |
|---|
| 9.99 |
3. Date Ranges with MIN/MAX
|
0 1 2 3 4 5 6 7 8 9 10 11 |
<span class="token comment">-- Find the date range of products launched in 2024</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>launch_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> first_2024_launch<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>launch_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> last_2024_launch <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> launch_date <span class="token operator">>=</span> <span class="token string">'2024-01-01'</span><span class="token punctuation">;</span> |
Part 5: MIN and MAX with GROUP BY
This is where MIN and MAX become truly powerful – finding extremes within each group.
1. Minimum and Maximum per Category
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="token comment">-- Find price ranges for each product category</span> <span class="token keyword">SELECT</span> category<span class="token punctuation">,</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> min_price<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> max_price<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> price_range <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> price <span class="token operator">></span> <span class="token number">0</span> <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> category <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> max_price <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Result:
| category | min_price | max_price | price_range |
|---|---|---|---|
| Furniture | 45.99 | 499.99 | 454.00 |
| Electronics | 39.99 | 399.99 | 360.00 |
| Appliances | 34.99 | 199.99 | 165.00 |
| Sports | 14.99 | 89.99 | 75.00 |
| Books | 9.99 | 14.99 | 5.00 |
| Misc | 0.00 | 0.00 | 0.00 |
2. Multiple Aggregates with MIN/MAX
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="token comment">-- Comprehensive category statistics</span> <span class="token keyword">SELECT</span> category<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> product_count<span class="token punctuation">,</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> cheapest<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> most_expensive<span class="token punctuation">,</span> <span class="token function">MIN</span><span class="token punctuation">(</span>rating<span class="token punctuation">)</span> <span class="token keyword">AS</span> lowest_rating<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>rating<span class="token punctuation">)</span> <span class="token keyword">AS</span> highest_rating<span class="token punctuation">,</span> <span class="token function">MIN</span><span class="token punctuation">(</span>launch_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> first_launch<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>launch_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> latest_launch <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> price <span class="token operator">></span> <span class="token number">0</span> <span class="token operator">AND</span> rating <span class="token operator">IS</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> category <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> category<span class="token punctuation">;</span> |
3. Finding Oldest and Newest Products by Category
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="token comment">-- For each category, find when the first and last product was launched</span> <span class="token keyword">SELECT</span> category<span class="token punctuation">,</span> <span class="token function">MIN</span><span class="token punctuation">(</span>launch_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> category_first_product<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>launch_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> category_newest_product<span class="token punctuation">,</span> EXTRACT<span class="token punctuation">(</span><span class="token keyword">DAY</span> <span class="token keyword">FROM</span> <span class="token function">MAX</span><span class="token punctuation">(</span>launch_date<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token function">MIN</span><span class="token punctuation">(</span>launch_date<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> days_between <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> launch_date <span class="token operator">IS</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> category <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> days_between <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Part 6: MIN and MAX with HAVING
Filter groups based on their min or max values:
1. Categories with Expensive Products
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="token comment">-- Find categories where the most expensive product is over $200</span> <span class="token keyword">SELECT</span> category<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> max_price<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> product_count <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> price <span class="token operator">></span> <span class="token number">0</span> <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> category <span class="token keyword">HAVING</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">200</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> max_price <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Result:
| category | max_price | product_count |
|---|---|---|
| Furniture | 499.99 | 5 |
| Electronics | 399.99 | 5 |
| Appliances | 199.99 | 5 |
2. Categories with Narrow Price Ranges
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment">-- Find categories where all products are within $50 of each other</span> <span class="token keyword">SELECT</span> category<span class="token punctuation">,</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> min_price<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> max_price<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> price_range <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> price <span class="token operator">></span> <span class="token number">0</span> <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> category <span class="token keyword">HAVING</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">50</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> price_range<span class="token punctuation">;</span> |
Result:
| category | min_price | max_price | price_range |
|---|---|---|---|
| Books | 9.99 | 14.99 | 5.00 |
| Misc | 0.00 | 0.00 | 0.00 |
3. Categories with Recent Activity
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="token comment">-- Find categories that have products launched both before and after 2023</span> <span class="token keyword">SELECT</span> category<span class="token punctuation">,</span> <span class="token function">MIN</span><span class="token punctuation">(</span>launch_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> oldest<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>launch_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> newest <span class="token keyword">FROM</span> products <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> category <span class="token keyword">HAVING</span> <span class="token function">MIN</span><span class="token punctuation">(</span>launch_date<span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token string">'2023-01-01'</span> <span class="token operator">AND</span> <span class="token function">MAX</span><span class="token punctuation">(</span>launch_date<span class="token punctuation">)</span> <span class="token operator">>=</span> <span class="token string">'2023-01-01'</span><span class="token punctuation">;</span> |
Part 7: MIN and MAX with Joins
Combine MIN/MAX with related tables for deeper insights:
1. Best and Worst Selling Products
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="token comment">-- Find the most and least ordered products</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>o<span class="token punctuation">.</span>quantity<span class="token punctuation">)</span> <span class="token keyword">AS</span> smallest_order_quantity<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>o<span class="token punctuation">.</span>quantity<span class="token punctuation">)</span> <span class="token keyword">AS</span> largest_order_quantity<span class="token punctuation">,</span> <span class="token function">MIN</span><span class="token punctuation">(</span>p<span class="token punctuation">.</span>name<span class="token punctuation">)</span> <span class="token keyword">AS</span> product_with_smallest<span class="token punctuation">,</span> <span class="token comment">-- Not accurate, just for demo</span> <span class="token function">MAX</span><span class="token punctuation">(</span>p<span class="token punctuation">.</span>name<span class="token punctuation">)</span> <span class="token keyword">AS</span> product_with_largest <span class="token comment">-- Not accurate, just for demo</span> <span class="token keyword">FROM</span> orders o <span class="token keyword">JOIN</span> products p <span class="token keyword">ON</span> o<span class="token punctuation">.</span>product_id <span class="token operator">=</span> p<span class="token punctuation">.</span>product_id<span class="token punctuation">;</span> |
For accurate product names, we need subqueries (coming in Part 9).
2. Customer Order Statistics
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="token comment">-- For each customer, find their first and last order</span> <span class="token keyword">SELECT</span> customer_name<span class="token punctuation">,</span> <span class="token function">MIN</span><span class="token punctuation">(</span>order_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> first_order<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>order_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> last_order<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>order_date<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token function">MIN</span><span class="token punctuation">(</span>order_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> customer_lifetime_days <span class="token keyword">FROM</span> orders <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> customer_name <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> last_order <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Result:
| customer_name | first_order | last_order | customer_lifetime_days |
|---|---|---|---|
| Oscar Wilde | 2024-02-04 | 2024-02-04 | 0 |
| Nina Simone | 2024-02-02 | 2024-02-02 | 0 |
| Mona Lisa | 2024-02-05 | 2024-02-05 | 0 |
| … | … | … | … |
3. Product Performance by Category
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="token comment">-- For each category, find the highest and lowest rated product</span> <span class="token keyword">SELECT</span> p<span class="token punctuation">.</span>category<span class="token punctuation">,</span> <span class="token function">MIN</span><span class="token punctuation">(</span>p<span class="token punctuation">.</span>rating<span class="token punctuation">)</span> <span class="token keyword">AS</span> lowest_rating<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>p<span class="token punctuation">.</span>rating<span class="token punctuation">)</span> <span class="token keyword">AS</span> highest_rating<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token keyword">DISTINCT</span> o<span class="token punctuation">.</span>product_id<span class="token punctuation">)</span> <span class="token keyword">AS</span> products_with_orders <span class="token keyword">FROM</span> products p <span class="token keyword">LEFT</span> <span class="token keyword">JOIN</span> orders o <span class="token keyword">ON</span> p<span class="token punctuation">.</span>product_id <span class="token operator">=</span> o<span class="token punctuation">.</span>product_id <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> p<span class="token punctuation">.</span>category <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> highest_rating <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Part 8: MIN and MAX with NULL Values
NULL handling is crucial with aggregate functions:
1. How NULLs Affect MIN and MAX
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="token comment">-- Create a test table to demonstrate NULL behavior</span> <span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> test_nulls <span class="token punctuation">(</span><span class="token keyword">value</span> <span class="token keyword">INTEGER</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> test_nulls <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">30</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- MIN and MAX ignore NULLs</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span><span class="token keyword">value</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> min_value<span class="token punctuation">,</span> <span class="token comment">-- Returns 10</span> <span class="token function">MAX</span><span class="token punctuation">(</span><span class="token keyword">value</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> max_value <span class="token comment">-- Returns 30</span> <span class="token keyword">FROM</span> test_nulls<span class="token punctuation">;</span> |
Important: MIN and MAX ignore NULL values. They don’t return NULL unless all values are NULL.
2. All NULLs Case
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="token comment">-- If all values are NULL</span> <span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> all_nulls <span class="token punctuation">(</span><span class="token keyword">value</span> <span class="token keyword">INTEGER</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> all_nulls <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span><span class="token keyword">value</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> min_value<span class="token punctuation">,</span> <span class="token comment">-- Returns NULL</span> <span class="token function">MAX</span><span class="token punctuation">(</span><span class="token keyword">value</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> max_value <span class="token comment">-- Returns NULL</span> <span class="token keyword">FROM</span> all_nulls<span class="token punctuation">;</span> |
3. Handling NULLs Explicitly
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="token comment">-- Find the minimum price, treating NULL as 0 (if that makes sense)</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span><span class="token keyword">COALESCE</span><span class="token punctuation">(</span>price<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> min_price_with_default <span class="token keyword">FROM</span> products<span class="token punctuation">;</span> <span class="token comment">-- Or exclude NULLs explicitly</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> min_price <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> price <span class="token operator">IS</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">;</span> |
Part 9: Finding the Row with MIN or MAX Value
A common need: find the entire row that contains the minimum or maximum value.
1. Using Subqueries (The Classic Way)
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token comment">-- Find the most expensive product and all its details</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> price <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">FROM</span> products<span class="token punctuation">)</span><span class="token punctuation">;</span> |
Result:
| product_id | name | category | price | … |
|---|---|---|---|---|
| 12 | Standing Desk | Furniture | 499.99 | … |
2. Handling Ties
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token comment">-- If multiple products share the max price, this returns all of them</span> <span class="token keyword">SELECT</span> name<span class="token punctuation">,</span> price<span class="token punctuation">,</span> category <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> price <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">FROM</span> products<span class="token punctuation">)</span><span class="token punctuation">;</span> |
3. Using ORDER BY with LIMIT (Simpler but Returns Only One)
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token comment">-- Get just one most expensive product (if ties, picks one)</span> <span class="token keyword">SELECT</span> name<span class="token punctuation">,</span> price<span class="token punctuation">,</span> category <span class="token keyword">FROM</span> products <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> price <span class="token keyword">DESC</span> NULLS <span class="token keyword">LAST</span> <span class="token keyword">LIMIT</span> <span class="token number">1</span><span class="token punctuation">;</span> |
4. For Each Category – The Most Expensive Product
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="token comment">-- Classic approach with correlated subquery</span> <span class="token keyword">SELECT</span> p1<span class="token punctuation">.</span>category<span class="token punctuation">,</span> p1<span class="token punctuation">.</span>name<span class="token punctuation">,</span> p1<span class="token punctuation">.</span>price <span class="token keyword">FROM</span> products p1 <span class="token keyword">WHERE</span> p1<span class="token punctuation">.</span>price <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token keyword">SELECT</span> <span class="token function">MAX</span><span class="token punctuation">(</span>p2<span class="token punctuation">.</span>price<span class="token punctuation">)</span> <span class="token keyword">FROM</span> products p2 <span class="token keyword">WHERE</span> p2<span class="token punctuation">.</span>category <span class="token operator">=</span> p1<span class="token punctuation">.</span>category <span class="token punctuation">)</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> p1<span class="token punctuation">.</span>category<span class="token punctuation">;</span> |
Better with Window Functions:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="token comment">-- Using ROW_NUMBER() (gives one per category)</span> <span class="token keyword">WITH</span> ranked_products <span class="token keyword">AS</span> <span class="token punctuation">(</span> <span class="token keyword">SELECT</span> category<span class="token punctuation">,</span> name<span class="token punctuation">,</span> price<span class="token punctuation">,</span> ROW_NUMBER<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">OVER</span> <span class="token punctuation">(</span><span class="token keyword">PARTITION</span> <span class="token keyword">BY</span> category <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> price <span class="token keyword">DESC</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> rank <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> price <span class="token operator">></span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token keyword">SELECT</span> category<span class="token punctuation">,</span> name<span class="token punctuation">,</span> price <span class="token keyword">FROM</span> ranked_products <span class="token keyword">WHERE</span> rank <span class="token operator">=</span> <span class="token number">1</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> category<span class="token punctuation">;</span> |
Result:
| category | name | price |
|---|---|---|
| Appliances | Microwave | 199.99 |
| Books | The Hobbit | 14.99 |
| Electronics | 4K Monitor | 399.99 |
| Furniture | Standing Desk | 499.99 |
| Misc | Sample Item | 0.00 |
| Sports | Running Shoes | 89.99 |
5. Using DISTINCT ON (PostgreSQL-specific)
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="token comment">-- PostgreSQL's DISTINCT ON is perfect for this</span> <span class="token keyword">SELECT</span> <span class="token keyword">DISTINCT</span> <span class="token keyword">ON</span> <span class="token punctuation">(</span>category<span class="token punctuation">)</span> category<span class="token punctuation">,</span> name<span class="token punctuation">,</span> price <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> price <span class="token operator">></span> <span class="token number">0</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> category<span class="token punctuation">,</span> price <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Part 10: Real-World Examples
Example 1: Sales Dashboard
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<span class="token comment">-- Daily sales summary for the last 7 days</span> <span class="token keyword">WITH</span> daily_sales <span class="token keyword">AS</span> <span class="token punctuation">(</span> <span class="token keyword">SELECT</span> order_date<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> order_count<span class="token punctuation">,</span> <span class="token function">SUM</span><span class="token punctuation">(</span>quantity <span class="token operator">*</span> unit_price<span class="token punctuation">)</span> <span class="token keyword">AS</span> revenue <span class="token keyword">FROM</span> orders <span class="token keyword">WHERE</span> order_date <span class="token operator">>=</span> <span class="token keyword">CURRENT_DATE</span> <span class="token operator">-</span> <span class="token keyword">INTERVAL</span> <span class="token string">'7 days'</span> <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> order_date <span class="token punctuation">)</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>order_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> start_date<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>order_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> end_date<span class="token punctuation">,</span> <span class="token function">MIN</span><span class="token punctuation">(</span>revenue<span class="token punctuation">)</span> <span class="token keyword">AS</span> lowest_daily_revenue<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>revenue<span class="token punctuation">)</span> <span class="token keyword">AS</span> highest_daily_revenue<span class="token punctuation">,</span> <span class="token function">AVG</span><span class="token punctuation">(</span>revenue<span class="token punctuation">)</span> <span class="token keyword">AS</span> avg_daily_revenue<span class="token punctuation">,</span> <span class="token function">SUM</span><span class="token punctuation">(</span>revenue<span class="token punctuation">)</span> <span class="token keyword">AS</span> total_revenue <span class="token keyword">FROM</span> daily_sales<span class="token punctuation">;</span> |
Example 2: Inventory Management
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="token comment">-- Identify products with extreme stock levels</span> <span class="token keyword">SELECT</span> <span class="token string">'Highest Stock'</span> <span class="token keyword">AS</span> stock_level<span class="token punctuation">,</span> name<span class="token punctuation">,</span> stock_quantity <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> stock_quantity <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> <span class="token function">MAX</span><span class="token punctuation">(</span>stock_quantity<span class="token punctuation">)</span> <span class="token keyword">FROM</span> products<span class="token punctuation">)</span> <span class="token keyword">UNION</span> <span class="token keyword">ALL</span> <span class="token keyword">SELECT</span> <span class="token string">'Lowest Stock'</span><span class="token punctuation">,</span> name<span class="token punctuation">,</span> stock_quantity <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> stock_quantity <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>stock_quantity<span class="token punctuation">)</span> <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> stock_quantity <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Example 3: Customer Lifetime Value Analysis
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment">-- For each customer, find their first order, last order, and total spent</span> <span class="token keyword">SELECT</span> customer_name<span class="token punctuation">,</span> <span class="token function">MIN</span><span class="token punctuation">(</span>order_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> first_purchase<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>order_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> last_purchase<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total_orders<span class="token punctuation">,</span> <span class="token function">SUM</span><span class="token punctuation">(</span>quantity <span class="token operator">*</span> unit_price<span class="token punctuation">)</span> <span class="token keyword">AS</span> lifetime_value<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>order_date<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token function">MIN</span><span class="token punctuation">(</span>order_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> customer_tenure_days <span class="token keyword">FROM</span> orders <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> customer_name <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> lifetime_value <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Example 4: Price Range Analysis for Marketing
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<span class="token comment">-- Create price segments based on min/max</span> <span class="token keyword">WITH</span> price_stats <span class="token keyword">AS</span> <span class="token punctuation">(</span> <span class="token keyword">SELECT</span> category<span class="token punctuation">,</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> min_price<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> max_price<span class="token punctuation">,</span> <span class="token function">AVG</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> avg_price <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> price <span class="token operator">></span> <span class="token number">0</span> <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> category <span class="token punctuation">)</span> <span class="token keyword">SELECT</span> category<span class="token punctuation">,</span> min_price<span class="token punctuation">,</span> max_price<span class="token punctuation">,</span> avg_price<span class="token punctuation">,</span> <span class="token keyword">CASE</span> <span class="token keyword">WHEN</span> max_price <span class="token operator">-</span> min_price <span class="token operator"><</span> <span class="token number">20</span> <span class="token keyword">THEN</span> <span class="token string">'Narrow Range'</span> <span class="token keyword">WHEN</span> max_price <span class="token operator">-</span> min_price <span class="token operator"><</span> <span class="token number">100</span> <span class="token keyword">THEN</span> <span class="token string">'Medium Range'</span> <span class="token keyword">ELSE</span> <span class="token string">'Wide Range'</span> <span class="token keyword">END</span> <span class="token keyword">AS</span> price_range_type<span class="token punctuation">,</span> <span class="token function">ROUND</span><span class="token punctuation">(</span><span class="token punctuation">(</span>max_price <span class="token operator">-</span> min_price<span class="token punctuation">)</span> <span class="token operator">/</span> avg_price <span class="token operator">*</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> price_variation_percent <span class="token keyword">FROM</span> price_stats <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> price_variation_percent <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Example 5: Seasonal Trends
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment">-- Find the earliest and latest order for each product</span> <span class="token keyword">SELECT</span> p<span class="token punctuation">.</span>name<span class="token punctuation">,</span> p<span class="token punctuation">.</span>category<span class="token punctuation">,</span> <span class="token function">MIN</span><span class="token punctuation">(</span>o<span class="token punctuation">.</span>order_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> first_order_date<span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>o<span class="token punctuation">.</span>order_date<span class="token punctuation">)</span> <span class="token keyword">AS</span> last_order_date<span class="token punctuation">,</span> EXTRACT<span class="token punctuation">(</span><span class="token keyword">DAY</span> <span class="token keyword">FROM</span> <span class="token function">MAX</span><span class="token punctuation">(</span>o<span class="token punctuation">.</span>order_date<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token function">MIN</span><span class="token punctuation">(</span>o<span class="token punctuation">.</span>order_date<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> days_between_orders <span class="token keyword">FROM</span> products p <span class="token keyword">JOIN</span> orders o <span class="token keyword">ON</span> p<span class="token punctuation">.</span>product_id <span class="token operator">=</span> o<span class="token punctuation">.</span>product_id <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> p<span class="token punctuation">.</span>product_id<span class="token punctuation">,</span> p<span class="token punctuation">.</span>name<span class="token punctuation">,</span> p<span class="token punctuation">.</span>category <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> days_between_orders <span class="token keyword">DESC</span> NULLS <span class="token keyword">LAST</span><span class="token punctuation">;</span> |
Part 11: Performance Considerations
1. Indexes for MIN and MAX
Indexes dramatically speed up MIN and MAX queries:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="token comment">-- Create indexes on columns you frequently use with MIN/MAX</span> <span class="token keyword">CREATE</span> <span class="token keyword">INDEX</span> idx_products_price <span class="token keyword">ON</span> products<span class="token punctuation">(</span>price<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">CREATE</span> <span class="token keyword">INDEX</span> idx_products_launch_date <span class="token keyword">ON</span> products<span class="token punctuation">(</span>launch_date<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">CREATE</span> <span class="token keyword">INDEX</span> idx_orders_order_date <span class="token keyword">ON</span> orders<span class="token punctuation">(</span>order_date<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- These queries will now be extremely fast</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">FROM</span> products<span class="token punctuation">;</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>order_date<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>order_date<span class="token punctuation">)</span> <span class="token keyword">FROM</span> orders<span class="token punctuation">;</span> |
2. How PostgreSQL Optimizes MIN/MAX
With an index, PostgreSQL can get the minimum by reading just the first entry in the index:
|
0 1 2 3 4 5 6 7 |
<span class="token keyword">EXPLAIN</span> <span class="token keyword">ANALYZE</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">FROM</span> products<span class="token punctuation">;</span> |
Look for “Index Only Scan” or “Limit” in the plan – it might show that PostgreSQL only needed to read one index entry!
3. MIN/MAX on Grouped Queries
For grouped queries, a composite index on (category, price) helps:
|
0 1 2 3 4 5 6 7 8 9 10 11 |
<span class="token keyword">CREATE</span> <span class="token keyword">INDEX</span> idx_products_category_price <span class="token keyword">ON</span> products<span class="token punctuation">(</span>category<span class="token punctuation">,</span> price<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- This query will be faster</span> <span class="token keyword">SELECT</span> category<span class="token punctuation">,</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">FROM</span> products <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> category<span class="token punctuation">;</span> |
Part 12: Common Mistakes and How to Avoid Them
Mistake 1: Forgetting NULL Handling
|
0 1 2 3 4 5 6 7 8 9 10 11 |
<span class="token comment">-- ❌ If all prices are NULL, this returns NULL</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">FROM</span> products<span class="token punctuation">;</span> <span class="token comment">-- ✅ Better to provide a default or filter</span> <span class="token keyword">SELECT</span> <span class="token keyword">COALESCE</span><span class="token punctuation">(</span><span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> products<span class="token punctuation">;</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> price <span class="token operator">IS</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">;</span> |
Mistake 2: Using MIN/MAX on Text for Dates
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token comment">-- ❌ This does alphabetical comparison, not chronological</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>launch_date::<span class="token keyword">text</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> products<span class="token punctuation">;</span> <span class="token comment">-- ✅ Use proper date type</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>launch_date<span class="token punctuation">)</span> <span class="token keyword">FROM</span> products<span class="token punctuation">;</span> |
Mistake 3: Assuming MIN/MAX Return the Whole Row
|
0 1 2 3 4 5 6 7 8 9 10 11 |
<span class="token comment">-- ❌ This doesn't work - MIN(price) doesn't tie to other columns</span> <span class="token keyword">SELECT</span> name<span class="token punctuation">,</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">FROM</span> products<span class="token punctuation">;</span> <span class="token comment">-- ✅ Use a subquery or window function</span> <span class="token keyword">SELECT</span> name<span class="token punctuation">,</span> price <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> price <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">FROM</span> products<span class="token punctuation">)</span><span class="token punctuation">;</span> |
Mistake 4: Not Considering Ties
|
0 1 2 3 4 5 6 7 8 9 10 11 |
<span class="token comment">-- ❌ This might miss some products if there are ties</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> products <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> price <span class="token keyword">DESC</span> <span class="token keyword">LIMIT</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment">-- ✅ This returns all products with the max price</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> products <span class="token keyword">WHERE</span> price <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> <span class="token function">MAX</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">FROM</span> products<span class="token punctuation">)</span><span class="token punctuation">;</span> |
Mistake 5: Using MIN/MAX on Non-Indexed Columns in Large Tables
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token comment">-- ❌ This will scan the entire table</span> <span class="token keyword">SELECT</span> <span class="token function">MIN</span><span class="token punctuation">(</span>description<span class="token punctuation">)</span> <span class="token keyword">FROM</span> large_table<span class="token punctuation">;</span> <span class="token comment">-- ✅ Consider an index or different approach for large text</span> <span class="token keyword">CREATE</span> <span class="token keyword">INDEX</span> idx_large_table_description <span class="token keyword">ON</span> large_table<span class="token punctuation">(</span>description<span class="token punctuation">)</span><span class="token punctuation">;</span> |
Summary: The MIN and MAX Philosophy
MIN and MAX are your window into the boundaries of your data. Master these concepts:
-
Basic usage – Find smallest and largest values in any column
-
With GROUP BY – Find extremes within categories
-
With HAVING – Filter groups based on their extremes
-
With subqueries – Find the actual rows containing extremes
-
Performance – Indexes make MIN/MAX lightning fast
Remember:
-
MIN and MAX ignore NULL values
-
They work on numbers, dates, text – any orderable data type
-
For text, they use alphabetical order
-
Combine with GROUP BY for per-category analysis
-
Use subqueries or window functions to get full rows
Key applications:
-
Price ranges (“What’s our cheapest and most expensive product?”)
-
Date ranges (“When was our first and last order?”)
-
Performance boundaries (“Who are our highest and lowest spenders?”)
-
Quality control (“What are the best and worst rated items?”)
-
Inventory management (“Which products have the most and least stock?”)
The MIN and MAX functions transform your database from a collection of data into a source of insights about boundaries, extremes, and ranges. They answer questions like “How bad is the worst case?” and “How good is the best case?” – essential for any data analysis.
Would you like me to elaborate on any specific aspect of MIN and MAX, such as more complex use cases, performance optimization, or integration with other aggregate functions?
