目录
我们看一看省略SUM如果选了不止一个的OrderPrice会怎么样:
一、SQL HAVING 语句
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
1. SQL HAVING 语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
ORDER BY field ASC/DESC (默认升序ASC 1,2...)
limit count


需要注意的是:
当同时含有where子句、group by 子句 、having子句及聚集函数时,执行顺序如下:
执行where子句查找符合条件的数据;
使用group by 子句对数据进行分组;对group by 子句形成的组运行聚集函数计算每一组的值;
最后用having 子句去掉不符合条件的组。
having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。
2. SQL HAVING 实例
我们拥有下面这个 "Orders" 表:
| O_Id | OrderDate | OrderPrice | Customer |
|---|---|---|---|
| 1 | 2008/12/29 | 1000 | Bush |
| 2 | 2008/11/23 | 1600 | Carter |
| 3 | 2008/10/05 | 700 | Bush |
| 4 | 2008/09/28 | 300 | Bush |
| 5 | 2008/08/06 | 2000 | Adams |
| 6 | 2008/07/21 | 100 | Carter |
现在,我们希望查找订单总金额少于 2000 的客户。
我们使用如下 SQL 语句:
select Customer,SUM(OrderPrice)
from Orders
group by Customer
having SUM(OrderPrice) < 2000
结果集类似:
| Customer | SUM(OrderPrice) |
|---|---|
| Carter | 1700 |
现在我们希望查找客户 "Bush" 或 "Adams" 拥有超过 1500 的订单总金额。
我们在 SQL 语句中增加了一个普通的 WHERE 子句:
SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Bush' OR Customer='Adams'
GROUP BY Customer
HAVING SUM(OrderPrice)>1500
结果集:
| Customer | SUM(OrderPrice) |
|---|---|
| Bush | 2000 |
| Adams | 2000 |
二、SQL的MAX()函数和MIN()函数
MIN() 函数
MIN 函数返回一列中的最小值。NULL 值不包括在计算中。
1. SQL MIN() 语法
SELECT MIN(column_name) FROM table_name
注释:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。
2. SQL MIN() 实例
我们拥有下面这个 "Orders" 表:
| O_Id | OrderDate | OrderPrice | Customer |
|---|---|---|---|
| 1 | 2008/12/29 | 1000 | Bush |
| 2 | 2008/11/23 | 1600 | Carter |
| 3 | 2008/10/05 | 700 | Bush |
| 4 | 2008/09/28 | 300 | Bush |
| 5 | 2008/08/06 | 2000 | Adams |
| 6 | 2008/07/21 | 100 | Carter |
现在,我们希望查找 "OrderPrice" 列的最小值。
我们使用如下 SQL 语句:
SELECT MIN(OrderPrice) AS SmallestOrderPrice FROM Orders
结果集类似这样:
| SmallestOrderPrice |
|---|
| 100 |
面试真题:SQL查询出每门课都大于80 分的学生姓名
Course表如下:

查询出每门课都大于80 分的学生姓名有两种方法。
1.select distinct name from Course where name not in (select distinct name from Course where score<=80)

2.select name from Course group by name having min(score)>80
select name
from Course
group by name
having min(score)>80

三、SQL的limit
Product表:

limit语法:
下面的SQL语句,limit只有一个参数值,将表中的前三条数据查询出来
select <列名>,<列名>,...from <表名> limit <参数值>;
select * from product limit 3;
+------------+--------------+--------------+------------+----------------+-------------+
| product_id | product_name | product_type | sale_price | purchase_price | regist_date |
+------------+--------------+--------------+------------+----------------+-------------+
| 0001 | T恤衫 | 衣服 | 1000 | 500 | 2009-09-20 |
| 0002 | 打孔器 | 办公用品 | 500 | 320 | 2009-09-11 |
| 0003 | 运动T恤 | 衣服 | 4000 | 2800 | NULL |
+------------+--------------+--------------+------------+----------------+-------------+
下面的SQL语句,limit有两个参数,第一个参数表示从第几行数据开始查,第二个参数表示查几条数据,“limit 3,2”表示从第四行数据开始,取两条数据。
select <列名>,<列名>,...from <表名> limit <参数值>,<参数值>;
select * from product limit 3,2;
+------------+--------------+--------------+------------+----------------+-------------+
| product_id | product_name | product_type | sale_price | purchase_price | regist_date |
+------------+--------------+--------------+------------+----------------+-------------+
| 0004 | 菜刀 | 厨房用具 | 3000 | 2800 | 2009-09-20 |
| 0005 | 高压锅 | 厨房用具 | 6800 | 5000 | 2009-01-15 |
+------------+--------------+--------------+------------+----------------+-------------+
四、SQL SELECT DISTINCT 语句
在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。
关键词 DISTINCT 用于返回唯一不同的值。
语法:
SELECT DISTINCT 列名称 FROM 表名称
"Orders"表:
| Company | OrderNumber |
|---|---|
| IBM | 3532 |
| W3School | 2356 |
| Apple | 4698 |
| W3School | 6953 |
使用 DISTINCT 关键词
如果要从 "Company" 列中选取所有的值,我们需要使用 SELECT 语句:
SELECT Company FROM Orders
结果:请注意,在结果集中,W3School 被列出了两次。
| Company |
|---|
| IBM |
| W3School |
| Apple |
| W3School |
如需从 Company" 列中仅选取唯一不同的值,我们需要使用 SELECT DISTINCT 语句:
SELECT DISTINCT Company FROM Orders
结果:现在,在结果集中,"W3School" 仅被列出了一次。
| Company |
|---|
| IBM |
| W3School |
| Apple |
五、SQL GROUP BY 语句
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
SQL GROUP BY 语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
SQL GROUP BY 实例
"Orders" 表:
| O_Id | OrderDate | OrderPrice | Customer |
|---|---|---|---|
| 1 | 2008/12/29 | 1000 | Bush |
| 2 | 2008/11/23 | 1600 | Carter |
| 3 | 2008/10/05 | 700 | Bush |
| 4 | 2008/09/28 | 300 | Bush |
| 5 | 2008/08/06 | 2000 | Adams |
| 6 | 2008/07/21 | 100 | Carter |
现在,我们希望查找每个客户的总金额(总订单)。
我们想要使用 GROUP BY 语句对客户进行组合。
我们使用下列 SQL 语句:
SELECT Customer,SUM(OrderPrice)
FROM Orders
GROUP BY Customer
结果集类似这样:
| Customer | SUM(OrderPrice) |
|---|---|
| Bush | 2000 |
| Carter | 1700 |
| Adams | 2000 |
很棒吧,对不对?
我们看一看省略SUM如果选了不止一个的OrderPrice会怎么样:
SELECT Customer,OrderPrice FROM orders GROUP BY Customer
报错:
省略SUM如果选了只有一个的name会怎么样:不会报错
题目:SQL查询出每门课都大于80分的学生姓名
Course表如下:

SQL语句:
select name
from Course
group by name
having min(score)>80

让我们看一下如果省略 GROUP BY 会出现什么情况:
SELECT Customer,SUM(OrderPrice) FROM Orders
结果集类似这样:下面的结果集不是我们需要的。因为有group by的时候会先执行group by再执行select
| Customer | SUM(OrderPrice) |
|---|---|
| Bush | 5700 |
| Carter | 5700 |
| Bush | 5700 |
| Bush | 5700 |
| Adams | 5700 |
| Carter | 5700 |

1695

被折叠的 条评论
为什么被折叠?



