select pub_id from publishers where pub_name='Binnet & Hardley') b)可以使用 IN运算符来操作返回一列或多行的子查询。
Select pub_name from publishers where pub_id in (select pub_id from titles where type='business')
c)可以返回多行或多列的子查询(事实上是所有的列)使用EXISTS关键字。下面的例子返回与上例相同的结果集:
Select pub_name from publishers p where exists
(select * from titles t where p.pub_id=t.pub_id and type='business')
第十二节 使用 TOP 和 PERCENT 限制结果集 TOP 子句限制返回到结果集中的行数。 TOP n [PERCENT]
n 指定返回的行数。如果未指定 PERCENT,n 就是返回的行数。如果指定了 PERCENT,n 就是返回的结果集行的百分比, 如下所示:
1)TOP 120 /*Return the top 120 rows of the result set. */ 2)TOP 15 PERCENT /* Return the top 15% of the result set. */. 说明:
a)如果一个 SELECT 语句既包含 TOP 又包含 ORDER BY 子句,那么返回的行将会从排序后的结果集中选择。整个结果集按
照指定的顺序建立并且返回排好序的结果集的前 n 行。
b)限制结果集大小的另一种方法是在执行一个语句之前执行 SET ROWCOUNT n 语句。
第十三节 设置数字日期格式
SQL Server 2000允许用指定的数字月份指定日期数据,当使用数字日期格式时,在字符串中以斜 杠(\\)>、连字符(-)或句号(.)作为分隔符来指定月、日、年,字符串必须以下面的形式出现: 数字 分隔符 数字 分隔符 数字 [时间] [时间] 下面的数字日期格式是有效的:
[0]4/15/2001---(mdy) [0]4-15-2001---(mdy) [0]4.15.2001---(mdy) [04]/2001/15---(myd) 15/[0]4/2001---(dmy) 15/2001/[0]4---(dym) 2001/15/[0]4---(ydm) 2001/[04]/15---(ymd)
当语言被设置为us_english时,默认的日期顺序是mdy,可以使用SET DATEFORMAT语句改变日期的 顺序,根据所用的语言,它也会影响日期顺序。
例:SET DATEFORMAT ymd 将日期设置为年月日格式
第十四节 数据导入导出
1、将数据从SQL Server中导出到Excel文件
EXEC master..xp_cmdshell 'bcp oa..verify out c:\\verify.xls -c -q -S\P“1\ --如果从SQL数据库中,导出数据到Excel,如果Excel文件已经存在,而且已经按照要接收的数据创建好表头,就可以简单的用: insert into OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE=c:\\kc.xls',kc$) select * from 表 2、将数据从Excel文件导入到SQL Server中 --导入数据并生成表
select * into 表 from OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:\\kc.xls',kc$)
--如果接受数据导入的表已经存在 insert into 表 select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:\\kc.xls',kc$)
EXEC master..xp_cmdshell 'bcp oa..verify in c:\\verify.xls -c -q -S\3、将数据从SQL Server中导出到文本文件
EXEC master..xp_cmdshell 'bcp \ exec master..xp_cmdshell 'bcp \P \ EXEC master..xp_cmdshell 'bcp \-c -S\
4、将数据从文本文件导入到SQL Server中
EXEC master..xp_cmdshell 'bcp \
master 数据库
记录 SQL Server 系统的所有系统级别信息。它记录所有的登录帐户和系统配置设置。 xp_cmdshell
以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出。 -c
使用字符数据类型执行大容量复制操作。此选项不提示输入每一字段;它使用 char 作为存储类型,不 带前缀,\\t(制表符)作为字段分隔符,\\n(换行符)作为行终止符。 in | out | queryout | format
指定大容量复制的方向。in 是从文件复制到数据库表或视图,out 是指从数据库表或视图复制到文件。只有从查询中大容量复制数据时,才必须
指定 queryout。根据指定的选项(-n、-c、-w、-6 或 -N)以及表或视图分隔符,format 将创建一个格式文件。如果使用 format,则还必须指 定 -f 选项。
第十五节 使用TRUNCATE TABLE快速删除表中的所有数据 TRUNCATE TABLE
删除表中的所有行,而不记录单个行删除操作。 语法
TRUNCATE TABLE name 参数 name
是要截断的表的名称或要删除其全部行的表的名称。 注释
TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。 但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。
DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释 放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用 的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数 据,请使用 DROP TABLE 语句。
对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语
句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
TRUNCATE TABLE 不能用于参与了索引视图的表。 示例
下例删除 authors 表中的所有数据。 TRUNCATE TABLE authors 权限
TRUNCATE TABLE 权限默认授予表所有者、sysadmin 固定服务器角色成员、db_owner 和 db_ddladmin 固定数 据库角色成员且不可转让。
第十六节 使用CHARINDEX函数代替Like进行数据查询 CHARINDEX函数(比like查找更快速 ) 返回字符串中指定表达式的起始位置。 语法
CHARINDEX ( expression1 , expression2 [ , start_location ] ) 参数
expression1
一个表达式,其中包含要寻找的字符的次序。expression1 是一个短字符数据类型分类的表达式。 expression2
一个表达式,通常是一个用于搜索指定序列的列。expression2 属于字符串数据类型分类。 start_location
在 expression2 中搜索 expression1 时的起始字符位置。如果没有给定 start_location,而是 一个负数或零,则将从 expression2 的起始位置开始搜索。 返回类型 int 例:
select study_matter,study_data from english_data where study_data like '%问%' select study_matter,study_data from english_data where CHARINDEX('问',study_data)>0
第十七节 使用CASE函数格式进行条件查询 USE pubs SELECT CASE type
WHEN 'popular_comp' THEN 'Popular Computing' WHEN 'mod_cook' THEN 'Modern Cooking' WHEN 'business' THEN 'Business' WHEN 'psychology' THEN 'Psychology' WHEN 'trad_cook' THEN 'Traditional Cooking' ELSE 'Not yet categorized' END AS Category,
CONVERT(varchar(30), title) AS \ price AS Price FROM titles
WHERE price IS NOT NULL ORDER BY 1
第十八节 用BEGIN…END语句进行数据统计
BEGIN和END语句主要用于将多个Transact-SQL语句组合为一个逻辑块,可把这个逻辑块看作为一个整体来进行处理,在书写程序时应注意
当控制流语句(条件语句和循环控制语句)执行一个包含两条或两条以上Transact-SQL语句的语句块时,就应使用此语句。
IF(SELECT COUNT(*) FROM DEPT WHERE DEPT='信息部')>0 BEGIN
SELECT COUNT(NAME) AS 人数 FROM VERIFY WHERE DEPT_ID=(SELECT ID FROM DEPT WHERE DEPT='信息部')
IF(SELECT COUNT(*) FROM VERIFY WHERE STATION='网络管理工程师')>0 BEGIN
SELECT COUNT(NAME) AS 人数 FROM VERIFY WHERE STATION='网络管理工程师' END ELSE BEGIN
SELECT ?无记录?AS 人数 END END
第十九节 使用DECLARE 语句进行数据统计
在批处理或过程的正文中用 DECLARE 语句声明变量,并用 SET 或 SELECT 语句给其指派值。游标变量可通
过该语句声明,并且可用在其它与游标相关的语句中。所有变量在声明后均初始化为 NULL。 A. 使用 DECLARE
下例使用名为 @find 的局部变量检索所有姓以 Ring 开头的作者信息。 USE pubs
DECLARE @find varchar(30) SET @find = 'Ring%'
SELECT au_lname, au_fname, phone FROM authors
WHERE au_lname LIKE @find
B. 在 DECLARE 中使用两个变量
下例从 Binnet & Hardley (pub_id = 0877) 的雇员中检索从 1993 年 1 月 1 日起所雇佣的雇员名称。 USE pubs GO
DECLARE @pub_id char(4), @hire_date datetime SET @pub_id = '0877'
SET @hire_date = '1993-01/01' SET NOCOUNT OFF SELECT fname, lname FROM employee
WHERE pub_id = @pub_id and hire_date >= @hire_date
第二十节 使用GOTO进行循环求和
GOTO语句可以改变控制流程的方向,一般用来从一个语句块、程序或者是嵌套层的控制流程语言结构中跳出,
它的功能是将执行流变更到标签处,跳过GOTO之后的Transact-SQL语句,使流程在标签处继续处理,GOTO语
句和标签可在过程、批处理或语句块中的任何位置使用。GOTO语句可嵌套使用,但用户必须注意,过度使用
GOTO语句会使程序的执行逻辑变得很难理解,程序控制也不容易,所以除非特殊情况,尽量少用GOTO语句。
--声明两个变量分别用来记录1,2...100的数各记录数据之和 DECLARE @Var_Number int,@Var_Sum int --初始化两个变量 SET @Var_Number=0