当前位置: 首页 > article >正文

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. 使用建议:

    • 选择合适的列
    • 控制索引大小
    • 优化搜索语句
    • 定期维护索引

以上就是全部内容了,如果各位大佬有任何疑问,欢迎在评论区留言,你的点赞收藏我创作的最大动力!🥰🥰🥰

相关文章:

SQL Server核心知识总结

SQL Server核心知识总结 &#x1f3af; 本文总结了SQL Server核心知识点,每个主题都提供实际可运行的示例代码。 一、SQL Server基础精要 1. 数据库核心操作 -- 1. 创建数据库&#xff08;核心配置&#xff09; CREATE DATABASE 学生管理系统 ON PRIMARY (NAME 学生管理系统…...

基于RNN+微信小程序+Flask的古诗词生成应用

项目介绍 平台采用B/S结构&#xff0c;后端采用主流的Flask框架进行开发&#xff0c;古诗词生成采用RNN模型进行生成&#xff0c;客户端基于微信小程序开发。是集成了Web后台开发、微信小程序开发、人工智能&#xff08;RNN&#xff09;等多个领域的综合性应用&#xff0c;是课…...

基于单片机的智慧农业大棚系统(论文+源码)

1系统整体设计 经过上述的方案分析&#xff0c;采用STM32单片机为核心&#xff0c;结合串口通信模块&#xff0c;温湿度传感器&#xff0c;光照传感器&#xff0c;土壤湿度传感器&#xff0c;LED灯等硬件设备来构成整个控制系统。系统可以实现环境的温湿度检测&#xff0c;土壤…...

【AGI】智谱开源2025:一场AI技术民主化的革命正在到来

智谱开源2025&#xff1a;一场AI技术民主化的革命正在到来 引言&#xff1a;开源&#xff0c;一场技术平权的革命一、CogView4&#xff1a;中文AI生成的里程碑1. 破解汉字生成的“AI魔咒”2. 开源协议与生态赋能 二、AutoGLM&#xff1a;人机交互的范式跃迁1. 自然语言驱动的跨…...

2025-03-08 学习记录--C/C++-PTA 习题8-9 分类统计各类字符个数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 二、代码&#xff08;C语言&#xff09;⭐️ #include <stdio.h> #define MAXS 15void StringCount( …...

yolov8改进|MobileNetV4替换Backbone,轻量化!!

yolov8改进|MobileNetV4替换Backbone,轻量化!! 一级目录二级目录三级目录MobileNetV4简介论文地址核心代码将核心代码放入`ultralytics/nn/modules`中,新建MobileNetV4.py修改`tasks.py``ultralytics/utils/torch_utils.py`中yaml文件一级目录 二级目录 三级目录 各位哥哥…...

OTP单片机调试工具

大部分的OTP单片机开发流程是先用仿真器进行仿真&#xff0c;f仿真完成之后再烧录OTP单片机芯片进行验证&#xff0c;但是很多少时候会发现有一个问题&#xff0c;仿真器仿真都是OK的&#xff0c;但是一旦焊接在板上了&#xff0c;就往往发现有问题&#xff0c;因为硬件条件变化…...

二次SQL注入

原理 用户向数据库存入恶意数据&#xff0c;当数据被送进数据库的时候&#xff0c;会对存入的信息进行转义然后再储存&#xff0c;但是存进去的数据会再次被转义回来&#xff08;也就是原样不变的存进数据库里&#xff0c;只是害怕攻击者在存入数据的时候捣蛋而已&#xff09;…...

机器学习:愚者未完成的诗篇(零)

当算法在数据海洋中打捞支离破碎的韵律时&#xff0c;机器学习系统展现出的智慧如同断臂的维纳斯雕像——完美与残缺构成令人战栗的美学悖论。愚者&#xff0c;在词语的混沌中编织逻辑经纬&#xff0c;却总在即将触及诗性本质的瞬间&#xff0c;暴露出认知维度的致命裂隙。 一…...

论文阅读-秦汉时期北方边疆组织的空间互动模式与直道的定位(中国)

论文英文题目&#xff1a;A spatial interaction model of Qin-Han Dynasty organisation on the northern frontier and the location of the Zhidao highway (China) 发表于&#xff1a;journal of archaeological science&#xff0c;影响因子&#xff1a;3.030 论文主要是…...

【贪心算法】将数组和减半的最小操作数

1.题目解析 2208. 将数组和减半的最少操作次数 - 力扣&#xff08;LeetCode&#xff09; 2.讲解算法原理 使用当前数组中最大的数将它减半&#xff0c;&#xff0c;直到数组和减小到一半为止&#xff0c;从而快速达到目的 重点是找到最大数&#xff0c;可以采用大根堆快速达到…...

Dify部署踩坑指南(Windows+Mac)

组件说明 Dify踩坑及解决方案 ⚠️ 除了修改镜像版本&#xff0c;nginx端口不要直接修改docker-compose.yaml &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 1、更换镜像版本 这个文件是由.env自动生成的&#xff0c;在.env配置 …...

无人机端部署 AI 模型,实现实时数据处理和决策

在无人机端部署 AI 模型&#xff0c;实现实时数据处理和决策&#xff0c;是提升无人机智能化水平的关键技术之一。通过将 AI 模型部署到无人机上&#xff0c;可以实现实时目标检测、路径规划、避障等功能。以下是实现这一目标的详细方案和代码示例。 一、实现方案 1. 硬件选择…...

你为什么要写博客?

契机&#xff1a;最近CSDN系统给我发了一条私信&#xff0c;说我成为博主已经四年了&#xff0c;写一篇博客纪念可以得一枚纪念勋章&#xff0c;遂有此文。 机缘 最开始的这篇博客&#xff0c;是为了公司内部的一次分享会准备的&#xff0c;完全是YY出来的&#xff0c;现在看…...

【VUE2】第三期——样式冲突、组件通信、异步更新、自定义指令、插槽

目录 1 scoped解决样式冲突 2 data写法 3 组件通信 3.1 父子关系 3.1.1 父向子传值 props 3.1.2 子向父传值 $emit 3.2 非父子关系 3.2.1 event bus 事件总线 3.2.2 跨层级共享数据 provide&inject 4 props 4.1 介绍 4.2 props校验完整写法 5 v-model原理 …...

P8685 [蓝桥杯 2019 省 A] 外卖店优先级--优先队列“数组”!!!!!

P8685 [蓝桥杯 2019 省 A] 外卖店优先级 题目 解析优先队列如何判断是否使用优先队列&#xff1f;省略规则优先队列常用操作大顶堆 vs 小顶堆定义队列h队列数组 代码 题目 解析 每个外卖店会在不同的时间点收到订单&#xff0c;我们可以看见测试用例的时间顺序是不同的&#x…...

VsCode + EIDE + OpenOCD + STM32(野火DAP) 开发环境配置

VsCode EIDE OpenOCD STM32(野火DAP) 开发环境配置 接受了新时代编辑器的我&#xff0c;实在受不了Keil的上古编辑页面&#xff0c;周树人说过&#xff1a;由奢入俭难&#xff0c;下面我们一起折腾一下开源软件Vscode&#xff0c; 用以开发51和STM32&#xff0c;有错误之处&…...

JVM类加载器面试题及原理

JVM只会运行二进制文件&#xff0c;类加载器的作用就是将字节码文件加载到JVM中&#xff0c;从而让Java程序能够启动起来。 1. 类加载器的种类 启动类加载器&#xff08;BootStrap ClassLoader&#xff09;&#xff1a;加载JAVA_HOME/jre/lib目录下的库扩展类加载器&#xff…...

在 Maven 中使用 <scope> 元素:全面指南

目录 前言 在 Maven 中&#xff0c; 元素用于定义依赖项的作用范围&#xff0c;即依赖项在项目生命周期中的使用方式。正确使用 可以帮助我们优化项目的构建过程&#xff0c;减少不必要的依赖冲突&#xff0c;并提高构建效率。本文将详细介绍 的使用步骤、常见作用范围、代码…...

tomcat的安装与配置(包含在idea中配置tomcat)

Tomcat 是由 Apache 软件基金会开发的开源 Java Web 应用服务器&#xff0c;主要用于运行 Servlet 和 JSP&#xff08;JavaServer Pages&#xff09;程序。它属于轻量级应用服务器&#xff0c;适用于中小型系统及开发调试场景&#xff0c;尤其在处理动态内容&#xff08;如 Jav…...

问题解决:AttributeError: ‘NoneType‘ object has no attribute ‘text‘

项目环境&#xff1a; 我的环境&#xff1a;Window10&#xff0c;Python3.12&#xff0c;Anaconda3&#xff0c;Pycharm2024.3.4 问题描述&#xff1a; 找不到’text’这个对象 部分代码&#xff1a; Traceback (most recent call last):File "D:\IT DateFiles\PyDate\FQ…...

量子计算测试挑战:软件测试将如何迎接新纪元?

引言 在计算机技术的飞速发展中&#xff0c;量子计算(Quantum Computing)正成为下一个颠覆性的科技热点。随着谷歌、IBM、微软等科技巨头纷纷投入巨资研究量子计算&#xff0c;其应用场景正逐步扩展&#xff0c;从优化计算到密码安全&#xff0c;再到人工智能和材料科学。然而…...

读书报告」网络安全防御实战--蓝军武器库

一眨眼&#xff0c;20天过去了&#xff0c;刷完了这本书「网络安全防御实战--蓝军武器库」&#xff0c;回味无穷&#xff0c;整理概览如下&#xff0c;可共同交流读书心得。在阅读本书的过程中&#xff0c;我深刻感受到网络安全防御是一个综合性、复杂性极高的领域。蓝军需要掌…...

《机器学习数学基础》补充资料:过渡矩阵和坐标变换推导

尽管《机器学习数学基础》这本书&#xff0c;耗费了比较长的时间和精力&#xff0c;怎奈学识有限&#xff0c;错误难免。因此&#xff0c;除了在专门的网页&#xff08; 勘误和修订 &#xff09;中发布勘误和修订内容之外&#xff0c;对于重大错误&#xff0c;我还会以专题的形…...

深度学习与普通神经网络有何区别?

深度学习与普通神经网络的主要区别体现在以下几个方面&#xff1a; 一、结构复杂度 普通神经网络&#xff1a;通常指浅层结构&#xff0c;层数较少&#xff0c;一般为2-3层&#xff0c;包括输入层、一个或多个隐藏层、输出层。深度学习&#xff1a;强调通过5层以上的深度架构…...

Flutter底层实现

1. Dart 语言 Dart 是 Flutter 的主要编程语言。Dart 设计之初就是为了与 JavaScript 兼容&#xff0c;并且可以编译为机器代码运行。Dart 提供了一些特性&#xff0c;如异步支持&#xff08;通过 async 和 await&#xff09;&#xff0c;这使得编写高效的网络请求和复杂动画变…...

【芯片验证】verificationguide上的36道UVM面试题

跟上一篇一样,verificationguide上的36到UVM面试题,通义回答ds判卷。 1. What is uvm_transaction, uvm_seq_item, uvm_object, uvm_component? uvm_transaction、uvm_seq_item、uvm_object、uvm_component是什么? uvm_transaction是UVM中所有事务的基础类,用于表示仿真…...

AI日报 - 2025年3月10日

AI日报 - 2025年3月10日 &#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | Anthropic CEO预测强AI最早2026年到来 &#x1f52c; SAGE框架提升问答质量61.25%&#xff0c;Reflexion框架将GPT-4成功率提至91% ▎&#x1f4bc; 商业动向 | xA…...

基于深度文档理解的开源 RAG 引擎RAGFlow的介绍和安装

目录 前言1. RAGFlow 简介1.1 什么是 RAGFlow&#xff1f;1.2 RAGFlow 的核心特点 2. RAGFlow 的安装与配置2.1 硬件与软件要求2.2 下载 RAGFlow 源码2.3 源码编译 Docker 镜像2.4 设置完整版&#xff08;包含 embedding 模型&#xff09;2.5 运行 RAGFlow 3. RAGFlow 的应用场…...

TinyWebServer项目笔记——02 半同步半反应堆线程池

目录 1.基础知识 &#xff08;1&#xff09;服务器编程基本框架 &#xff08;2&#xff09;五种I/O模型 &#xff08;3&#xff09;事件处理模式 &#xff08;4&#xff09;并发编程模式 &#xff08;5&#xff09;半同步/半反应堆 &#xff08;6&#xff09;线程池 &a…...