http://community.csdn.net/Expert/topic/5068/5068547.xml?temp=.3311731
46.71% 的提问是关于语句、方法的基本使用,通过查询数据库在线帮助可以实现。
5.41% 的提问是关于查询数据分组,例如下面的举例
col1 col2 col1 sum col1 connect col1 top1
----------- 得到 ----------- 或得到 ---------- 或得到 ---- -----
a 1 a 3 a 1,2 a 2
a 2
b 1 b 1 b 1 b 1
基本数据 分组求和 分组合并或拆分 分组求排名数据
5.31% 的问题是关于数据导入导出。
4.14% 的问题是关于提高查询速度,涉及到减少连接数据库次数、建立索引、优化语句等方面。
3.5% 的问题是关于数据库安装过程中出现的问题。
3.5% 的问题是关于触发器。
3.2% 的问题是关于恢复数据库。
2.44% 的问题是关于连接远程服务器。
1.91% 的问题是关于数据库备份。
1.91% 的问题是与日期有关,例如按照日期排序。
1.49% 的问题是关于数据库用户角色和权限。
除了上面提到的高频问题,还包括:数据库、数据表设计,交叉表使用,数据库打包,数据库发布,树型数据处理,扩展存储过程使用,数据库复制,查询语句效率比较,Lock,Job,分页,事务,XML处理,行列转换,Cursor,数据加密,系统自带表使用,补丁,查询数据排序,内存占用,视图。
上面的内容是自己对SQL Server疑难问题版内的问题做的统计。因为问题更新的速度很快,所以统计的结果可能也只是反映当时一个时段的情况。所以自己对问题的总结也不会单纯拘泥于上面提到的内容。
问题征集:http://community.csdn.net/Expert/topic/5045/5045025.xml?temp=.3225519
数据库查询分组类型问题:http://community.csdn.net/Expert/topic/5073/5073353.xml?temp=.9627649
数据导入导出问题总结:http://community.csdn.net/Expert/topic/5086/5086676.xml?temp=.3282282
提高查询速度问题总结:http://community.csdn.net/Expert/topic/5106/5106330.xml?temp=5.613345E-02
连接远程SQLServer数据库总结:http://community.csdn.net/Expert/topic/5106/5106345.xml?temp=.3122675
SQL Server安装问题总结:http://community.csdn.net/Expert/topic/5122/5122206.xml?temp=.5882532
SQL Server还原问题总结:http://community.csdn.net/Expert/topic/5122/5122922.xml?temp=.2247736
SQL Server备份问题总结:http://community.csdn.net/Expert/topic/5122/5122999.xml?temp=.1588404
SQL Server触发器问题总结:http://community.csdn.net/Expert/topic/5146/5146269.xml?temp=.3856012
谢谢。
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
from a where 1<>1
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
insert into b(a, b, c) select d,e,f from b;
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
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)
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) 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
select * from (SELECT a,b,c FROM a) T where t.a > 1;
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
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 .....
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
select top 10 * form table1 where 范围
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
(select a from tableA ) except (select a from tableB) except (select a from tableC)
select top 10 * from tablename order by newid()
select newid()
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
select name from sysobjects where type='U'
select name from syscolumns where id=object_id('TableName')
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
TRUNCATE TABLE table1
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
--如何将exec执行结果放入变量中?
@sqls nvarchar(4000)
set @sqls='select @a=count(*) from tableName '
exec sp_executesql @sqls,N'@a int output',@num output
select @num
--------------------------------------------------------------------------------
1 :普通SQL语句可以用Exec执行
Exec('select * from tableName')
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N
declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。
Exec('select ' + @fname + ' from tableName') -- 请注意 加号前后的 单引号的边上加空格
declare @fname varchar(20)
set @fname = 'FiledName' --设置字段名
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句会报错
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句正确
declare @num int,
@sqls nvarchar(4000)
set @sqls='select count(*) from tableName'
exec(@sqls)
--如何将exec执行结果放入变量中?
@sqls nvarchar(4000)
set @sqls='select @a=count(*) from tableName '
exec sp_executesql @sqls,N'@a int output',@num output
select @num
1.日期算當月天數:
select Day(dateadd(day,-1,convert(datetime,convert(char(07),dateadd(m,1,getdate()),120)+'-01')))
select 32-Day(getdate()+(32-Day(getdate())))
用' union all select 'replace'分割符'
Order By可以指定列序而不用指定列名,在下面的例子里说明它的用处(注意,第三列未指定别名)
Select a.ID,a.Name,(Select Count(*) From TableB b Where a.ID=b.PID) From TableA a Order By 3
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 ''?''
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
*/
表结构新
表名=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 ny column having count(*)>1)
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
select emp_no,emp_name,dept,title
from employee
where emp_name<>'喻自强' and dept in
(select dept from employee
where emp_name='喻自强')
select dept,sum(salary)
from employee
group by dept
--显示该商品的编号、销售数量、单价和金额
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寸显示器'
select prod_id,sum(qty) totqty,sum(qty*unit_price) totprice
from sale_item
group by prod_id
select cust_id,sum(tot_amt) totprice
from sales
where convert(char(4),order_date,120)='1996'
group by cust_id
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
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
select order_no,cust_id,sale_id,tot_amt
from sales
where tot_amt=
(select max(tot_amt)
from sales)
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
select cust_name
from customer a
where not exists
(select *
from sales b
where a.cust_id=b.cust_id)
--订货日期不要显示时间,日期格式为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
--性别,销售日期、销售数量和金额,其中性别用男、女表示
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
--产品名称、数量、单价、金额和销售日期
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
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
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
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 )
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 '刘%'
select cust_id
from sales
where tot_amt>20000
select count(*)as 人数
from employee
where salary between 40000 and 60000
select avg(salary) avg_sal,dept
from employee
where addr like '上海市%'
group by dept
update employee
set addr like '北京市'
where addr like '上海市'
select emp_no,emp_name,dept
from employee
where sex='F'and dept in ('业务','会计')
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'
select count(distinct prod_id) as '共销售产品数'
from sale_item
update employee
set salary=salary*1.03
where dept='业务'
29、由employee表中查找出薪水最低的员工信息。
select *
from employee
where salary=
(select min(salary )
from employee )
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 '客户丙'
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
select avg(unit_price)
from sale_item
where prod_id='P0001'
select sale_id,tot_amt
from sales
where sale_id in
(select sale_id from employee
where sex='F')
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
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)