原贴链接: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) desc26、选取编号界于‘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
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
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%')