精华内容
下载资源
问答
  • 从2500多行的表中随机取一行,使用rand函数: SELECT * FROM tbl_nichuiniu_article where Category='z1' ORDER BY RAND() LIMIT 1; 查询结果显示扫表两遍,order by rand() 需要使用临时表(Using temporary),...

    从2500多行的表中随机取一行,使用rand函数:

    SELECT * FROM tbl_nichuiniu_article  where Category='z1' ORDER BY  RAND()  LIMIT 1;

    查询结果显示扫表两遍,order by rand() 需要使用临时表(Using temporary),需要使用文件排序(Using filesort),效率低下,查询时间800毫秒

    网上找了个方法优化后,10毫秒,性能显著提升

    SELECT * FROM tbl_nichuiniu_article 
    WHERE Category='z1' and id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM tbl_nichuiniu_article)-(SELECT MIN(id) FROM tbl_nichuiniu_article)) + (SELECT MIN(id) FROM tbl_nichuiniu_article)))  
    ORDER BY id LIMIT 1; 

    0602更新
    实际使用一段时间上面的sql后,发现每次随机请求到的ID都是偏小的,随机的区间只有总数的前10%。于是再次更新sql:

    SELECT * FROM tbl_nichuiniu_article AS t1 JOIN (
    SELECT floor( RAND() * ((SELECT MAX(id) FROM tbl_nichuiniu_article)-(SELECT MIN(id) FROM tbl_nichuiniu_article)) + 
    (SELECT MIN(id) FROM tbl_nichuiniu_article)) AS id) AS t2
    WHERE t1.id >= t2.id
    ORDER BY t1.id ASC LIMIT 1;

    上一条没使用左连接,分析语句都正常,如下可获得一个随机数:

    SELECT floor( RAND() * ((SELECT MAX(id) FROM tbl_nichuiniu_article)-(SELECT MIN(id) FROM tbl_nichuiniu_article)) + 
    (SELECT MIN(id) FROM tbl_nichuiniu_article))

    但是联合成一整个语句查询时,随机到的数字却很小。
    原因是上面的sql查询出来的结果实际上是作为一张表。
    使用下面的语句id>= 对应的应该是一个字段,而不是一张表。

    SELECT * FROM tbl_nichuiniu_article WHERE Category='z1' and id >= 

    所以如果要对应一张查询出来的新表,就需要使用左连接。

    0602再次更新
    最开始的用法语句是没有报错的,出问题的还是随机数生成的过程与select语句结合时,有些变化没有被观察到。往后注意级联查询时用左连接,能避免类似的错误出现。

    展开全文
  • 数据库中的函数 数据库中的函数与Java中的函数类似,都是完成一定功能的代码的集合。根据函数操作数据行数可将SQL函数分为单行函数和多行函数(也就是聚合函数)。... select rand() --返回一个0-1之间的随机...

    数据库中的函数

    数据库中的函数与Java中的函数类似,都是完成一定功能的代码的集合。根据函数操作数据行数可将SQL函数分为单行函数多行函数(也就是聚合函数)

     

    常用单行函数

    单行函数:返回结果是一行记录

    • select ceiling(3.5)   --向上取整
    • select floor(3.5)    --向下取整
    • select rand()   --返回一个0-1之间的随机数
    • select current_date()  --获取当前日期
    • select now    --获取当前时间

    聚合函数

    多行函数又称聚合函数,这类函数用于对行数据进行操作

    count():求行数

    SUM():总和

    AVG() :平均分

    MAX():最高分

    MIN():最低分

    使用:

    • select count(id) from student;    --统计表中的数据量,会忽略所有的null值
    • select count(*) from student;   --不会忽略null值,计算行数
    • select count(1) from result;   --不会忽略null值,计算行数
    • select SUM(score) as 总和 from result;
    • select AVG(score) as 平均分 from result;
    • select MAX(score) as 最高分 from result;
    • select MIN(score) as 最低分 from result;

     

    加密函数

    MD5加密是不可逆的,不过相同的值的加密值是相同的。如果数据库中的密码是加密过的,从前端获取到的密码可以使用加密函数后再与数据库中加密的密码进行比对。

    select * from user where id=1 and pwd=MD5('123456');

     

    展开全文
  • 很多朋友都知道在mysql随机查询数据直接使用rand()函数就可以实现了,但是rand()函数如果直接使用几百上万条数据没什么问题,如果上万条数据就出事了,下面我来给各位朋友详细介绍mysql中rand()随机查询数据与性能...

    SELECT * FROM `wl_sell` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(itemid) FROM `wl_sell`)-(SELECT MIN(itemid) FROM `wl_sell`))+(SELECT MIN(itemid) FROM `wl_sell`)) AS itemid) AS t2 WHERE t1.itemid >= t2.itemid ORDER BY t1.itemid LIMIT 7;

    很多朋友都知道在mysql随机查询数据直接使用rand()函数就可以实现了,但是rand()函数如果直接使用几百上万条数据没什么问题,如果上万条数据就出事了,下面我来给各位朋友详细介绍mysql中rand()随机查询数据与性能分析吧。
    比如有一个需求,通过sql语句,返回-5至5的随机整数.如果这一个放在PHP中,则非常简单直接用 
    <?php
    print rand(-5,5);
    ?>
    在mysql中,rand函数只能有一个参数. //摘自手册
    RAND() RAND(N) 
    返回一个随机浮点值 v ,范围在 0 到1 之间 (即, 其范围为 0 ≤ v ≤ 1.0)。若已指定一个整数参数 N ,则它被用作种子值,用来产生重复序列。
     

    有两个方法可以达成以上效果.
    1.新建一个表,里面存着 -5 至 5 之间的数.再利用order by rand()得到随机数.
    #建立指定范围数据表

    create table randnumber
    select -1 as number
    union 
    select -2
    union 
    select -3
    union 
    select -4
    union 
    select -5
    union 
    select 0
    union 
    select 1
    union 
    select 2
    union 
    select 3
    union 
    select 4
    union 
    select 5 
     

    #得到随机数

    select number
    from randnumber order by rand() limit 1

    优点: 随机数可以指定某部分数据,并不需要连续的.
    缺点: 当随机数范围很广的时候,建表比较困难.
    2.利用MySQL的ROUND()加上RAND()函数实现
    #一句sql语句搞定
    SELECT ROUND((0.5-RAND())*2*5)

    #注释
    #0.5-rand()可以得到-0.5 至 +0.5的随机数
    #(0.5-rand())*2可以得到-1 至 +1的随机数
    #(0.5-rand())*2*5可以得到-5 至 +5的随机数
    #ROUND((0.5-RAND())*2*5)可以得到-5 至 +5的随机整数

     

    优点: 当随机数范围很广的时候,只需要更改*5当中的5即可,非常方便.
    缺点: 随机数只能是连续的,不可以指定某部分数据.


    在mysql中查询5条不重复的数据,使用以下:

    SELECT * FROM `table` ORDER BY RAND() LIMIT 5

    就可以了。但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上

    搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。

    SELECT * 
     FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2 
    WHERE t1.id >= t2.id 
     ORDER BY t1.id ASC LIMIT 5;

    但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。


    上面的语句采用的是JOIN,mysql的论坛上有人使用

     SELECT * 
     FROM `table` 
     WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) 
     ORDER BY id LIMIT 1; 
     

    我测试了一下,需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距。总觉有什么地方不正常。

    于是我把语句改写了一下。

    SELECT * FROM `table` 
     WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))  
    ORDER BY id LIMIT 1;

    这下,效率又提高了,查询时间只有0.01秒

    最后,再把语句完善一下,加上MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。
    完整查询语句是:

    SELECT * FROM `table` 
     WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECTMIN(id) FROM `table`)))  
     ORDER BY id LIMIT 1;
     
    SELECT * 
     FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM`table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2 
     WHERE t1.id >= t2.id 
    ORDER BY t1.id LIMIT 1;
    最后对这两个语句进行分别查询10次,
    前者花费时间 0.147433 秒
    后者花费时间 0.015130 秒
    看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。


    谢谢关注websites博客!

    展开全文
  • MySQL数据库 常见内置函数 文章目录MySQL数据库 常见内置函数1.数学函数2.字符串函数3.日期函数4.加密函数5.条件判断函数2.自定义函数3.自定义函数相关语法 1.数学函数 rand() round(num) ceil(num) floor(num) ...

    MySQL数据库 常见内置函数

    1.数学函数

    rand() round(num) ceil(num) floor(num)
    随机 四舍五入 向上取整 向下取整

    2.字符串函数

    length() 字节长度
    char_length() 字符长度

    ucase() 大写
    lcase() 小写

    concat(字符,…,字符n) 连接字符串

    replace(字符串,旧字符,新字符)字符串替换

    mysql> SELECT REPLACE('1234.mp4','.mp4','.mp3')
    1234.mp3
    12
    

    截取字符串
    left(字符串,截取长度)
    right(字符串,截取长度)
    substring(字符串,开始位置,截取长度) #包含开始位置

    mysql> select left('123456',4);
    +------------------+
    | left('123456',4) |
    +------------------+
    | 1234             |
    +------------------+
    1 row in set (0.00 sec)
    
    mysql> select right('123456',4);
    +-------------------+
    | right('123456',4) |
    +-------------------+
    | 3456              |
    +-------------------+
    1 row in set (0.00 sec)
    
    mysql> select substring('123456',2,4); 
    +-------------------------+
    | substring('123456',2,4) |
    +-------------------------+
    | 2345                    |
    +-------------------------+
    1 row in set (0.00 sec)
    1234567891011121314151617181920212223
    

    3.日期函数

    now() unix_timestamp() from_unixtime()
    当前时间 时间戳 格式化时间戳
    mysql> select now();
    +---------------------+
    | now()               |
    +---------------------+
    | 2019-03-16 14:55:42 |
    +---------------------+
    1 row in set (0.00 sec)
    
    mysql> select unix_timestamp();
    +------------------+
    | unix_timestamp() |
    +------------------+
    |       1552719356 |
    +------------------+
    1 row in set (0.00 sec)
    
    mysql> select from_unixtime(1552719356);
    +---------------------------+
    | from_unixtime(1552719356) |
    +---------------------------+
    | 2019-03-16 14:55:56       |
    +---------------------------+
    1 row in set (0.00 sec)
    
    123456789101112131415161718192021222324
    
    year() month() day() hour() minute() second()
    mysql> select 
        -> year(now()) as '年',
        -> month(now()) as '月',
        -> day(now()) as '日',
        -> hour(now()) as '时',
        -> minute(now()) as '分',
        -> second(now()) as '秒';
    +------+------+------+------+------+------+
    |||||||
    +------+------+------+------+------+------+
    | 2019 |    3 |   16 |   14 |   59 |   12 |
    +------+------+------+------+------+------+
    
    12345678910111213
    

    4.加密函数

    md5(数据)
    password(数据)

    5.条件判断函数

    1).语法: if(数据,值1,值2) #判断指定数据是否为真:真-值1,假-值2

    mysql> select if(null,1,2);
    +--------------+
    | if(null,1,2) |
    +--------------+
    |            2 |
    +--------------+
    1 row in set (0.00 sec)
    
    mysql> select if(1,0,2);
    +-----------+
    | if(1,0,2) |
    +-----------+
    |         0 |
    +-----------+
    1 row in set (0.00 sec)
    
    12345678910111213141516
    

    2).语法: IFNULL(数据,值2) #判断指定数据是否为null:null-值2,非null-本身

    mysql> select ifnull(0,123);
    +---------------+
    | ifnull(0,123) |
    +---------------+
    |             0 |
    +---------------+
    1 row in set (0.00 sec)
    
    mysql> select ifnull('a',123);
    +-----------------+
    | ifnull('a',123) |
    +-----------------+
    | a               |
    +-----------------+
    1 row in set (0.00 sec)
    
    12345678910111213141516
    

    2.自定义函数

    语法:

    #修改结束符
    delimiter //
    create function 函数名(参数名 类型,...,参数名n 类型n) returns 返回数据类型
    begin
    #SQL语句
    return 返回值;
    end //
    delimiter ;
    
    #调用
    select 函数名();
    
    123456789101112
    
    • 输出"hello world"(不带参数的函数)
    #判断函数是否存在,存在就删除
    drop function if exists f1;
    
    delimiter //
    create function f1() returns varchar(30)
    begin
        return 'hello world';
    end //
    delimiter ;
    
    select f1();
    
    +-------------+
    | f1()        |
    +-------------+
    | hello world |
    +-------------+
    1234567891011121314151617
    
    • 传递两个整型求和(带参数的函数)
    drop function if exists f2;
    
    delimiter //
    
    create function f2(num1 int, num2 int) returns int
    begin
         return num1 + num2;
    end //
    delimiter ;
    
    select f2(8, 2);
    
    +----------+
    | f2(8, 2) |
    +----------+
    |       10 |
    +----------+
    1234567891011121314151617
    

    3.自定义函数相关语法

    显示所有的函数:show function status\G #输出的内容很多

    删除函数:drop function [if exists] 函数名;

    展开全文
  • 数据库MySQL-函数

    2020-03-27 10:37:03
    1.7 函数 1.7.1 数字类 -- 获取随机数 mysql> select rand(); +------------------+ | rand() | +------------------+ | 0.25443412666622 | +------------------+ 1 row in set (0.00 sec) -- 随机排序 mysql&...
  • php MySQL使用rand函数随机取记录 如何在mysql中使用随机数, 如何写一个语句能一下更新几百条MYSQL数据!需要测试MYSQL数据库,里面有一个上万条数据的数据库,如何写一个PHP文件一下每次更新几百条信息,我都是写...
  • phpMySQL使用rand函数随机取记录 如何在mysql中使用随机数, 如何写一个语句能一下更新几百条MYSQL数据! 需要测试MYSQL数据库,里面有一个上万条数据的数据库,如何写一个PHP文件一下每次更新几百条信息,我都是写...
  • 有时候,我们需要在数据库的一张表中,...更好的方式,是直接使用数据库提供的随机函数。示例如下。 select * from table1 order by rand() limit 100 上述例子,表示从table1表中,随机选出100条数据。 随机函...
  • Atitit.并发測试解决方式(2)-----获取随机数据库记录随机抽取数据...3.经常使用的实现方法:::数据库随机函数 1 4.Mssql的实现NEWID()跟rand() 1 5.newid()与rand()的差别 2 6.NEWID() 2 7.參考 2 1.应用场...
  • 10.17 内置函数 强调:mysql内置的函数只能在sql语句中...rand() #返回0到1内的随机值,可以通过提供一个参数(种子)使rand()随机数生成器生成一个指定的值。 ​ #加密函数 md5() #计算字符串str的MD5校验和 p...
  • 从SQLSERVER/MYSQL数据库随机取一条或者N条记录 原文:从SQLSERVER/MYSQL数据库中...很多人都知道使用rand()函数但是怎麽使用可能不是每个人都知道 建立测试表 USE [sss] GO CREATE TABLE R...
  • 在开发过程中遇到了一个问题,使用MySQL数据库,用SQL语句在表中随机获取一条或多条数据,看似简单,但是往深层研究的话还是很有深度的,查了好多资料,接下来给大家分享一下: 1. 随机获取单条数据 SELECT * ...
  • Atitit.并发测试解决方案(2)-----获取随机数据库记录随机...3.常用的实现方法:::数据库随机函数 1 4.Mssql的实现NEWID()跟rand() 1 5.newid()与rand()的区别 2 6.NEWID() 2 7.参考 2 1.应用场景 并发测试...
  • 数据库常用函数

    千次阅读 2018-06-03 22:41:47
    1. 数学函数RAND() 返回0到1之间的随机值 ROUND(78.518,2) 按照指定的精度四舍五入。78.520 FLOOR(number) 返回&lt;=参数的最大整数 CEILING(number) 返回&gt;=参数的最小整数 PI() 返回3.14159 DEGREES...
  • Atitit.并发测试解决方案(2) -----...3. 常用的实现方法:::数据库随机函数 1 4. Mssql 的实现 NEWID() 跟rand() 1 5. newid()与rand()的区别 2 6. NEWID() 2 7. 参考 2   1. 应用场景 并发测试  
  • 顺便给你找了点关于mysql rand函数的实例,如下:那就在insert 命令中,value()里面用rand(),注意字段宽度是否够一直以为mysql随机查询几条数据,就用SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了。
  • mysql 数据库查询随机数量条目的效率问题及解决办法 时间:2010-11-15 Tag:...但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 167
精华内容 66
关键字:

数据库rand随机函数