一、基礎
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'