建表與自增主鍵
CREATE TABLE [表名] (
[自動編號字段] INT IDENTITY(1,1) PRIMARY KEY,
[字段1] NVARCHAR(50) DEFAULT '默認值' NULL,
[字段2] NTEXT NULL,
[字段3] DATETIME,
[字段4] MONEY NULL,
[字段5] INT DEFAULT 0,
[字段6] DECIMAL(12,4) DEFAULT 0,
[字段7] IMAGE NULL
);
基礎增刪改查
-- 插入
INSERT INTO [表名] (字段1, 字段2) VALUES (100, '51Windows.Net');
-- 刪除
DELETE FROM [表名] WHERE [字段名] > 100;
-- 更新
UPDATE [表名] SET [字段1] = 200, [字段2] = '51Windows.Net' WHERE [字段3] = 'HAIWA';
結構變更(ALTER TABLE)
-- 新增字段
ALTER TABLE [表名] ADD [字段名] NVARCHAR(50) NULL;
-- 刪除字段
ALTER TABLE [表名] DROP COLUMN [字段名];
-- 修改字段類型/長度/可空性
ALTER TABLE [表名] ALTER COLUMN [字段名] NVARCHAR(50) NULL;
-- 重命名表
EXEC sp_rename '舊表名', '新表名', 'OBJECT';
約束與默認值
-- 新建 CHECK 約束
ALTER TABLE [表名] ADD CONSTRAINT 約束名 CHECK ([約束字段] <= '2000-1-1');
-- 刪除約束
ALTER TABLE [表名] DROP CONSTRAINT 約束名;
-- 新建默認值
ALTER TABLE [表名] ADD CONSTRAINT 默認值名 DEFAULT '51Windows.Net' FOR [字段名];
-- 刪除默認值
ALTER TABLE [表名] DROP CONSTRAINT 默認值名;
縮減日志與數據庫文件
DUMP TRANSACTION 數據庫名 WITH NO_LOG;
BACKUP LOG 數據庫名 WITH NO_LOG;
DBCC SHRINKDATABASE(數據庫名);
EXEC sp_dboption '數據庫名', 'autoshrink', 'true';
自增列重建(無法直接 ALTER)
ALTER TABLE 表名 DROP COLUMN ID;
ALTER TABLE 表名 ADD ID INT IDENTITY(1,1);
常用系統函數與技巧
| 需求 | 語句/函數 |
| 切換數據庫 | USE 數據庫名 |
| 判斷對象是否存在 | EXISTS(...) / OBJECT_ID('對象名') |
| 建表時直接建主鍵 | CONSTRAINT PK名 PRIMARY KEY(列) |
| 創建索引 | CREATE INDEX 索引名 ON 表名(字段名) |
| 添加外鍵 | ALTER TABLE 表名 ADD CONSTRAINT FK名 FOREIGN KEY(字段) REFERENCES 表名(字段) |
| 身份列種子/增量 | IDENTITY(seed, increment) |
| 局部臨時表 | #表名(當前會話,會話結束自動刪除) |
| 全局臨時表 | ##表名(所有會話可見,最後會話結束刪除) |
| 多實例安裝 | 多次安裝 SQL Server 可創建多個命名實例 |
| 重命名列/表 | sp_rename '表名.舊列名', '新列名', 'COLUMN' |
| 向身份列顯式插值 | SET IDENTITY_INSERT 表名 ON; ...; SET IDENTITY_INSERT 表名 OFF; |
| 寫入 text/image 大字段 | WRITETEXT(需先 sp_dboption 'select into/bulkcopy', true) |
| 快速清空表 | TRUNCATE TABLE 表名(不記錄日志,極快) |
| 統計函數忽略 NULL | 除 COUNT(*) 外均忽略 NULL |
| 限制 text/image 返回長度 | SET TEXTSIZE 50 / SELECT @@TEXTSIZE |
| 讀取 text 片段 | READTEXT 表.列 @指針 偏移 長度 |
| LIKE 正則語法 | [a-z] 任意字母,[^a-z] 非字母 |
| 邏輯運算符優先級 | NOT > AND > OR |
| GROUP BY NULL 處理 | 所有 NULL 歸為一組 |
| HAVING vs WHERE | HAVING 可用聚合函數,WHERE 不可 |
| UNION 去重 | UNION ALL 保留重複行 |
| SELECT INTO 建新表 | 需 sp_dboption 'select into/bulkcopy', true |
| 隨機抽 N 行 | SELECT TOP N * FROM 表 ORDER BY NEWID() |
| 唯一約束 | CONSTRAINT 名 UNIQUE(列) |
| 企業管理器置 NULL 快捷鍵 | Ctrl+0 |
| 變量賦值 | SET @v = 值 / SELECT @v = 列 FROM 表 WHERE ... |
| 無 FROM 的 SELECT | SELECT @v1, @v2, GETDATE() |
遞歸函數範例:樹形結構查詢
CREATE FUNCTION fn_Tree(@Id INT)
RETURNS @tb TABLE (id INT, fid INT)
AS
BEGIN
INSERT @tb SELECT id, fid FROM tablename WHERE fid = @Id;
WHILE EXISTS (SELECT 1 FROM tablename WHERE fid IN (SELECT id FROM @tb) AND id NOT IN (SELECT id FROM @tb))
INSERT @tb SELECT id, fid FROM tablename WHERE fid IN (SELECT id FROM @tb) AND id NOT IN (SELECT id FROM @tb);
RETURN;
END;
-- 調用
SELECT * FROM dbo.fn_Tree(0);
日期格式轉換速查(CONVERT style)
| Style | 輸出範例 | 說明 |
| 112 | 20040912 | YYYYMMDD |
| 102 | 2004.09.12 | YYYY.MM.DD |
| 101 | 09/12/2004 | MM/DD/YYYY |
| 103 | 12/09/2004 | DD/MM/YYYY |
| 104 | 12.09.2004 | DD.MM.YYYY |
| 105 | 12-09-2004 | DD-MM-YYYY |
| 106 | 12 09 2004 | DD MM YYYY |
| 107 | 09 12, 2004 | Mon DD, YYYY |
| 108 | 11:06:08 | HH:MM:SS |
| 109 | 09 12 2004 11:06:08.177 | Mon DD YYYY HH:MI:SS:mmm |
| 110 | 09-12-2004 | MM-DD-YYYY |
| 111 | 2004/09/12 | YYYY/MM/DD |
| 113 | 12 09 2004 11:06:08.177 | DD Mon YYYY HH:MI:SS:mmm |
| 114 | 11:06:08.177 | HH:MI:SS:mmm |
| 120 | 2004-09-12 11:06:08 | YYYY-MM-DD HH:MI:SS (ISO8601) |
| 121 | 2004-09-12 11:06:08.177 | YYYY-MM-DD HH:MI:SS.mmm (ISO8601+毫秒) |
用法:CONVERT(VARCHAR(19), GETDATE(), 120) → 2004-09-12 11:06:08