mysql中rollup和limit的用法 mysql中where子句的优化

发布时间:2021-01-11编辑:脚本学堂
本文介绍下,mysql数据库中rollup与limit的用法,以及where子句优化的相关内容,有需要的朋友参考下。

本节内容:
rollup和limit的用法、where子句优化。

1. 使用ROLLUP的分组
假设某公司某个月每个营业员的销售额 sell表,其结构如下:
 

复制代码 代码示例:
create table sell
(
sale_id int auto_increment,
sale_name varchar(10),
sale decimal(8,2),
primary key(sale_id)
);
Insert into sell
values(100000,'张三',500);
Insert into sell
values(null,'李四',300.56);
Insert into sell
values(null,'王五',350.56);
insert into sell
values(null,'李四',200.68);
Insert into sell
values(null,'王五',700.56);
insert into sell
values(null,'张三',800.56);

表记录:
 

复制代码 代码示例:
mysql> select sale_id as 销售号,sale_name as 营业员姓名,sale as 销售额 from sell;
+--------+------------------+------------+
| 销售号 | 营业员姓名 | 销售额 |
+--------+------------------+------------+
| 100000 | 张三       | 500.00   |
| 100001 | 李四       | 300.56   |
| 100002 | 王五       | 350.56   |
| 100003 | 李四       | 200.68   |
| 100004 | 王五       | 700.56   |
| 100005 | 张三       | 800.56   |
+--------+------------------+------------+

需求描述:
要查询每个营业员的总营业额,及所有营业员的总销售额?

方法1.
 

复制代码 代码示例:
select sale_name as 营业员姓名,sum(sale) as 总营业额
from sell
group by sale_name
Union
select null,sum(sale)
from sell;

查询结果:
 

+-----------------+------------+
| 营业员姓名 | 总营业额 |
+-----------------+------------+
| 李四       |   501.24 |
| 王五       |  1051.12 |
| 张三       |  1300.56 |
| NULL      |  2852.92 |
+----------------+-------------+

方法2:
使用MySQL中rollup 分组,它是通过为group by 子句添加 with rollup来简化方法1  如下:
 

复制代码 代码示例:
select sale_name as 营业员姓名,sum(sale) as 总营业额
from sell
group by sale_name with rollup;
 

查询结果与上面的一模一样。

2. select 语句中的limit 子句
比如对上面的sell 表:查询出销售额最大的三笔?
方法1:
 

复制代码 代码示例:
select sale_id  as 销售号, sale as 销售额 from sell as s1
Where 3 >
(
select count(*) from sell as s2
Where s1.sale < s2.sale
)
Order by sale DESC;

查询结果:
 

+---------+--------+
| 销售号 | 销售额 |
+---------+--------+
| 100005 | 800.56 |
| 100004 | 700.56 |
| 100000 | 500.00 |
+--------+----------+

方法2:
此处使用MySQL中的limit 如下:
 

复制代码 代码示例:
Select sale_id  as 销售号, sale as 销售额 from sell
Order by sale DESC
LIMIT 3;
 

查询结果与方法1 一模一样。

关于limit 的一点补充:带有偏移量的limit。

比如上面的sell 表中,要从除了最大三笔销售额后,查询出最大的两笔销售额?
方法:
 

复制代码 代码示例:
Select sale_id  as 销售号, sale as 销售额 from sell
Order by sale DESC
LIMIT  2  OFFSET  3;

查询结果:
 

+---------+--------+
| 销售号 | 销售额 |
+---------+--------+
| 100002 | 350.56 |
| 100001 | 300.56 |
+---------+--------+

3,优化where 子句
此部分讨论的优化where子句适用于 select ,同样也适用于delete 、update中的where子句。

1)、去掉不必要的括号
例如,以下where子句中的条件
 ((a AND b) AND c OR (((a AND b) AND (c AND d))))
优化为:
(a AND b AND c) OR (a AND b AND c AND d)

2)、常量重叠
例如下面的where子句中的条件
(a<b AND b=c) AND a=5
优化为:
b>5 AND b=c AND a=5

就是这些了,本节详细介绍了mysql数据库中,rollup和limit的用法、where子句优化的相关内容,希望对大家有所帮助。

>>> 您可能感兴趣的文章:
MySQL limit查询优化的实例详解
mysql limit,offset 区别实例分析
Mysql limit offset用法举例
mysql select查询中使用limit的例子
mysql查询中使用LIMIT的小例子
mysql查询中Limit、order的简单示例
mysql limit用法及优化详解
mysql查询优化之limit和count的优化
有关mysql中的union和order by、limit区别分析
mysql优化之LIMIT,OFFSET分页
优化mysql的limit offset的例子
mysql的limit offset,n的奥秘