sql 高级技巧

1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1
法二:select top 0 * into b from a
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
3、说明:
跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

示例:

select * into 目的数据库..表 from 源数据库..表

select * into FactoryDB(目的数据库)..T1(表) from corporatestandardsDataBase2(源数据库)..users(表);

下面是夸服务器数据表拷贝,sql语句,'Data Source=10.112.49.123,代表是服务器地址,如果是本机就是:localhost;dnt1.dbo是数据库,dnt_users是表

select  * into b213 from
 (
SELECT * FROM  opendatasource( 'SQLOLEDB','Data Source=10.112.49.123;User ID=sa;Password=sa').dnt1.dbo.dnt_users

)as c

4.查询表结构类似,数据部在另外一个表中的方法。

select * from users a where not exists(select * from users2 b where a.userid=b.userid )

5.查询结果,一个字段的内容叠加。其中无论@content,还是username,字段值都必须加isnull 处理否则。返回结果为空。

declare @content nvarchar(4000)

select  @content=isnull( @content+',','')+isnull(username,'')  from users

select @content as aa

6 多表练查

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 .....

7.包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)

8.随机取出10条数据
select top 10 * from tablename order by newid()

9说明:随机选择记录
select newid()

10说明:删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

11说明:列出数据库里所有的表名
select name from sysobjects where type='U'

12说明:列出表里的所有的
select name from syscolumns where id=object_id('TableName')

13说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
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

显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3

14说明:初始化表table1

TRUNCATE TABLE table1

15说明:从excel中把数据导入数据库。其中Admin(不能用administrator) password="登录密码"

SELECT  * into newtable5
FROM
 OpenDataSource
( 'Microsoft.Jet.OLEDB.4.0','Data Source="c:\why.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]

16说明:选择从10到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
 
随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)
对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。
你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:
Randomize
RNumber = Int(Rnd*499) +1
 
While Not objRec.EOF
If objRec("ID") = RNumber THEN
... 这里是执行脚本 ...
end if
objRec.MoveNext
Wend
 
 这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。
然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。
假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。
虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。
这时候不就死定了?
  采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:
Randomize
RNumber = Int(Rnd*499) + 1
 
sql = "SELECT * FROM Customers WHERE ID = " & RNumber
 
set objRec = ObjConn.Execute(SQL)
Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")
 
不必写出RNumber 和ID,你只需要检查匹配情况即可。
只要你对以上代码的工作满意,你自可按需操作“随机”记录。
Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
--------------------------------------------------------------------------------------
再谈随机数

现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。
把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。
为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:
sql = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3

假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),
你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。
这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码):
sql = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"
注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。
 
随机读取若干条记录,
测试过
Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id)
sql server:select top n * from 表名 order by newid()
mysqlelect * From 表名 Order By rand() Limit n
Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)
语法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
使用SQL语句 用...代替过长的字符串显示
语法:
SQL数据库:
select case when len(field)>10 then left(field,10)+'...'
else field end as news_name,news_id from tablename
Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;
 
Conn.Execute说明
Execute方法该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:

1.执行SQL查询语句时,将返回查询得到的记录集。
用法为:Set 对象变量名=连接对象.Execute("SQL 查询语言")
Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,
通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。

2.执行SQL的操作性语言时,没有记录集的返回。此时用法为:
连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]
·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。
通过访问该变量,就可知道SQL语句队多少条记录进行了操作。
·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。
通过指定该参数,可使执行更高效。

·BeginTrans、RollbackTrans、CommitTrans方法
这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;
CommitTrans用于提交所有的事务处理结果,即确认事务的处理。
事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;
若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。
  BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。
判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。
Error集合中的每一个Error对象,代表一个错误信息。

posted @ 2011-03-21 10:17  狼-志  阅读(5069)  评论(0编辑  收藏  举报