数据库知识
来源:互联网 发布:怎么找淘宝达人推广 编辑:程序博客网 时间:2024/04/29 06:58
解决方法:
1)、SELECT *
FROM TableA a
WHERE EXISTS
(SELECT 1 FROM TableA WHERE [PK] <> a.[PK] AND ColumnA = a.ColumnA)
注:pk是主键或是unique 的字段
2)、select * from TableA where ColumnA in (select ColumnA from TableA group by ColumnA having count(ColumnA)>1)
2、在一个表当中有完全相同的两条以上记录,怎样用sql语句把他们删除,只保留一条
解决方法:
delect Table where id not in (
select max(ID) from Table group by Column1,Column2...
)
注:ID为表中唯一字段。group by 子句后跟的字段就是你用来判断重复的条件,如只有Column1,那么只要Column11字段内容相同即表示记录相同。用“max”做可以保留最新记录
3、数据库的递归
简单的例子:
CREATE PROCEDURE [proA] @i int AS
if @i>5 return
Print @i
set @i=@i+1
exec paoA @i
----------
执行:exec proA 0
结果
----------
0
1
2
3
4
5
4、利用case语句使数据生成一个新的结果(表名:TableA)
原数据
ID ColumnA
---------
1 a
2 b
解决方法: select ID,ColumnA,case ColumnA when 'a' then 100 when 'b' then 200 end as ColumnB from TableA
结果
ID ColumnA ColumnB
--------------------
1 a 100
2 b 200
5、临时表的运用(现有表TableA字段ColumnA),如何在显示时增加一个自增的ID
原数据
ColumnA
------
a
b
解决方法:
select ID=identity(int,1,1),* into #temp from TableA
select * from #temp
结果
ID ColumnA
------------
1 a
2 b
6、触发器运用(现有表TableA,字段[ColumnA,ColumnB] TableB,字段[ColumnA,ColumnB,ColumnC]),如何在TableA里增加记录的同时在TableB里也增加记录,删除时也同时删除。
解决方法
-----------添加触发器-----------
CREATE TRIGGER [a_insert] ON [TableA]
FOR INSERT
AS
insert into TableB(ColumnA,ColumnB)
select a.ColumnA,a.ColumnB from TableA a
where a.ColumnA in (select b.ColumnA from inserted b)
-----------删除触发器-----------
CREATE TRIGGER [a_del] ON [TableA]
FOR DELETE
AS
delete from TableB where ColumnA in (select ColumnA from deleted)
注:ColumnA为主键
7、distinct的运用(现有表TableA,字段ColumnA),如何消除重复行
原数据
ColumnA
------
a
a
b
b
解决方法:
1、select distinct ColumnA from TableA
2、select ColumnA from TableA group by ColumnA
结果
ColumnA
----
a
b
8、Convert的运用,表(TableA)里字段(ColumnA)类型是DataTime时,取出的数据形式是'0000-0-0 00:00:00',如何取出形式是'0000-00-00'
解决方法:select Convert(char(10),ColumnA,120) as rq from TableA
9、top的运用,表(TableA),字段ID,ColumnA.如何取出中间某几条记录
原数据
ID ColumnA
-------------
1 a
2 b
3 c
4 d
5 e
如何取出3-4条记录
解决方法:select top 2 * from TableA where ID not in (select top 2 ID from TableA)
结果
ID ColumnA
-------------
3 c
4 d
10、Between的运用(表TableA,字段ID,ColumnA[DateTime],ColumnB[DateTime])如何取出范围内的记录。
原数据
ID ColumnA ColumnB
------------------------------
1 2003-1-1 2003-2-1
2 2003-2-2 2003-3-1
3 2003-3-2 2003-4-1
4 2003-4-2 2004-1-1
如何得到 '2003-11-11' 属于哪个范围
解决方法:
declare @dt datetime
set @dt='2003-11-1'
select *
from TableA
where @dt between [ColumnA] and [ColumnB]
go
结果
ID ColumnA ColumnB
------------------------------
4 2003-4-2 2004-1-1
10、数据库日志
1)、截断事务日志:
BACKUP LOG 数据库名 WITH NO_LOG
2)、清空日志
DUMP TRANSACTION 库名 WITH NO_LOG
再: 企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
3)、 删除LOG
1:分离数据库 企业管理器->服务器->数据库->右键->分离数据库
2:删除LOG文件
3:附加数据库 企业管理器->服务器->数据库->右键->附加数据库
此法生成新的LOG,大小只有500多K
再将此数据库设置自动收缩
或用代码:
下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。
EXEC sp_detach_db @dbname = 'pubs'
EXEC sp_attach_single_file_db @dbname = 'pubs',
@physname = 'c:/Program Files/Microsoft SQL Server/MSSQL/Data/pubs.mdf'
4)、 如果想以后不让它增长
企业管理器--服务器--右键数据库--属性--事务日志--将文件增长限制为xM(x是你允许的最大数据文件大小)
--SQL语句的设置方式:
alter database 数据库名 modify file(name=逻辑文件名,maxsize=20)
5)、设置为自动收缩
企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"