SQL MIN函数是一个聚合函数,用于查找表中的列或行的最小值。
在这篇文章中,你将看到如何在SQL Server中使用MIN函数。你将看到在不同的情况下,你可以使用SQL MIN函数来获得期望的结果。所以,让我们开始吧,不用多说。
SQL MIN 语法
MIN函数的语法是非常简单的。你需要传递你想找到的最小值的列,如下所示。
MIN(column_name)
SQL MIN函数的基本例子
让我们看看SQL MIN函数的一些基本例子。
执行下面的脚本,创建一个名为Scores的表,其中包含两列。"学生A "和 "学生B"。这张表将用于计算本节中的最小值。
CREATE TABLE Scores(StudentA float, StudentB float)
INSERT INTO Scores values(15,26),(10,15),(20,19),(40,35),(25,47)
下面的SELECT查询显示了表中的所有列。
SELECT * FROM Scores

让我们使用MIN函数来查找 "StudentA "列中的最小值。
SELECT MIN(StudentA) as MinA
FROM Scores
输出。

你可以看到输出中的最小值,即10。
SQL MIN函数也可以和SELECT语句一起使用,以返回两个或多个列的最小值。例如,下面的脚本从 "StudentA "和 "StudentB "两列中返回最小值。
SELECT MIN(StudentA) as MinA, MIN(StudentB) as MinB
FROM Scores
输出结果。

在上面的输出中,你可以看到 "StudentA "和 "StudentB "两列的最小值。
你也可以将WHERE子句与MIN函数结合起来使用,以过滤你的结果。下面的脚本从Scores表中 "StudentA "列的值大于20的两列中返回最小值。
SELECT MIN(StudentA) as MinA, MIN(StudentB) as MinB
FROM Scores
WHERE StudentA > 20
输出。

输出结果显示,从学生 "StudentA "列返回的大于20的最小值是25。对于 "学生B "列,返回的最小值是35。
这初看起来很奇怪,因为 "StudentB "列包含一个小于35的值26,但是 "StudentB "列的最小值却被返回35。原因是 "StudentA "列的值是15,而 "StudentB "列包含26的那一行,由于WHERE子句删除了所有 "StudentA "列包含的值小于20的行,"StudentB "列包含26的那一行也被删除。
为了找到两列中的最小值,你可以使用两个SELECT查询,然后使用UNION操作符将结果连接起来,如下所示。
SELECT MIN(StudentA) FROM Scores WHERE StudentA > 20
UNION
SELECT MIN(StudentB) FROM Scores WHERE StudentB > 20
在输出中,你会看到两行,第一行包含 "StudentA "表中大于20的最小值。第二行包含 "学生B "表中相同条件下的最小值。
跨越多个列的SQL MIN
你也可以为你表中的所有行找到跨列的最小值。例如,下面的脚本为你在前面的脚本中创建的Scores表中的每一行找到 "StudentA "和 "StudentB "表之间的最小值。一个新的列 "MinValue "被添加,它包含所有行的跨列最小值。
SELECT StudentA, StudentB,
(SELECT MIN(MinScore)
FROM (VALUES (StudentA),(StudentB)) AS UpdateScore(MinScore))
AS MinValue
FROM Scores
输出。

GROUP BY 最小值
在本节中,你将看到如何从数据库中的每组数据中获得最小值。在这一节中,你将使用Northwind样本数据库,你可以从这个链接中下载和安装。
执行以下查询,查看产品表。
USE Northwind
SELECT * FROM Products
输出。

从上表中,让我们试着找出每个产品类别的最低单价。
执行下面的查询。
USE Northwind
SELECT CategoryID, MIN(UnitPrice)
FROM Products
GROUP BY CategoryID
输出。

从上面的输出中,你可以看到不同类别中所有产品的最低单价。例如,你可以看到,对于ID为2的类别,最便宜的产品价格为10.00。
用SQL MIN过滤记录的HAVING子句
你也可以使用SQL MIN函数和HAVING子句来过滤记录。HAVING子句通常与GROUP BY子句一起使用,用于根据聚合函数过滤记录。
例如,如果你想只选择那些最小单价大于7的类别,你可以使用以下脚本。
USE Northwind
SELECT CategoryID, MIN(UnitPrice) as MinPrice
FROM Products
GROUP BY CategoryID
HAVING MIN(UnitPrice) > 7
输出。

从输出结果来看,你可以看到被选中的记录是按类别ID分组的,只有那些最小单价大于7的类别被选中。
ORDER BY子句与SQL MIN用于排序记录
ORDER BY子句是用来对选定的记录进行升序或降序排序。ORDER BY子句与GROUP BY子句一起使用时,可以通过聚合函数来排序记录。
例如,下面的脚本选择每个类别的单价的最小值,按升序排序。
USE Northwind
SELECT CategoryID, MIN(UnitPrice) as MinPrice
FROM Products
GROUP BY CategoryID
HAVING MIN(UnitPrice) > 7
ORDER BY MIN(UnitPrice)
输出。

同样,如果要对记录进行降序排序,你只需要在ORDER BY子句后面加上一个关键字DESC。
USE Northwind
SELECT CategoryID, MIN(UnitPrice) as MinPrice
FROM Products
GROUP BY CategoryID
HAVING MIN(UnitPrice) > 7
ORDER BY MIN(UnitPrice) DESC
输出。

上面的输出显示了产品表中每个类别的最低单价,按照最低价格的降序排列。
用某一列中的最小值过滤表行
很多时候,你需要根据某一列的最小值来选择行。例如,在Northwind数据库的产品表中,你可能想以最小单价选择产品的名称和单价。
为此,你可以写一个子查询,使用MIN函数来返回单价列的最小值。接下来,在外层查询中,你可以使用一个SELECT查询,该查询返回单价等于子查询返回的值(单价的最小值)的行的产品名称和单价。
USE Northwind
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice = (SELECT MIN(UnitPrice) FROM Products)
在下面的输出中,你可以看到带有最小单价的产品名称。
输出。

关于分类列的SQL MIN
除了从数字列中找到最小值外,SQL MIN函数还可以应用于分类列。在这种情况下,SQL MIN函数从按字母顺序排序的记录集中返回第一条记录。让我们来看看这个操作。
下面的脚本创建了一个名为 "Student "的表,列为 "Student_Name "和 "Student_Age"。Student_Name "列是一个分类列。
然后,该脚本从 "学生 "表中按字母顺序选择所有的记录,这些记录是按 "学生姓名 "排序的。
CREATE TABLE Student(Student_Name VARCHAR(50), Student_Age FLOAT)
INSERT INTO Student
VALUES
('John', 26),
('Nick', 15),
('Mick', 19),
('Alex', 35),
('Joseph',47)
SELECT * FROM Student
ORDER BY Student_Name
输出。

现在,如果你对 "Student_Name "列应用MIN函数,将显示 "Student_Name "列中按字母顺序排序的第一条记录,即本例中的 "Alex"。
下面是这样做的脚本。
SELECT MIN(Student_Name) as MinName
FROM Student
输出。

让我们再看看SQL MIN函数在分类列的情况下如何过滤记录的例子。让我们从Northwind数据库的产品表中获得按类别id分组的最小名称。
USE Northwind
SELECT CategoryID, MIN(ProductName) as MinName
FROM Products
GROUP BY CategoryID
输出。

你也可以使用带有ORDER BY子句的SQL MIN来对数据进行排序,在分类列上使用一个聚合函数。下面是一个例子。
USE Northwind
SELECT CategoryID, MIN(ProductName) as MinName
FROM Products
GROUP BY CategoryID
ORDER BY MIN(ProductName)
输出。

你甚至可以使用SQL MIN函数和HAVING子句来过滤分类列的数据。例如,下面的脚本从ProductName列中返回最小的产品名称,按字母顺序排序,按类别ID分组,其中最小的产品名称小于字符串 "C"。这只返回那些以 "A "或 "B "开头的产品名称,下面是一个例子。
USE Northwind
SELECT CategoryID, MIN(ProductName) as MinName
FROM Products
GROUP BY CategoryID
HAVING MIN(ProductName) < 'C'
输出。

结论
在这篇文章中,我们学习了如何使用SQL MIN函数,该函数用于查找表中列或行的最小值。