MIN() Function in MySQL

Introduction
Finding lowest values across datasets is essential for analysis and validation.
MIN() function returns smallest value from non-NULL values in column.
It is widely used for:

  • Record dates
  • Lowest prices
  • Minimum scores

What is MIN() Function
MIN() returns minimum non-NULL value in specified column or expression.
Ignores NULL values automatically.

Basic Syntax

sql

SELECT MIN(column_name) FROM table_name; 

Example

sql

SELECT MIN(marks) as lowest_marks FROM Students; 

Returns lowest mark scored by any student.

MIN with GROUP BY
Minimum per category.

sql

SELECT city, MIN(marks) as lowest_city_mark 

FROM Students 

GROUP BY city; 

MIN with WHERE
Conditional minimums.

sql

SELECT MIN(marks) FROM Students 

WHERE status = 'Active'; 

MIN with Multiple Aggregates
Combine statistics.

sql

SELECT city, 

       MIN(marks) as lowest, 

       MAX(marks) as highest, 

       AVG(marks) as average 

FROM Students 

GROUP BY city; 

MIN with ORDER BY
Sort by minimum values.

sql

SELECT department, MIN(marks) as dept_lowest 

FROM Students 

GROUP BY department 

ORDER BY dept_lowest ASC

MIN with JOIN
Minimum across relationships.

sql

SELECT c.course_name, MIN(s.marks) as course_lowest 

FROM Students s 

JOIN Courses c ON s.course_id = c.id 

GROUP BY c.id, c.course_name; 

MIN with HAVING
Filter groups by minimum.

sql

SELECT city, MIN(marks) as lowest_mark 

FROM Students 

GROUP BY city 

HAVING MIN(marks) < 40; 

Multiple MIN Functions
Different criteria minimums.

sql

SELECT city,

       MIN(CASE WHEN status = 'Active' THEN marks END) as active_min,

       MIN(CASE WHEN marks > 0 THEN marks END) as valid_min

FROM Students

GROUP BY city;

MIN with Subquery
Compare against minimum threshold.

sql

SELECT name, marks 

FROM Students 

WHERE marks = (SELECT MIN(marks) FROM Students WHERE marks IS NOT NULL); 

MIN on Dates
Earliest record.

sql

SELECT MIN(join_date) as earliest_join FROM Students; 

MIN on Strings
Lexicographically smallest.

sql

SELECT MIN(city) as first_city FROM Students; 

MIN with COALESCE
Handle all-NULL results.

sql

SELECT COALESCE(MIN(marks), 0) as safe_min FROM Students; 

Execution Order with MIN
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT

Performance Considerations

  • MIN very fast with indexes
  • MIN(DISTINCT) slower
  • Index columns used in MIN
  • Works well with sorted data

Important Notes

  • Ignores NULL values
  • Empty set returns NULL
  • Works with numbers, dates, strings
  • String MIN uses collation order
  • MIN(DISTINCT) removes duplicates first

Example Scenario
Course performance extremes:

sql

SELECT

    c.course_name,

    COUNT(s.id) as total_students,

    MIN(s.marks) as lowest_score,

    MAX(s.marks) as highest_score,

    ROUND(AVG(s.marks), 2) as average

FROM Courses c

LEFT JOIN Students s ON c.id = s.course_id

GROUP BY c.id, c.course_name

HAVING MIN(s.marks) IS NOT NULL

ORDER BY lowest_score ASC;

Common Mistakes

  • MIN on non-indexed columns (slow)
  • Surprised by NULL exclusion
  • MIN(DISTINCT) performance overhead
  • String collation affecting results
  • Forgetting COALESCE for NULL results

Key Points to Remember

  • MIN finds smallest non-NULL value
  • GROUP BY + MIN = category minimums
  • Works with numbers, dates, strings
  • Very fast with proper indexes
  • Ignores NULLs automatically
  • COALESCE(MIN(), default) for safety