311

I tried but failed:

mysql> select max(1,0);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual 
that corresponds to your MySQL server version for the right syntax to use 
near '0)' at line 1
Taryn
  • 224,125
  • 52
  • 341
  • 389
Mask
  • 29,767
  • 47
  • 97
  • 123

3 Answers3

566

Use GREATEST()

E.g.:

SELECT GREATEST(2,1);

Note: Whenever if any single value contains null at that time this function always returns null (Thanks to user @sanghavi7)

NinethSense
  • 8,036
  • 2
  • 21
  • 23
  • example: select greatest(queue.count - 1, 0) from queue; – Jahmic Jun 20 '12 at 17:16
  • 41
    one thing need to keep in mind that whenever if any single value contains null at that time this function always returns null as answer! – sanghavi7 Mar 01 '13 at 12:00
  • 37
    There is also [`LEAST`](http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_least) – bobobobo Apr 13 '13 at 19:10
  • 1
    how can i run a sub query as a parameter to `GREATEST` so that i can get values for a cirtain column – Junaid Qadir Shekhanzai Jul 13 '13 at 16:11
  • 19
    To prevent the problem with null you can use ifnull. E.g. `select greatest(date1, ifnull(date2, "0000-00-00 00.00:00")) from table1 where date2 is null;` will get you date1. – Christoph Grimmer-Dietrich Nov 05 '14 at 14:24
  • sadly, if you are using `LEAST`, and you put something like `SELECT LEAST(20000, COUNT(*)) FROM massive_table WHERE index_breaking_filter;` it can't shortcut the logic after the `COUNT(*)` exceeds 20k - it takes just as long as the query without the least. – tehwalrus Nov 02 '16 at 11:05
  • 2
    If some values may be null, you can do `GREATEST(COALESCE(column1, 0), COALESCE(column2, 0))` – Sean the Bean Jul 18 '19 at 13:08
28

To get the maximum value of a column across a set of rows:

SELECT MAX(column1) FROM table; -- expect one result

To get the maximum value of a set of columns, literals, or variables for each row:

SELECT GREATEST(column1, 1, 0, @val) FROM table; -- expect many results
cs_alumnus
  • 1,419
  • 15
  • 23
  • 5
    Watch out for null values with `GREATEST`. Any null value will cause the function to return null. To prevent this, you can do `GREATEST(COALESCE(column1, 0), COALESCE(column2, 0))` – Sean the Bean Jul 18 '19 at 13:09
7

You can use GREATEST function with not nullable fields. If one of this values (or both) can be NULL, don't use it (result can be NULL).

select 
    if(
        fieldA is NULL, 
        if(fieldB is NULL, NULL, fieldB), /* second NULL is default value */
        if(fieldB is NULL, field A, GREATEST(fieldA, fieldB))
    ) as maxValue

You can change NULL to your preferred default value (if both values is NULL).

Leonid Zakharov
  • 846
  • 6
  • 11