关于索引,推荐转载的这篇文章
改善SQL语句的效率
数据量很大怎样加快索检速度 索引建立方法的区别 频繁插入删除数据需要更新索引 测试了一下sql server 2005 全文检索其他关于效率的高频问题
判断一个表的数据不在另一个表中最优秀方法?
删除千万级表中重复记录的办法数据库数据查询变得不正常类型问题
大数据量,稳定运行一段时候以后无法得到查询结果。
返回表的字段名称
select name from syscolumns where id=object_id('jobs')
select * into b
from a where 1<>1--刚看到的.新建一个与a表一样的空的b表
select * into b from a where 1<>1--刚看到的.新建一个与a表一样的空的b表
精点,经典, 一些不错的sql语句,自己根据需要收藏吧,分给多点哦:) 1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) 法一:select * into b from a where 1<>1 法二:select top 0 * into b from a2、说明:拷贝表(拷贝数据,源表名: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) b6、说明:外连接查询(表名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.c7、说明:在线视图查询(表名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 数值29、说明: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())>513、说明:一条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 323、说明:初始化表table1
TRUNCATE TABLE table124、说明:选择从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' -- 请注意字符串前一定要加N2:字段名,表名,数据库名之类作为变量时,必须用动态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 一些不错的sql语句 1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) 法一:select * into b from a where 1<>1 法二:select top 0 * into b from a2、说明:拷贝表(拷贝数据,源表名: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) b6、说明:外连接查询(表名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.c7、说明:在线视图查询(表名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 数值29、说明: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())>513、说明:一条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' 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' --返回库中用户表 dinoLgrace(淡泊以明志,宁静而致远) 24、说明:选择从10到15的记录 select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc好聪明的语句
在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'分割符'3....
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 ''?''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 ny column having count(*)>1)找出表中某一列相同的数据行
select *from table where (column in(select column from table group by column having count(*)>1)刚才BY写错拉!
--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>2000021、统计表中员工的薪水在40000-60000之间的人数
select count(*)as 人数 from employee where salary between 40000 and 6000022、查询表中的同一部门的职工的平均工资,但只查询"住址"是"上海市"的员工
select avg(salary) avg_sal,dept from employee where addr like '上海市%' group by dept23、将表中住址为"上海市"的员工住址改为"北京市"
update employee set addr like '北京市' where addr like '上海市'24、查找业务部或会计部的女员工的基本信息。
select emp_no,emp_name,dept from employee where sex='F'and dept in ('业务','会计')25、显示每种产品的销售金额总和,并依销售金额由大到小输出。
select prod_id ,sum(qty*unit_price) from sale_item group by prod_id order by sum(qty*unit_price) desc 26、选取编号界于‘C0001’和‘C0004’的客户编号、客户名称、客户地址。 select CUST_ID,cust_name,addr from customer where cust_id between 'C0001' AND 'C0004'27、计算出一共销售了几种产品。
select count(distinct prod_id) as '共销售产品数' from sale_item28、将业务部员工的薪水上调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_amt32、计算'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_hired35、找出目前业绩超过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)