程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> Sql Server創建、鏈接和備份等操作與技巧

Sql Server創建、鏈接和備份等操作與技巧

編輯:關於SqlServer

一、基礎

1、說明:創建數據庫 

CREATE DATABASE database-name

2、說明:刪除數據庫

drop database dbname

3、說明:備份sql server

--- 創建備份數據的device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dak'
--- 開始備份
BACKUP DATABASE pubs TO testBack
*bak文件在SQLServer 中只需要還原即可;挺好用的。

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、幾個高級查詢運算詞

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),不消除重復行。

注:使用運算詞的幾個查詢結果行必須是一致的。

11、連接

實例
==========================
a表                      b表
name sex              name age
張三 男                李四 30
李四 女                王五 23 
==========================
交叉鏈接:
張三 男 李四 30
李四 女 王五 23
張三 男 王五 23
李四 女 李四 30

左聯結:
selece * from a left join b on a.name=b.name
張三 男  null null
李四 女  李四 30 

內鏈接  selece * from a inner  join b on a.name=b.name
李四 女  李四 30 

外鏈接 select *  from   a full outer join  b on a.name=b.name
張三 男 NULL NULL
李四 女 李四 30
NULL NULL 王五 23

12、對數據庫進行操作:

分離數據庫: sp_detach_db;  附加數據庫:sp_attach_db 後接表名,附加需要完整的路徑名

如何修改數據庫的名稱:sp_renamedb 'old_name', 'new_name'

 

二、技巧  

1、說明:復制表(只復制結構,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1(僅用於SQlServer)
法二: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、說明:子查詢(表名:a 表名: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)
10、說明:兩張關聯表,刪除主表中已經在副表中沒有的信息 
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

5、說明:一條sql 語句搞定數據庫分頁
select top 10 b.* from (select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主鍵字段 = a.主鍵字段 order by a.排序字段
具體實現:
關於數據庫分頁:
  declare @start int,@end int 
  @sql  nvarchar(600)
  set @sql=’select top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid from T where Rid>-1)’
  exec sp_executesql @sql
注意:在top後不能直接跟一個變量,所以在實際應用中只有這樣的進行特殊的處理。Rid為一個標識列,如果top後還有具體的字段,這樣做是非常有好處的。因為這樣可以避免 top的字段如果是邏輯索引的,查詢的結果後實際表中的不一致(邏輯索引中的數據有可能和數據表中的不一致,而查詢時如果處在索引則首先查詢索引)

6、說明:包括所有在 TableA 中但不在 TableB和TableC 中的行並消除所有重復行而派生出一個結果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)

7、說明:隨機取出條數據
select top 10 * from tablename order by newid()

8、說明:刪除重復記錄
1),delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

2),select distinct * into temp from tablename
  delete from tablename
  insert into tablename select * from temp
評價: 這種操作牽連大量的數據的移動,這種做法不適合大容量但數據操作

3),例如:在一個外部表中導入數據,由於某些原因第一次只導入了一部分,但很難判斷具體位置,這樣只有在下一次全部導入,這樣也就產生好多重復的字段,怎樣刪除重復字段
alter table tablename
--添加一個自增列
add  column_b int identity(1,1)
 delete from tablename where column_b not in(
select max(column_b)  from tablename group by column1,column2,...)
alter table tablename drop column column_b

9、說明:列出數據庫裡所有的表名
select name from sysobjects where type='U' // U代表用戶

10、說明:列出表裡的所有的列名
select name from syscolumns where id=object_id('TableName')

11、說明:選擇從到的記錄
select top 5 * from (select top 15 * from table order by id asc) table_別名 order by id desc

 

三、高級

1、1=1,1=2的使用,在SQL語句組合時用的較多
“where 1=1” 是表示選擇全部    “where 1=2”全部不選。
2、收縮數據庫 --重建索引 DBCC REINDEX DBCC INDEXDEFRAG --收縮數據和日志 DBCC SHRINKDB DBCC SHRINKFILE
3、壓縮數據庫 dbcc shrinkdatabase(dbname)
4、轉移數據庫給新用戶以已存在用戶權限 exec sp_change_users_login 'update_one','newname','oldname'
5、檢查備份集 RESTORE VERIFYONLY from disk='E:\dvbbs.bak'
6、修復數據庫 ALTER DATABASE [dvbbs] SET SINGLE_USER DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK ALTER DATABASE [dvbbs] SET MULTI_USER
7、日志清除 SET NOCOUNT ON DECLARE @LogicalFileName sysname, @MaxMinutes INT, @NewSize INT USE tablename -- 要操作的數據庫名 SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 @MaxMinutes = 10, -- Limit on time allowed to wrap log. @NewSize = 1 -- 你想設定的日志文件的大小(M) Setup / initialize DECLARE @OriginalSize int SELECT @OriginalSize = size FROM sysfiles WHERE name = @LogicalFileName SELECT 'Original Size of ' + db_name() + ' LOG is ' + CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' FROM sysfiles WHERE name = @LogicalFileName CREATE TABLE DummyTrans (DummyColumn char (8000) not null) DECLARE @Counter INT, @StartTime DATETIME, @TruncLog VARCHAR(255) SELECT @StartTime = GETDATE(), @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' DBCC SHRINKFILE (@LogicalFileName, @NewSize) EXEC (@TruncLog) -- Wrap the log if necessary. WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) AND (@OriginalSize * 8 /1024) > @NewSize BEGIN -- Outer loop. SELECT @Counter = 0 WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) BEGIN -- update INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans SELECT @Counter = @Counter + 1 END EXEC (@TruncLog) END SELECT 'Final Size of ' + db_name() + ' LOG is ' + CONVERT(VARCHAR(30),size) + ' 8K pages or ' + CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' FROM sysfiles WHERE name = @LogicalFileName DROP TABLE DummyTrans SET NOCOUNT OFF 8、說明:更改某個表 exec sp_changeobjectowner 'tablename','dbo'
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved