转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> Access >> 正文
sql随机抽取记录         ★★★

sql随机抽取记录

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2144 更新时间:2012/9/16 17:08:25
sql随机抽取记录

我们经常想在一个数据表中随机地选取出数据来,比如随机生成考试试卷等。

利用 SQL Server 的 NewID() 方法就可以很轻松地达到这个目的。

NewID() 方法返回一个 GUID,如:EE95A489-B721-4E8A-8171-3CA8CB6AD9E4

在 select 表的时候,再增加一列为 NewID() 就可以了。

SQL 语句:select *, NewID() from table

这样每条记录后就会有一个随机的 GUID 值,我们再按这个 GUID 排一下序就可以达到乱序的效果。

SQL 语句:select *, NewID() as random from table order by random

我们要想随机取出 10 条数据,只要加上 TOP 10 就行了:

SQL 语句:select top 10 *, NewID() as random from table order by random

筛选唯一记录

SELECT * FROM tablename ORDER BY NEWID()

这个方法只适用于 SQL Server。

SELECT top 4 * FROM 表 ORDER BY Rnd(id)

这句适用于ACCESS的,大家能参考

select * from table_name order by rand() [limit num];

mysql的随机查询语句。

SQL随机选取记录

今天在动易的论坛上看到有人问如何随机选取记录的问题,上网查了一下资料,网上的资料比较散,所以整理了一下,权当做个笔记,将来做考试系统的时候肯定是要用到的。

SQL Server:

SQL Server数据库有个NewID函数,可以很方便的用SQL语句得到数据表中的随机数据。

Select TOP N * From TABLE Order By NewID()

Access:

Access数据库虽然有个Rnd,可以通过“select top 10 * from tb order by rnd(id)”得到随机数据,VBA环境下使用没有问题,可惜在VB中使用,产生的随机序列是一样的,每次调用返回的数据相同。

有人说在程序中加上Randomize初始化随机种子,那么这只说对了一半,在程序中简单的加上Randomize,是没作用的,道理很简单,Randomize不可能影响SQL语句中的Rnd,这个Rnd只不过是个字符串,SQL语句是通过数据库引擎去执行的,正因为如此,无法初始化种子,致使每次应用产生的随机序列是一样的。

由此可见,解决问题的关键就是如何初始化随机种子。Rnd函数语法是Rnd(number),它有一个特性,就是如果使用了负参数的number,那么就会产生一个固定的随机序列。利用这个特性,我们的问题就迎刃而解了,这就是每次调用Rnd函数时,使用一个负的不同的number,从而达到产生不同随机序列的目的。经过测试,问题解决。示例代码如下:

’......

Dim sql As String

Dim r As Single

Randomize

r = Rnd

sql = "select top 1 * from tb order by rnd(" & r & "-id)"

’......

代码说明:SQL语句中的Rnd的参数是一个数值表达式,必须包含表中的一个字段(最好是主键),因为变量r返回的是一个随机的0到1之间的single,(一般情况下表中的ID值都是大于1的),从而使参数的值是个小于0的随机数,由此产生了不同的随机序列。

补充一点,有一种提议用time来解决这个问题,就是"select top 10 * from tb order by rnd(" & time & "- id) "。在某些情况下是可以的,但是,如果你需要快速连续的查询信息,比如一些摇号程序需要连续滚动地显示信息,这种情况下,就会出现连续几次返回重复的信息。究其原因,就是time在做数值运算的时候,会转换为一个小于1的Double,而rnd返回的是一个Single,显然,rnd返回的结果有可能会截去time-id运算后的尾数,在time变化很小的情况下,使rnd返回的值与前次相同,从而返回的查询结果相同。

MySql:

Select * From TABLE Order By Rand() Limit 10


[Access]ASP&SQL让select查询结果随机排序的实现方法  [系统软件]SQL语句性能优化--LECCO SQL Expert
[C语言系列]SQL Server到DB2连接服务器的实现  [C语言系列]SQL Server到SYBASE连接服务器的实现
[C语言系列]SQL Server到SQLBASE连接服务器的实现  [C语言系列]SQL Server连接VFP数据库的实现
[C语言系列]ASP+SQL Server之图象数据处理  [C语言系列]SQL Server连接ACCESS数据库的实现
[C语言系列]DBA的最佳选择—图形界面还是T-SQL命令?  [C语言系列]SQL Server日期计算
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台