MySQL中的RAND()函数使用详解

MySQL中的RAND()函数使用详解,第1张

这篇文章主要介绍了MySQL中的RAND()函数使用详解,是MySQL入门学习中的基础知识,需要的朋友可以参考下

MySQL

RAND()函数调用可以在0和1之间产生一个随机数:

?

1

2

3

4

5

6

7

mysql

SELECT

RAND(

),

RAND(

),

RAND(

)

+------------------+-----------------+------------------+

|

RAND(

)

|

RAND(

)

|

RAND(

)

|

+------------------+-----------------+------------------+

|

0.45464584925645

|

0.1824410643265

|

0.54826780459682

|

+------------------+-----------------+------------------+

1

row

in

set

(0.00

sec)

当调用一个整数参数时,RAND()使用该随机数发生器种子值。每次在给定值种子生成,RAND()会产生一个可重复的一系列数字:

?

1

2

3

4

5

6

7

mysql

SELECT

RAND(1),

RAND(

),

RAND(

)

+------------------+------------------+------------------+

|

RAND(1

)

|

RAND(

)

|

RAND(

)

|

+------------------+------------------+------------------+

|

0.18109050223705

|

0.75023211143001

|

0.20788908117254

|

+------------------+------------------+------------------+

1

row

in

set

(0.00

sec)

可以使用ORDER

BY

RAND(),随机组行或值如下:

要了解ORDER

BY

RAND()函数,

假设EMPLOYEE_TBL的表有以下记录:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

mysql

SELECT

*

FROM

employee_tbl

+------+------+------------+--------------------+

|

id

|

name

|

work_date

|

daily_typing_pages

|

+------+------+------------+--------------------+

|

1

|

John

|

2007-01-24

|

250

|

|

2

|

Ram

|

2007-05-27

|

220

|

|

3

|

Jack

|

2007-05-06

|

170

|

|

3

|

Jack

|

2007-04-06

|

100

|

|

4

|

Jill

|

2007-04-06

|

220

|

|

5

|

Zara

|

2007-06-06

|

300

|

|

5

|

Zara

|

2007-02-06

|

350

|

+------+------+------------+--------------------+

7

rows

in

set

(0.00

sec)

现在使用以下目录:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

mysql

SELECT

*

FROM

employee_tbl

ORDER

BY

RAND()

+------+------+------------+--------------------+

|

id

|

name

|

work_date

|

daily_typing_pages

|

+------+------+------------+--------------------+

|

5

|

Zara

|

2007-06-06

|

300

|

|

3

|

Jack

|

2007-04-06

|

100

|

|

3

|

Jack

|

2007-05-06

|

170

|

|

2

|

Ram

|

2007-05-27

|

220

|

|

4

|

Jill

|

2007-04-06

|

220

|

|

5

|

Zara

|

2007-02-06

|

350

|

|

1

|

John

|

2007-01-24

|

250

|

+------+------+------------+--------------------+

7

rows

in

set

(0.01

sec)

mysql

SELECT

*

FROM

employee_tbl

ORDER

BY

RAND()

+------+------+------------+--------------------+

|

id

|

name

|

work_date

|

daily_typing_pages

|

+------+------+------------+--------------------+

|

5

|

Zara

|

2007-02-06

|

350

|

|

2

|

Ram

|

2007-05-27

|

220

|

|

3

|

Jack

|

2007-04-06

|

100

|

|

1

|

John

|

2007-01-24

|

250

|

|

4

|

Jill

|

2007-04-06

|

220

|

|

3

|

Jack

|

2007-05-06

|

170

|

|

5

|

Zara

|

2007-06-06

|

300

|

+------+------+------------+--------------------+

7

rows

in

set

(0.00

sec)

注:下面的讨论和结论是基于 InnoDB 引擎的。

首先要弄清楚 count() 的语义。count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。

所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。

至于分析性能差别的时候,记住这么几个原则:

扫描全表,读到server层,判断字段可空,拿出该字段所有值,判断每一个值是否为空,不为空则累加

扫描全表,读到server层,判断字段不可空,按行累加。

扫描全表,但不取值,server层收到的每一行都是1,判断不可能是null,按值累加。

注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的 *** 作。

MySQL 执行count(*)在优化器做了专门优化。因为count(*)返回的行一定不是空。扫描全表,但是不取值,按行累加。

看到这里,你会说优化器就不能自己判断一下吗,主键 id 肯定是非空的,为什么不能按照 count(*) 来处理,多么简单的优化。当然 MySQL 专门针对这个语句进行优化也不是不可以。但是这种需要专门优化的情况太多了,而且 MySQL 已经优化过 count(*) 了,你直接使用这种语句就可以了。

count(可空字段) <count(非空字段) = count(主键 id) <count(1) count(*)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7207960.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-02
下一篇 2023-04-02

发表评论

登录后才能评论

评论列表(0条)

保存