iLeichun

当前位置:首页数据库

SQL函数newID()和RAND()详解

分类:数据库  来源:网络  时间:2011-3-21 22:17:05

  SELECT * FROM Northwind..Orders ORDER BY NEWID()

   --随机排序

   SELECT TOP 10 * FROM Northwind ORDER BY NEWID()

   --Orders表中随机取出10条记录  

   示例  

   A.对变量使用 NEWID 函数

   以下示例使用 NEWID() 对声明为 uniqueidentifier 数据类型的变量赋值。在测试 uniqueidentifier 数据类型变量的值之前,先输出该值。

   -- Creating a local variable with DECLARESET syntax.

   DECLARE @myid uniqueidentifier

   SET @myid = NEWID()

   PRINT ¹Value of @myid is ¹+ CONVERT(varchar(255), @myid)

   下面是结果集:

   Value of @myid is 6F9619FF-8B86-D011-B42D-00C04FC964FF

   注意:

   NEWID 对每台计算机返回的值各不相同。所显示的数字仅起解释说明的作用。  

   随机函数:rand()

   在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会取随机整数。那就看下面的两种随机取整数的方法:   

   1

   Aselect floor(rand()*N) ---生成的数是这样的:12.0

   Bselect cast( floor(rand()*N) as int) ---生成的数是这样的:12   

   2

   Aselect ceiling(rand() * N) ---生成的数是这样的:12.0

   Bselect cast(ceiling(rand() * N) as int) ---生成的数是这样的:12   

   其中里面的N是一个你指定的整数,如100,可以看出,两种方法的A方法是带有.0这个的小数的,而B方法就是真正的整数了。

 大致一看,这两种方法没什么区别,真的没区别?其实是有一点的,那就是他们的生成随机数的范围:

   方法1的数字范围:0N-1之间,如cast( floor(rand()*100) as int)就会生成099之间任一整数

   方法2的数字范围:1N之间,如cast(ceiling(rand() * 100) as int)就会生成1100之间任一整数

   对于这个区别,看SQL的联机帮助就知了:  

   比较 CEILING 和 FLOOR

   CEILING 函数返回大于或等于所给数字表达式的最小整数。FLOOR 函数返回小于或等于所给数字表达式的最大整数。例如,对于数字表达式 12.9273CEILING 将返回 13FLOOR 将返回 12FLOOR 和 CEILING 返回值的数据类型都与输入的数字表达式的数据类型相同。

   现在,各位就可以根据自己需要使用这两种方法来取得随机数了^_^   

   另外,还要提示一下各位菜鸟,关于随机取得表中任意N条记录的方法,就用newid()

   select top N * from table_name order by newid() ----N是一个你指定的整数,表是取得记录的条数.

浅谈视图的优点与缺点

分类:数据库  来源:网络  时间:2010-12-8 19:15:48

视图的优点与缺点

在程序设计的时候必须先了解视图的优缺点,这样可以扬长避短,视图具有如下的一些优点:

● 简单性。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次都指定全部的条件。

● 安全性。通过视图用户只能查询和修改他们所能见到的数据。数据库中的其他数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上。

● 逻辑数据独立性。视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。 视图也存在一些缺点,主要如下。

● 性能:SQL Server必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,SQL Server也把它变成一个复杂的结合体,需要花费一定的时间。

● 修改限制:当用户试图修改视图的某些行时,SQL Server必须把它转化为对基本表的某些行的修改。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的。

所以,在定义数据库对象时,不能不加选择地来定义视图,应该权衡视图的优点和缺点,合理地定义视图。

什么是网络数据库

分类:数据库  来源:网络  时间:2010-10-23 15:14:10

网络就是两台以上的计算机由某种物理介质相连达到通信的目的系统。

数据库是以某种文件结构存储的一系列信息表,这种文件结构使您能够访问这些表、选择表中的列、对表进行排序以及根据各种标准选择行。数据库通常有多个 索引与这些表中的许多列相关联,所以我们能尽可能快地访问这些表。
网络数据库定义:以后台数据库为基础的,加上一定的前台程序,通过浏览器完成数据存储、查询等操作的系统。

1、什么是网络数据库
数据库是按一定的结构和规则组织起来的相关数据的集合。是综合各用户数据形成的数据集合,是存放数据的仓库。
网络就是用通讯设备和线路,将处在不同地方和空间位置、操作相对独立的多个计算机连接起来,再配置一定的系统和应用软件,在原本独立的计算机之间实现软硬件资源共享和信息传递,那么这个系统就成为计算机网络了(点此查看关于计算机网络的基础知识)。
数据库技术目前是计算机处理与存储数据的最有效、最成功的技术
计算机网络的特点则是资源共享
数据+资源共享这两种技术结合在一起即成为在今天广泛应用的网络数据库(也叫WEB数据库)
网络数据库定义:以后台数据库为基础的,加上一定的前台程序,通过浏览器完成数据存储、查询等操作的系统。
这个概念看上去很抽象,我们可以把它说得通俗一点:简单的说,一个网络数据库就是用户利用浏览器作为输入接口,输入所需要的数据,浏览器将这些数据传送给网站,而网站再对这些数据进行处理,例如,将数据存入数据库,或者对数据库进行查询操作等,最后网站将操作结果传回给浏览器,通过浏览器将结果告知用户。

2、为什么要使用网络数据库

在我上学的时候,老师曾经问过这样一个问题:为什么鲸鱼要生活在极地海洋?有一个同学回答说:因为鲸鱼块头太大了,它们的皮肤面积太大,保温的鲸脂层太厚以及因为它们的新陈代谢系统的原因。他总结说:如果鲸鱼不生活在极地海洋中,它们就会热死。

我的答案很简单:因为极地海洋中有它们所需要的足够的食物。

那么,为什么使用网络数据库呢?因为人们在网络数据库中可以找到他们需要的东西。检查银行帐户、股票价格、利率、实现电子商务等等。这些功能是用HTML编写的网页是无法做到的,因为用HTML无法完成交互功能,要做到这些,必须使用网络数据库技术。

3、WEB数据库的优点

WEB数据库可以实现方便廉价的资源共享,数据信息是资源的主体,因而网络数据库技术自然而然成为互联网的核心技术。

你可能会注意到现在有很多有关互联网的技术。但是,实际上这些技术中90%都是没有多大用处的。我是说,如果它们很有用处的话,光是学习这些技术就会把你给累死。大多数的网络技术之所以不被人重视,我想是因为以下原因:

没有用,很漂亮很有趣,但没有什么意义。
不能通用于所有浏览器。例如,JavaScript 在不同的浏览器中会出不同的问题。更不用说ActiveX了。速度慢、占用过多的带宽,没有到可以实际应用的地步。
太多的人只是将精力集中在自己做的东西有多漂亮,却忘记了制作它是要用于什么用途。

IBM调低DB2售价 Oracle变相提价MySQL

分类:数据库  来源:网络  时间:2010-10-23 14:53:35

根据The Register公布的一份报告,Oracle取消了MySQL的Basic和Silver级支持。当然,这没有多少损失,在basic级别上,每年只能获得两次支持,而silver级只是增加了一些初级的监控工具。专业人员通常在用生产级数据库中使用的性能监控等功能必须在gold级(每年每台服务器2999美元)中才能获得。全套工具需要每年每台服务器支付4999美元。

请记住这些价格都是Sun制定的。有传言说,Oracle将提高价格以比肩其Berkeley数据库。Berkeley DB的事务版(transactional version)目前每台处理器5800美元,而高可用版每台处理器9800美元。一般情况下,Oracle将一个处理器定义为一个单核或双核芯片。另一方面,有人会坚持使用MySQL的免费版,并从众多第三方厂商中寻找工具。

数据库市场争霸战

与此同时,IBM最近将入门级数据库的价格削减了一半。像其他主要厂商一样,DB2的express版可以免费使用。其中的DB2 Express-C支持2G物理内存和2核。每年支付1500美元可以升级到DB2 Express Fixed Term License版,支持的处理器和内存数量翻倍,并且增加了一些生产环境中所需的功能,如主动-被动集成、复制备份压缩,还包括Optim Development Studio和Optim Database Administrator。

使用SQL子选择来合并查询

分类:数据库  来源:网络  时间:2010-10-23 14:18:46

  子选择的理念很简单:一个选择查询安置在另一个查询内部,创建一个在单一声明搜索中不可用的资源。子选择允许查询的合并,结果组比较的责任落到了数据库中而不是应用软件代码中。

  使用这个功能的一个途径是对两个表格中的可比数据专栏中的值进行定位。例如,我的一个数据库有两个表格,Album和Lyric。我可以很容易地通过下面的子查询声明来找到每一个Metallica的歌曲中包含“justice”的歌名:

  SELECT song_name FROM Album

  WHERE band_name = ‘Metallica’

  AND song_name IN

  (SELECT song_name FROM Lyric

  WHERE song_lyric LIKE ‘%justice%’);

  这个例子是很简单的,我从Album表格中选择了所有Metallica的歌曲,接着,我在lyric表格中选择所有包含“justice”的歌曲,最后,我使用IN关键字来从Lyric表格结果组中显示的Album表格中返回歌曲名称。

  我使用Lyric表格结果组来给Album表格中的结果做限定。WHERE子句中的子选择部分是完全自包含的,因此我不需要使用例如Album.song_name和Lyric.song_name等完整的专栏名称。我没有从最终结果组的Lyric表格中返回任何值,如果我需要歌曲的Lyric,我会使用一个JOIN声明。

  使用NOT IN排除结果

  你可以使用NOT IN关键字来获得明确地不被包含在另一个结果组中的结果。例如,我想要通过下面的代码来返回Metallica在“And Justice for All”专辑中不包含单词“justice”的歌曲:

  SELECT song_name FROM Album

  WHERE album_name = ‘And Justice for All’

  AND band_name = ‘Metallica’

  AND song_name NOT IN

  (SELECT song_name FROM Lyric

  WHERE song_lyric LIKE ‘%justice%’);

  在前面的SQL代码中,我选择了Metallica的“And Justice for All,”专辑中的所有歌曲,接着是带有歌词中带有“justice”所有歌曲,最后从在Lyric结果组中没有出现的Album结果组返回了所有歌曲。较之于返回两个查询并使用代码来比较数组,你通过一个单独的声明就可以得到确切的结果。

  使用EXISTS来相关结果

  有时你可以通过多种途径来访问相同的数据,而且你需要对你的结果进行匹配(或相关)来得到值的交叉区。例如,我可以通过搜索Album表格来得到Metallica的歌曲列表,可是,我也可以从我的Cover表格中得到由Damage, Inc表演的Metallica的歌曲的列表,我可以在两个表格中直接比较查询结果来对值作相关。

  SELECT Album.song_name FROM Album

  WHERE Album.band_name = ‘Metallica’

  AND EXISTS

  (SELECT Cover.song_name FROM Cover

  WHERE Cover.band_name = ‘Damage, Inc.’

  AND Cover.song_name = Album.song_name);

  在SQL代码中,我使用完整的专栏名称,这是因为我直接对两个表格作比较,而不仅仅是将结果组作为一个被动资源来使用。我并不从Cover表格中返回结果。一些数据库支持NOT EXISTS关键字来确保你并没有匹配。

  使用合计函数来比较

  除了使用子选择在相关的表格中检查数据,你还可以在一个WHERE子选择中使用合计函数来确定主结果组。例如,我想要核实每一个Metallica歌曲在Album表格中的条目。而且,我还想返回缺少歌曲的专辑的名称。很方便地,AlbumInfo表格包含的一个专栏(album_tracks)给出了应该有多少首歌曲方面的信息。

  SELECT AlbumInfo.album_name FROM AlbumInfo

  WHERE AlbumInfo.band_name = ‘Metallica’

  AND album_tracks <>

  (SELECT COUNT(*) FROM Album

  WHERE Album.album_name = AlbumInfo.album_name);

  现在我已经成功地返回了所有Metallica的专辑中,应有的曲目数量与Album表格中实际的歌曲条目数量不符的专辑名称。

  返回子选择结果

  如果我还是关心每一张专辑的曲目数量并需要得到一个比较报告怎么办?你可以将一个子选择的结果作为最终结果组的一部分来返回。这个功能经常被合计函数所使用。通常地,对其他表格的访问可以作为你的查询的一部分。下一个例子将返回每一张Metallica的专辑,应该包括的曲目数量和在Album表格中包括的条目数量:

  SELECT AlbumInfo.album_name, album_tracks,

  (SELECT COUNT(*) FROM Album

  WHERE Album.album_name = AlbumInfo.album_name)

  FROM AlbumInfo

  WHERE AlbumInfo.band_name = ‘Metallica’;

  另一个强有力的例子涉及了在AlbumInfo表格中将album_tracks值改变为在Album表格中实际的条目数量:

  UPDATE AlbumInfo SET album_tracks =

  SELECT COUNT(*) FROM Album

  WHERE AlbumInfo.album_name = Album.album_name)

  WHERE AlbumInfo.band_name = ‘Metallica’;

  在上两个例子中的子选择声明被看作一个自包含单位来执行。

  子选择比较关键字(ALL, SOME, ANY)

  除了使用标准查询功能,还有三个关键字可以使你将一个表达式值和一个单栏子选择声明结果组作比较,这些关键字返回TRUE或FALSE的Boolean值。ALL关键字要求子选择中所有值都遵守比较运算符。SOME和ANY关键字则要求至少一对。这里是ALL关键字的一个简单实例。

  SELECT * FROM AlbumSales

  WHERE album_gross >

  ALL (SELECT album_costs FROM AlbumProduction);

  上面的例子将从AlbumSales表格返回在AlbumProduction表格里面付出总额大于成本而生产最昂贵的专辑的所有记录。如果用ANY替代ALL,声明将返回所有付出总额大于最低专辑成本的专辑记录。声明= ANY与IN关键字意义是相同的。声明<> ALL与NOT IN关键字是对等的。关键字ANY和SOME也是等同的。数据库生产商中对这些关键字的支持情况是不同的,因此在出现问题时要相信查阅生产商方面的资料

在SQL 代码中加入Hint来约束SQL 的执行计划

分类:数据库  来源:网络  时间:2010-10-23 14:06:08

曾经遇到的一个例子就是这样,开发人员为了要求每次对一个表做操作的时候都使用索引,于是在代码中强行加入了Hint约束SQL的执行计划,它的样子大概是这样:

 

Select /*+ index(t1 ind_t1) */ col1,col2 from t1 where col1>...... and col1<...... 猜测他们在系统上线之前测试的阶段,发现这条SQL选择索引比全表扫描效率高得多,为了保证以后执行计划能够始终选择索引,他们在代码中的SQL里加入了这个Hint。

 

系统上线后,没有出现过问题,直到有一天用户抱怨查询非常慢,我从数据库里得到了用户端发出的SQL,才知道这个SQL在代码里加入了Hint。问题是,为什么之前操作都没有问题呢?我登录这个数据库,查看了一下这个表的信息,惊奇地发现,这个表每天仍然定时在做分析操作,这是一个奇怪的现象,人为地对表进行定时分析,却不允许数据库来选择执行计划,这显然是不合理的事情。但这种现象在开发人员当中又是比较普遍的,大家了解一些数据库的技术,却无法将这些知识整合起来运用,系统设计及开发阶段,没有DBA参与进来,直到系统进入运行维护阶段,才有DBA来充当救火队员的角色,这在当前中国软件开发中是一个很普遍的现象。

 

接着说这个案例。这是一个Oracle 10gr2的数据库,CBO(基于成本的优化器)的技术已经比较成熟,所以此时应该选择由Oracle数据库来决定SQL的执行计划。我分别执行了这条原始SQL和去掉了Hint的SQL,并获得了各自的执行计划,执行计划显示出,去掉Hint的SQL选择了全表扫描(Full Table Scan),执行中扫过的数据块远远小于通过索引访问数据的SQL,于是原因找到了。

 

可是为什么之前没有出现过这个问题?我对比了一下最近的数据和之前的数据,发现近期的数据在创建索引的列上的列值重复率要远远高于从前,因此Oracle在选择索引之后,比以前读取了更多的索引块和数据块,造成了大量的I/O操作。

 

因此,对于高版本的数据库(10g以上),我们还是应该让数据库自己根据表、索引的统计分析信息来决定SQL的执行计划,因为表中的数据是会变化的,这种人为的强行干预,必然会在某个时候出现问题。

数据库服务器成黑客最爱

分类:数据库  来源:网络  时间:2010-10-23 14:02:42

  如今顶尖的黑客一定都是顶尖的商人!因为他们的评估记录上会写着哪些目标最简单,哪些目标最有利可图。现在,可能没有比笨拙的企业数据库更好对付的目标了。一般来说,企业的数据库中汇集着这家公司最重要的机密:客户名单、工资记录、以及其他许多按照良好结构储存的敏感信息,这些都是最容易卖出好价钱的。何况数据库的管理员们往往不会想在安全性上精益求精,而且数据库本身常常和网络应用联系在一起,这些都已经被证明是企业数据库屡遭破解的原因。

  在Verizon Business的年度计算机破坏报告中,调查小组报告说,在2008年的数据丢失案中,数据库破坏占据了30%。更糟糕的是,在数据入侵的统计中,数据库入侵高达75%(参见下图)。由于敏感信息往往是储存在一个单独的数据库中,一次简单的入侵就可能导致企业遭受重大损失。

 

  数据来源:Verizon 2009数据破坏调查报告,基于2008年2亿8500万次累计攻击数据

  制图:51CTO.com安全频道

  “认真研究一下,你会发现安全威胁在很大比例上都来自于数据库,”企业安全咨询公司Securosis创始人兼分析师Rich Mogull说。还有大多数的信息安全管理员都是在IT网络背景下成长起来,对数据库技术并不了解太多,他另外说到。最近Forrester Research的研究也发现,大多数数据库管理员仅花费不到5%的时间来保证数据库的安全。

  “我要说的是,在我就安全性问题开会的时候,三次里至少有两次数据库方面的人不来参加,”Gartner的信息安全和隐私研究主管Jeffrey Wheatman说。“我认为这是一个大问题,因为当你要对一个不太明白的东西进行监测或要保证它的安全,你需要请一位这方面的专家来帮助你。”

  此前,51CTO.com也曾刊载专家分析文章称,由于企业数据库系统用户众多,涉及数据库管理员、内部员工及合作方人员等,网络管理非常复杂,数据库的审计已经成为燃眉之急。

  许多数据库的安全漏洞仅仅是由简单的安全工作失误造成的。在2008年的调查中,IOUG(the Independent Oracle Users Group,独立Oracle用户组织)发现,有26%的企业安装Oracle数据库的安全补丁的时间超过了6个月,而有11%的企业竟然从来没有给它们打补丁。“生产数据库(production database)往往不能在第一时间得到最新的补丁,因为这些数据库服务器的访问非常繁忙,人们会说‘只要不出大问题,就不要去修补它’!”漏洞评估公司QuietMove的合伙人Adam Muntner说。

  企业经常会犯一些错误,这使数据库变得更加脆弱,比如将测试数据库留在生产服务器上,或者把敏感数据链接到网络应用中,这就有可能被黑客轻松窃取。“我认为数据库面临的最大威胁就是与网络应用相链接和其中的业务逻辑漏洞,”Muntner说。

  与网络应用密切联系会使数据库容易遭受SQL注入攻击——这个问题51CTO.com安全频道曾专门讨论过,指攻击者输入SQL代码形式的字符串到网络应用的薄弱区域。他们可以袭击连接到特定网络应用的数据库,也可以使用网络应用和数据库之间的链接,对整个数据库服务器发起更广泛的攻击。跟据IBM的ISS X-Force安全研究团队报告,SQL注入攻击在去年成为因特网最常见的针对基于数据库的网站漏洞的攻击方式,比起2007年增长了134%。相应地,应对SQL注入攻击,也需要进行全面防御。

原文出自【比特网】,转载请保留原文链接:http://sec.chinabyte.com/475/11584475.shtml