经典收藏SQL语句合集(来自大家的智慧)

原贴链接:http://community.csdn.net/Expert/topic/5413/5413089.xml?temp=.6840479

关于索引,推荐转载的这篇文章
http://blog.csdn.net/dutguoyi/archive/2006/01/10/575617.aspx

改善SQL语句的效率
http://community.csdn.net/Expert/topic/5087/5087396.xml?temp=.345669
数据量很大怎样加快索检速度
http://community.csdn.net/Expert/topic/5058/5058320.xml?temp=.1229517
索引建立方法的区别
http://community.csdn.net/Expert/topic/5068/5068154.xml?temp=.3010218
频繁插入删除数据需要更新索引
http://community.csdn.net/Expert/topic/4937/4937910.xml?temp=.8428614
测试了一下sql server 2005 全文检索
http://community.csdn.net/Expert/topic/4878/4878430.xml?temp=.6049311

其他关于效率的高频问题

判断一个表的数据不在另一个表中最优秀方法?
http://community.csdn.net/Expert/topic/5038/5038742.xml?temp=.4704553
删除千万级表中重复记录的办法
http://community.csdn.net/Expert/topic/5089/5089261.xml?temp=.7907068

数据库数据查询变得不正常类型问题

大数据量,稳定运行一段时候以后无法得到查询结果。
http://community.csdn.net/Expert/topic/4810/4810464.xml?temp=9.014529E-02

《SQL数据库资料整理》(2006年整理的)
文章太长,只要引过来:
http://bbs.54master.com/viewthread.php?action=printable&tid=127814


-- 返回表的字段名称

select  name  from  syscolumns  where  id = object_id ( ' jobs ' )

-- 刚看到的.新建一个与a表一样的空的b表

select   *   into  b
from  a  where   1 <> 1  

一些不错的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 ..

4 、说明:子查询(表名1:a 表名2:b)
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 )

5 、说明:显示文章、提交人和最后回复时间
select  a.title,a.username,b.adddate  from   table  a,( select   max (adddate) adddate  from   table   where   table .title = a.title) b

6 、说明:外连接查询(表名1:a 表名2:b)
select  a.a, a.b, a.c, b.c, b.d, b.f  from  a  LEFT  OUT  JOIN  b  ON  a.a  =  b.c

7 、说明:在线视图查询(表名1:a )
select   *   from  ( SELECT  a,b,c  FROM  a) T  where  t.a  >   1 ;

8 、说明:between的用法,between限制查询数据范围时包括了边界值, not  between不包括
select   *   from  table1  where  time  between  time1  and  time2
select  a,b,c,  from  table1  where  a  not   between  数值1  and  数值2

9 、说明: in  的使用方法
select   *   from  table1  where  a  [ not ]   in  (‘值1’,’值2’,’值4’,’值6’)

10 、说明:两张关联表,删除主表中已经在副表中没有的信息 
delete   from  table1  where   not   exists  (  select   *   from  table2  where  table1.field1 = table2.field1 )

11 、说明:四表联查问题:
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  ..

12 、说明:日程安排提前五分钟提醒 
SQL: 
select   *   from  日程安排  where   datediff ( ' minute ' ,f开始时间, getdate ()) > 5

13 、说明:一条sql 语句搞定数据库分页
select   top   10  b. *   from  ( select   top   20  主键字段,排序字段  from  表名  order   by  排序字段  desc ) a,表名 b  where  b.主键字段  =  a.主键字段  order   by  a.排序字段

14 、说明:前10条记录
select   top   10   *  form table1  where  范围

15 、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select  a,b,c  from  tablename ta  where  a = ( select   max (a)  from  tablename tb  where  tb.b = ta.b)

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

17 、说明:随机取出10条数据
select   top   10   *   from  tablename  order   by   newid ()

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

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

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

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

22 、说明:列示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

23 、说明:初始化表table1
TRUNCATE   TABLE  table1

24 、说明:选择从10到15的记录
select   top   5   *   from  ( select   top   15   *   from   table   order   by  id  asc ) table_别名  order   by  id  desc

-- 如何将exec执行结果放入变量中? 

declare   @num   int
@sqls   nvarchar ( 4000
set   @sqls = ' select @a=count(*) from tableName  '  
exec  sp_executesql  @sqls ,N ' @a int output ' , @num  output 
select   @num  


-- ------------------------------------------------------------------------------

动态sql语句基本语法 
1  :普通SQL语句可以用Exec执行 

eg: 
Select   *   from  tableName 
Exec ( ' select * from tableName '
Exec  sp_executesql N ' select * from tableName '   --  请注意字符串前一定要加N 

2 :字段名,表名,数据库名之类作为变量时,必须用动态SQL 

eg: 
declare   @fname   varchar ( 20
set   @fname   =   ' FiledName '  
Select   @fname   from  tableName  --  错误,不会提示错误,但结果为固定值FiledName,并非所要。 
Exec ( ' select  '   +   @fname   +   '  from tableName ' --  请注意 加号前后的 单引号的边上加空格 

当然将字符串改成变量的形式也可 
declare   @fname   varchar ( 20
set   @fname   =   ' FiledName '   -- 设置字段名 

declare   @s   varchar ( 1000
set   @s   =   ' select  '   +   @fname   +   '  from tableName '  
Exec ( @s --  成功 
exec  sp_executesql  @s   --  此句会报错 



declare   @s   Nvarchar ( 1000 --  注意此处改为nvarchar(1000) 
set   @s   =   ' select  '   +   @fname   +   '  from tableName '  
Exec ( @s --  成功 
exec  sp_executesql  @s   --  此句正确 

3 . 输出参数 
declare   @num   int
@sqls   nvarchar ( 4000
set   @sqls = ' select count(*) from tableName '  
exec ( @sqls
-- 如何将exec执行结果放入变量中? 

declare   @num   int
@sqls   nvarchar ( 4000
set   @sqls = ' select @a=count(*) from tableName  '  
exec  sp_executesql  @sqls ,N ' @a int output ' , @num  output 
select   @num  

delete   from  table1  where   not   exists  (  select   *   from  table2  where  table1.field1 = table2.field1 )

select   *   from  sysobjects  where  xtype = ' tr '   -- 返回库中触发器
select   *   from  sysobjects  where  xtype = ' U '    -- 返回库中用户表

在CSDN上學到了一些
1 .日期算當月天數:
   
select   Day ( dateadd ( day , - 1 , convert ( datetime , convert ( char ( 07 ), dateadd (m, 1 , getdate ()), 120 ) + ' -01 ' )))
   
select   32 - Day ( getdate () + ( 32 - Day ( getdate ())))

2 .簡單的分割字串:
   用
'  union all select  ' replace ' 分割符 '


-- 修改用户数据库的排序规则
ater  database  dbname collate SQL_Latin1_General_CP1_CI_AS


-- 修改字段的排序规则
alter   table  a  alter   column  c2  varchar ( 50 ) collate SQL_Latin1_General_CP1_CI_AS


-- 按姓氏笔画排序
select   *   from  表名  order   by  列名 Collate Chinese_PRC_Stroke_ci_as 



-- 按拼音首字母排序
select   *   from  表名  order   by  列名 Collate Chinese_PRC_CS_AS_KS_WS


-- 查找一个Server下含有某个表名的数据库名字
EXEC  sp_msforeachdb  '
USE [?]
IF OBJECT_ID(N
'' 表名 '' ) IS NOT NULL
PRINT N
'' ? '''


-- 查询所有表名、字段名及字段描述
select  
    表名
= object_name (id), 
    列名
= col_name ( object_id ( object_name (id)),smallid), 
    描述
= value 
from   sysproperties 


-- 查询所有表的记录数明细
--
方法(1)
select   
    a.name,b.rows  
from   
    sysobjects a, sysindexes b
where   
    a.name
= b.name  and   a.type = ' u '  
-- 方法(2)
sp_msforeachtable  ' select  '' ? ''  as  '' 表名 '' ,(select sum(1) from ?) as  '' 记录数 '''  


-- 复制表(表结构)
--
方法(1)
select   *   into  Employee_bak  from  Employee  where   1 <> 1
-- 方法(2)
select   top   0   *   into  Employee_bak  from  Employee
-- 方法(3)
--
企业管理器中的右键表-->复制,然后在查询分析器中粘贴查看SQL语句


-- 判断两字符是否完全(区分大小写)相等(如何判断字符的大小写)
declare    @v    nvarchar ( 10 )  
declare    @p    nvarchar ( 10 )  
set    @v = ' NIPSAN '   
if    cast ( @v   as    varbinary ) =   cast ( @p   as   varbinary )  
    
print  N ' 相等 '   
else     
    
print  N ' 不等 '   


-- 得到数据库中所有表的空间/记录情况
exec  sp_MSForEachTable 
@precommand = N '
create table ##(
id int identity,
表名 sysname,
字段数 int,
记录数 int,
保留空间 Nvarchar(10),
使用空间 varchar(10),
索引使用空间 varchar(10),
未用空间 varchar(10))
' ,
@command1 = N ' insert ##(表名,记录数,保留空间,使用空间,索引使用空间,未用空间) exec sp_spaceused  '' ? ''

update ## set 字段数=(select count(*) from syscolumns where id=object_id(
'' ? '' )) 
where id=scope_identity()
' @postcommand = N ' select * from ## order by id drop table ## '


-- 查看硬盘分区:
EXEC  master..xp_fixeddrives


-- Order By的一个小技巧
Order  By可以指定列序而不用指定列名,在下面的例子里说明它的用处(注意,第三列未指定别名)
Select  a.ID,a.Name,( Select   Count ( * From  TableB b  Where  a.ID = b.PID)  From  TableA a  Order   By   3

表结构新

SELECT  
表名
= case   when  a.colorder = 1   then  d.name  else   ''   end ,
表说明
= case   when  a.colorder = 1   then   isnull (f.value, '' else   ''   end ,
字段序号
= a.colorder,
字段名
= a.name,
标识
= case   when   COLUMNPROPERTY ( a.id,a.name, ' IsIdentity ' ) = 1   then   ' ' else   ''   end ,
主键
= case   when   exists ( SELECT   1   FROM  sysobjects  where  xtype = ' PK '   and  parent_obj = a.id  and  name  in  (
SELECT  name  FROM  sysindexes  WHERE  indid  in (
SELECT  indid  FROM  sysindexkeys  WHERE  id  =  a.id  AND  colid = a.colid
))) 
then   ' '   else   ''   end ,
类型
= b.name,
占用字节数
= a.length,
长度
= COLUMNPROPERTY (a.id,a.name, ' PRECISION ' ),
小数位数
= isnull ( COLUMNPROPERTY (a.id,a.name, ' Scale ' ), 0 ),
允许空
= case   when  a.isnullable = 1   then   ' ' else   ''   end ,
默认值
= isnull (e. text , '' ),
字段说明
= isnull (g. [ value ] , '' ),
索引名称
= isnull (h.索引名称, '' ),
索引顺序
= isnull (h.排序, '' )
FROM  syscolumns a
left   join  systypes b  on  a.xtype = b.xusertype
inner   join  sysobjects d  on  a.id = d.id   and  d.xtype = ' U '   and  d.status >= 0
left   join  syscomments e  on  a.cdefault = e.id
left   join  sysproperties g  on  a.id = g.id  and  a.colid = g.smallid  
left   join  sysproperties f  on  d.id = f.id  and  f.smallid = 0
left   join ( -- 这部分是索引信息,如果要显示索引与表及字段的对应关系,可以只要此部分
select  索引名称 = a.name,c.id,d.colid
,排序
= case  indexkey_property(c.id,b.indid,b.keyno, ' isdescending ' )
when   1   then   ' 降序 '   when   0   then   ' 升序 '   end
from  sysindexes a
join  sysindexkeys b  on  a.id = b.id  and  a.indid = b.indid
join  ( -- 这里的作用是有多个索引时,取索引号最小的那个
select  id,colid,indid = min (indid)  from  sysindexkeys
group   by  id,colid) b1  on  b.id = b1.id  and  b.colid = b1.colid  and  b.indid = b1.indid
join  sysobjects c  on  b.id = c.id  and  c.xtype = ' U '   and  c.status >= 0
join  syscolumns d  on  b.id = d.id  and  b.colid = d.colid
where  a.indid  not   in ( 0 , 255 )
) h 
on  a.id = h.id  and  a.colid = h.colid
-- where d.name='要查询的表'    --如果只查询指定表,加上此条件
order   by  a.id,a.colorder





-- 索引信息

-- 索引信息
select  索引名称 = case   when  b.keyno = 1   then  a.name  else   ''   end
,表名
= case   when  b.keyno = 1   then  c.name  else   ''   end
,列名
= d.name
,排序
= case  indexkey_property(c.id,b.indid,b.keyno, ' isdescending ' )
when   1   then   ' 降序 '   when   0   then   ' 升序 '   end
,聚集
= INDEXPROPERTY (c.id,a.name, ' IsClustered ' )
,唯一
= case   INDEXPROPERTY (c.id,a.name, ' IsUnique ' )
when   0   then   ' 非唯一 '
when   1   then   case   when  e.id  is   null   then   ' 唯一索引 '   else   ' 唯一约束 '   end
end
,e.name
,填充因子
= a.OrigFillFactor
from  sysindexes a
join  sysindexkeys b  on  a.id = b.id  and  a.indid = b.indid
-- join (--这里的作用是有多个索引时,取索引号最小的那个
--
select id,colid,indid=min(indid) from sysindexkeys
--
group by id,colid) b1 on b.id=b1.id and b.colid=b1.colid and b.indid=b1.indid
join  sysobjects c  on  b.id = c.id  and  c.xtype = ' U '   and  c.status >= 0
join  syscolumns d  on  b.id = d.id  and  b.colid = d.colid
left   join  sysobjects e  on  b.indid = e.id  and  e.xtype = ' UQ '
where  a.indid  not   in ( 0 , 255 )
order   by  c.name,a.name

找出表中某一列相同的数据行
select   * from   table   where  ( column   in ( select   column   from   table   group   by   column   having   count ( * ) > 1 )

-- 1、查找员工的编号、姓名、部门和出生日期,如果出生日期为空值,
--
显示日期不详,并按部门排序输出,日期格式为yyyy-mm-dd。
select  emp_no ,emp_name ,dept ,
       
isnull ( convert ( char ( 10 ),birthday, 120 ), ' 日期不详 ' ) birthday
from  employee
order   by  dept

-- 2、查找与喻自强在同一个单位的员工姓名、性别、部门和职称
select  emp_no,emp_name,dept,title
from  employee
where  emp_name <> ' 喻自强 '   and  dept  in
   (
select  dept  from  employee
    
where  emp_name = ' 喻自强 ' )

-- 3、按部门进行汇总,统计每个部门的总工资
select  dept, sum (salary)
from  employee
group   by  dept

-- 4、查找商品名称为14寸显示器商品的销售情况,
--
显示该商品的编号、销售数量、单价和金额
select  a.prod_id,qty,unit_price,unit_price * qty totprice
from  sale_item a,product b
where  a.prod_id = b.prod_id  and  prod_name = ' 14寸显示器 '

-- 5、在销售明细表中按产品编号进行汇总,统计每种产品的销售数量和金额
select  prod_id, sum (qty) totqty, sum (qty * unit_price) totprice
from  sale_item
group   by  prod_id

-- 6、使用convert函数按客户编号统计每个客户1996年的订单总金额
select  cust_id, sum (tot_amt) totprice
from  sales
where   convert ( char ( 4 ),order_date, 120 ) = ' 1996 '
group   by  cust_id

-- 7、查找有销售记录的客户编号、名称和订单总额
select  a.cust_id,cust_name, sum (tot_amt) totprice
from  customer a,sales b
where  a.cust_id = b.cust_id
group   by  a.cust_id,cust_name

-- 8、查找在1997年中有销售记录的客户编号、名称和订单总额
select  a.cust_id,cust_name, sum (tot_amt) totprice
from  customer a,sales b
where  a.cust_id = b.cust_id  and   convert ( char ( 4 ),order_date, 120 ) = ' 1997 '
group   by  a.cust_id,cust_name

-- 9、查找一次销售最大的销售记录
select  order_no,cust_id,sale_id,tot_amt
from  sales
where  tot_amt =
   (
select   max (tot_amt)
    
from  sales)

-- 10、查找至少有3次销售的业务员名单和销售日期
select  emp_name,order_date
from  employee a,sales b 
where  emp_no = sale_id  and  a.emp_no  in
  (
select  sale_id
   
from  sales
   
group   by  sale_id
   
having   count ( * ) >= 3 )
order   by  emp_name

-- 11、用存在量词查找没有订货记录的客户名称
select  cust_name
from  customer a
where   not   exists
   (
select   *
    
from  sales b
    
where  a.cust_id = b.cust_id)

-- 12、使用左外连接查找每个客户的客户编号、名称、订货日期、订单金额
--
订货日期不要显示时间,日期格式为yyyy-mm-dd
--
按客户编号排序,同一客户再按订单降序排序输出
select  a.cust_id,cust_name, convert ( char ( 10 ),order_date, 120 ),tot_amt
from  customer a  left   outer   join  sales b  on  a.cust_id = b.cust_id
order   by  a.cust_id,tot_amt  desc

-- 13、查找16M DRAM的销售情况,要求显示相应的销售员的姓名、
--
性别,销售日期、销售数量和金额,其中性别用男、女表示
select  emp_name 姓名, 性别 =   case  a.sex   when   ' m '   then   ' '
                                       
when   ' f '   then   ' '  
                                       
else   ' '
                                       
end ,
        销售日期
=   isnull ( convert ( char ( 10 ),c.order_date, 120 ), ' 日期不详 ' ),
        qty 数量, qty
* unit_price  as  金额
from  employee a, sales b, sale_item c,product d
where  d.prod_name = ' 16M DRAM '   and  d.pro_id = c.prod_id  and
      a.emp_no
= b.sale_id  and  b.order_no = c.order_no

-- 14、查找每个人的销售记录,要求显示销售员的编号、姓名、性别、
--
产品名称、数量、单价、金额和销售日期
select  emp_no 编号,emp_name 姓名, 性别 =   case  a.sex  when   ' m '   then   ' '
                                       
when   ' f '   then   ' '  
                                       
else   ' '
                                       
end ,
      prod_name 产品名称,销售日期
=   isnull ( convert ( char ( 10 ),c.order_date, 120 ), ' 日期不详 ' ),
      qty 数量, qty
* unit_price  as  金额
from  employee a  left   outer   join  sales b  on  a.emp_no = b.sale_id , sale_item c,product d
where  d.pro_id = c.prod_id  and  b.order_no = c.order_no

-- 15、查找销售金额最大的客户名称和总货款
select  cust_name,d.cust_sum
from    customer a,
       (
select  cust_id,cust_sum
        
from  ( select  cust_id,  sum (tot_amt)  as  cust_sum
              
from  sales
              
group   by  cust_id ) b
        
where  b.cust_sum  =  
               ( 
select   max (cust_sum)
                 
from  ( select  cust_id,  sum (tot_amt)  as  cust_sum
                       
from  sales
                       
group   by  cust_id ) c )
        ) d
where  a.cust_id = d.cust_id 

-- 16、查找销售总额少于1000元的销售员编号、姓名和销售额
select  emp_no,emp_name,d.sale_sum
from    employee a,
       (
select  sale_id,sale_sum
        
from  ( select  sale_id,  sum (tot_amt)  as  sale_sum
              
from  sales
              
group   by  sale_id ) b
        
where  b.sale_sum  < 1000                
        ) d
where  a.emp_no = d.sale_id 

-- 17、查找至少销售了3种商品的客户编号、客户名称、商品编号、商品名称、数量和金额
select  a.cust_id,cust_name,b.prod_id,prod_name,d.qty,d.qty * d.unit_price
from  customer a, product b, sales c, sale_item d
where  a.cust_id = c.cust_id  and  d.prod_id = b.prod_id  and  
      c.order_no
= d.order_no  and  a.cust_id  in  (
      
select  cust_id
      
from   ( select  cust_id, count ( distinct  prod_id) prodid
             
from  ( select  cust_id,prod_id
                   
from  sales e,sale_item f
                   
where  e.order_no = f.order_no) g
             
group   by  cust_id
             
having   count ( distinct  prod_id) >= 3 ) h )

-- 18、查找至少与世界技术开发公司销售相同的客户编号、名称和商品编号、商品名称、数量和金额
select  a.cust_id,cust_name,d.prod_id,prod_name,qty,qty * unit_price
from  customer a, product b, sales c, sale_item d
where  a.cust_id = c.cust_id  and  d.prod_id = b.prod_id  and  
      c.order_no
= d.order_no   and   not   exists
  (
select  f. *
   
from  customer x ,sales e, sale_item f
   
where  cust_name = ' 世界技术开发公司 '   and  x.cust_id = e.cust_id  and
         e.order_no
= f.order_no  and   not   exists
           ( 
select  g. *
             
from  sale_item g, sales  h
             
where  g.prod_id  =  f.prod_id  and  g.order_no = h.order_no  and
                   h.cust_id
= a.cust_id)
    )
   
19 、查找表中所有姓刘的职工的工号,部门,薪水
select  emp_no,emp_name,dept,salary
from  employee
where  emp_name  like   ' 刘% '

20 、查找所有定单金额高于20000的所有客户编号
select  cust_id
from  sales
where  tot_amt > 20000

21 、统计表中员工的薪水在40000 - 60000之间的人数
select   count ( * ) as  人数
from  employee
where  salary  between   40000   and   60000

22 、查询表中的同一部门的职工的平均工资,但只查询"住址"是"上海市"的员工
select   avg (salary) avg_sal,dept 
from  employee 
where  addr  like   ' 上海市% '
group   by  dept

23 、将表中住址为"上海市"的员工住址改为"北京市"
update  employee  
set  addr  like   ' 北京市 '
where  addr  like   ' 上海市 '

24 、查找业务部或会计部的女员工的基本信息。
select  emp_no,emp_name,dept
from  employee 
where  sex = ' F ' and  dept  in  ( ' 业务 ' , ' 会计 ' )

25 、显示每种产品的销售金额总和,并依销售金额由大到小输出。
select  prod_id , sum (qty * unit_price)
from  sale_item 
group   by  prod_id
order   by   sum (qty * unit_price)  desc
26 、选取编号界于‘C0001’和‘C0004’的客户编号、客户名称、客户地址。
select  CUST_ID,cust_name,addr
from  customer 
where  cust_id  between   ' C0001 '   AND   ' C0004 '

27 、计算出一共销售了几种产品。
select   count ( distinct  prod_id)  as   ' 共销售产品数 '
from  sale_item 

28 、将业务部员工的薪水上调3 %
update  employee
set  salary = salary * 1.03
where  dept = ' 业务 '
    
29 、由employee表中查找出薪水最低的员工信息。
select   *
from  employee
where  salary =
       (
select   min (salary )
        
from  employee )

30 、使用join查询客户姓名为"客户丙"所购货物的"客户名称","定单金额","定货日期","电话号码"
select  a.cust_id,b.tot_amt,b.order_date,a.tel_no
from  customer a  join  sales b
on  a.cust_id = b.cust_id  and  cust_name  like   ' 客户丙 '

31 、由sales表中查找出订单金额大于“E0013业务员在1996 / 10 / 15这天所接每一张订单的金额”的所有订单。
select   *
from  sales
where  tot_amt >all
       (
select  tot_amt 
        
from  sales 
        
where  sale_id = ' E0013 ' and  order_date = ' 1996/10/15 ' )
order   by  tot_amt

32 、计算 ' P0001 ' 产品的平均销售单价
select   avg (unit_price)
from  sale_item
where  prod_id = ' P0001 '

33 、找出公司女员工所接的定单
select  sale_id,tot_amt
from  sales
where  sale_id  in  
(
select  sale_id  from  employee
where  sex = ' F ' )

34 、找出同一天进入公司服务的员工
select  a.emp_no,a.emp_name,a.date_hired
from  employee a
join  employee b
on  (a.emp_no != b.emp_no  and  a.date_hired = b.date_hired)
order   by  a.date_hired

35 、找出目前业绩超过232000元的员工编号和姓名。
select  emp_no,emp_name
from  employee 
where  emp_no  in
(
select  sale_id
from  sales 
group   by  sale_id
having   sum (tot_amt) < 232000 )

36 、查询出employee表中所有女职工的平均工资和住址在"上海市"的所有女职工的平均工资
select   avg (salary)
from  employee
where  sex  like   ' f '
union
select   avg (salary)
from  employee
where  sex  like   ' f '   and  addr  like   ' 上海市% '

37 、在employee表中查询薪水超过员工平均薪水的员工信息。
Select   *   from  employee  where  salary > ( select   avg (salary)   from  employee)

38 、找出目前销售业绩超过40000元的业务员编号及销售业绩,并按销售业绩从大到小排序。
   
Select  sale_id , sum (tot_amt)
from  sales 
group   by  sale_id 
having   sum (tot_amt) > 40000
order   by   sum (tot_amt)  desc

39 、找出公司男业务员所接且订单金额超过2000元的订单号及订单金额。
    
Select  order_no,tot_amt
From  sales ,employee
Where  sale_id = emp_no  and  sex = ' M '   and  tot_amt > 2000

40 、查询sales表中订单金额最高的订单号及订单金额。
Select  order_no,tot_amt  from  sales  where  tot_amt = ( select   max (tot_amt)   from  sales)

41 、查询在每张订单中订购金额超过24000元的客户名及其地址。
Select  cust_name,addr  from  customer a,sales b  where  a.cust_id = b.cust_id  and  tot_amt > 24000

42 、求出每位客户的总订购金额,显示出客户号及总订购金额,并按总订购金额降序排列。
   
Select  cust_id, sum (tot_amt)  from  sales
Group   by  cust_id 
Order   by   sum (tot_amt)  desc

43 、求每位客户订购的每种产品的总数量及平均单价,并按客户号,产品号从小到大排列。
    
Select  cust_id,prod_id, sum (qty), sum (qty * unit_price) / sum (qty)
From  sales a, sale_item b
Where  a.order_no = b.order_no
Group   by  cust_id,prod_id
Order   by  cust_id,prod_id

44 、查询订购了三种以上产品的订单号。
    
Select  order_no  from  sale_item
Group   by  order_no
Having   count ( * ) > 3

45 、查询订购的产品至少包含了订单10003中所订购产品的订单。
   
Select    distinct  order_no
From  sale_item a
Where   order_no <> ' 10003 ' and    not   exists  ( 
Select   *    from  sale_item b  where  order_no  = ' 10003 '    and   not   exists  
(
select   *    from  sale_item c  where  c.order_no = a.order_no   and   c.prod_id = b.prod_id))

46 、在sales表中查找出订单金额大于“E0013业务员在1996 / 11 / 10这天所接每一张订单的金额”的所有订单,并显示承接这些订单的业务员和该订单的金额。
   
Select  sale_id,tot_amt  from  sales
   
where  tot_amt >all ( select  tot_amt  from  sales  where  sale_id = ' E0013 '   and  order_date = ' 1996/11/10 ' )  

47 、查询末承接业务的员工的信息。
    
Select   *
From  employee a
Where   not   exists  
(
select   *   from   sales b  where   a.emp_no = b.sale_id)

48 、查询来自上海市的客户的姓名,电话、订单号及订单金额。
    
Select  cust_name,tel_no,order_no,tot_amt
From  customer a ,sales b
Where  a.cust_id = b.cust_id  and  addr = ' 上海市 '

49 、查询每位业务员各个月的业绩,并按业务员编号、月份降序排序。
   
Select  sale_id, month (order_date),  sum (tot_amt) 
from  sales 
group   by  sale_id, month (order_date)
order   by  sale_id, month (order_date)  desc

50 、求每种产品的总销售数量及总销售金额,要求显示出产品编号、产品名称,总数量及总金额,并按产品号从小到大排列。
   
Select  a.prod_id,prod_name, sum (qty), sum (qty * unit_price)
From  sale_item a,product b
Where  a.prod_id = b.prod_id 
Group   by  a.prod_id,prod_name
Order   by  a.prod_id
51 、查询总订购金额超过’C0002’客户的总订购金额的客户号,客户名及其住址。
   
Select  cust_id, cust_name,addr
From  customer
Where  cust_id   in  ( select  cust_id  from  sales 
Group   by  cust_id
Having   sum (tot_amt) >
(
Select   sum (tot_amt)  from  sales   where  cust_id = ' C0002 ' ))

52 、查询业绩最好的的业务员号、业务员名及其总销售金额。
    
select  emp_no,emp_name, sum (tot_amt)
from  employee a,sales b
where  a.emp_no = b.sale_id
group   by  emp_no,emp_name
having   sum (tot_amt) =
         (
select   max (totamt)
          
from  ( select  sale_id, sum (tot_amt) totamt
               
from  sales
               
group   by  sale_id) c)

53 、查询每位客户所订购的每种产品的详细清单,要求显示出客户号,客户名,产品号,产品名,数量及单价。
   
select  a.cust_id, cust_name,c.prod_id,prod_name,qty, unit_price
from  customer a,sales b, sale_item c ,product d
where  a.cust_id = b.cust_id   and  b.order_no = c.order_no  and  c.prod_id = d.prod_id

54 、求各部门的平均薪水,要求按平均薪水从小到大排序。
   
select  dept, avg (salary)  from  employee  group   by  dept  order   by   avg (salary)

将小写金额转换为中文大写  


CREATE     FUNCTION     [ dbo ] . [ f_num_chn ]    ( @num    numeric( 14 , 2 ))   
  
RETURNS     varchar ( 100 )    WITH    ENCRYPTION   
  
AS    
  
BEGIN    
  
-- 版权所有:csli888   
       DECLARE     @n_data     VARCHAR ( 20 ), @c_data     VARCHAR ( 100 ), @n_str     VARCHAR ( 10 ), @i     int    
    
      
SET     @n_data = RIGHT ( SPACE ( 14 ) + CAST ( CAST ( ABS ( @num * 100 )    AS     bigint )    AS     varchar ( 20 )), 14 )   
      
SET     @c_data = ''    
      
SET     @i = 1    
      
WHILE     @i <= 14    
      
BEGIN    
          
SET     @n_str = SUBSTRING ( @n_data , @i , 1 )   
          
IF     @n_str <> '     '    
          
BEGIN    
              
IF     not    (( SUBSTRING ( @n_data , @i , 2 ) = ' 00 ' )    or    
                  ((
@n_str = ' 0 ' )    and    (( @i = 4 )    or    ( @i = 8 )    or    ( @i = 12 )    or    ( @i = 14 ))))   
                  
SET     @c_data = @c_data + SUBSTRING ( ' 零壹贰叁肆伍陆柒捌玖 ' , CAST ( @n_str     AS     int ) + 1 , 1 )   
              
IF     not    (( @n_str = ' 0 ' )    and    ( @i <> 4 )    and    ( @i <> 8 )    and    ( @i <> 12 ))   
                  
SET     @c_data = @c_data + SUBSTRING ( ' 仟佰拾亿仟佰拾万仟佰拾圆角分 ' , @i , 1 )   
              
IF     SUBSTRING ( @c_data , LEN ( @c_data ) - 1 , 2 ) = ' 亿万 '    
                  
SET     @c_data = SUBSTRING ( @c_data , 1 , LEN ( @c_data ) - 1 )   
          
END    
          
SET     @i = @i + 1    
      
END    
      
IF     @num < 0    
          
SET     @c_data = ' (负数) ' + @c_data    
      
IF     @num = 0    
          
SET     @c_data = ' 零圆 '    
      
IF     @n_str = ' 0 '    
          
SET     @c_data = @c_data + ' '    
      
RETURN ( @c_data )   
  
END    


统计每周的数据量

CREATE   PROCEDURE  AccAllWeek

 
AS

set  nocount  on
declare   @str   nvarchar ( 3000 )

set   @str = N ' SELECT count(CASE dateName(dw,AddDate) WHEN   '' 星期一 ''  THEN  '' 星期一 ''  END) AS a01, '
set   @str = @str + N ' count(CASE dateName(dw,AddDate) WHEN  '' 星期二 ''  THEN  '' 星期二 ''  END) AS a02, '
set   @str = @str + N ' count(CASE dateName(dw,AddDate) WHEN  '' 星期三 ''  THEN  '' 星期三 ''  END) AS a03, '
set   @str = @str + N ' count(CASE dateName(dw,AddDate) WHEN  '' 星期四 ''  THEN  '' 星期四 ''  END) AS a04, '
set   @str = @str + N ' count(CASE dateName(dw,AddDate) WHEN  '' 星期五 ''  THEN  '' 星期五 ''  END) AS a05, '
set   @str = @str + N ' count(CASE dateName(dw,AddDate) WHEN  '' 星期六 ''  THEN  '' 星期六 ''  END) AS a06, '
set   @str = @str + N ' count(CASE dateName(dw,AddDate) WHEN  '' 星期日 ''  THEN  '' 星期日 ''  END) AS a07 '
set   @str = @str + N '   from YouTable '

EXEC ( @str )

按星期格式返回7天中每天的数据比例

select   @result   =   count *  )  from   user   where  username  =   @username   and  password  =   @password
             
if   @result   =   0
             
return   0
             
else  
             
return   1
===============
改成:
if   exists ( select   1    from   user   where  username  =   @username   and  password  =   @password )
             
return   0
else  
             
return   1

n久前整理过的一些最基本的,随意看看.
1 . Insert  (添加数据)
  .Inert 
Into  tb1(field1,field2)  Values ( 11 , ' aa ' )
  .Inert tb1 
Values ( 11 ,"aa")
  .Inert tb1(field1,field2) 
Select  field3, ' s ' + field4  From  tb2  Where  field3 < 22
  .Inert tb1 
Select   *   From  tb2  Where  field3 < 22

2 . Update  (修改数据)
  .
Update  tb1  Set  field1 = field1 + 1 ,field2 = ' zz '   Where  field1 < 1
  .
Update  tb1  Set  field1 = field1 + 1 ,field2 = ' zz '   From  ( Select   *   From  tb2  Where  field3 > 1 As  a  Where  a.field3 = table1.field2
  .
Update  tb1  Set  field1 = field1 + 1 ,field2 = ' zz '   From  table2  As  a,table1  as  b  Where  a.field4 = table1.field2

3 . Delete  (删除数据)
  .
Delete  table1  Where  field2  Like   ' a% '
  .
Delete  table1  From  ( Select   *   From  table2  Where  field3 < 1 As  a  Where  a.field4 = table1.field2
  .
Delete  table1  As  a,table2  As  b  Where  a.field2 = b.field4  And  b.field3 < 1

4 .Creat (在本机上新建msde数据库.如需安装在始动路径,改绝对路径为Application.StartupPath)
   .
if   object_id ( ' msde1 ' is   null   CREATE   DATABASE  msde1  ON  (Name = msde1_dat,filename = ' C:\\msde1.mdf ' ,size = 10 ,maxsize = 50 ,filegrowth = 10 % log   on  (name = msde1_log,filename = ' c:\\msde1.ldf ' ,size = 3 ,maxsize = 20 ,filegrowth = 1 )

5 . Drop  (删除表)
  .
Drop  table1 
  .
if   object_id ( ' table1 ' is   not   null   DROP   TABLE  table1 (删除之前可先判断一下.)
  .
Drop  table1  Truncate   Table  table2 (如table1 参照 table2,需要先删除 table1)
  
6 . If , Else , Begin
  
If   Exists ( Select  field2  From  table1  Where  field2 = ' aa ' )
     
Begin
Delect table1 
Where  field2 = ' aa '
        
Print   ' aa is deleted. '
     
End
  
Else
        
Print   ' aa is not found. '

7 . Declare , GOTO
  
Declare   @s   int , @time   int
  
Select   @s = 1 , @time = 1
  label1:
  
Select   @s = @s * @time
  
Select   @time = @time + 1
  
If   @time <= 10
GOTO  label1
  
Print   ' 10 n= ' + str ( @s )

8 . While , Break , Continue
  
While  Boolean    // Boolean:  1 = 1
{SQL}
 
Break
{SQL}
Continue
{SQL}

9 . WaitFor
  
Begin
WaitFor  Time  ' 10:00:00 '    // (系统时间)
Select   *   From  Table1
  
End

  
Begin
WaitFor  Delay  ' 1:00:00 '    // (1小时后)
Select   *   From  Table1
  
End

10 . Return
   
Create   Procedure  check_contact  @para  varchare( 40 )
AS
If  ( Select  contract  From  authors  Where  au_lname = @para ) = 1
Return   1
Else
Return   2

11 . Case
   
Select  Name = Convert ( varchar ( 15 ),au_lname),
Contract
= Case  contract
When   0   Then   ' 0 '
When   1   Then   ' 1 '
Else   ' 2 '
End
   
From  authors

   
Select  Name = Convert ( varchar ( 15 ),au_lname),
Contract
= Case
When  contract = 0   Then   ' 0 '
When  contract <> 0   Then   ' 1 '
End
   
From  authors

12 . DataLength   // 返回表达式中数据的实际长度(如为字段名,则返回字段中数据的长度,非字段定义长度.)
   
Select  Name = field1, DataLength = DataLength (field1)  From  table1

13 . Current_TimeStamp   // 返回系统的当前日期和时间
   
Use  pubs
   
GO
   Creat 
Table  books
   {
book_id 
char ( 3 Not   NULL ,
pub_date 
datetime   Not   NULL   Default   Current_TimeStamp ,
price 
money
   }
   
GO
   
Insert  books(book_id,price)
Values ( ' A01 ' ,$ 55.0 )

14 . FormatMessage // 格式化指定错误号的错误信息
   
Declare   @Err123   nvarchar ( 64 )
   
Set   @Err123 = FormatMessage ( 123 , 50 )
   
Print   @Err123

15 . GetAnsiNULL // 返回数据库的默认空值设置
   
Select   GetAnsiNULL ( ' pubs ' ) // return   1 :notNull;   return   0 NULL

16 . IsNULL   // 替换空值项(注意替换项和替换内容的类型需一致)
   
Select  title = field2,num = IsNULL (field1, 0 From  table1
   
Select  title = field2,num = IsNULL ( str (field1), ' Nothing ' From  table1

17 .Coalescs // 返回参数中的第一个非空( NULL )表达式
   
Select  title = field2,numMark = Coalescs(field1,field2, ' Nothing ' From  table1
//// The Result:  If  field1  is   null   And  field2  is   not   null   Then   return  field2.value.
       
If  field1  is   null   And  field2  is   null   Then   return   ' Nothing ' .

18 . Permissions // 返回用户的语句和对象权限.
   
Declare   @state_p   int , @object_p   int
   
Set   @state_p = Permissions ()
If  ( @sate_p   &   2 ) = 2
Print   ' 你可以在当前数据库中创建表 '
If  ( @sate_p   &   4 ) = 4
Print   ' 你可以在当前数据库中创建存储过程 '
If  ( @sate_p   &   8 ) = 8
Print   ' 你可以在当前数据库中创建视图 '
Set   @object_p = Permissions ( Object_id ( ' pubs..jobs ' ))
If  ( @object_p   &   1 ) = 1
Print   ' 你可以检索jobs表中的数据 '
If  ( @object_p   &   2 ) = 2
Print   ' 你可以修改jobs表中的数据 '
If  ( @object_p   &   8 ) = 8
Print   ' 你可以向jobs表中添加数据 '
If  ( @object_p   &   16 ) = 16
Print   ' 你可以删除jobs表中的数据 '

19 . Convert // 转换函数(从一种系统数据类型转换为另外一种)
   
Select  thetime1 = Convert ( char , Current_TimeStamp , 120 ),thetime2 = Convert ( char , Current_TimeStamp , 108 )
////// The Result: thetime1: 2006 - 03 - 13   15 : 50 : 00 ; thetime2: 03 : 50 : 00
   
Select  s0 = Convert ( char ,$ 123456789.9876 , 0 ),s1 = Convert ( char ,$ 123456789.9876 , 1 ),s2 = Convert ( char ,$ 123456789.9876 , 2 )
////// The Result: s0: 123456789.99 ; s1: 123 , 456 , 789.99 ; s2: 123456789.9876
   
Select  n0 = Convert ( char , 123456789.9876 , 0 ),n1 = Convert ( char ,$ 123456789.9876 , 1 ),n2 = Convert ( char ,$ 123456789.9876 , 2 )
////// The Result: n0: 123457 ; n1:1.2345679e + 005 ; n2:1.234567890000000e + 005

20 . Cast // 转换函数(转换格式控制没有Convert函数灵活)
   
Select  title_id,theDate = Cast (pubdate  As   Char ( 11 ))  From  titles  Where  title_id  Like   ' b% '
////// The Result: title_id: BU1032; theDate: Jun  12   1991

****************************
一些日期元素的取值范围:yy(
1753 ~ 9999 ),qq( 1 ~ 4 ),mm( 1 ~ 12 ),dy( 1 ~ 366 ),dd( 1 ~ 31 ),wk( 0 ~ 51 ),hh( 0 ~ 23 ),mi( 1 ~ 59 ),ss( 1 ~ 59 ),ms( 0 ~ 999 )
****************************
21 . DateAdd // 返回指定时间间隔后的日期.
   
Select  NowDate = GetDate (),LateDate = DateAdd (dy, 60 , GetDate ())

22 . DateDiff         // 返回时间间隔.
   
Select  TheDate = pubdate,NowDate = GetDate (),NY = DateDiff (yy,pubdate, GetDate ()),NM = DateDiff (mm,pubdate, GetDate ())  From  titles  Where  type = ' business '

23 . DateName , DatePart // 返回日期中指定部分对应的字符串,整数值
   
Select  YN = DateName (yy, GetDate ())   The Result: ' 2006 '
   
Select  YI = DatePart (yy, GetDate ())   The Result: 2006

24 . Char , Ascii
   
Print   ' A==>ASCII value is: ' + Char ( 13 ) + Str ( Ascii ( ' A ' ), 2 , 0 ) // Enter  key   ASCII   is   13 .
////// The Result:A ==> ASCII  value  is :
                 
65

25 . Stuff    // 删除字符串中指定位置的字符串,然后在删除位置插入字符串.
   
Print   Stuff ( ' abcdefghijk ' , 3 , 5 , ' ABCD ' )
////// The Result:abABCDhijk

26 . Str
   
Print   Str ( 10.1234 , 10 , 6 )
////// The Result: 10.123400

27 . Replicate , Replace // 按指定次数复制字符串,替换字符串中的内容.
   
Select   Replace ( Replicate ( ' ABC ' , 2 ), ' BC ' , ' bc ' )
////// The Result:AbcAbc

28 . sin , cos , tan ,ctan, Radians
   
Select  sin30du = Sin ( Radians ( 30.0 )),ctan30du = cot ( Radians ( 30.0 ))

29 . Round (近似值)
   
Select  r1 = Round ( 918.2736 , 3 ),r2 = Round ( 918.2736 , - 2 ),r3 = Round ( 918.2736 , 3 , 1 ),r4 = Round ( 918.2736 , - 2 , 1 )
////// The Result: r1: 918.2740 ; r2: 900.0000 ; r3: 918.2730 ; r4: 900.0000 ;



经过对SQLServer2000系统表的分析,写出了以下两个SQL语句。可以把这两个语句分别建为两个“视图”,方便查看用户数据表和字段的信息。

1 、列出所有的用户数据表:

SELECT   TOP   100   PERCENT  o.name  AS  表名
FROM  dbo.syscolumns c  INNER   JOIN
      dbo.sysobjects o 
ON  o.id  =  c.id  AND   objectproperty (o.id, N ' IsUserTable ' =   1   AND  
      o.name 
<>   ' dtproperties '   LEFT   OUTER   JOIN
      dbo.sysproperties m 
ON  m.id  =  o.id  AND  m.smallid  =  c.colorder
WHERE  (c.colid  =   1 )
ORDER   BY  o.name, c.colid

2 、列出所有的用户数据表及其字段信息:

SELECT   TOP   100   PERCENT  c.colid  AS  序号, o.name  AS  表名, c.name  AS  列名, 
      t.name 
AS  类型, c.length  AS  长度, c.isnullable  AS  允许空, 
      
CAST (m. [ value ]   AS   Varchar ( 100 ))  AS  说明
FROM  dbo.syscolumns c  INNER   JOIN
      dbo.sysobjects o 
ON  o.id  =  c.id  AND   objectproperty (o.id, N ' IsUserTable ' =   1   AND  
      o.name 
<>   ' dtproperties '   INNER   JOIN
      dbo.systypes t 
ON  t.xusertype  =  c.xusertype  LEFT   OUTER   JOIN
      dbo.sysproperties m 
ON  m.id  =  o.id  AND  m.smallid  =  c.colorder
ORDER   BY  o.name, c.colid

你如果有更好的方法,请交流一下:)

-- --作者:夏春涛 Email:[email protected]  QQ:23106676 ----

From : http: // www.cnblogs.com / bluesky521 / archive / 2007 / 03 / 23 / 685783 .html

CREATE   PROCEDURE  sp_page
@CurrentPage   int @PageSize   int , @Field_Info   varchar ( 500 ), @Table_info   varchar ( 20 ), @Field_id   varchar ( 10 ), @intOrder   int , @otherwhere   varchar ( 50 ), @RecordCount   int  output, @PageCount   int  output
-- @CurrentPage为显示那一页,@PageSize为每一页显示几行,@Field_info为要显示的字段可以为*,@Table_info为要查询的表或视图,@field_id为按这个字段排序,@intorder0为升序排1为降序排,@otherwhere为条件,@RecordCount为总行数,@PageCount为总页数
AS
DECLARE   @MinPage   int @MaxPage   int
declare   @sql   varchar ( 1000 )
declare   @sqlt   nvarchar ( 300 )
declare   @order   varchar ( 4 )
set   @sqlt   =   ' SELECT @RecordCount = COUNT( '   +   @Field_id   +   ' ) FROM  '   +   @Table_Info
exec  sp_executesql  @sqlt ,N ' @RecordCount int output ' , @RecordCount  output      -- 如何将exec执行结果放入变量中,如果是字符串就要用N,N后面的变量一定要和@sqlt里面的变量同名
IF   @PageSize   <=   0
begin
set   @PageSize   =   10
end
else   if   @PageSize   >   @RecordCount
begin
set   @pageSize   =   @RecordCount
end
set   @pagecount   =   @RecordCount   /   @PageSize
if  (( @recordcount   %   @pagesize !=   0 ) -- 如果除不尽则加一页
begin
set   @PageCount   =   @RecordCount   /   @PageSize
set   @PageCount   =   @pagecount   +   1
end
else
begin
set   @pagecount   =   @recordcount   / @PageSize
end
IF   @CurrentPage   <=   0
begin
set   @CurrentPage   =   1
end
else   if   @CurrentPage   >   @pagecount
begin
set   @currentpage   =   @pagecount -- 如果输入页数大于总页数则符最后一页
end
SET   @MinPage   =  ( @CurrentPage   -   1 *   @PageSize   +   1
SET   @MaxPage   =   @MinPage   +   @PageSize   -   1

BEGIN
if   @intorder   =   0
set   @order   =   ' asc '
else
set   @order   =   ' desc '
if   @Field_Info   like   ''
set   @field_Info   =   ' * '
if   @otherwhere   like   ''
set   @sql   =   ' select  '   +   @Field_Info   +   '  from (select  '   +    @Field_Info   +   '  , row_number() over(order by  '   +   @Field_id   +   '   '   +   @Order   +   ' ) as rownumber from  '   +   @Table_info   +   ' ) as a where rownumber between  '   +   convert ( varchar ( 10 ), @minpage +   '  and  '   +   convert ( varchar ( 10 ), @maxpage )
else
set   @sql   =   ' select  '   +   @Field_Info   +   '  from (select  '   +    @Field_Info   +   '  , row_number() over(order by  '   +   @Field_id   +   '   '   +   @Order   +   ' ) as rownumber from  '   +   @Table_info   +   ' ) as a where rownumber between  '   +   convert ( varchar ( 10 ), @minpage +   '  and  '   +   convert ( varchar ( 10 ), @maxpage +   '  and  '   +   @otherwhere
exec ( @sql )
END


declare   @rcon   int
declare   @pcon   int  
exec  sp_page  8 , 73 , '' , ' user_info ' , ' id ' , 0 , '' , @rcon  output, @pcon  output


这是我修改别人的一个数据库分页的存储过程

-- 清除企业管理器的备份历史记录


use  msdb 

declare   @db   varchar ( 100 )

set   @db   =   ' 数据库名 '

-- 查看SQL Server企业管理器的备份数据库历史记录
select  f.device_type, f.physical_device_name, f.logical_device_name, b.database_name 
from  backupmediafamily f, backupset b 
where  b.database_name  =   @db   and  b.backup_finish_date  in  ( select  backup_finish_date  from  backupmediafamily  INNER   JOIN  backupset  ON  backupmediafamily.media_set_id = backupset.media_set_id  where  backupset.database_name  =   @db   and  (backupmediafamily.device_type = 2   or  backupmediafamily.device_type = 102 ))  and  b.media_set_id  =  f.media_set_id

-- 删除SQL Server企业管理器的备份数据库历史记录
delete  backupmediafamily
from  backupmediafamily f, backupset b 
where  b.database_name  =   @db   and  b.backup_finish_date  in  ( select  backup_finish_date  from  backupmediafamily  INNER   JOIN  backupset  ON  backupmediafamily.media_set_id = backupset.media_set_id  where  backupset.database_name  =   @db   and  (backupmediafamily.device_type = 2   or  backupmediafamily.device_type = 102 ))  and  b.media_set_id  =  f.media_set_id

  随机选择数据库记录的方法(使用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 ()
mysql 
select   *   From  表名  Order   By   rand () Limit n

  Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)

  语法 
select  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对象,代表一个错误信息。

SELECT   * UPPER (master.dbo.fn_varbintohexstr(TermAddress))  AS  TermAddress_Hex
FROM  TerminalPrm
WHERE  (master.dbo.fn_varbintohexstr(TermAddress)  LIKE   ' 0%46% ' )


你可能感兴趣的:(sql语句)