SQL Server核心知識總結

SQL Server核心知識總結

🎯 本文總結了SQL Server核心知識點,每個主題都提供實際可運行的示例代碼。

一、SQL Server基礎精要

1. 數據庫核心操作

-- 1. 創建數據庫(核心配置)
CREATE DATABASE 學生管理系統
ON PRIMARY
(NAME = '學生管理系統_數據',FILENAME = 'D:\Data\學生管理系統.mdf',SIZE = 100MB,FILEGROWTH = 100MB
)
LOG ON
(NAME = '學生管理系統_日志',FILENAME = 'D:\Data\學生管理系統.ldf',SIZE = 50MB,FILEGROWTH = 50MB
);
GO-- 2. 創建核心表結構
CREATE TABLE 學生表
(學號 CHAR(10) PRIMARY KEY,           -- 主鍵(最重要)姓名 NVARCHAR(20) NOT NULL,         -- 必填字段性別 CHAR(2),出生日期 DATE,班級 NVARCHAR(20)
);CREATE TABLE 成績表
(ID INT IDENTITY(1,1) PRIMARY KEY,    -- 自增主鍵學號 CHAR(10),課程號 CHAR(5),成績 DECIMAL(5,2),CONSTRAINT FK_成績表_學生表 FOREIGN KEY (學號) REFERENCES 學生表(學號)  -- 外鍵關系
);-- 3. 基本數據操作(最常用)
-- 插入數據
INSERT INTO 學生表 (學號, 姓名, 性別, 班級)
VALUES ('2021001', '張三', '男', '計算機1班');-- 更新數據
UPDATE 學生表 
SET 班級 = '計算機2班'
WHERE 學號 = '2021001';-- 刪除數據
DELETE FROM 學生表 
WHERE 學號 = '2021001';

🔑 核心要點

  1. 數據庫設計三要素:

    • 主數據文件(.mdf):存儲數據
    • 日志文件(.ldf):記錄事務
    • 合理的初始大小和增長設置
  2. 表設計核心原則:

    • 必須有主鍵(唯一標識)
    • 建立合適的外鍵關系
    • 選擇合適的數據類型
    • 添加必要的約束
  3. 最常用的SQL操作:

    • INSERT:添加數據
    • UPDATE:修改數據
    • DELETE:刪除數據

2. 數據類型和查詢

讓我們學習最常用的數據類型和SELECT查詢:

-- 1. 最常用數據類型示例
CREATE TABLE 數據類型示例
(-- 整數類型(最常用)ID INT IDENTITY(1,1),         -- 自增整數,常用主鍵數量 SMALLINT,               -- 較小范圍整數-- 精確數值(金融計算必用)金額 DECIMAL(12,2),          -- 總12位,小數2位單價 MONEY,                  -- 專用于金融計算-- 字符串(最常用)名稱 NVARCHAR(50),           -- Unicode變長,最常用編號 CHAR(10),              -- 定長,如學號工號等描述 VARCHAR(MAX),          -- 大文本數據-- 日期時間(最常用)創建日期 DATE,               -- 僅日期更新時間 DATETIME2           -- 日期時間,推薦使用
);-- 2. 核心查詢語句
-- 基礎查詢(最常用)
SELECT 學號, 姓名, 成績
FROM 學生表
WHERE 班級 = '計算機1班'
ORDER BY 成績 DESC;-- 多表聯接(重要)
SELECT s.姓名, c.課程名, g.成績
FROM 學生表 s
INNER JOIN 成績表 g ON s.學號 = g.學號
INNER JOIN 課程表 c ON g.課程號 = c.課程號
WHERE g.成績 >= 60;-- 分組統計(常用)
SELECT 班級, COUNT(*) AS 人數,AVG(成績) AS 平均分,MAX(成績) AS 最高分
FROM 學生表 s
JOIN 成績表 g ON s.學號 = g.學號
GROUP BY 班級
HAVING AVG(成績) >= 60;-- 子查詢(重要)
SELECT 姓名, 成績
FROM 學生表 s
JOIN 成績表 g ON s.學號 = g.學號
WHERE 成績 > (SELECT AVG(成績)FROM 成績表
);

📝 查詢要點

  1. SELECT語句核心組成(按執行順序):

    • FROM:指定數據來源
    • WHERE:行級過濾
    • GROUP BY:分組
    • HAVING:組級過濾
    • ORDER BY:排序
  2. 常用聯接類型:

    • INNER JOIN:內聯接(最常用)
    • LEFT JOIN:左外聯接(保留左表所有行)
    • RIGHT JOIN:右外聯接(保留右表所有行)
  3. 常用聚合函數:

    • COUNT():計數
    • SUM():求和
    • AVG():平均值
    • MAX()/MIN():最大/最小值
  4. 性能優化要點:

    • 只查詢需要的列
    • 合理使用索引
    • 避免SELECT *
    • 適當使用WHERE條件

3. 索引和性能優化

讓我們學習最核心的性能優化技術:

-- 1. 創建最常用的索引類型
-- 聚集索引(主鍵,每表僅一個)
CREATE TABLE 訂單表
(訂單號 INT PRIMARY KEY,  -- 自動創建聚集索引客戶ID INT,訂單日期 DATE,總金額 DECIMAL(12,2)
);-- 非聚集索引(最常用的查詢優化方式)
CREATE NONCLUSTERED INDEX IX_訂單表_客戶ID
ON 訂單表(客戶ID);-- 覆蓋索引(包含所有需要的列)
CREATE NONCLUSTERED INDEX IX_訂單表_日期_金額
ON 訂單表(訂單日期)
INCLUDE (總金額);-- 2. 查看索引使用情況
-- 查看索引的使用統計
SELECT OBJECT_NAME(i.object_id) AS 表名,i.name AS 索引名,ius.user_seeks + ius.user_scans AS 使用次數,ius.last_user_seek AS 最后查詢時間
FROM sys.dm_db_index_usage_stats ius
JOIN sys.indexes i ON ius.object_id = i.object_id AND ius.index_id = i.index_id
WHERE database_id = DB_ID();-- 3. 性能診斷(最常用)
-- 查看執行計劃
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
GO-- 慢查詢示例
SELECT * FROM 訂單表 
WHERE 訂單日期 BETWEEN '2024-01-01' AND '2024-01-31';-- 優化后的查詢
SELECT 訂單號, 訂單日期, 總金額 
FROM 訂單表 WITH(INDEX(IX_訂單表_日期_金額))
WHERE 訂單日期 BETWEEN '2024-01-01' AND '2024-01-31';

🚀 性能優化核心要點

  1. 索引使用原則:

    • 經常查詢的列建立索引
    • 外鍵列必建索引
    • 避免對頻繁更新的列建索引
    • 選擇性高的列適合建索引
  2. 最重要的優化技巧:

    • 使用覆蓋索引避免回表
    • 避免索引列上使用函數
    • 避免隱式類型轉換
    • 合理使用索引提示
  3. 常見性能問題:

    • 索引碎片化:定期重建或重組
    • 統計信息過期:更新統計信息
    • 參數嗅探:使用OPTIMIZE FOR
    • 死鎖:合理的事務處理
  4. 性能監控工具:

    • 執行計劃
    • STATISTICS IO/TIME
    • sys.dm_db_index_usage_stats
    • 數據庫引擎優化顧問

4. 事務和并發控制

讓我們學習如何保證數據的一致性:

-- 1. 基本事務處理(最常用)
-- 轉賬示例
BEGIN TRYBEGIN TRANSACTION;-- 從賬戶A扣款UPDATE 賬戶表SET 余額 = 余額 - 1000WHERE 賬戶ID = 'A';-- 給賬戶B存款UPDATE 賬戶表SET 余額 = 余額 + 1000WHERE 賬戶ID = 'B';-- 記錄交易日志INSERT INTO 交易日志(交易類型, 金額, 時間)VALUES ('轉賬', 1000, GETDATE());COMMIT TRANSACTION;
END TRY
BEGIN CATCHROLLBACK TRANSACTION;INSERT INTO 錯誤日志(錯誤信息, 時間)VALUES (ERROR_MESSAGE(), GETDATE());
END CATCH;-- 2. 事務隔離級別(重要)
-- 設置隔離級別
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;-- 處理并發訪問
BEGIN TRANSACTION;-- 使用鎖提示SELECT * FROM 訂單表 WITH (UPDLOCK, ROWLOCK)WHERE 訂單號 = '001';-- 更新訂單UPDATE 訂單表SET 狀態 = '已處理'WHERE 訂單號 = '001';
COMMIT TRANSACTION;-- 3. 死鎖處理(常見問題)
-- 設置死鎖優先級
SET DEADLOCK_PRIORITY HIGH;-- 使用表鎖提示避免死鎖
UPDATE 訂單表 WITH (ROWLOCK)
SET 狀態 = '處理中'
WHERE 訂單號 = '001';-- 4. 并發控制最佳實踐
-- 使用樂觀并發控制
CREATE TABLE 商品表
(商品ID INT PRIMARY KEY,名稱 NVARCHAR(50),庫存 INT,版本號 ROWVERSION  -- 用于樂觀并發控制
);-- 樂觀并發更新示例
UPDATE 商品表
SET 庫存 = 庫存 - 1
WHERE 商品ID = 1 
AND 版本號 = @原版本號;  -- 確保數據未被其他事務修改

🔒 事務管理核心要點

  1. 事務ACID特性:

    • 原子性:要么全做要么全不做
    • 一致性:保持數據完整
    • 隔離性:事務間互不干擾
    • 持久性:提交后永久保存
  2. 最常用的隔離級別:

    • READ COMMITTED(默認):防止臟讀
    • REPEATABLE READ:防止不可重復讀
    • SERIALIZABLE:最高隔離級別
    • READ UNCOMMITTED:性能最好但不安全
  3. 并發控制策略:

    • 悲觀鎖:適用于高并發更新
    • 樂觀鎖:適用于讀多寫少
    • 行級鎖:粒度小,并發高
    • 表級鎖:粒度大,阻塞多
  4. 實踐建議:

    • 事務盡可能短小
    • 合理設置隔離級別
    • 避免長時間持有鎖
    • 正確的錯誤處理

5. 備份和恢復

讓我們學習如何保護數據安全:

-- 1. 完整備份(最基礎最重要)
-- 創建完整備份
BACKUP DATABASE 學生管理系統
TO DISK = 'D:\Backup\學生管理系統_Full.bak'
WITH COMPRESSION,                 -- 啟用壓縮CHECKSUM,                   -- 驗證備份完整性DESCRIPTION = '完整備份';    -- 備份描述-- 2. 差異備份(節省空間和時間)
BACKUP DATABASE 學生管理系統
TO DISK = 'D:\Backup\學生管理系統_Diff.bak'
WITH DIFFERENTIAL,               -- 差異備份COMPRESSION;-- 3. 日志備份(保證時間點恢復)
BACKUP LOG 學生管理系統
TO DISK = 'D:\Backup\學生管理系統_Log.bak'
WITH COMPRESSION;-- 4. 數據庫恢復(最常用場景)
-- 完整恢復
RESTORE DATABASE 學生管理系統
FROM DISK = 'D:\Backup\學生管理系統_Full.bak'
WITH NORECOVERY;  -- 允許繼續還原其他備份-- 還原差異備份
RESTORE DATABASE 學生管理系統
FROM DISK = 'D:\Backup\學生管理系統_Diff.bak'
WITH NORECOVERY;-- 還原日志備份到指定時間點
RESTORE LOG 學生管理系統
FROM DISK = 'D:\Backup\學生管理系統_Log.bak'
WITH STOPAT = '2024-01-15 14:30:00',  -- 指定恢復時間點RECOVERY;  -- 完成恢復,數據庫可用-- 5. 自動化備份維護(生產環境必備)
-- 清理過期備份文件
DECLARE @cmd NVARCHAR(500);
SET @cmd = 'forfiles /p "D:\Backup" /s /m *.bak /d -30 /c "cmd /c del @path"';
EXEC xp_cmdshell @cmd;-- 驗證備份有效性
RESTORE VERIFYONLY 
FROM DISK = 'D:\Backup\學生管理系統_Full.bak';

💾 備份恢復核心要點

  1. 三種主要備份類型:

    • 完整備份:整個數據庫的完整副本
    • 差異備份:自上次完整備份后的變化
    • 日志備份:記錄詳細的事務日志
  2. 常用備份策略(最佳實踐):

    • 每周一次完整備份
    • 每天一次差異備份
    • 每小時一次日志備份
    • 定期驗證備份有效性
  3. 關鍵恢復場景:

    • 系統崩潰:使用最新的一致備份
    • 數據誤刪:使用時間點恢復
    • 硬件故障:完整恢復流程
    • 測試環境:快速還原生產數據
  4. 備份管理要點:

    • 異地存儲重要備份
    • 定期清理過期備份
    • 監控備份執行狀態
    • 測試恢復流程

6. 安全管理

讓我們學習如何保護數據庫安全:

-- 1. 用戶和角色管理(基礎安全)
-- 創建登錄名
CREATE LOGIN 教師登錄 
WITH PASSWORD = 'P@ssw0rd123',CHECK_POLICY = ON;  -- 啟用密碼策略-- 創建數據庫用戶
USE 學生管理系統;
CREATE USER 教師用戶 FOR LOGIN 教師登錄;-- 創建角色并分配權限
CREATE ROLE 教師角色;
GRANT SELECT, UPDATE ON 成績表 TO 教師角色;
GRANT SELECT ON 學生表 TO 教師角色;-- 將用戶添加到角色
ALTER ROLE 教師角色 ADD MEMBER 教師用戶;-- 2. 數據加密(敏感數據保護)
-- 創建主密鑰
CREATE MASTER KEY ENCRYPTION 
BY PASSWORD = 'YourStr0ngP@ssw0rd';-- 創建證書
CREATE CERTIFICATE 學生信息證書
WITH SUBJECT = '學生敏感信息加密證書';-- 創建加密密鑰
CREATE SYMMETRIC KEY 學生信息加密密鑰
WITH ALGORITHM = AES_256
ENCRYPTION BY CERTIFICATE 學生信息證書;-- 加密數據示例
CREATE TABLE 學生敏感信息
(學號 CHAR(10) PRIMARY KEY,姓名 NVARCHAR(20),身份證號 VARBINARY(256),  -- 加密存儲聯系電話 VARBINARY(256)   -- 加密存儲
);-- 插入加密數據
OPEN SYMMETRIC KEY 學生信息加密密鑰
DECRYPTION BY CERTIFICATE 學生信息證書;INSERT INTO 學生敏感信息 
VALUES ('2021001', '張三',EncryptByKey(Key_GUID('學生信息加密密鑰'), '320123199901011234'),EncryptByKey(Key_GUID('學生信息加密密鑰'), '13912345678')
);CLOSE SYMMETRIC KEY 學生信息加密密鑰;-- 3. 審計跟蹤(最重要的安全措施)
-- 創建服務器審計
CREATE SERVER AUDIT 數據庫審計
TO FILE (FILEPATH = 'D:\Audit\');-- 創建數據庫審計規范
CREATE DATABASE AUDIT SPECIFICATION 學生數據審計
FOR SERVER AUDIT 數據庫審計
ADD (SELECT, UPDATE, DELETE ON 學生表 BY PUBLIC),
ADD (SELECT, UPDATE ON 成績表 BY PUBLIC);-- 啟用審計
ALTER SERVER AUDIT 數據庫審計 WITH (STATE = ON);
ALTER DATABASE AUDIT SPECIFICATION 學生數據審計 WITH (STATE = ON);-- 查看審計日志
SELECT * FROM fn_get_audit_file
('D:\Audit\*', DEFAULT, DEFAULT);-- 4. 安全最佳實踐
-- 定期修改密碼
ALTER LOGIN 教師登錄 
WITH PASSWORD = 'NewP@ssw0rd456';-- 禁用不用的賬戶
ALTER LOGIN 教師登錄 DISABLE;-- 回收不需要的權限
REVOKE UPDATE ON 成績表 FROM 教師角色;-- 監控登錄失敗
SELECT * FROM sys.dm_exec_sessions
WHERE login_time > DATEADD(HOUR, -1, GETDATE())
AND login_name = '教師登錄';

🔐 安全管理核心要點

  1. 訪問控制基礎:

    • 最小權限原則
    • 基于角色的授權
    • 定期審查權限
    • 密碼策略管理
  2. 數據加密策略:

    • 敏感數據加密存儲
    • 傳輸數據加密
    • 密鑰定期輪換
    • 證書安全管理
  3. 審計要點:

    • 重要操作必須審計
    • 定期檢查審計日志
    • 異常行為告警
    • 審計日志安全存儲
  4. 安全維護:

    • 定期安全評估
    • 及時安裝補丁
    • 監控可疑活動
    • 制定應急預案

二、高級特性

讓我們學習SQL Server最常用的高級功能:

1. 存儲過程和函數

-- 1. 存儲過程(最常用的封裝方式)
-- 創建成績統計存儲過程
CREATE PROCEDURE sp_統計學生成績@班級 NVARCHAR(20),@及格率 DECIMAL(5,2) OUTPUT
AS
BEGINSET NOCOUNT ON;-- 計算及格率SELECT @及格率 = CONVERT(DECIMAL(5,2),SUM(CASE WHEN 成績 >= 60 THEN 1 ELSE 0 END) * 100.0 / COUNT(*))FROM 成績表 gJOIN 學生表 s ON g.學號 = s.學號WHERE s.班級 = @班級;-- 返回詳細統計SELECT COUNT(*) AS 總人數,AVG(成績) AS 平均分,MAX(成績) AS 最高分,MIN(成績) AS 最低分FROM 成績表 gJOIN 學生表 s ON g.學號 = s.學號WHERE s.班級 = @班級;
END;-- 調用存儲過程
DECLARE @及格率 DECIMAL(5,2);
EXEC sp_統計學生成績 @班級 = '計算機1班',@及格率 = @及格率 OUTPUT;
PRINT '及格率: ' + CAST(@及格率 AS VARCHAR(10)) + '%';-- 2. 自定義函數(常用計算封裝)
-- 創建年齡計算函數
CREATE FUNCTION fn_計算年齡
(@出生日期 DATE
)
RETURNS INT
AS
BEGINRETURN DATEDIFF(YEAR, @出生日期, GETDATE()) -CASE WHEN DATEADD(YEAR, DATEDIFF(YEAR, @出生日期, GETDATE()), @出生日期) > GETDATE()THEN 1 ELSE 0 END;
END;-- 創建成績等級函數
CREATE FUNCTION fn_計算等級
(@成績 DECIMAL(5,2)
)
RETURNS CHAR(1)
AS
BEGINRETURN CASE WHEN @成績 >= 90 THEN 'A'WHEN @成績 >= 80 THEN 'B'WHEN @成績 >= 70 THEN 'C'WHEN @成績 >= 60 THEN 'D'ELSE 'F'END;
END;-- 使用函數
SELECT 姓名,dbo.fn_計算年齡(出生日期) AS 年齡,成績,dbo.fn_計算等級(成績) AS 等級
FROM 學生表 s
JOIN 成績表 g ON s.學號 = g.學號;

📦 存儲過程和函數要點

  1. 存儲過程優勢:

    • 減少網絡流量
    • 重用業務邏輯
    • 提高執行效率
    • 增強安全性
  2. 函數使用場景:

    • 復雜計算封裝
    • 數據轉換處理
    • 業務規則統一
    • 代碼重用

2. 觸發器

-- 1. 數據審計觸發器(最常用)
CREATE TRIGGER tr_學生表_審計
ON 學生表
AFTER INSERT, UPDATE, DELETE
AS
BEGINSET NOCOUNT ON;-- 插入操作審計INSERT INTO 審計日志(表名, 操作類型, 操作時間, 操作用戶, 數據)SELECT '學生表','INSERT',GETDATE(),SYSTEM_USER,(SELECT * FROM inserted FOR JSON AUTO)FROM insertedWHERE EXISTS (SELECT 1 FROM inserted);-- 刪除操作審計INSERT INTO 審計日志(表名, 操作類型, 操作時間, 操作用戶, 數據)SELECT '學生表','DELETE',GETDATE(),SYSTEM_USER,(SELECT * FROM deleted FOR JSON AUTO)FROM deletedWHERE EXISTS (SELECT 1 FROM deleted);
END;-- 2. 業務規則觸發器(數據驗證)
CREATE TRIGGER tr_成績表_驗證
ON 成績表
INSTEAD OF INSERT
AS
BEGINSET NOCOUNT ON;-- 驗證成績范圍IF EXISTS (SELECT 1 FROM inserted WHERE 成績 < 0 OR 成績 > 100)BEGINRAISERROR ('成績必須在0-100之間', 16, 1);RETURN;END;-- 驗證通過后插入數據INSERT INTO 成績表(學號, 課程號, 成績)SELECT 學號, 課程號, 成績FROM inserted;
END;

🔄 觸發器使用要點

  1. 常用場景:

    • 數據審計跟蹤
    • 業務規則驗證
    • 數據同步更新
    • 自動計算匯總
  2. 設計原則:

    • 觸發器要簡單
    • 避免長事務
    • 注意性能影響
    • 合理使用事務

3. 視圖

讓我們繼續學習視圖的應用:

-- 1. 基礎視圖(最常用)
-- 創建學生成績匯總視圖
CREATE VIEW v_學生成績匯總
AS
SELECT s.學號,s.姓名,s.班級,COUNT(g.課程號) AS 課程數,AVG(g.成績) AS 平均分,SUM(CASE WHEN g.成績 >= 60 THEN 1 ELSE 0 END) AS 及格課程數
FROM 學生表 s
LEFT JOIN 成績表 g ON s.學號 = g.學號
GROUP BY s.學號, s.姓名, s.班級;-- 2. 帶檢查選項的視圖(數據驗證)
CREATE VIEW v_優秀學生
WITH SCHEMABINDING
AS
SELECT 學號, 姓名, 班級, 成績
FROM dbo.成績表 g
JOIN dbo.學生表 s ON g.學號 = s.學號
WHERE 成績 >= 90
WITH CHECK OPTION;-- 3. 索引視圖(提高查詢性能)
CREATE VIEW v_課程平均分
WITH SCHEMABINDING
AS
SELECT 課程號,COUNT_BIG(*) AS 學生數,AVG(CONVERT(DECIMAL(5,2), 成績)) AS 平均分
FROM dbo.成績表
GROUP BY 課程號;-- 在視圖上創建唯一聚集索引
CREATE UNIQUE CLUSTERED INDEX IX_課程平均分
ON v_課程平均分(課程號);-- 4. 分區視圖(大表分區)
-- 創建分區表
CREATE TABLE 歷史成績表_2023
(學號 CHAR(10),課程號 CHAR(5),成績 DECIMAL(5,2),學年 CHAR(4) CHECK (學年 = '2023')
);CREATE TABLE 歷史成績表_2024
(學號 CHAR(10),課程號 CHAR(5),成績 DECIMAL(5,2),學年 CHAR(4) CHECK (學年 = '2024')
);-- 創建分區視圖
CREATE VIEW v_歷史成績
AS
SELECT * FROM 歷史成績表_2023
UNION ALL
SELECT * FROM 歷史成績表_2024;-- 5. 視圖的使用示例
-- 查詢優秀學生
SELECT * FROM v_優秀學生
WHERE 班級 = '計算機1班'
ORDER BY 成績 DESC;-- 更新視圖數據
UPDATE v_學生成績匯總
SET 班級 = '計算機2班'
WHERE 學號 = '2021001';-- 通過視圖插入數據
INSERT INTO v_優秀學生(學號, 姓名, 班級, 成績)
VALUES ('2021010', '李四', '計算機1班', 95);

👁? 視圖使用要點

  1. 視圖的優勢:

    • 簡化復雜查詢
    • 控制數據訪問
    • 提供數據獨立性
    • 實現數據安全
  2. 常用視圖類型:

    • 基礎視圖:簡化查詢
    • 索引視圖:提升性能
    • 分區視圖:管理大數據
    • 更新視圖:維護數據
  3. 設計原則:

    • 避免過于復雜的視圖
    • 合理使用索引視圖
    • 注意更新限制
    • 控制視圖嵌套層數
  4. 性能考慮:

    • 適當使用SCHEMABINDING
    • 避免使用SELECT *
    • 合理使用索引
    • 控制視圖復雜度

4. XML和JSON

讓我們學習如何處理結構化數據:

-- 1. XML數據處理(常用于數據交換)
-- 創建包含XML列的表
CREATE TABLE 學生檔案
(學號 CHAR(10) PRIMARY KEY,基本信息 XML,成績記錄 XML
);-- 插入XML數據
INSERT INTO 學生檔案(學號, 基本信息)
VALUES ('2021001','<學生><姓名>張三</姓名><性別>男</性別><聯系方式><電話>13912345678</電話><郵箱>zhangsan@example.com</郵箱></聯系方式></學生>'
);-- 查詢XML數據
SELECT 學號,基本信息.value('(/學生/姓名)[1]', 'NVARCHAR(20)') AS 姓名,基本信息.value('(/學生/聯系方式/電話)[1]', 'VARCHAR(20)') AS 聯系電話
FROM 學生檔案;-- 使用XML索引提高查詢性能
CREATE PRIMARY XML INDEX PX_學生檔案_基本信息
ON 學生檔案(基本信息);-- 2. JSON數據處理(更現代的選擇)
-- 將查詢結果轉為JSON
SELECT 學號,姓名,班級,成績
FROM 學生表 s
JOIN 成績表 g ON s.學號 = g.學號
FOR JSON PATH;-- 創建包含JSON的表
CREATE TABLE 學生信息擴展
(學號 CHAR(10) PRIMARY KEY,擴展信息 NVARCHAR(MAX)CHECK (ISJSON(擴展信息) = 1)  -- 確保是有效的JSON
);-- 插入JSON數據
INSERT INTO 學生信息擴展
VALUES ('2021001','{"興趣愛好": ["編程", "籃球", "音樂"],"獲獎記錄": [{"時間": "2023-06", "獎項": "編程大賽一等獎"},{"時間": "2023-12", "獎項": "優秀學生"}],"實習經歷": {"公司": "科技公司","職位": "開發實習生","時間": "2023-07至2023-09"}}'
);-- 查詢JSON數據
SELECT 學號,JSON_VALUE(擴展信息, '$.實習經歷.公司') AS 實習公司,JSON_QUERY(擴展信息, '$.興趣愛好') AS 興趣愛好
FROM 學生信息擴展;-- 3. 結構化數據轉換(常用場景)
-- 行轉列(XML方式)
SELECT 學號,姓名,(SELECT 課程號 AS '@課程', 成績 AS '@分數'FROM 成績表WHERE 學號 = s.學號FOR XML PATH('課程'), ROOT('成績記錄')) AS 成績XML
FROM 學生表 s;-- 行轉列(JSON方式)
SELECT 學號,姓名,(SELECT 課程號, 成績FROM 成績表WHERE 學號 = s.學號FOR JSON PATH) AS 成績JSON
FROM 學生表 s;-- 4. 數據導入導出
-- 導出XML數據
SELECT 學號, 姓名, 班級
FROM 學生表
FOR XML PATH('學生'), ROOT('學生列表');-- 導出JSON數據
SELECT 學號, 姓名, 班級
FROM 學生表
FOR JSON PATH, ROOT('學生列表');-- 解析JSON數組
SELECT 學號,興趣
FROM 學生信息擴展
CROSS APPLY OPENJSON(擴展信息, '$.興趣愛好')WITH (興趣 NVARCHAR(50) '$');

📊 結構化數據處理要點

  1. XML使用場景:

    • 數據交換接口
    • 配置文件存儲
    • 復雜數據結構
    • 遺留系統集成
  2. JSON優勢:

    • 更輕量級的格式
    • 更好的可讀性
    • 前后端數據傳輸
    • 現代API集成
  3. 性能考慮:

    • 適當使用XML索引
    • JSON數據類型驗證
    • 避免過大的文檔
    • 合理的查詢方式
  4. 最佳實踐:

    • 選擇合適的格式
    • 規范的數據結構
    • 有效的錯誤處理
    • 定期數據維護

5. 全文檢索

讓我們學習如何實現高效的文本搜索:

-- 1. 全文檢索配置(基礎設置)
-- 創建全文目錄
CREATE FULLTEXT CATALOG 文章目錄
WITH ACCENT_SENSITIVITY = OFF
AS DEFAULT;-- 創建包含大文本的表
CREATE TABLE 文章表
(文章ID INT PRIMARY KEY,標題 NVARCHAR(200),內容 NVARCHAR(MAX),作者 NVARCHAR(50),發布時間 DATETIME2
);-- 創建全文索引
CREATE FULLTEXT INDEX ON 文章表
(標題 LANGUAGE 2052,  -- 簡體中文內容 LANGUAGE 2052
)
KEY INDEX PK__文章表__ID
ON 文章目錄
WITH CHANGE_TRACKING AUTO;-- 2. 基本全文搜索(最常用)
-- 簡單匹配
SELECT 文章ID, 標題, 作者
FROM 文章表
WHERE CONTAINS(內容, '數據庫');-- 多個關鍵詞(任意匹配)
SELECT 文章ID, 標題
FROM 文章表
WHERE CONTAINS(內容, 'SQL OR 數據庫');-- 精確短語匹配
SELECT 文章ID, 標題
FROM 文章表
WHERE CONTAINS(內容, '"SQL Server 優化"');-- 3. 高級搜索功能
-- 近似匹配
SELECT 文章ID, 標題
FROM 文章表
WHERE CONTAINS(內容, 'NEAR((數據庫, 優化), 10)');-- 通配符搜索
SELECT 文章ID, 標題
FROM 文章表
WHERE CONTAINS(內容, '"SQL*"');-- 加權搜索
SELECT 文章ID, 標題,RANK
FROM 文章表
INNER JOIN CONTAINSTABLE(文章表, (標題, 內容), '數據庫 OR 優化',LANGUAGE 2052
) AS KEY_TBL
ON 文章表.文章ID = KEY_TBL.[KEY]
ORDER BY RANK DESC;-- 4. 全文搜索最佳實踐
-- 創建復合全文索引
CREATE FULLTEXT INDEX ON 文章表
(標題 LANGUAGE 2052 STATISTICAL_SEMANTICS,內容 LANGUAGE 2052 STATISTICAL_SEMANTICS,作者 LANGUAGE 2052
)
KEY INDEX PK__文章表__ID
ON 文章目錄
WITH CHANGE_TRACKING AUTO;-- 使用停用詞
CREATE FULLTEXT STOPLIST 自定義停用詞
FROM SYSTEM STOPLIST;ALTER FULLTEXT STOPLIST 自定義停用詞
ADD '的' LANGUAGE 2052;-- 更新全文索引
ALTER FULLTEXT INDEX ON 文章表
SET STOPLIST 自定義停用詞;-- 5. 性能優化示例
-- 重建全文索引
ALTER FULLTEXT INDEX ON 文章表
START FULL POPULATION;-- 增量更新
ALTER FULLTEXT INDEX ON 文章表
START INCREMENTAL POPULATION;-- 查看索引狀態
SELECT OBJECT_NAME(object_id) AS 表名,FULLTEXTCATALOGPROPERTY('文章目錄', 'ItemCount') AS 索引文檔數,FULLTEXTCATALOGPROPERTY('文章目錄', 'PopulateStatus') AS 填充狀態
FROM sys.fulltext_indexes
WHERE object_id = OBJECT_ID('文章表');

🔍 全文檢索核心要點

  1. 基礎配置:

    • 創建全文目錄
    • 配置全文索引
    • 設置語言選項
    • 管理停用詞
  2. 搜索功能:

    • 簡單關鍵詞搜索
    • 精確短語匹配
    • 近似詞搜索
    • 加權排序結果
  3. 性能優化:

    • 合理使用索引
    • 定期重建索引
    • 增量更新策略
    • 監控索引狀態
  4. 使用建議:

    • 選擇合適的列
    • 控制索引大小
    • 優化搜索語句
    • 定期維護索引

以上就是全部內容了,如果各位大佬有任何疑問,歡迎在評論區留言,你的點贊收藏我創作的最大動力!🥰🥰🥰

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897278.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897278.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897278.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android 支持自定義布局、線程安全、避免內存泄漏的 Toast 工具類

支持自定義布局&#xff1a;可以靈活地顯示自定義樣式的 Toast。 線程安全&#xff1a;確保在主線程中顯示 Toast&#xff0c;避免崩潰。 避免內存泄漏&#xff1a;使用 ApplicationContext 和取消機制&#xff0c;防止內存泄漏問題。 工具類&#xff1a;作為一個通用的工具…

嵌入式人工智能應用-第6章 人臉檢測

嵌入式人工智能應用 人臉檢測 嵌入式人工智能應用1 人臉檢測1.1 CNN 介紹1.2 人臉檢測原理1.3 MTCNN介紹1.4 NCNN介紹2 系統安裝2.1 安裝依賴庫NCNN2.2 運行對應的庫3 總結1 人臉檢測 1.1 CNN 介紹 卷積神經網絡。卷積是什么意思呢?從數學上說,卷積是一種運算。它是我們學習…

RocketMQ提供了哪些過濾機制?

前言 本篇文章比較簡單&#xff0c;分別介紹RocketMQ支持幾種過濾機制&#xff0c;其原理和使用。 RocketMQ 提供了多種消息過濾機制&#xff0c;幫根據業務需求高效篩選消息&#xff0c;可以減少不必要的消息傳輸和處理。以下是其核心過濾機制及使用場景&#xff1a; 1. Tag…

Redis數據結構深度解析:從String到Stream的奇幻之旅(一)

Redis系列文章 《半小時掌握Redis核心操作&#xff1a;從零開始的實戰指南》-CSDN博客 Redis數據結構深度解析&#xff1a;從String到Stream的奇幻之旅&#xff08;一&#xff09;-CSDN博客 Redis數據結構深度解析&#xff1a;從String到Stream的奇幻之旅&#xff08;二&…

【Java開發指南 | 第三十五篇】Maven + Tomcat Web應用程序搭建

讀者可訂閱專欄&#xff1a;Java開發指南 |【CSDN秋說】 文章目錄 前言Maven Tomcat Web應用程序搭建1、使用Maven構建新項目2、單擊項目&#xff0c;連續按兩次shift鍵&#xff0c;輸入"添加"&#xff0c;選擇"添加框架支持"3、選擇Java Web程序4、點擊&…

機器始終是一個機器:技術本質與哲學邊界

機器始終是一個機器&#xff1a;技術本質與哲學邊界 這句話揭示了人工智能發展中的核心矛盾——無論技術如何進步&#xff0c;機器的本質仍是基于規則與數據的計算系統。這種「機器性」既是其能力的源泉&#xff0c;也是其與生命體智能不可逾越的邊界的根源。以下從技術本質、…

JAVA編程【jvm垃圾回收的差異】

jvm垃圾回收的差異 JVM&#xff08;Java Virtual Machine&#xff09;的垃圾回收&#xff08;GC&#xff09;機制是自動管理內存的一種方式&#xff0c;能夠幫助開發者釋放不再使用的內存&#xff0c;避免內存泄漏和溢出等問題。不同的垃圾回收器&#xff08;GC&#xff09;有…

親測解決筆記本觸摸板使用不了Touchpad not working

這個問題可以通過FnFxx來解決&#xff0c;筆記本鍵盤上Fxx會有一個觸摸板圖標。如果不行應該玉藻設置中關了&#xff0c;打開即可。 解決辦法 在藍牙&#xff0c;觸摸板里打開即可。 Turn it on in settings。

RAG技術深度解析:從基礎Agent到復雜推理Deep Search的架構實踐

重磅推薦專欄: 《大模型AIGC》 《課程大綱》 《知識星球》 本專欄致力于探索和討論當今最前沿的技術趨勢和應用領域,包括但不限于ChatGPT和Stable Diffusion等。我們將深入研究大型模型的開發和應用,以及與之相關的人工智能生成內容(AIGC)技術。通過深入的技術解析和實踐經…

數據結構篇——串(String)

一、引入 在計算機中的處理的數據內容大致可分為以整形、浮點型等的數值處理和字符、字符串等的非數值處理。 今天我們主要學習的就是字符串數據。本章主要圍繞“串的定義、串的類型、串的結構及其運算”來進行串介紹與學習。 二、串的定義 2.1、串的基本定義 串&#xff08;s…

【智能體架構:Agent】LangChain智能體類型ReAct、Self-ASK的區別

1. 什么是智能體 將大語言模型作為一個推理引擎。給定一個任務&#xff0c; 智能體自動生成完成任務所需步驟&#xff0c; 執行相應動作&#xff08;例如選擇并調用工具&#xff09;&#xff0c; 直到任務完成。 2. 先定義工具&#xff1a;Tools 可以是一個函數或三方 API也…

OmniParser技術分析(一)

1.引言 通過上篇文章介紹 OmniParser:下一代純視覺UI自動化測試先驅相信大家已經對OmniParser有初步了解&#xff0c;接下來詳細介紹下OmniParser使用了哪些技術模型實現了對UI純視覺的檢測和理解。 2.整體方案 通過閱讀OmniParser提供的運行Demo代碼知道&#xff0c;其實整…

設計心得——繼承和實例

一、繼承的應用場景 在上篇文章分析了繼承的應用&#xff0c;本文反過來講繼承和實例。可以理解對上文的繼承進行一下基礎知識的鋪墊&#xff0c;繼承的應用場景非常多&#xff0c;典型的應用場景包括&#xff1a; 1、單純屬性的繼承 這種繼承非常常見&#xff0c;在前面也舉過…

從連接到交互:SDN 架構下 OpenFlow 協議的流程與報文剖析

在SDN架構中&#xff0c;交換機與控制器之間的通信基于 OpenFlow協議&#xff0c;其設計目的是實現控制平面與數據平面的解耦。以下是 交換機連接控制器 和 數據包進入交換機觸發交互 的詳細流程及協議報文分析&#xff1a; 一、交換機連接控制器的流程&#xff08;初始化階段&…

opentitan riscv

OpenTitan?是一個開源的硅根信任&#xff08;Root of Trust, RoT&#xff09;項目&#xff0c;旨在使硅RoT的設計和實現更加透明、可信和安全&#xff0c;適用于企業、平臺提供商和芯片制造商。該項目由lowRISC CIC管理&#xff0c;作為一個協作項目&#xff0c;旨在生產高質量…

R語言使用scitable包交互效應深度挖掘一個陌生數據庫

很多新手剛才是總是覺得自己沒什么可以寫的&#xff0c;自己不知道選什么題材進行分析&#xff0c;使用scitable包后這個完全不用擔心&#xff0c;選題多到你只會擔心你寫不完&#xff0c;寫得不夠快。 今天演示一下使用scitable包深度挖掘一個陌生數據庫 先導入R包和數據 li…

電腦內存智能監控清理,優化性能的實用軟件

軟件介紹 Memory cleaner是一款內存清理軟件。功能很強&#xff0c;效果很不錯。 Memory cleaner會在內存用量超出80%時&#xff0c;自動執行“裁剪進程工作集”“清理系統緩存”以及“用全部可能的方法清理內存”等操作&#xff0c;以此來優化電腦性能。 同時&#xff0c;我…

C#控制臺應用程序學習——3.8

一、語言概述 1、平臺相關性 C# 主要運行在.NET 平臺上。.NET 提供了一個龐大的類庫&#xff0c;C# 程序可以方便地調用這些類庫來實現各種功能&#xff0c;如文件操作、數據庫訪問、網絡通信等。 2、語法風格 C# 的語法與 C、C 和 Java 有一定的相似性。例如&#xff0c;它使用…

鴻蒙HarmonyOS-Navagation基本用法

Navagation基本用法 Navigation組件是路由導航的根視圖容器&#xff0c;一般作為Page頁面的根容器使用&#xff0c;其內部默認包含了標題欄&#xff0c;內容欄和公工具欄&#xff0c;其中內容區默認首頁顯示導航內容&#xff08;Navigation的子組件&#xff09;或非首頁顯示&am…

初階數據結構(C語言實現)——4.1棧

目錄 1.棧1.1棧的概念及結構1.2 棧的實現1.1.0 棧的初始化1.1.1 銷毀1.1.2 入棧1.1.3 出棧1.1.4 獲取棧中有效元素個數1.1.5 檢測棧是否為空&#xff0c;如果為空返回非零結果&#xff0c;如果不為空返回01.1.6 獲取棧頂元素1.1.7 驗證 附錄 棧的C語言實現源碼.h文件.c文件test…