在mysql中,可以利用“SELECT”語句和MAX()函數(shù)來查詢最大值,該函數(shù)可返回一組值中的最大值,語法“SELECT MAX(DISTINCT expression) FROM 數(shù)據(jù)表名;”。
本教程操作環(huán)境:windows7系統(tǒng)、mysql8版本、Dell G3電腦。
在mysql中,可以利用“SELECT”語句和MAX()函數(shù)來查詢最大值。
MySQL MAX()函數(shù)返回一組值中的最大值。MAX()函數(shù)在許多查詢中非常方便,例如查找最大數(shù)量,最昂貴的產(chǎn)品以及客戶的最大付款。
MAX()函數(shù)的語法如下:
MAX(DISTINCT expression);
如果添加DISTINCT運(yùn)算符,則MAX函數(shù)返回不同值的最大值,它與所有值的最大值相同。 這意味著DISTINCT運(yùn)算符不會(huì)對MAX函數(shù)產(chǎn)生任何影響(用不用DISTINCT運(yùn)算符都可以)。
請注意,DISTINCT運(yùn)算符在其他聚合函數(shù)(如COUNT,SUM和AVG)中生效。
MySQL MAX函數(shù)示例
我們來看看示例數(shù)據(jù)庫(yiibaidb)中的payments表,其表結(jié)構(gòu)如下所示 –
mysql>?desc?payments; +----------------+---------------+------+-----+---------+-------+ |?Field??????????|?Type??????????|?Null?|?Key?|?Default?|?Extra?| +----------------+---------------+------+-----+---------+-------+ |?customerNumber?|?int(11)???????|?NO???|?PRI?|?NULL????|???????| |?checkNumber????|?varchar(50)???|?NO???|?PRI?|?NULL????|???????| |?paymentDate????|?date??????????|?NO???|?????|?NULL????|???????| |?amount?????????|?decimal(10,2)?|?NO???|?????|?NULL????|???????| +----------------+---------------+------+-----+---------+-------+ 4?rows?in?set
要在payments表中獲得最大的付款,您可以使用以下查詢:
SELECT? ????MAX(amount) FROM ????payments;
執(zhí)行上面查詢語句,得到以下結(jié)果 –
mysql>?SELECT? ????MAX(amount) FROM ????payments; +-------------+ |?MAX(amount)?| +-------------+ |?120166.58???| +-------------+ 1?row?in?set
MySQL MAX函數(shù)在子查詢中
不僅要獲得最大的付款金額,還要獲得其他付款信息,如客戶編號,支票號碼和付款日期,您可以在子查詢中使用MAX函數(shù),如下所示:
SELECT? ????* FROM ????payments WHERE ????amount?=?( ?SELECT? ????????????MAX(amount) ????????FROM ????????????payments);
執(zhí)行上面查詢語句,得到以下結(jié)果 –
+----------------+-------------+-------------+-----------+ | customerNumber | checkNumber | paymentDate | amount | +----------------+-------------+-------------+-----------+ | 141 | JE105477 | 2015-03-18 | 120166.58 | +----------------+-------------+-------------+-----------+ 1 row in set
上面查詢語句是怎么運(yùn)行的?
- 子查詢返回所有的最大付款金額。
- 外部查詢獲取的金額等于從子查詢返回的最大金額的其他相關(guān)付款信息。
不使用MAX函數(shù)的另一種方法是使用ORDER BY子句以降序?qū)Y(jié)果集進(jìn)行排序,并使用LIMIT子句獲取第一行,如下查詢:
SELECT? ????* FROM ????payments ORDER?BY?amount?DESC LIMIT?1;
執(zhí)行上面查詢語句,得到以下結(jié)果 –
+----------------+-------------+-------------+-----------+ |?customerNumber?|?checkNumber?|?paymentDate?|?amount????| +----------------+-------------+-------------+-----------+ |????????????141?|?JE105477????|?2015-03-18??|?120166.58?| +----------------+-------------+-------------+-----------+ 1?row?in?set
如果您沒有在amount列上創(chuàng)建索引,則第二個(gè)查詢執(zhí)行速度更快,因?yàn)樗鼤?huì)檢查payments表中的所有行,而第一個(gè)查詢會(huì)檢查payments表中的所有行兩次,一次是在子查詢中,另一次在外部查詢中。 但是,如果amount列被索引,則第一個(gè)查詢將執(zhí)行得更快。
具有GROUP BY子句的MySQL MAX
要找到每個(gè)組的最大值,您可以在SELECT語句中使用MAX函數(shù)與GROUP BY子句。
對于每個(gè)客戶,查詢獲得客戶已支付的最大付款,可使用以下查詢:
SELECT? ????customerNumber,?MAX(amount) FROM ????payments GROUP?BY?customerNumber ORDER?BY?MAX(amount);
執(zhí)行上面查詢語句,得到以下查詢結(jié)果 –
+----------------+-------------+ |?customerNumber?|?MAX(amount)?| +----------------+-------------+ |????????????219?|?4465.85?????| |????????????198?|?9658.74?????| |????????????381?|?14379.9?????| |????????????103?|?14571.44????| |????????????473?|?17746.26????| |????????????362?|?18473.71????| *******?此處省略一大波數(shù)據(jù)?****** |????????????148?|?105743??????| |????????????124?|?111654.4????| |????????????141?|?120166.58???| +----------------+-------------+ 98?rows?in?set
具有HAVING子句的MySQL MAX
您可以在HAVING子句中使用GROUP BY子句中的MAX函數(shù),以根據(jù)指定的條件為分組添加過濾器。
例如,以下查詢查找每個(gè)客戶的最大付款; 并根據(jù)返回款項(xiàng),如下面查詢語句,只查詢金額超過80000的付款 –
SELECT? ????customerNumber,?MAX(amount) FROM ????payments GROUP?BY?customerNumber HAVING?MAX(amount)?>?80000;
執(zhí)行上面查詢語句,得到以下結(jié)果 –
+----------------+-------------+ |?customerNumber?|?MAX(amount)?| +----------------+-------------+ |????????????114?|?82261.22????| |????????????124?|?111654.4????| |????????????141?|?120166.58???| |????????????148?|?105743??????| |????????????167?|?85024.46????| |????????????239?|?80375.24????| |????????????321?|?85559.12????| +----------------+-------------+ 7?rows?in?set
【相關(guān)推薦:mysql視頻教程】