您的位置:首页 > 数据库

T-SQL语言基础(二)

2010-05-02 12:29 127 查看
函数
SQL Server 内建的函数提供了一个快速、简单的方法来完成某些特定的工作。SQL Server 7.0 新增了几个有用的函数,并且也包含在 SQL Server 2000 中。了解哪些函数是可用的,SQL Server 应用程式的设计工作可以变得稍为简单。在《线上丛书》中的「Transact-SQL 新增与加强的功能」这个主题可以找到新增函数的完整清单。此处仅介绍一些对您可能很有帮助的函数:
  NEWID 建立一个 uniqueidentifier 资料型别的 全域唯一识别项 (GUID)。您需要使用这个函数将值分派给该资料型别的资料行,使用方式为 NEWID() 。(此函数不需引数)
  YEAR 传回指定日期年份部分的完整整数。使用方式为 YEAR(date) 。例如:以下陈述式 SELECT YEAR('07/11/01') 将会传回值 2001。
  MONTH 传回指定日期月份部分的整数。使用方式为 MONTH(date) 。例如:以下陈述式 SELECT MONTH('07/11/01') 将会传回值7。
  DAY 传回指定日期日期部分的整数。使用方式为 DAY(date) 。例如:以下陈述式 SELECT DAY('07/11/01') 将会传回值 11。
  FILE_NAME 传回档案识别码(ID)的逻辑档案名称。使用方式为 FILE_NAME (file_id_number)。例如:陈述式 SELECT FILE_NAME(4) 档案识别码为4的档案逻辑名称。如果资料库中找不到有此识别码的档案,则传回 NULL。
  资料型别
  在 SQL Server 7 中新增了几种新的资料型别,一些已经有的资料型别的尺寸也有延伸。此外,SQL Server 2000 新增了三种资料型别,这些资料别多数在 第10章 已经讨论过。此处仅列出 SQL Server 7 有改变,并且也包含在 SQL Server 2000 中的资料型别:
  资料指标变数新增了一个 cursor 资料型别。关於指标的相关讯息,请参考《线上丛书》里「Cursors」这个主题。
  新增了三种新的 Unicode 资料型别-nchar、nvarchar 以及 ntext。每一个 Unicode 字元使用两个位元组,并支援所有国际字元。
  新增了一种 uniqueidentifier 资料型别,用於储存通用唯一识别码(GUID)。
  字元资料和二进位字串的最大长度扩展到8,000位元组。这一长度适用於 char、varchar、binary 以及 varbinary 等型别。
  SQL Server 2000 则新增了下列资料型别:
  bigint储存8个位元组长度的整数。
  sql_variant允许不同资料型别的值储存於同一个资料行。此型别的资料行储存资料本身的值并且加以描述-它的基本型别、小数位数、精确性、最大大小以及定序(collation)。
  table运作方式与暂存资料表类似;其宣告包含资料行清单与资料型别。此资料型别可用来定义一个区域变数或是一个使用者自订函数的传回值。
  陈述式
  SQL Server 7.0 包括了许多新的 T-SQL 陈述式和已经存在陈述式的新选项。同样的,这些也保留在S QL 2000 之中。这些陈述式对应 SQL Server 7.0 的一些新功能。例如,ALTER DATABASE 陈述式包含了下列一些针对档案与档案群组的新选项:MODIFY FILE、ADD FILEGROUP、MODIFY FILEGROUP、REMOVE FILE 以及 REMOVE FILEGROUP。特别是档案群组,新的 DBCC CHECKFILEGROUP 陈述式会检查档案群组中所有资料表的分配和结构的完整性。
  SQL Server 7.0 与 SQL Server 2000 包括两个额外的 DBCC 陈述式、DBCC SHRINKFILE 与 DBCC SHRINKDATABASE。前者能缩减资料档案的大小,后者可缩减资料库的所有资料档案并释放未使用的磁碟空间。
  SQL Server 7 与 SQL Server 2000 支援一种改进的备份和还原结构。新的BACKUP 陈述式允许全部或部份的资料库备份和记录档备份。新的 RESTORE 陈述式允许使用全部或部份资料库备份和记录档备份来还原。这些代替了 SQL Server 较早版本中的 DUMP 和 LOAD 陈述式。
使用 T-SQL 执行还原
 RESTORE T-SQL 命令和 BACKUP 命令类似( 第 32 章 中曾经讨论过)。如同BACKUP 命令,第一次使用时可能相当困难,但是一些 DBA 还是喜欢将他们的管理程序放置到 SQL 命令档中,以便於重复执行这些功能。和 BACKUP 命令一样,RESTORE 命令提供了比 Enterprise Manager 更多的附加选项。
  在本节中,我们将讨论 RESTORE 命令的语法以及这个命令提供的多种选项。RESTORE 命令有两种形式显示如下:
  RESTORE DATABASE 还原完整的资料库、档案或档案群组。
  RESTORE LOG 还原交易记录档。
  如您所见,所用的命令要依照执行还原操作的类型而定。因为这些命令共用大部分的选项,所以我们稍候将在一个清单中讨论这两种还原类型(资料库和记录档)的所有选项。
  RESTORE 陈述式
  执行完整资料库还原时 RESTORE 陈述式的语法如下:
  RESTORE DATABASE database_name
  [ FROM backup_device ]
  [ WITH options ]
  这个陈述式只要求资料库的档案名称和备份所在的位置。
  执行档案和档案群组还原时陈述式的语法如下:
  RESTORE DATABASE database_name
  [ FILE = file_name ]
  [ FILEGROUP = filegroup_name ]
  [ FROM backup_device ]
  [ WITH options ]
  这个陈述式只要求资料库名称、档案名称或档案群组名称和备份所在的位置。
  执行交易记录还原时陈述式的语法如下:
  RESTORE LOG database_name
  [ FROM backup_device ]
  [ WITH options ]
  就如同其他的命令,database_name 是还原将要执行的资料库名称。backup_device 参数可以是逻辑备份装置名称或实体装置的名称。如果要指定一个实体装置,必须限定它的装置类型-也就是说,装置名称前面必须加上 DISK=、TAPE= 或 PIPE=。可以指定一个或多个装置,中间以逗号隔开。
  --------------------------------------------------------------------------------
  说明
  如果没有提供 FORM 子句,还原将无法进行,而且仍然会执行回复(除非执行NORECOVERY 选项)。这项技术可以用来将资料库设定为回复模式,而不还原其他附加资料。例如,可以执行多个差异还原操作,然后执行 RESTORE 陈述式,不需要 FORM 子句来将资料库设定为回复模式,就能够启动回复过程。
  --------------------------------------------------------------------------------
  选项
  表33-1列出了 RESTORE 命令可用的选项。如您所见,在执行还原操作时,这些选项提供了很大的弹性空间(如果列出的选项只对交易记录还原有用,将会标示其限制性)。
  表33-1 RESTORE 命令选项
  选项 说明
  RESTRICTED_USER 设定新还原资料库的安全性,只有 db_owner、dbcreater 和 sysadmin 角色成员才能存取该资料库。
  FILE = file_number 如果在储存媒体中有多个备份集,可用来识别所使用的备份集。例如设定该数值为2,则使用磁带上的第二个备份集。
  PASSWORD = password 指定储存备份的密码。
  MEDIANAME =media_name 指定媒体的名称。
  MEDIAPASSWORD = password 指定储存媒体的密码。
  MOVE 'logical_file_name'
  TO 'OS_file_name'
  更改还原档案的位置,例如:MOVE 'Northwind' TO 'D:\data\Northwind.mdf'。如果旧的磁碟无法使用,而需要还原到新的磁碟上时,可以使用这个选项。
  NORECOVERY |RECOVERY |
  STANDBY = undo_file
  NORECOVERY 指定在还原后,交易将无法退回或重新进行。如果将还原其他的备份(差异式备份或交易记录档备份),则需要用到这个选项。REVOVERY 为预设选项,它指定执行回复操作,并退回每个没有提交的变更。STANDBY 指定在还原需要还原情况下,建立还原(undo)档案。
  KEEP_REPLICATION 指定当资料库还原时复制设定要保存下来。
  NOUNLOAD | UNLOAD NOUNLOAD 指定在还原完成后不卸载储存媒体(例如,覆写备份磁带并弹出)。UNLOAD 为预设选项,指定在还原完成后卸载储存媒体。
  REPLACE 指出即使资料档案已经存在,SQL Server 仍将还原这些档案。现存的档案将被删除和覆写。如果没有指定 REPLACE,那麼 SQL Server 将会核对 database_name 是否已经存在。如果已经存在,那麼将终止还原操作。这个安全特性帮助避免无意地将还原覆写正在工作的资料库。
  RESTART 指定 SQL Server 在还原操作被中断后重新启动还原操作。
  STATS [ = percentage ] 在还原操作完成了指定的百分率后显示讯息。如果需要监控操作的过程,这个选项将会很有用。
  PARTIAL 指定执行部份还原。
  STOPAT = date_time
  (log restore only)
  指定资料库回复到 data_time 指定时刻的资料状态(只对记录档还原有效)。
  STOPATMARK = 'mark' 指定还原操作进行到标记处。
  STOPBEFOREMARK = 'mark' 指定还原操作进行到标记之前。
  说明
  命名交易(Named transactions)是 SQL Server 2000 中的新功能。它们是使用命令 BEGIN TRANSACTION ... WITH MARK 的 mark_name 选项建立的,特点是可以使用 RESTORE 命令中的 STOPATMARK 和 STOPBEFOREMARK 功能。
  --------------------------------------------------------------------------------
  --------------------------------------------------------------------------------
  真实世界 使用RESTORE
  这里有几个使用 RESTORE T-SQL 命令的例子。
  这个陈述式还原 Example 资料库的资料档:
  RESTORE DATABASE Example
  FROM Backup_Dev_1, Backup_Dev_2
  WITH
  NORECOVERY,
  STATS = 5
  GO
  这个陈述式还原 Example 资料库的交易记录档:
  RESTORE LOG Example
  FROM Backup_Dev_3, Backup_Dev_4
  WITH
  NORECOVERY,
  STATS = 5,
  UNLOAD
  GO
  和还原的结果一样,输出将显示操作完成的百分率。将通知还原了多少页面、还原花了多少时间,以及还原执行的速度(MB/sec)。
  现在可用以下的命令回复资料库:
  RESTORE LOG Example
  WITH RECOVERY
  GO
  您将再次看到关於还原操作的统计。
  数据分组
  1。选前几条数据
  select top 10 orderid,amt=unitprice*quantity
  from ordredetails
  order by amt desc
  2.利用group by 子句对select命令所选数据分组。分组后可以显示出来
  group by是除了不含汇总函数(sum,avg,count,min,max等以外的列)
  select prod_id,sum(qty*unit_price) tot_amt
  from sale_item
  group by prod_id
  order by tot_amt desc
  3.group by 子句还可以加 with cube语句,加上with cube语句,其返回的数据除了和没有with cube语句一样外,,另外它会得到一些加总列。
  select sup_id,prod_id ,sum(qty*unit_price),sum(qty) tot_amt
  from sale_item
  groupby sup_id,prod_id with cube
  将有对应每个sup_id的加总列,每个prod_id 的加总列,和null,null全部的加总列
  4.with cube语句换成with rollup ,则只返回最高层次的group列(最靠近group by的列的加总)
  上面的例子,只返回sup_id的加总列,每个sup_id后有个加总列
  5。使用grouping区分空值
  cube操作生成的空值null带来一个问题,即如何区分cube操作生成的null值和实际数据中返回的null值。这个问题,可以用grouping函数解决。如果列中的值来自事实数据,则grouping函数返回0,如果列中的值是cube操作所生成的null,则返回1。在cube操作中,所生成的null代表全体值。可将select语句写成使用grouping函数将null替换为字符串all。
  因为事实数据中的null表名数据值未知,所以select语句还可以用字符串unknow替代来自事实数据的null。
  select productid,grouping(productid),orderid,grouping(orderid),sum(quantity)
  from order
  group by productid,orderid
  with cube
  order by productid,orderid
  6.group by 子句经常会和having子句搭配,用来找出每个组别中满足指定条件的数据,以下命令由产品文件中找出代码重复者,也就是同一型产品有两家以上的供应商。
  select prod_id,count(*) from stock
  group by prod_id
  having count(*)>1
  order by prod_id
本文出自 “乐成的技术笔记” 博客,谢绝转载!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: