我的亿家

首页 » 我的亿家程序 » SQL数据库 » 30条经典的SQL语句,或是T-SQL语句
22VS - 2008-5-28 21:18:00
那就贴一个吧:
DECLARE  @idoc  int
DECLARE  @doc  varchar(1000)
SET  @doc  = '
<ROOT>
<Customer  CustomerID= "VINET "  C>
      <Order  CustomerID= "VINET "  EmployeeID= "5 "  OrderDate= "1996-07-04T00:00:00 ">
            <OrderDetail  OrderID= "10248 "  ProductID= "11 "  Quantity= "12 "/>
            <OrderDetail  OrderID= "10248 "  ProductID= "42 "  Quantity= "10 "/>
      </Order>
</Customer>
<Customer  CustomerID= "LILAS "  C>
      <Order  CustomerID= "LILAS "  EmployeeID= "3 "  OrderDate= "1996-08-16T00:00:00 ">
            <OrderDetail  OrderID= "10283 "  ProductID= "72 "  Quantity= "3 "/>
      </Order>
</Customer>
</ROOT> '
--Create  an  internal  representation  of  the  XML  document.
EXEC  sp_xml_preparedocument  @idoc  OUTPUT,  @doc
--  Execute  a  SELECT  statement  that  uses  the  OPENXML  rowset  provider.
SELECT        *
FROM              OPENXML  (@idoc,  '/ROOT/Customer ',1)
                        WITH  (CustomerID    varchar(10),
                                    ContactName  varchar(20))
EXEC  sp_xml_removedocument  @idoc
22VS - 2008-5-28 21:19:00
关于索引,推荐转载的这篇文章
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
22VS - 2008-5-28 21:19:00
返回表的字段名称

select  name  from  syscolumns  where  id=object_id( 'jobs ')
22VS - 2008-5-28 21:20:00
一些不错的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
22VS - 2008-5-28 21:20:00
--如何将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
22VS - 2008-5-28 21:20:00
一些不错的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 '
22VS - 2008-5-28 21:21:00
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 '分割符 '
22VS - 2008-5-28 21:21:00
--修改用户数据库的排序规则
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
*/
22VS - 2008-5-28 21:21:00
表结构新

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
22VS - 2008-5-28 21:22:00
--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
22VS - 2008-5-28 21:22:00
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)
22VS - 2008-5-28 21:22:00
将小写金额转换为中文大写   


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
22VS - 2008-5-28 21:23:00
统计每周的数据量

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)
22VS - 2008-5-28 21:23:00
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 's  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 's  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;
22VS - 2008-5-28 21:24:00
经过对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:xChuntao@163.com   QQ:23106676  ----
22VS - 2008-5-28 21:24:00
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


这是我修改别人的一个数据库分页的存储过程
22VS - 2008-5-28 21:24:00
--清除企业管理器的备份历史记录


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
22VS - 2008-5-28 21:24:00
经验分享交流:常用SQL语句技法 

  下列语句部分是Mssql语句,不可以在access中使用。

  SQL分类: 

  DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) 
  DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) 
  DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)

  首先,简要介绍基础语句:

  1、说明:创建数据库

CREATE  DATABASE  database-name 

  2、说明:删除数据库

drop  database  dbname

  3、说明:备份sql  server

  ---  创建  备份数据的  device

USE  master
EXEC  sp_addumpdevice  'disk ',  'testBack ',  'c:\mssql7backup\MyNwind_1.dat '

  ---  开始  备份

BACKUP  DATABASE  pubs  TO  testBack 

  4、说明:创建新表

create  table  tabname(col1  type1  [not  null]  [primary  key],col2  type2  [not  null],..)

  根据已有的表创建新表: 

A:create  table  tab_new  like  tab_old  (使用旧表创建新表)
B:create  table  tab_new  as  select  col1,col2…  from  tab_old  definition  only

  5、说明:

  删除新表:drop  table  tabname 

  6、说明:

  增加一个列:Alter  table  tabname  add  column  col  type

  注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。

  7、说明:

  添加主键:Alter  table  tabname  add  primary  key(col) 

  说明:

  删除主键:Alter  table  tabname  drop  primary  key(col)

  8、说明:

  创建索引:create  [unique]  index  idxname  on  tabname(col….) 

  删除索引:drop  index  idxname

  注:索引是不可更改的,想更改必须删除重新建。

  9、说明:

  创建视图:create  view  viewname  as  select  statement

  删除视图:drop  view  viewname

  10、说明:几个简单的基本的sql语句

  选择:select  *  from  table1  where  范围

  插入:insert  into  table1(field1,field2)  values(value1,value2)

  删除:delete  from  table1  where  范围

  更新:update  table1  set  field1=value1  where  范围

  查找:select  *  from  table1  where  field1  like  ’%value1%’  ---like的语法很精妙,查资料!

  排序:select  *  from  table1  order  by  field1,field2  [desc]

  总数:select  count  *  as  totalcount  from  table1

  求和:select  sum(field1)  as  sumvalue  from  table1

  平均:select  avg(field1)  as  avgvalue  from  table1

  最大:select  max(field1)  as  maxvalue  from  table1

  最小:select  min(field1)  as  minvalue  from  table1

  11、说明:几个高级查询运算词

  A:  UNION  运算符 

  UNION  运算符通过组合其他两个结果表(例如  TABLE1  和  TABLE2)并消去表中任何重复行而派生出一个结果表。当  ALL  随  UNION  一起使用时(即  UNION  ALL),不消除重复行。两种情况下,派生表的每一行不是来自  TABLE1  就是来自  TABLE2。

  B:  EXCEPT  运算符 

  EXCEPT  运算符通过包括所有在  TABLE1  中但不在  TABLE2  中的行并消除所有重复行而派生出一个结果表。当  ALL  随  EXCEPT  一起使用时  (EXCEPT  ALL),不消除重复行。 

  C:  INTERSECT  运算符

  INTERSECT  运算符通过只包括  TABLE1  和  TABLE2  中都有的行并消除所有重复行而派生出一个结果表。当  ALL  随  INTERSECT  一起使用时  (INTERSECT  ALL),不消除重复行。

  注:使用运算词的几个查询结果行必须是一致的。

  12、说明:使用外连接 

  A、left  outer  join: 

  左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 

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

  B:right  outer  join: 

  右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

  C:full  outer  join: 

  全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

  其次,大家来看一些不错的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  .....
22VS - 2008-5-28 21:25:00
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

  随机选择数据库记录的方法(使用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对象,代表一个错误信息。
22VS - 2008-5-28 21:25:00
您正在看的SQLserver教程是:SQL语法参考手册(SQL)。
  DB2 提供了关连式资料库的查询语言 SQL (Structured Query Language),是一种非常口语化、既易学又易懂的语法。此一语言几乎是每个资料库系统都必须提供的,用以表示关连式的操作,包含了资料的定义(DDL)以及资料的处理(DML)。SQL原来拼成SEQUEL,这语言的原型以“系统 R“的名字在 IBM 圣荷西实验室完成,经过IBM内部及其他的许多使用性及效率测试,其结果相当令人满意,并决定在系统R 的技术基础发展出来 IBM 的产品。而且美国国家标准学会(ANSI)及国际标准化组织(ISO)在1987遵循一个几乎是以 IBM SQL 为基础的标准关连式资料语言定义。

一、资料定义 DDL(Data Definition Language)
资料定语言是指对资料的格式和形态下定义的语言,他是每个资料库要建立时候时首先要面对的,举凡资料分哪些表格关系、表格内的有什麽栏位主键、表格和表格之间互相参考的关系等等,都是在开始的时候所必须规划好的。

1、建表格:
CREATE TABLE table_name(
column1 DATATYPE [NOT NULL] [NOT NULL PRIMARY KEY],
column2 DATATYPE [NOT NULL],
...)
说明: 
DATATYPE --是资料的格式,详见表。
NUT NULL --可不可以允许资料有空的(尚未有资料填入)。
PRIMARY KEY --是本表的主键。

2、更改表格 
ALTER TABLE table_name
ADD COLUMN column_name DATATYPE
说明:增加一个栏位(没有删除某个栏位的语法。
ALTER TABLE table_name
ADD PRIMARY KEY (column_name)
说明:更改表得的定义把某个栏位设为主键。
ALTER TABLE table_name
DROP PRIMARY KEY (column_name)
说明:把主键的定义删除。

3、建立索引 
CREATE INDEX index_name ON table_name (column_name)
说明:对某个表格的栏位建立索引以增加查询时的速度。

4、删除 
DROP table_name
DROP index_name

二、的资料形态 DATATYPEs
smallint
16 位元的整数。
interger
32 位元的整数。
decimal(p,s)
p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数
点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float
32位元的实数。
double
64位元的实数。
char(n)
n 长度的字串,n不能超过 254。
varchar(n)
长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n)
和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为
了支援两个字元长度的字体,例如中文字。
vargraphic(n)
可变长度且其最大长度为 n 的双字元字串,n不能超过 2000。
date
包含了 年份、月份、日期。
time
包含了 小时、分钟、秒。
timestamp
包含了 年、月、日、时、分、秒、千分之一秒。

三、资料操作 DML (Data Manipulation Language)
资料定义好之後接下来的就是资料的操作。资料的操作不外乎增加资料(insert)、查询资料(query)、更改资料(update) 、删除资料(delete)四种模式,以下分 别介绍他们的语法:

1、增加资料:
INSERT INTO table_name (column1,column2,...)
VALUES ( value1,value2, ...)
说明:
1.若没有指定column 系统则会按表格内的栏位顺序填入资料。
2.栏位的资料形态和所填入的资料必须吻合。
3.table_name 也可以是景观 view_name。

INSERT INTO table_name (column1,column2,...)
SELECT columnx,columny,... FROM another_table
说明:也可以经过一个子查询(subquery)把别的表格的资料填入。

2、查询资料:
基本查询
SELECT column1,columns2,...
FROM table_name
说明:把table_name 的特定栏位资料全部列出来
SELECT *
FROM table_name
WHERE column1 = xxx
[AND column2 > yyy] [OR column3 <> zzz]
说明:
1.'*'表示全部的栏位都列出来。
2.WHERE 之後是接条件式,把符合条件的资料列出来。

SELECT column1,column2
FROM table_name
ORDER BY column2 [DESC]
说明:ORDER BY 是指定以某个栏位做排序,[DESC]是指从大到小排列,若没有指明,则是从小到大
排列

组合查询
组合查询是指所查询得资料来源并不只有单一的表格,而是联合一个以上的
表格才能够得到结果的。
SELECT *
FROM table1,table2
WHERE table1.colum1=table2.column1
说明:
1.查询两个表格中其中 column1 值相同的资料。
2.当然两个表格相互比较的栏位,其资料形态必须相同。
3.一个复杂的查询其动用到的表格可能会很多个。

整合性的查询:
SELECT COUNT (*)
FROM table_name
WHERE column_name = xxx
说明:
查询符合条件的资料共有几笔。
SELECT SUM(column1)
FROM table_name
说明:
1.计算出总和,所选的栏位必须是可数的数字形态。
2.除此以外还有 AVG() 是计算平均、MAX()、MIN()计算最大最小值的整合性查询。
SELECT column1,AVG(column2)
FROM table_name
GROUP BY column1
HAVING AVG(column2) > xxx
说明:
1.GROUP BY: 以column1 为一组计算 column2 的平均值必须和 AVG、SUM等整合性查询的关键字
一起使用。
2.HAVING : 必须和 GROUP BY 一起使用作为整合性的限制。

复合性的查询
SELECT *
FROM table_name1
WHERE EXISTS (
SELECT *
FROM table_name2
WHERE conditions )
说明:
1.WHERE 的 conditions 可以是另外一个的 query。
2.EXISTS 在此是指存在与否。
SELECT *
FROM table_name1
WHERE column1 IN (
SELECT column1
FROM table_name2
WHERE conditions )
说明: 
1. IN 後面接的是一个集合,表示column1 存在集合里面。
2. SELECT 出来的资料形态必须符合 column1。

其他查询
SELECT *
FROM table_name1
WHERE column1 LIKE 'x%'
说明:LIKE 必须和後面的'x%'
您正在看的SQLserver教程是:SQL语法参考手册(SQL)。 相呼应表示以 x为开头的字串。
SELECT *
FROM table_name1
WHERE column1 IN ('xxx','yyy',..)
说明:IN 後面接的是一个集合,表示column1 存在集合里面。
SELECT *
FROM table_name1
WHERE column1 BETWEEN xx AND yy
说明:BETWEEN 表示 column1 的值介於 xx 和 yy 之间。

3、更改资料:
UPDATE table_name
SET column1='xxx'
WHERE conditoins
说明:
1.更改某个栏位设定其值为'xxx'。
2.conditions 是所要符合的条件、若没有 WHERE 则整个 table 的那个栏位都会全部被更改。

4、删除资料:
DELETE FROM table_name
WHERE conditions
说明:删除符合条件的资料。

说明:关于WHERE条件后面如果包含有日期的比较,不同数据库有不同的表达式。具体如下:
(1)如果是ACCESS数据库,则为:WHERE mydate>#2000-01-01#
(2)如果是ORACLE数据库,则为:WHERE mydate>cast('2000-01-01' as date)
或:WHERE mydate>to_date('2000-01-01','yyyy-mm-dd')
在Delphi中写成:
thedate='2000-01-01';
query1.SQL.add('select * from abc where mydate>cast('+''+thedate+''+' as date)');

如果比较日期时间型,则为:
WHERE mydatetime>to_date('2000-01-01 10:00:01','yyyy-mm-dd hh24:mi:ss')
1
查看完整版本: 30条经典的SQL语句,或是T-SQL语句