GVKun编程网logo

Mysql入门mysql中rollup和limit的用法 mysql中where子句的优化(mysql rowid用法)

23

本篇文章给大家谈谈Mysql入门mysql中rollup和limit的用法mysql中where子句的优化,以及mysqlrowid用法的知识点,同时本文还将给你拓展mysql–带有where子句的S

本篇文章给大家谈谈Mysql入门mysql中rollup和limit的用法 mysql中where子句的优化,以及mysql rowid用法的知识点,同时本文还将给你拓展mysql – 带有where子句的SQL MIN函数、MySQL:联合索引与Where子句的优化_MySQL、MYSQL中limit的用法_MySQL、Mysql中limit的用法详解_MySQL等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Mysql入门mysql中rollup和limit的用法 mysql中where子句的优化(mysql rowid用法)

Mysql入门mysql中rollup和limit的用法 mysql中where子句的优化(mysql rowid用法)

《MysqL入门MysqL中rollup和limit的用法 MysqL中where子句的优化》要点:
本文介绍了MysqL入门MysqL中rollup和limit的用法 MysqL中where子句的优化,希望对您有用。如果有疑问,可以联系我们。

导读:本节内容:rollup和limit的用法、where子句优化.1. 使用ROLLUP的分组假设某公司某个月每个营业员的销售额 sell表,其结构如下: create ...

MysqL数据库本节内容:
rollup和limit的用法、where子句优化.

MysqL数据库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数据库表记录:
 

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   |
+--------+------------------+------------+

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

MysqL数据库办法1.
 

select sale_name as 营业员姓名,sum(sale) as 总营业额
from sell
group by sale_name
Union
select null,sum(sale)
from sell;

MysqL数据库查询结果:
 

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

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

select sale_name as 营业员姓名,sum(sale) as 总营业额
from sell
group by sale_name with rollup;
 

MysqL数据库查询结果与上面的一模一样.

MysqL数据库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;

MysqL数据库查询结果:
 

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

MysqL数据库办法2:
此处使用MysqL中的limit 如下:
 

Select sale_id  as 销售号,sale as 销售额 from sell
Order by sale DESC
LIMIT 3;
 

MysqL数据库查询结果与办法1 一模一样.

MysqL数据库关于limit 的一点补充:带有偏移量的limit.

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

Select sale_id  as 销售号,sale as 销售额 from sell
Order by sale DESC
LIMIT  2  OFFSET  3;

MysqL数据库查询结果:
 

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

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

MysqL数据库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)

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

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

《MysqL入门MysqL中rollup和limit的用法 MysqL中where子句的优化》是否对您有启发,欢迎查看更多与《MysqL入门MysqL中rollup和limit的用法 MysqL中where子句的优化》相关教程,学精学透。小编PHP学院为您提供精彩教程。

mysql – 带有where子句的SQL MIN函数

mysql – 带有where子句的SQL MIN函数

这是我的项目表

 Project Table
JNo Name    City
J1  Proj1   London
J2  Proj2   Paris
J3  Proj3   athens
J4  Proj4   India

这是我的货运表

Shipment
SNo PNo JNo Qty
S1  P1  J1  50
S1  P1  J2  90
S1  P2  J1  40
S1  P3  J3  20
S2  P1  J3  110
S2  P2  J2  30
S2  P4  J3  10
S2  P3  J1  100
S3  P1  J3  80
S3  P4  J2  70
S3  P4  J2  70
S4  P1  J3  20
S4  P2  J1  60

我想要提供最小数量的项目名称.

我试过了.但它只返回最小数量值
这是我的代码

select min(qty) from shipment where jno IN(select jno from project)
最佳答案
select p.name from Project p,Shipment s where s.JNo=p.JNo and s.Qty in (select min(qty) from shipment)

MySQL:联合索引与Where子句的优化_MySQL

MySQL:联合索引与Where子句的优化_MySQL

本网站系统上线至今,数据量已经不知不觉上到500m,近8w记录了。涉及数据库操作的基本都是变得很慢了,用的人都会觉得躁火~~然后把这个情况在群里一贴,包括机器配置什么的一说,马上就有群友发话了,而且帮我确定了不是机器配置的问题,“深圳-枪手”热心人他的机器512内存过百w的数据里也跑得飞快,甚至跟那些几w块的机器一样牛(吹过头了),呵呵~~~

在群友的分析指点下,尝试把排序、条件等一个一个去除来做测试,结果发现问题就出在排序部分,去除排序的时候,执行时间由原来的48秒变成0.3x秒,这是个什么档次的变化呀~~看着这个结果我激动ing.....

于是我把涉及排序的字段组成一个联合索引alter table xx add indexindexname(x1,x2,x3),经过2分钟创建新索引之后再执行同一个SQL语句,哇塞0.28S。。。。爽

于是按照同样的思路把其它几个常用的SQL作了过些优化,效果马上见效

过了30分钟再查slow sql记录文件,不好了,发现原来一个好好的SQL变得灰常慢了,神马情况?

几经分析和测试原来就是因为添加了联合索引的原因,而且这个SQL语句当中有个or,当把这个or改用union之后问题排除。

 

这回又得出一个心得:写SQL的时候千万别一时就手,随便写个就OK,那会为以为带来很严重的后果。

再附上一段关于Where子句的执行顺序:

在用MySQL查询数据库的时候,连接了很多个用,发现非常慢。例如:

SELECT ... WHERE p.languages_id = 1 AND m.languages_id = 1 ANDc.languages_id = 1 AND t.languages_id = 1 AND p.products_id IN(472,474)

这样查询需要20多秒,虽然在各个字段上都建立了索引。用分析ExplainSQL一分析,发现在第一次分析过程中就返回了几万条数据:

WHERE p.languages_id = 1 ,然后再依次根据条件,缩小范围。

而我改变一下WHERE 字段的位置之后,速度就有了明显地提高:

WHERE p.products_id IN (472,474) AND
p.languages_id = 1 AND m.languages_id = 1 AND c.languages_id = 1AND t.languages_id = 1

这样,第一次的条件是p.products_id IN(472,474),它返回的结果只有不到10条,接下来还要根据其它的条件来过滤,自然在速度上有了较大的提升。

经过实践发现,不要以为WHERE中的字段顺序无所谓,可以随便放在哪,应该尽可能地第一次就过滤掉大部分无用的数据,只返回最小范围的数据。

希望能帮到有同样遭遇的朋友。原文

MYSQL中limit的用法_MySQL

MYSQL中limit的用法_MySQL

Mysql中limit的用法:在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能。SELECT * FROM table   LIMIT [offset,] rows | rows OFFSET offsetLIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: 
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.//如果只给定一个参数,它表示返回最大的记录行数目: 
mysql> SELECT * FROM table LIMIT 5;     //检索前 5 个记录行//换句话说,LIMIT n 等价于 LIMIT 0,n。注意limit 10和limit 9,1的不同:例如:1.
Select * From cyclopedia Where ID>=(
Select Max(ID) From (
Select ID From cyclopedia Order By ID limit 90001
) As tmp
) limit 100;2.
Select * From cyclopedia Where ID>=(
Select Max(ID) From (
Select ID From cyclopedia Order By ID limit 90000,1
) As tmp
) limit 100;同样是取90000条后100条记录,第1句快还是第2句快?
第1句是先取了前90001条记录,取其中最大一个ID值作为起始标识,然后利用它可以快速定位下100条记录
第2句择是仅仅取90000条记录后1条,然后取ID值作起始标识定位下100条记录

第1句执行结果.100 rows in set (0.23) sec
第2句执行结果.100 rows in set (0.19) sec其实第2句完全可以简化成:Select * From cyclopedia Where ID>=(
Select ID From cyclopedia limit 90000,1
)limit 100;直接利用第90000条记录的ID,不用经过Max运算,这样做理论上效率因该高一些,但在实际使用中几乎看不到效果,因为本身定位ID返回的就是1条记录,Max几乎不用运作就能得到结果,但这样写更清淅明朗,省去了画蛇那一足.Select Top 100 * From cyclopedia Where ID>=(
Select Top 90001 Max(ID) From (
Select ID From cyclopedia Order By ID
) As tmp
)但不管是实现方式是存贮过程还是直接代码中,瓶颈始终在于MS-SQL的TOP总是要返回前N个记录,这种情况在数据量不大时感受不深,但如果成百上千万,效率肯定会低下的.相比之下MySQL的limit就有优势的多,执行:
Select ID From cyclopedia limit 90000
Select ID From cyclopedia limit 90000,1
的结果分别是:
90000 rows in set (0.36) sec
1 row in set (0.06) sec
而MS-SQL只能用Select Top 90000 ID From cyclopedia 执行时间是390ms,执行同样的操作时间也不及MySQL的360ms.limit的offset(偏移量)用于记录较多的时候,记录较少时,偏移offset较小,直接使用limit较优。offset越大,后者越优。////////////////////////////////////////////////////////////////////////1、offset比较小的时候。

select * from yanxue8_visit limit 10,10
多次运行,时间保持在0.0004-0.0005之间
Select * From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10,1
) limit 10
多次运行,时间保持在0.0005-0.0006之间,主要是0.0006
结论:偏移offset较小的时候,直接使用limit较优。这个显示是子查询的原因。


2、offset大的时候。
select * from yanxue8_visit limit 10000,10
多次运行,时间保持在0.0187左右
Select * From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10000,1
) limit 10
多次运行,时间保持在0.0061左右,只有前者的1/3。可以预先offset越大,后者越优。//////////////////////////////////////////////////////////////////////////////////////////////mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last. 
//如果只给定一个参数,它表示返回最大的记录行数目


转载自:http://blog.csdn.net/zhqingyun163/article/details/5053579

Mysql中limit的用法详解_MySQL

Mysql中limit的用法详解_MySQL

  mysql中limit的用法:在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能。


  SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

  LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。

  mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15

  //为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:

  mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.

  //如果只给定一个参数,它表示返回最大的记录行数目:

  mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行

  //换句话说,LIMIT n 等价于 LIMIT 0,n。

  注意limit 10和limit 9,1的不同:

  例如:

  1.


  Select * From cyclopedia Where ID>=(
  Select Max(ID) From (
  Select ID From cyclopedia Order By ID limit 90001
  ) As tmp
  ) limit 100;

  2.


  Select * From cyclopedia Where ID>=(
  Select Max(ID) From (
  Select ID From cyclopedia Order By ID limit 90000,1
  ) As tmp
  ) limit 100;
  

今天关于Mysql入门mysql中rollup和limit的用法 mysql中where子句的优化mysql rowid用法的介绍到此结束,谢谢您的阅读,有关mysql – 带有where子句的SQL MIN函数、MySQL:联合索引与Where子句的优化_MySQL、MYSQL中limit的用法_MySQL、Mysql中limit的用法详解_MySQL等更多相关知识的信息可以在本站进行查询。

本文标签: