经典SQL大全

将SQL SERVER中查询到的数据导成一个Excel文件
-- ======================================================
T-SQL代码:
EXEC  master..xp_cmdshell  'bcp 库名.dbo.表名out c:\Temp.xls -c -q -S"servername" -U"sa" -P""'
参数:S 是SQL服务器名;U是用户;P是密码
说明:还可以导出文本文件等多种格式
实例: EXEC  master..xp_cmdshell  'bcp saletesttmp.dbo.CusAccount out c:\temp1.xls -c -q -S"pmserver" -U"sa" -P"sa"'
EXEC  master..xp_cmdshell  'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout C:\ authors.xls -c -Sservername -Usa -Ppassword'
在VB6中应用ADO导出EXCEL文件代码: 
Dim cn   As  New ADODB. Connection
cn. open  "Driver={SQL Server};Server=WEBSVR;DataBase=WebMis;UID=sa;WD=123;"
cn. execute  "master..xp_cmdshell 'bcp " SELECT  col1, col2  FROM  库名.dbo.表名 " queryout E:\DT.xls -c -Sservername -Usa -Ppassword'"
------------------------------------------------------------------------------------------------
 
4、在SQL SERVER里往Excel插入数据:
-- ======================================================
insert  into  OpenDataSource(  'Microsoft.Jet.OLEDB.4.0' ,
'Data Source="c:\Temp.xls";User ID=Admin;Password=;Extended properties=Excel 5.0' )...table1 (A1,A2,A3)  values  (1,2,3)
 
T-SQL代码:
INSERT  INTO  
OPENDATASOURCE( 'Microsoft.JET.OLEDB.4.0' ,  
'Extended Properties=Excel 8.0;Data source=C:\training\inventur.xls' )...[Filiale1$]  
(bestand, produkt)  VALUES  (20,  'Test' )  
------------------------------------


  1.   SQL分类:  
  2.   
  3.   DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)   
  4.   DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)   
  5.   DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)  
  6.   
  7.   首先,简要介绍基础语句:  
  8.   
  9.   1、说明:创建数据库  
  10.   
  11. CREATE DATABASE database-name  
  12.   
  13.   2、说明:删除数据库  
  14.   
  15. drop database dbname  
  16.   
  17.   3、说明:备份sql server  
  18.   
  19.   --- 创建 备份数据的 device  
  20.   
  21. USE master  
  22.  EXEC sp_addumpdevice 'disk', 'testBack', 'c:/mssql7backup/MyNwind_1.dat'  
  23.   
  24.   --- 开始 备份  
  25.   
  26. BACKUP DATABASE pubs TO testBack  
  27.   
  28.   4、说明:创建新表  
  29.   
  30. create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)  
  31.   
  32.   根据已有的表创建新表:  
  33.   
  34. A:create table tab_new like tab_old (使用旧表创建新表)  
  35. B:create table tab_new as select col1,col2… from tab_old definition only  
  36.   
  37.   5、说明:  
  38.   
  39.   删除新表:drop table tabname  
  40.   
  41.   6、说明:  
  42.   
  43.   增加一个列:Alter table tabname add column col type  
  44.   
  45.   注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。  
  46.   
  47.   7、说明:  
  48.   
  49.   添加主键:Alter table tabname add primary key(col)  
  50.   
  51.   说明:  
  52.   
  53.   删除主键:Alter table tabname drop primary key(col)  
  54.   
  55.   8、说明:  
  56.   
  57.   创建索引:create [unique] index idxname on tabname(col….)  
  58.   
  59.   删除索引:drop index idxname  
  60.   
  61.   注:索引是不可更改的,想更改必须删除重新建。  
  62.   
  63.   9、说明:  
  64.   
  65.   创建视图:create view viewname as select statement  
  66.   
  67.   删除视图:drop view viewname  
  68.   
  69. 10、说明:几个简单的基本的sql语句  
  70.   
  71.   选择:select * from table1 where 范围  
  72.   
  73.   插入:insert into table1(field1,field2) values(value1,value2)  
  74.   
  75.   删除:delete from table1 where 范围  
  76.   
  77.   更新:update table1 set field1=value1 where 范围  
  78.   
  79.   查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!  
  80.   
  81.   排序:select * from table1 order by field1,field2 [desc]  
  82.   
  83.   总数:select count * as totalcount from table1  
  84.   
  85.   求和:select sum(field1) as sumvalue from table1  
  86.   
  87.   平均:select avg(field1) as avgvalue from table1  
  88.   
  89.   最大:select max(field1) as maxvalue from table1  
  90.   
  91.   最小:select min(field1) as minvalue from table1  
  92.   
  93.   11、说明:几个高级查询运算词  
  94.   
  95.   A: UNION 运算符  
  96.   
  97.    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。  
  98.   
  99.   B: EXCEPT 运算符  
  100.   
  101.   EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。  
  102.   
  103.   C: INTERSECT 运算符  
  104.   
  105.   INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。  
  106.   
  107.   注:使用运算词的几个查询结果行必须是一致的。  
  108.   
  109.   12、说明:使用外连接  
  110.   
  111.   A、left outer join:  
  112.   
  113.   左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。  
  114.   
  115. SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c  
  116.   
  117.   B:right outer join:  
  118.   
  119.   右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。  
  120.   
  121.   C:full outer join:  
  122.   
  123.   全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。  
  124.   
  125.   其次,大家来看一些不错的sql语句  
  126.   
  127.   1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)  
  128.   
  129.   法一:select * into b from a where 1<>1  
  130.   
  131.   法二:select top 0 * into b from a  
  132.   
  133.   2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)  
  134.   
  135. insert into b(a, b, c) select d,e,f from b;  
  136.   
  137.   3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)  
  138.   
  139. insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件  
  140.   
  141.   例子:..from b in '"&Server.MapPath(".")&"/data.mdb" &"' where..  
  142.   
  143.   4、说明:子查询(表名1:a 表名2:b)  
  144.   
  145. select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)  
  146.   
  147.   5、说明:显示文章、提交人和最后回复时间  
  148.   
  149. select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b  
  150.   
  151. 6、说明:外连接查询(表名1:a 表名2:b)  
  152.   
  153. select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c  
  154.   
  155.   7、说明:在线视图查询(表名1:a )  
  156.   
  157. select * from (SELECT a,b,c FROM a) T where t.a > 1;  
  158.   
  159.   8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括  
  160.   
  161. select * from table1 where time between time1 and time2  
  162.   
  163. select a,b,c, from table1 where a not between 数值1 and 数值2  
  164.   
  165.   9、说明:in 的使用方法  
  166.   
  167. select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)  
  168.   
  169.   10、说明:两张关联表,删除主表中已经在副表中没有的信息  
  170.   
  171. delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )  
  172.   
  173.   11、说明:四表联查问题:  
  174.   
  175. select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....  
  176.   
  177.   12、说明:日程安排提前五分钟提醒  
  178.   
  179. SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5  
  180.   
  181.   13、说明:一条sql 语句搞定数据库分页  
  182.   
  183. select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段  
  184.   
  185.   14、说明:前10条记录  
  186.   
  187. select top 10 * form table1 where 范围  
  188.   
  189.   15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)  
  190.   
  191. select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)  
  192.   
  193.   16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表  
  194.   
  195. (select a from tableA ) except (select a from tableB) except (select a from tableC)  
  196.   
  197.   17、说明:随机取出10条数据  
  198.   
  199. select top 10 * from tablename order by newid()  
  200.   
  201.   18、说明:随机选择记录  
  202.   
  203. select newid()  
  204.   
  205.   19、说明:删除重复记录  
  206.   
  207. Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)  
  208.   
  209.   20、说明:列出数据库里所有的表名  
  210.   
  211. select name from sysobjects where type='U'  
  212.   
  213. 21、说明:列出表里的所有的  
  214.   
  215. select name from syscolumns where id=object_id('TableName')  
  216.   
  217.   22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。  
  218.   
  219. select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type  
  220.   
  221.   显示结果:  
  222.   
  223. type     vender pcs  
  224. 电脑 A 1  
  225. 电脑 A 1  
  226. 光盘 B 2  
  227. 光盘 A 2  
  228. 手机 B 3  
  229. 手机 C 3  
  230.   
  231.   23、说明:初始化表table1  
  232.   
  233. TRUNCATE TABLE table1  
  234.   
  235.   24、说明:选择从10到15的记录  
  236.   
  237. select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc  
  238.   
  239. 随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)  
  240.   
  241.   对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:  
  242.   
  243. Randomize   
  244. RNumber = Int(Rnd*499) +1   
  245.    
  246. While Not objRec.EOF   
  247. If objRec("ID") = RNumber THEN   
  248. ... 这里是执行脚本 ...   
  249. end if   
  250. objRec.MoveNext   
  251. Wend  
  252.   
  253.    这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一 个数据库内就包含了成千上万条记录。这时候不就死定了?  
  254.   
  255.   采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:  
  256.   
  257. Randomize   
  258. RNumber = Int(Rnd*499) + 1   
  259.    
  260. SQL = "SELECT * FROM Customers WHERE ID = " & RNumber   
  261.    
  262. set objRec = ObjConn.Execute(SQL)   
  263. Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")  
  264.   
  265.   不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。  
  266.   
  267. 再谈随机数  
  268.   
  269.   现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。  
  270.   
  271.   为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:  
  272.   
  273.   SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3  
  274.   
  275.   假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码):   
  276. SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"  
  277.   
  278.   注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。  
  279.   
  280.   随机读取若干条记录,测试过  
  281.   
  282. Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id)  
  283.  Sql server:select top n * from 表名 order by newid()  
  284.  mysql select * From 表名 Order By rand() Limit n  
  285.   
  286.   Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)  
  287.   
  288.   语法 select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...  
  289.   
  290.   使用SQL语句 用...代替过长的字符串显示  
  291.   
  292.   语法:  
  293.   
  294.   SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename  
  295.   Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;  
  296.   
  297.   Conn.Execute说明  
  298.   
  299.   Execute方法  
  300.   
  301.   该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:  
  302.   
  303.   1.执行SQL查询语句时,将返回查询得到的记录集。用法为:  
  304.   
  305.   Set 对象变量名=连接对象.Execute("SQL 查询语言")  
  306.   
  307.   Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。  
  308.   
  309.   2.执行SQL的操作性语言时,没有记录集的返回。此时用法为:  
  310.   
  311.   连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]  
  312.   
  313.   ·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。  
  314.   
  315.   ·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。  
  316.   
  317.   ·BeginTrans、RollbackTrans、CommitTrans方法  
  318.   
  319.   这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。  
  320.   
  321.   事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。  
  322.   
  323.    BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过 连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一 个错误信息。  
  324.   
  325. SQL语句大全精要  
  326.   
  327. 2006/10/26 13:46  
  328. DELETE语句   
  329. DELETE语句:用于创建一个删除查询,可从列在 FROM 子句之中的一个或多个表中删除记录,且该子句满足 WHERE 子句中的条件,可以使用DELETE删除多个记录。  
  330.   
  331. 语法:DELETE [table.*] FROM table WHERE criteria  
  332.   
  333. 语法:DELETE * FROM table WHERE criteria='查询的字'  
  334.   
  335. 说明:table参数用于指定从其中删除记录的表的名称。  
  336. criteria参数为一个表达式,用于指定哪些记录应该被删除的表达式。  
  337.  可以使用 Execute 方法与一个 DROP 语句从数据库中放弃整个表。不过,若用这种方法删除表,将会失去表的结构。不同的是当使用 DELETE,只有数据会被删除;表的结构以及表的所有属性仍然保留,例如字段属性及索引。  
  338.   
  339.    
  340.   
  341. UPDATE   
  342. 有关UPDATE,急!!!!!!!!!!!  
  343.  在ORACLE数据库中  
  344.  表 A ( ID ,FIRSTNAME,LASTNAME )   
  345. 表 B( ID,LASTNAME)  
  346.   
  347. 表 A 中原来ID,FIRSTNAME两个字段的数据是完整的  
  348.  表 B中原来ID,LASTNAME两个字段的数据是完整的  
  349.  现在要把表 B中的LASTNAME字段的相应的数据填入到A表中LASTNAME相应的位置。两个表中的ID字段是相互关联的。  
  350.  先谢谢了!!!!  
  351.   
  352. update a set a.lastname=(select b.lastname from b where a.id=b.id)  
  353.   
  354.   
  355.   掌握SQL四条最基本的数据操作语句:Insert,Select,Update和Delete。  
  356.   
  357.    练掌握SQL是数据库用户的宝贵财 富。在本文中,我们将引导你掌握四条最基本的数据操作语句—SQL的核心功能—来依次介绍比较操作符、选择断言以及三值逻辑。当你完成这些学习后,显然你已经开始算是精通SQL了。  
  358.   
  359.    在我们开始之前,先使用CREATE TABLE语句来创建一个表(如图1所示)。DDL语句对数据库对象如表、列和视进行定义。它们并不对表中的行进行处理,这是因为DDL语句并不处理数据 库中实际的数据。这些工作由另一类SQL语句—数据操作语言(DML)语句进行处理。  
  360.   
  361.    SQL中有四种基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由于这是大多数SQL用户经常用到的,我们有必要在此对它 们进行一一说明。在图1中我们给出了一个名为EMPLOYEES的表。其中的每一行对应一个特定的雇员记录。请熟悉这张表,我们在后面的例子中将要用到 它。  
  362.   
  363.   INSERT语句  
  364.   
  365.   用户可以用INSERT语句将一行记录插入到指定的一个表中。例如,要将雇员John Smith的记录插入到本例的表中,可以使用如下语句:  
  366.   
  367.   INSERT INTO EMPLOYEES VALUES  
  368.   
  369.    ('Smith','John','1980-06-10',  
  370.   
  371.    'Los Angles',16,45000);  
  372.   
  373.   通过这样的INSERT语句,系统将试着将这些值填入到相应的列中。这些列按照我们创建表时定义的顺序排列。在本例中,第一个值“Smith”将填到第一个列LAST_NAME中;第二个值“John”将填到第二列FIRST_NAME中……以此类推。  
  374.   
  375.   我们说过系统会“试着”将值填入,除了执行规则之外它还要进行类型检查。如果类型不符(如将一个字符串填入到类型为数字的列中),系统将拒绝这一次操作并返回一个错误信息。  
  376.   
  377.   如果SQL拒绝了你所填入的一列值,语句中其他各列的值也不会填入。这是因为SQL提供对事务的支持。一次事务将数据库从一种一致性转移到另一种一致性。如果事务的某一部分失败,则整个事务都会失败,系统将会被恢复(或称之为回退)到此事务之前的状态。  
  378.   
  379.    回到原来的INSERT的例子,请注意所有的整形十进制数都不需要用单引号引起来,而字符串和日期类型的值都要用单引号来区别。为了增加可读性而在数字间插入逗号将会引起错误。记住,在SQL中逗号是元素的分隔符。  
  380.   
  381.   同样要注意输入文字值时要使用单引号。双引号用来封装限界标识符。  
  382.   
  383.   对于日期类型,我们必须使用SQL标准日期格式(yyyy-mm-dd),但是在系统中可以进行定义,以接受其他的格式。当然,2000年临近,请你最好还是使用四位来表示年份。  
  384.   
  385.   既然你已经理解了INSERT语句是怎样工作的了,让我们转到EMPLOYEES表中的其他部分:  
  386.   
  387.   INSERT INTO EMPLOYEES VALUES  
  388.   
  389.    ('Bunyan','Paul','1970-07-04',  
  390.   
  391.    'Boston',12,70000);  
  392.   
  393.   INSERT INTO EMPLOYEES VALUES  
  394.   
  395.    ('John','Adams','1992-01-21',  
  396.   
  397.    'Boston',20,100000);  
  398.   
  399.   INSERT INTO EMPLOYEES VALUES  
  400.   
  401.    ('Smith','Pocahontas','1976-04-06',  
  402.   
  403.    'Los Angles',12,100000);  
  404.   
  405.   INSERT INTO EMPLOYEES VALUES  
  406.   
  407.    ('Smith','Bessie','1940-05-02',  
  408.   
  409.    'Boston',5,200000);  
  410.   
  411.   INSERT INTO EMPLOYEES VALUES  
  412.   
  413.    ('Jones','Davy','1970-10-10',  
  414.   
  415.    'Boston',8,45000);  
  416.   
  417.   INSERT INTO EMPLOYEES VALUES  
  418.   
  419.    ('Jones','Indiana','1992-02-01',  
  420.   
  421.    'Chicago',NULL,NULL);  
  422.   
  423.   在最后一项中,我们不知道Jones先生的工薪级别和年薪,所以我们输入NULL(不要引号)。NULL是SQL中的一种特殊情况,我们以后将进行详细的讨论。现在我们只需认为NULL表示一种未知的值。  
  424.   
  425.   有时,像我们刚才所讨论的情况,我们可能希望对某一些而不是全部的列进行赋值。除了对要省略的列输入NULL外,还可以采用另外一种INSERT语句,如下:  
  426.   
  427.   INSERT INTO EMPLOYEES(  
  428.   
  429.    FIRST_NAME, LAST_NAME,  
  430.   
  431.    HIRE_DATE, BRANCH_OFFICE)  
  432.   
  433.   VALUE(  
  434.   
  435.    'Indiana','Jones',  
  436.   
  437.    '1992-02-01','Indianapolis');  
  438.   
  439.    这样,我们先在表名之后列出一系列列名。未列出的列中将自动填入缺省值,如果没有设置缺省值则填入NULL。请注意我们改变了列的顺序,而值的顺序要对 应新的列的顺序。如果该语句中省略了FIRST_NAME和LAST_NAME项(这两项规定不能为空),SQL操作将失败。  
  440.   
  441.   让我们来看一看上述INSERT语句的语法图:  
  442.   
  443.   INSERT INTO table  
  444.   
  445.    [(column { ,column})]  
  446.   
  447.   VALUES  
  448.   
  449.    (columnvalue [{,columnvalue}]);  
  450.   
  451.   和前一篇文章中一样,我们用方括号来表示可选项,大括号表示可以重复任意次数的项(不能在实际的SQL语句中使用这些特殊字符)。VALUE子句和可选的列名列表中必须使用圆括号。  
  452.   
  453.   SELECT语句  
  454.   
  455.   SELECT语句可以从一个或多个表中选取特定的行和列。因为查询和检索数据是数据库管理中最重要的功能,所以SELECT语句在SQL中是工作量最大的部分。实际上,仅仅是访问数据库来分析数据并生成报表的人可以对其他SQL语句一窍不通。  
  456.   
  457.    SELECT语句的结果通常是生成另外一个表。在执行过程中系统根据用户的标准从数据库中选出匹配的行和列,并将结果放到临时的表中。在直接 SQL(direct SQL)中,它将结果显示在终端的显示屏上,或者将结果送到打印机或文件中。也可以结合其他SQL语句来将结果放到一个已知名称的表中。  
  458.   
  459.   SELECT语句功能强大。虽然表面上看来它只用来完成本文第一部分中提到的关系代数运算“选择”(或称“限制”),但实际上它也可以完成其他两种关系运算—“投影”和“连接”,SELECT语句还可以完成聚合计算并对数据进行排序。  
  460.   
  461.   SELECT语句最简单的语法如下:  
  462.   
  463.   SELECT columns FROM tables;  
  464.   
  465.   当我们以这种形式执行一条SELECT语句时,系统返回由所选择的列以及用户选择的表中所有指定的行组成的一个结果表。这就是实现关系投影运算的一个形式。  
  466.   
  467.   让我们看一下使用图1中EMPLOYEES表的一些例子(这个表是我们以后所有SELECT语句实例都要使用的。而我们在图2和图3中给出了查询的实际结果。我们将在其他的例子中使用这些结果)。  
  468.   
  469.   假设你想查看雇员工作部门的列表。那下面就是你所需要编写的SQL查询:  
  470.   
  471.   SELECT BRANCH_OFFICE FROM EMPLOYEES;  
  472.   
  473.   以上SELECT语句的执行将产生如图2中表2所示的结果。  
  474.   
  475.   由于我们在SELECT语句中只指定了一个列,所以我们的结果表中也只有一个列。注意结果表中具有重复的行,这是因为有多个雇员在同一部门工作(记住SQL从所选的所有行中将值返回)。要消除结果中的重复行,只要在SELECT语句中加上DISTINCT子句:  
  476.   
  477.   SELECT DISTINCT BRANCH_OFFICE  
  478.   
  479.   FROM EMPLOYEES;  
  480.   
  481.   这次查询的结果如表3所示。  
  482.   
  483.   现在已经消除了重复的行,但结果并不是按照顺序排列的。如果你希望以字母表顺序将结果列出又该怎么做呢?只要使用ORDER BY子句就可以按照升序或降序来排列结果:  
  484.   
  485.   SELECT DISTINCT BRANCH_OFFICE  
  486.   
  487.   FROM EMPLOYEES  
  488.   
  489.   ORDER BY BRANCH_OFFICE ASC;  
  490.   
  491.    这一查询的结果如表4所示。请注意在ORDER BY之后是如何放置列名BRANCH _OFFICE的,这就是我们想要对其进行排序的列。为什么即使是结果表中只有一个列时我们也必须指出列名呢?这是因为我们还能够按照表中其他列进行排 序,即使它们并不显示出来。列名BRANCH_ OFFICE之后的关键字ASC表示按照升序排列。如果你希望以降序排列,那么可以用关键字DESC。  
  492.   
  493.   同样我们应该指出ORDER BY子句只将临时表中的结果进行排序;并不影响原来的表。  
  494.   
  495.   假设我们希望得到按部门排序并从工资最高的雇员到工资最低的雇员排列的列表。除了工资括号中的内容,我们还希望看到按照聘用时间从最近聘用的雇员开始列出的列表。以下是你将要用到的语句:  
  496.   
  497.   SELECT BRANCH_OFFICE,FIRST_NAME,  
  498.   
  499.    LAST_NAME,SALARY,HIRE_DATE  
  500.   
  501.   FROM EMPLOYEES  
  502.   
  503.   ORDER BY SALARY DESC,  
  504.   
  505.    HIRE_DATE DESC;  
  506.   
  507.    这里我们进行了多列的选择和排序。排序的优先级由语句中的列名顺序所决定。SQL将先对列出的第一个列进行排序。如果在第一个列中出现了重复的行时,这 些行将被按照第二列进行排序,如果在第二列中又出现了重复的行时,这些行又将被按照第三列进行排序……如此类推。这次查询的结果如表5所示。  
  508.   
  509.   将一个很长的表中的所有列名写出来是一件相当麻烦的事,所以SQL允许在选择表中所有的列时使用*号:  
  510.   
  511.   SELECT * FROM EMPLOYEES;  
  512.   
  513.   这次查询返回整个EMPLOYEES表,如表1所示。  
  514.   
  515.    下面我们对开始时给出的SELECT语句的语法进行一下更新(竖直线表示一个可选项,允许在其中选择一项。):  
  516.   
  517.   SELECT [DISTINCT]  
  518.   
  519.    (column [{, columns}])| *  
  520.   
  521.   FROM table [ {, table}]  
  522.   
  523.   [ORDER BY column [ASC] | DESC  
  524.   
  525.    [ {, column [ASC] | DESC }]];  
  526.   
  527.   定义选择标准  
  528.   
  529.   在我们目前所介绍的SELECT语句中,我们对结果表中的列作出了选择但返回的是表中所有的行。让我们看一下如何对SELECT语句进行限制使得它只返回希望得到的行:  
  530.   
  531.   SELECT columns FROM tables [WHERE predicates];  
  532.   
  533.    WHERE子句对条件进行了设置,只有满足条件的行才被包括到结果表中。这些条件由断言(predicate)进行指定(断言指出了关于某件事情的一种 可能的事实)。如果该断言对于某个给定的行成立,该行将被包括到结果表中,否则该行被忽略。在SQL语句中断言通常通过比较来表示。例如,假如你需要查询 所有姓为Jones的职员,则可以使用以下SELECT语句:  
  534.   
  535.   SELECT * FROM EMPLOYEES  
  536.   
  537.   WHERE LAST_NAME = 'Jones';  
  538.   
  539.   LAST_NAME = 'Jones'部分就是断言。在执行该语句时,SQL将每一行的LAST_NAME列与“Jones”进行比较。如果某一职员的姓为“Jones”,即断言成立,该职员的信息将被包括到结果表中(见表6)。  
  540.   
  541.   使用最多的六种比较  
  542.   
  543.   我们上例中的断言包括一种基于“等值”的比较(LAST_NAME = 'Jones'),但是SQL断言还可以包含其他几种类型的比较。其中最常用的为:  
  544.   
  545.   等于 =  
  546.   
  547.   不等于 <>  
  548.   
  549.   小于 <  
  550.   
  551.   大于 >  
  552.   
  553.   小于或等于 <=  
  554.   
  555.   大于或等于 >=  
  556.   
  557.   下面给出了不是基于等值比较的一个例子:  
  558.   
  559.   SELECT * FROM EMPLOYEES  
  560.   
  561.   WHERE SALARY > 50000;  
  562.   
  563.   这一查询将返回年薪高于$50,000.00的职员(参见表7)。  
  564.   
  565.   逻辑连接符  
  566.   
  567.    有时我们需要定义一条不止一种断言的SELECT语句。举例来说,如果你仅仅想查看Davy Jones的信息的话,表6中的结果将是不正确的。为了进一步定义一个WHERE子句,用户可以使用逻辑连接符AND,OR和NOT。为了只得到职员 Davy Jones的记录,用户可以输入如下语句:  
  568.   
  569.   SELECT * FROM EMPLOYEES  
  570.   
  571.   WHERE LAST_NAME = 'Jones' AND FIRST_NAME = 'Davy';  
  572.   
  573.   在本例中,我们通过逻辑连接符AND将两个断言连接起来。只有两个断言都满足时整个表达式才会满足。如果用户需要定义一个SELECT语句来使得当其中任何一项成立就满足条件时,可以使用OR连接符:  
  574.   
  575.   SELECT * FROM EMPLOYEES  
  576.   
  577.   WHERE LAST_NAME = 'Jones' OR LAST_NAME = 'Smith';  
  578.   
  579.   有时定义一个断言的最好方法是通过相反的描述来说明。如果你想要查看除了Boston办事处的职员以外的其他所有职员的信息时,你可以进行如下的查询:  
  580.   
  581.   SELECT * FROM EMPLOYEES  
  582.   
  583.   WHERE NOT(BRANCH_OFFICE = 'Boston');  
  584.   
  585.   关键字NOT后面跟着用圆括号括起来的比较表达式。其结果是对结果取否定。如果某一职员所在部门的办事处在Boston,括号内的表达式返回true,但是NOT操作符将该值取反,所以该行将不被选中。  
  586.   
  587.   断言可以与其他的断言嵌套使用。为了保证它们以正确的顺序进行求值,可以用括号将它们括起来:  
  588.   
  589.   SELECT * FROM EMPLOYEES  
  590.   
  591.   WHERE (LAST_NAME = 'Jones'  
  592.   
  593.   AND FIRST_NAME = 'Indiana')  
  594.   
  595.   OR (LAST_NAME = 'Smith'  
  596.   
  597.   AND FIRST_NAME = 'Bessie');  
  598.   
  599.   SQL沿用数学上标准的表达式求值的约定—圆括号内的表达式将最先进行求值,其他表达式将从左到右进行求值。  
  600.   
  601.   以上对逻辑连接符进行了说明,在对下面的内容进行说明之前,我们再一次对SELECT语句的语法进行更新:  
  602.   
  603.   SELECT [DISTINCT]  
  604.   
  605.    (column [{, column } ] )| *  
  606.   
  607.   FROM table [ { , table} ]  
  608.   
  609.   [ORDER BY column [ASC] | [DESC  
  610.   
  611.   [{ , column [ASC] | [DESC } ] ]  
  612.   
  613.   WHERE predicate [ { logical-connector predicate } ];  
  614.   
  615.   NULL和三值逻辑  
  616.   
  617.   在SQL中NULL是一个复杂的话题,关于NULL的详细描述更适合于在SQL的高级教程而不是现在的入门教程中进行介绍。但由于NULL需要进行特殊处理,并且你也很可能会遇到它,所以我们还是简略地进行一下说明。  
  618.   
  619.   首先,在断言中进行NULL判断时需要特殊的语法。例如,如果用户需要显示所有年薪未知的职员的全部信息,用户可以使用如下SELECT语句:  
  620.   
  621.   SELECT * FROM EMPLOYEES  
  622.   
  623.   WHERE SALARY IS NULL;  
  624.   
  625.   相反,如果用户需要所有已知年薪数据的职员的信息,你可以使用以下语句:  
  626.   
  627.   SELECT * FROM EMPLOYEES  
  628.   
  629.   WHERE SALARY IS NOT NULL;  
  630.   
  631.   请注意我们在列名之后使用了关键字IS NULL或IS NOT NULL,而不是标准的比较形式:COLUMN = NULL、COLUMN <> NULL或是逻辑操作符NOT(NULL)。  
  632.   
  633.   这种形式相当简单。但当你不明确地测试NULL(而它们确实存在)时,事情会变得很混乱。  
  634.   
  635.   例如,回过头来看我们图1中的EM-PLOYEES表,可以看到Indiana Jones的工薪等级或年薪值都是未知的。这两个列都包含NULL。可以想象运行如下的查询:  
  636.   
  637.   SELECT * FROM EMPLOYEES  
  638.   
  639.   WHERE GRADE <= SALARY;  
  640.   
  641.    此时,Indiana Jones应该出现在结果表中。因为NULL都是相等的,所以可以想象它们是能够通过GRADE小于等于SALARY的检查的。这其实是一个毫无疑义的查 询,但是并没有关系。SQL允许进行这样的比较,只要两个列都是数字类型的。然而,Indiana Jones并没有出现在查询的结果中,为什么?  
  642.   
  643.    正如我们早先提到过的,NULL表示未知的值(而不是象某些人所想象的那样表示一个为NULL的值)。对于SQL来说意味着这个值是未知的,而只要这个 值为未知,就不能将其与其他值比较(即使其他值也是NULL)。所以SQL允许除了在true 和false之外还有第三种类型的真值,称之为“非确定”(unknown)值。  
  644.   
  645.    如果比较的两边都是NULL,整个断言就被认为是非确定的。将一个非确定断言取反或使用AND或OR与其他断言进行合并之后,其结果仍是非确定的。由于 结果表中只包括断言值为“真”的行,所以NULL不可能满足该检查。从而需要使用特殊的操作符IS NULL和IS NOT NULL。  
  646.   
  647.   UPDATE语句  
  648.   
  649.   UPDATE语句允许用户在已知的表中对现有的行进行修改。  
  650.   
  651.   例如,我们刚刚发现Indiana Jones的等级为16,工资为$40,000.00,我们可以通过下面的SQL语句对数据库进行更新(并清除那些烦人的NULL)。  
  652.   
  653.   UPDATE EMPLOYEES  
  654.   
  655.   SET GRADE = 16SALARY = 40000  
  656.   
  657.   WHERE FIRST_NAME = 'Indiana'  
  658.   
  659.    AND LAST_NAME = 'Jones';  
  660.   
  661.   上面的例子说明了一个单行更新,但是UPDATE语句可以对多行进行操作。满足WHERE条件的所有行都将被更新。如果,你想让Boston办事处中的所有职员搬到New York,你可以使用如下语句:  
  662.   
  663.   UPDATE EMPLOYEES  
  664.   
  665.   SET BRANCH_OFFICE = 'New York'  
  666.   
  667.   WHERE BRANCH_OFFICE = 'Boston';  
  668.   
  669.   如果忽略WHERE子句,表中所有行中的部门值都将被更新为'New York'。  
  670.   
  671.   UPDATE语句的语法流图如下面所示:  
  672.   
  673.   UPDATE table  
  674.   
  675.   SET column = value [{, column = value}]  
  676.   
  677.   [ WHERE predicate [ { logical-connector predicate}]];  
  678.   
  679.   DELETE语句  
  680.   
  681.    DELETE语句用来删除已知表中的行。如同UPDATE语句中一样,所有满足WHERE子句中条件的行都将被删除。由于SQL中没有UNDO语句或是 “你确认删除吗?”之类的警告,在执行这条语句时千万要小心。如果决定取消Los Angeles办事处并解雇办事处的所有职员,这一卑鄙的工作可以由以下这条语句来实现:  
  682.   
  683.   DELETE FROM EMPLOYEES  
  684.   
  685.   WHERE BRANCH_OFFICE = 'Los Angeles';  
  686.   
  687.   如同UPDATE语句中一样,省略WHERE子句将使得操作施加到表中所有的行。  
  688.   
  689.   DELETE语句的语法流图如下面所示:  
  690.   
  691.   DELETE FROM table  
  692.   
  693.   [WHERE predicate [ { logical-connector predicate} ] ];  
  694.  </pre><br>  
  695. <pre></pre>  
  696. <pre class="html" name="code"> </pre><pre class="html" name="code"> </pre><pre class="html" name="code">一、基础  
  697.    
  698. 1、说明:创建数据库  
  699. CREATE DATABASE database-name   
  700. 2、说明:删除数据库  
  701. drop database dbname  
  702. 3、说明:备份sql server  
  703. --- 创建 备份数据的 device  
  704. USE master  
  705. EXEC sp_addumpdevice 'disk', 'testBack', 'c:/mssql7backup/MyNwind_1.dat'  
  706. --- 开始 备份  
  707. BACKUP DATABASE pubs TO testBack   
  708. 4、说明:创建新表  
  709. create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)  
  710.    
  711. 根据已有的表创建新表:   
  712. A:select * into table_new from table_old (使用旧表创建新表)  
  713. B:create table tab_new as select col1,col2… from tab_old definition only<仅适用于Oracle>  
  714. 5、说明:删除新表  
  715. drop table tabname   
  716. 6、说明:增加一个列,删除一个列  
  717. A:alter table tabname add column col type  
  718. B:alter table tabname drop column colname  
  719. 注:DB2DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。  
  720. 7、说明:添加主键: Alter table tabname add primary key(col)   
  721. 说明:删除主键: Alter table tabname drop primary key(col)   
  722. 8、说明:创建索引:create [unique] index idxname on tabname(col….)   
  723. 删除索引:drop index idxname  
  724. 注:索引是不可更改的,想更改必须删除重新建。  
  725. 9、说明:创建视图:create view viewname as select statement   
  726. 删除视图:drop view viewname  
  727. 10、说明:几个简单的基本的sql语句  
  728. 选择:select * from table1 where 范围  
  729. 插入:insert into table1(field1,field2) values(value1,value2)  
  730. 删除:delete from table1 where 范围  
  731. 更新:update table1 set field1=value1 where 范围  
  732. 查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!  
  733. 排序:select * from table1 order by field1,field2 [desc]  
  734. 总数:select count as totalcount from table1  
  735. 求和:select sum(field1) as sumvalue from table1  
  736. 平均:select avg(field1) as avgvalue from table1  
  737. 最大:select max(field1) as maxvalue from table1  
  738. 最小:select min(field1) as minvalue from table1  
  739. 11、说明:几个高级查询运算词  
  740. A: UNION 运算符   
  741. UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。   
  742. B: EXCEPT 运算符   
  743. EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。   
  744. C: INTERSECT 运算符  
  745. INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。   
  746. 注:使用运算词的几个查询结果行必须是一致的。   
  747. 12、说明:使用外连接   
  748. A、left (outer) join:   
  749. 左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。   
  750. SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c  
  751. B:right (outer) join:   
  752. 右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。   
  753. C:full/cross (outer) join:   
  754. 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。  
  755. 12、分组:Group by:  
  756.    一张表,一旦分组 完成后,查询后只能得到组相关的信息。  
  757.     组相关的信息:(统计信息) count,sum,max,min,avg  分组的标准)  
  758.     在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据  
  759.    在selecte统计函数中的字段,不能和普通的字段放在一起;  
  760.    
  761. 13、对数据库进行操作:  
  762.    分离数据库: sp_detach_db; 附加数据库:sp_attach_db 后接表明,附加需要完整的路径名  
  763. 14.如何修改数据库的名称:  
  764. sp_renamedb 'old_name', 'new_name'   
  765.   
  766.    
  767.    
  768. 二、提升  
  769.    
  770. 1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)  
  771. 法一:select * into b from a where 1<>1(仅用于SQlServer)  
  772. 法二:select top 0 * into b from a  
  773. 2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)  
  774. insert into b(a, b, c) select d,e,f from b;  
  775.    
  776. 3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)  
  777. insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件  
  778. 例子:..from b in '"&Server.MapPath(".")&"/data.mdb" &"' where..  
  779.    
  780. 4、说明:子查询(表名1:a 表名2:b)  
  781. select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)  
  782.    
  783. 5、说明:显示文章、提交人和最后回复时间  
  784. select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b  
  785.    
  786. 6、说明:外连接查询(表名1:a 表名2:b)  
  787. select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c  
  788.    
  789. 7、说明:在线视图查询(表名1:a )  
  790. select * from (SELECT a,b,c FROM a) T where t.a > 1;  
  791.    
  792. 8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括  
  793. select * from table1 where time between time1 and time2  
  794. select a,b,c, from table1 where a not between 数值1 and 数值2  
  795.    
  796. 9、说明:in 的使用方法  
  797. select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)  
  798.    
  799. 10、说明:两张关联表,删除主表中已经在副表中没有的信息   
  800. delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )  
  801.    
  802. 11、说明:四表联查问题:  
  803. select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....  
  804.    
  805. 12、说明:日程安排提前五分钟提醒   
  806. SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5  
  807.    
  808. 13、说明:一条sql 语句搞定数据库分页  
  809. select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段  
  810. 具体实现:  
  811. 关于数据库分页:  
  812.    
  813.   declare @start int,@end int   
  814.   
  815.   @sql  nvarchar(600)  
  816.    
  817.   set @sql=’select top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid from T where Rid>-1)’  
  818.    
  819.   exec sp_executesql @sql  
  820.    
  821.   
  822. 注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引)  
  823.    
  824. 14、说明:前10条记录  
  825. select top 10 * form table1 where 范围  
  826.    
  827. 15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)  
  828. select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)  
  829.    
  830. 16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表  
  831. (select a from tableA ) except (select a from tableB) except (select a from tableC)  
  832.    
  833. 17、说明:随机取出10条数据  
  834. select top 10 * from tablename order by newid()  
  835.    
  836. 18、说明:随机选择记录  
  837. select newid()  
  838.    
  839. 19、说明:删除重复记录  
  840. 1),delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)  
  841. 2),select distinct * into temp from tablename  
  842.   delete from tablename  
  843.   insert into tablename select * from temp  
  844. 评价: 这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作  
  845. 3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段  
  846.    
  847. alter table tablename  
  848. --添加一个自增列  
  849. add  column_b int identity(1,1)  
  850.  delete from tablename where column_b not in(  
  851. select max(column_b)  from tablename group by column1,column2,...)  
  852. alter table tablename drop column column_b  
  853.    
  854. 20、说明:列出数据库里所有的表名  
  855. select name from sysobjects where type='U' // U代表用户  
  856.    
  857. 21、说明:列出表里的所有的列名  
  858. select name from syscolumns where id=object_id('TableName')  
  859.    
  860. 22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。  
  861. select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type  
  862. 显示结果:  
  863. type vender pcs  
  864. 电脑 A 1  
  865. 电脑 A 1  
  866. 光盘 B 2  
  867. 光盘 A 2  
  868. 手机 B 3  
  869. 手机 C 3  
  870.    
  871. 23、说明:初始化表table1  
  872.    
  873. TRUNCATE TABLE table1  
  874.    
  875. 24、说明:选择从10到15的记录  
  876. select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc  
  877.    
  878. 三、技巧  
  879.    
  880. 1、1=11=2的使用,在SQL语句组合时用的较多  
  881.    
  882. “where 1=1” 是表示选择全部    “where 1=2”全部不选,  
  883. 如:  
  884. if @strWhere !=''   
  885. begin  
  886. set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere   
  887. end  
  888. else   
  889. begin  
  890. set @strSQL = 'select count(*) as Total from [' + @tblName + ']'   
  891. end   
  892.   
  893. 我们可以直接写成  
  894.    
  895. 错误!未找到目录项。  
  896. set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere 2、收缩数据库  
  897. --重建索引  
  898. DBCC REINDEX  
  899. DBCC INDEXDEFRAG  
  900. --收缩数据和日志  
  901. DBCC SHRINKDB  
  902. DBCC SHRINKFILE  
  903.    
  904. 3、压缩数据库  
  905. dbcc shrinkdatabase(dbname)  
  906.    
  907. 4、转移数据库给新用户以已存在用户权限  
  908. exec sp_change_users_login 'update_one','newname','oldname'  
  909. go  
  910.    
  911. 5、检查备份集  
  912. RESTORE VERIFYONLY from disk='E:/dvbbs.bak'  
  913.    
  914. 6、修复数据库  
  915. ALTER DATABASE [dvbbs] SET SINGLE_USER  
  916. GO  
  917. DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK  
  918. GO  
  919. ALTER DATABASE [dvbbs] SET MULTI_USER  
  920. GO  
  921.    
  922. 7、日志清除  
  923. SET NOCOUNT ON  
  924. DECLARE @LogicalFileName sysname,  
  925.  @MaxMinutes INT,  
  926.  @NewSize INT  
  927.    
  928.   
  929. USE tablename -- 要操作的数据库名  
  930. SELECT  @LogicalFileName = 'tablename_log', -- 日志文件名  
  931. @MaxMinutes = 10, -- Limit on time allowed to wrap log.  
  932.  @NewSize = 1  -- 你想设定的日志文件的大小(M)  
  933.    
  934. Setup / initialize  
  935. DECLARE @OriginalSize int  
  936. SELECT @OriginalSize = size   
  937.  FROM sysfiles  
  938.  WHERE name = @LogicalFileName  
  939. SELECT 'Original Size of ' + db_name() + ' LOG is ' +   
  940.  CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +   
  941.  CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'  
  942.  FROM sysfiles  
  943.  WHERE name = @LogicalFileName  
  944. CREATE TABLE DummyTrans  
  945.  (DummyColumn char (8000) not null)  
  946.    
  947.   
  948. DECLARE @Counter    INT,  
  949.  @StartTime DATETIME,  
  950.  @TruncLog   VARCHAR(255)  
  951. SELECT @StartTime = GETDATE(),  
  952.  @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'  
  953.    
  954. DBCC SHRINKFILE (@LogicalFileName, @NewSize)  
  955. EXEC (@TruncLog)  
  956. -- Wrap the log if necessary.  
  957. WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired  
  958.  AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)    
  959.  AND (@OriginalSize * 8 /1024) > @NewSize    
  960.  BEGIN -- Outer loop.  
  961. SELECT @Counter = 0  
  962.  WHILE   ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))  
  963.  BEGIN -- update  
  964.  INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans  
  965.  SELECT @Counter = @Counter + 1  
  966.  END  
  967.  EXEC (@TruncLog)    
  968.  END  
  969. SELECT 'Final Size of ' + db_name() + ' LOG is ' +  
  970.  CONVERT(VARCHAR(30),size) + ' 8K pages or ' +   
  971.  CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'  
  972.  FROM sysfiles   
  973.  WHERE name = @LogicalFileName  
  974. DROP TABLE DummyTrans  
  975. SET NOCOUNT OFF   
  976.   
  977. 8、说明:更改某个表  
  978. exec sp_changeobjectowner 'tablename','dbo'  
  979.    
  980. 9、存储更改全部表  
  981.    
  982. CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch  
  983. @OldOwner as NVARCHAR(128),  
  984. @NewOwner as NVARCHAR(128)  
  985. AS  
  986.    
  987. DECLARE @Name    as NVARCHAR(128)  
  988. DECLARE @Owner   as NVARCHAR(128)  
  989. DECLARE @OwnerName   as NVARCHAR(128)  
  990.    
  991. DECLARE curObject CURSOR FOR   
  992. select 'Name'    = name,  
  993.    'Owner'    = user_name(uid)  
  994. from sysobjects  
  995. where user_name(uid)=@OldOwner  
  996. order by name  
  997.    
  998. OPEN   curObject  
  999. FETCH NEXT FROM curObject INTO @Name, @Owner  
  1000. WHILE(@@FETCH_STATUS=0)  
  1001. BEGIN       
  1002. if @Owner=@OldOwner   
  1003. begin  
  1004.    set @OwnerName = @OldOwner + '.' + rtrim(@Name)  
  1005.    exec sp_changeobjectowner @OwnerName, @NewOwner  
  1006. end  
  1007. -- select @name,@NewOwner,@OldOwner  
  1008.    
  1009. FETCH NEXT FROM curObject INTO @Name, @Owner  
  1010. END  
  1011.    
  1012. close curObject  
  1013. deallocate curObject  
  1014. GO  
  1015.    
  1016.   
  1017. 10、SQL SERVER中直接循环写入数据  
  1018. declare @i int  
  1019. set @i=1  
  1020. while @i<30  
  1021. begin  
  1022.     insert into test (userid) values(@i)  
  1023.     set @i=@i+1  
  1024. end  
  1025. 案例:  
  1026. 有如下表,要求就裱中所有沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:  
  1027.    
  1028.     Name     score  
  1029.    
  1030.     Zhangshan   80  
  1031.    
  1032.     Lishi       59  
  1033.    
  1034.     Wangwu      50  
  1035.    
  1036.     Songquan    69  
  1037.    
  1038. while((select min(score) from tb_table)<60)  
  1039.    
  1040. begin  
  1041.    
  1042. update tb_table set score =score*1.01   
  1043.   
  1044. where score<60  
  1045.    
  1046. if  (select min(score) from tb_table)>60  
  1047.    
  1048.   break  
  1049.    
  1050.  else  
  1051.    
  1052.     continue  
  1053.    
  1054. end  
  1055.    
  1056.    
  1057.    
  1058. 数据开发-经典  
  1059.    
  1060.   
  1061. 1.按姓氏笔画排序:  
  1062. Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多  
  1063.    
  1064. 2.数据库加密:  
  1065. select encrypt('原始密码')  
  1066. select pwdencrypt('原始密码')  
  1067. select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同 encrypt('原始密码')  
  1068. select pwdencrypt('原始密码')  
  1069. select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同  
  1070.    
  1071. 3.取回表中字段:  
  1072. declare @list varchar(1000),  
  1073. @sql nvarchar(1000)   
  1074. select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A'  
  1075. set @sql='select '+right(@list,len(@list)-1)+' from 表A'   
  1076. exec (@sql)  
  1077.    
  1078. 4.查看硬盘分区:  
  1079. EXEC master..xp_fixeddrives  
  1080.    
  1081. 5.比较A,B表是否相等:  
  1082. if (select checksum_agg(binary_checksum(*)) from A)  
  1083.      =  
  1084.     (select checksum_agg(binary_checksum(*)) from B)  
  1085. print '相等'  
  1086. else  
  1087. print '不相等'  
  1088.    
  1089. 6.杀掉所有的事件探察器进程:  
  1090. DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses  
  1091. WHERE program_name IN('SQL profiler',N'SQL 事件探查器')  
  1092. EXEC sp_msforeach_worker '?'  
  1093.    
  1094. 7.记录搜索:  
  1095. 开头到N条记录  
  1096. Select Top N * From 表  
  1097. -------------------------------  
  1098. N到M条记录(要有主索引ID)  
  1099. Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID   Desc  
  1100. ----------------------------------  
  1101. N到结尾记录  
  1102. Select Top N * From 表 Order by ID Desc  
  1103. 案例  
  1104. 例如1:一张表有一万多条记录,表的第一个字段 RecID 是自增长字段, 写一个SQL语句, 找出表的第31到第40个记录。  
  1105.    
  1106.  select top 10 recid from A where recid not  in(select top 30 recid from A)  
  1107.    
  1108. 分析:如果这样写会产生某些问题,如果recid在表中存在逻辑索引。  
  1109.    
  1110.     select top 10 recid from A where……是从索引中查找,而后面的select top 30 recid from A则在数据表中查找,这样由于索引中的顺序有可能和数据表中的不一致,这样就导致查询到的不是本来的欲得到的数据。  
  1111.    
  1112. 解决方案  
  1113.    
  1114. 1, 用order by select top 30 recid from A order by ricid 如果该字段不是自增长,就会出现问题  
  1115.    
  1116. 2, 在那个子查询中也加条件:select top 30 recid from A where recid>-1  
  1117.    
  1118. 例2:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。  
  1119. set @s = 'select top 1 * from T   where pid not in (select top ' + str(@count-1) + ' pid  from  T)'  
  1120.    
  1121. print @s      exec  sp_executesql  @s  
  1122.    
  1123. 9:获取当前数据库中的所有用户表  
  1124. select Name from sysobjects where xtype='u' and status>=0  
  1125.    
  1126. 10:获取某一个表的所有字段  
  1127. select name from syscolumns where id=object_id('表名')  
  1128.    
  1129. select name from syscolumns where id in (select id from sysobjects where type = 'u' and name = '表名')  
  1130.    
  1131. 两种方式的效果相同  
  1132.    
  1133. 11:查看与某一个表相关的视图、存储过程、函数  
  1134. select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%'  
  1135.    
  1136. 12:查看当前数据库中所有存储过程  
  1137. select name as 存储过程名称 from sysobjects where xtype='P'  
  1138.    
  1139. 13:查询用户创建的所有数据库  
  1140. select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')  
  1141. 或者  
  1142. select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01  
  1143.    
  1144. 14:查询某一个表的字段和数据类型  
  1145. select column_name,data_type from information_schema.columns  
  1146. where table_name = '表名'   
  1147.   
  1148. 15:不同服务器数据库之间的数据操作  
  1149.    
  1150. --创建链接服务器   
  1151.   
  1152. exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '   
  1153.   
  1154. exec sp_addlinkedsrvlogin  'ITSV ', 'false ',null, '用户名 ', '密码 '   
  1155.   
  1156. --查询示例   
  1157.   
  1158. select * from ITSV.数据库名.dbo.表名   
  1159.   
  1160. --导入示例   
  1161.   
  1162. select * into 表 from ITSV.数据库名.dbo.表名   
  1163.   
  1164. --以后不再使用时删除链接服务器   
  1165.   
  1166. exec sp_dropserver  'ITSV ', 'droplogins '   
  1167.   
  1168.    
  1169.    
  1170. --连接远程/局域网数据(openrowset/openquery/opendatasource)   
  1171.   
  1172. --1、openrowset   
  1173.   
  1174. --查询示例   
  1175.   
  1176. select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)   
  1177.   
  1178. --生成本地表   
  1179.   
  1180. select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)   
  1181.   
  1182.    
  1183.    
  1184. --把本地表导入远程表   
  1185.   
  1186. insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)   
  1187.   
  1188. select *from 本地表   
  1189.   
  1190. --更新本地表   
  1191.   
  1192. update b   
  1193.   
  1194. set b.列A=a.列A   
  1195.   
  1196.  from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b   
  1197.   
  1198. on a.column1=b.column1   
  1199.   
  1200. --openquery用法需要创建一个连接   
  1201.   
  1202. --首先创建一个连接创建链接服务器   
  1203.   
  1204. exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '   
  1205.   
  1206. --查询   
  1207.   
  1208. select *   
  1209.   
  1210. FROM openquery(ITSV,  'SELECT *  FROM 数据库.dbo.表名 ')   
  1211.   
  1212. --把本地表导入远程表   
  1213.   
  1214. insert openquery(ITSV,  'SELECT *  FROM 数据库.dbo.表名 ')   
  1215.   
  1216. select * from 本地表   
  1217.   
  1218. --更新本地表   
  1219.   
  1220. update b   
  1221.   
  1222. set b.列B=a.列B   
  1223.   
  1224. FROM openquery(ITSV,  'SELECT * FROM 数据库.dbo.表名 ') as a    
  1225.   
  1226. inner join 本地表 b on a.列A=b.列A   
  1227.   
  1228.    
  1229.    
  1230. --3、opendatasource/openrowset   
  1231.   
  1232. SELECT   *   
  1233.   
  1234. FROM   opendatasource( 'SQLOLEDB ',  'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta   
  1235.   
  1236. --把本地表导入远程表   
  1237.   
  1238. insert opendatasource( 'SQLOLEDB ',  'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名   



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值