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';
🔑 核心要点:
-
数据库设计三要素:
- 主数据文件(.mdf):存储数据
- 日志文件(.ldf):记录事务
- 合理的初始大小和增长设置
-
表设计核心原则:
- 必须有主键(唯一标识)
- 建立合适的外键关系
- 选择合适的数据类型
- 添加必要的约束
-
最常用的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 成绩表
);
📝 查询要点:
-
SELECT语句核心组成(按执行顺序):
- FROM:指定数据来源
- WHERE:行级过滤
- GROUP BY:分组
- HAVING:组级过滤
- ORDER BY:排序
-
常用联接类型:
- INNER JOIN:内联接(最常用)
- LEFT JOIN:左外联接(保留左表所有行)
- RIGHT JOIN:右外联接(保留右表所有行)
-
常用聚合函数:
- COUNT():计数
- SUM():求和
- AVG():平均值
- MAX()/MIN():最大/最小值
-
性能优化要点:
- 只查询需要的列
- 合理使用索引
- 避免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';
🚀 性能优化核心要点:
-
索引使用原则:
- 经常查询的列建立索引
- 外键列必建索引
- 避免对频繁更新的列建索引
- 选择性高的列适合建索引
-
最重要的优化技巧:
- 使用覆盖索引避免回表
- 避免索引列上使用函数
- 避免隐式类型转换
- 合理使用索引提示
-
常见性能问题:
- 索引碎片化:定期重建或重组
- 统计信息过期:更新统计信息
- 参数嗅探:使用OPTIMIZE FOR
- 死锁:合理的事务处理
-
性能监控工具:
- 执行计划
- 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 版本号 = @原版本号; -- 确保数据未被其他事务修改
🔒 事务管理核心要点:
-
事务ACID特性:
- 原子性:要么全做要么全不做
- 一致性:保持数据完整
- 隔离性:事务间互不干扰
- 持久性:提交后永久保存
-
最常用的隔离级别:
- READ COMMITTED(默认):防止脏读
- REPEATABLE READ:防止不可重复读
- SERIALIZABLE:最高隔离级别
- READ UNCOMMITTED:性能最好但不安全
-
并发控制策略:
- 悲观锁:适用于高并发更新
- 乐观锁:适用于读多写少
- 行级锁:粒度小,并发高
- 表级锁:粒度大,阻塞多
-
实践建议:
- 事务尽可能短小
- 合理设置隔离级别
- 避免长时间持有锁
- 正确的错误处理
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';
💾 备份恢复核心要点:
-
三种主要备份类型:
- 完整备份:整个数据库的完整副本
- 差异备份:自上次完整备份后的变化
- 日志备份:记录详细的事务日志
-
常用备份策略(最佳实践):
- 每周一次完整备份
- 每天一次差异备份
- 每小时一次日志备份
- 定期验证备份有效性
-
关键恢复场景:
- 系统崩溃:使用最新的一致备份
- 数据误删:使用时间点恢复
- 硬件故障:完整恢复流程
- 测试环境:快速还原生产数据
-
备份管理要点:
- 异地存储重要备份
- 定期清理过期备份
- 监控备份执行状态
- 测试恢复流程
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 = '教师登录';
🔐 安全管理核心要点:
-
访问控制基础:
- 最小权限原则
- 基于角色的授权
- 定期审查权限
- 密码策略管理
-
数据加密策略:
- 敏感数据加密存储
- 传输数据加密
- 密钥定期轮换
- 证书安全管理
-
审计要点:
- 重要操作必须审计
- 定期检查审计日志
- 异常行为告警
- 审计日志安全存储
-
安全维护:
- 定期安全评估
- 及时安装补丁
- 监控可疑活动
- 制定应急预案
二、高级特性
让我们学习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.学号;
📦 存储过程和函数要点:
-
存储过程优势:
- 减少网络流量
- 重用业务逻辑
- 提高执行效率
- 增强安全性
-
函数使用场景:
- 复杂计算封装
- 数据转换处理
- 业务规则统一
- 代码重用
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;
🔄 触发器使用要点:
-
常用场景:
- 数据审计跟踪
- 业务规则验证
- 数据同步更新
- 自动计算汇总
-
设计原则:
- 触发器要简单
- 避免长事务
- 注意性能影响
- 合理使用事务
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);
👁️ 视图使用要点:
-
视图的优势:
- 简化复杂查询
- 控制数据访问
- 提供数据独立性
- 实现数据安全
-
常用视图类型:
- 基础视图:简化查询
- 索引视图:提升性能
- 分区视图:管理大数据
- 更新视图:维护数据
-
设计原则:
- 避免过于复杂的视图
- 合理使用索引视图
- 注意更新限制
- 控制视图嵌套层数
-
性能考虑:
- 适当使用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) '$');
📊 结构化数据处理要点:
-
XML使用场景:
- 数据交换接口
- 配置文件存储
- 复杂数据结构
- 遗留系统集成
-
JSON优势:
- 更轻量级的格式
- 更好的可读性
- 前后端数据传输
- 现代API集成
-
性能考虑:
- 适当使用XML索引
- JSON数据类型验证
- 避免过大的文档
- 合理的查询方式
-
最佳实践:
- 选择合适的格式
- 规范的数据结构
- 有效的错误处理
- 定期数据维护
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('文章表');
🔍 全文检索核心要点:
-
基础配置:
- 创建全文目录
- 配置全文索引
- 设置语言选项
- 管理停用词
-
搜索功能:
- 简单关键词搜索
- 精确短语匹配
- 近似词搜索
- 加权排序结果
-
性能优化:
- 合理使用索引
- 定期重建索引
- 增量更新策略
- 监控索引状态
-
使用建议:
- 选择合适的列
- 控制索引大小
- 优化搜索语句
- 定期维护索引
以上就是全部内容了,如果各位大佬有任何疑问,欢迎在评论区留言,你的点赞收藏我创作的最大动力!🥰🥰🥰
相关文章:
SQL Server核心知识总结
SQL Server核心知识总结 🎯 本文总结了SQL Server核心知识点,每个主题都提供实际可运行的示例代码。 一、SQL Server基础精要 1. 数据库核心操作 -- 1. 创建数据库(核心配置) CREATE DATABASE 学生管理系统 ON PRIMARY (NAME 学生管理系统…...
浏览器WEB播放RTSP
注意:浏览器不能直接播放RTSP,必须转换后才能播放。这一点所有的播放都是如此。 参考 https://github.com/kyriesent/node-rtsp-stream GitHub - phoboslab/jsmpeg: MPEG1 Video Decoder in JavaScript 相关文件方便下载 https://download.csdn.net…...
登录固定账号和密码:
接口文档 【apifox】面试宝典 个人中心-保存用户数据信息 - 教学练测项目-面试宝典-鸿蒙 登录固定账号和密码: 账号:hmheima 密码:Hmheima%123 UI设计稿 【腾讯 CoDesign】面试宝典 CoDesign - 腾讯自研设计协作平台 访问密码࿱…...
深度学习/强化学习调参技巧
深度调优策略 1. 学习率调整 技巧:学习率是最重要的超参数之一。过大可能导致训练不稳定,过小则收敛速度慢。可以使用学习率衰减(Learning Rate Decay)或自适应学习率方法(如Adam、RMSprop)来动态调整学习…...
Java常用正则表达式(身份证号、邮箱、手机号)格式校验
目录 身份证号的正则表达式 代码解释 正则表达式 方法 isValidIDCard 注意事项 校验邮箱的正则表达式 代码解释 正则表达式 方法 isValidEmail 注意事项 手机号的正则表达式 中国大陆手机号校验(支持空字符串) 代码解释 通用手机号校验&am…...
1.12.信息系统的分类【ES】
专家系统(ES)技术架构深度解析 一、ES核心定义 🧠 智能决策中枢 由三大核心能力构建的领域专家模拟系统: 存储专家级领域知识(10^4规则量级)支持不确定性推理(置信度>85%)动态…...
c语言程序设计--(结构体、共用体)冲刺考研复试中的面试问答,来看看我是怎么回答的吧!
结构体 1、谈谈你对结构体的理解。 答,首先在结构的基础知识上,结构是一些值的集合,这些值称为成员变量结构的每个成员可以是不同类型的变量。结构体其实就是把(一些单一类型的数据)不同类型的数据组合在一起的做法便…...
闭包:JavaScript 中的隐形大杀器
你可能已经在很多地方听说过闭包这个词,尤其是涉及到 JavaScript 的作用域和异步操作时。闭包是 JavaScript 中非常核心的概念,然而它又非常容易让开发者感到困惑。今天我们就来深入剖析闭包,帮助你真正理解它的工作原理,以及如何…...
分布式锁—7.Curator的分布式锁一
大纲 1.Curator的可重入锁的源码 2.Curator的非可重入锁的源码 3.Curator的可重入读写锁的源码 4.Curator的MultiLock源码 5.Curator的Semaphore源码 1.Curator的可重入锁的源码 (1)InterProcessMutex获取分布式锁 (2)InterProcessMutex的初始化 (3)InterProcessMutex.…...
linux---天气爬虫
代码概述 这段代码实现了一个天气查询系统,支持实时天气、未来天气和历史天气查询。用户可以通过终端菜单选择查询类型,并输入城市名称来获取相应的天气信息。程序通过 TCP 连接发送 HTTP 请求,并解析返回的 JSON 数据来展示天气信息。 #in…...
C++蓝桥杯基础篇(九)
片头 嗨!小伙伴们,大家好~ 今天我们将学习蓝桥杯基础篇(十),学习函数相关知识,准备好了吗?咱们开始咯! 一、函数基础 一个典型的函数定义包括以下部分:返回类型、函数名…...
Java Spring MVC (2)
常见的Request Controller 和 Response Controller 的区别 用餐厅点餐来理解 想象你去一家餐厅吃饭: Request Controller(接单员):负责处理你的点餐请求,记录你的口味、桌号等信息。Response Controller(…...
Elasticsearch:使用 BigQuery 提取数据
作者:来自 Elastic Jeffrey Rengifo 了解如何使用 Python 在 Elasticsearch 中索引和搜索 Google BigQuery 数据。 BigQuery 是 Google 的一个平台,允许你将来自不同来源和服务的数据集中到一个存储库中。它还支持数据分析,并可使用生成式 AI…...
接口-菜品分页查询
业务内容 页面上菜品根据菜品名称、菜品分类、售卖状态三个字段进行分页查询。 在请求参数中携带了菜品名称、菜品分类、售卖状态三个字段参数。 返回PageResult类型的实体。 注意:在返回数据中在records下有个categoryName,这个字段的内容在category…...
springboot3 RestClient、HTTP 客户端区别
1 RestClient使用 RestClient 是 Spring 6.1 M2 中引入的同步 HTTP 客户端,它取代了 RestTemplate。同步 HTTP 客户端以阻塞方式发送和接收 HTTP 请求和响应,这意味着它会等待每个请求完成后才继续下一个请求。本文将带你了解 RestClient 的功能以及它与…...
自我训练模型:通往未来的必经之路?
摘要 在探讨是否唯有通过自我训练模型才能掌握未来的问题时,文章强调了底层技术的重要性。当前,许多人倾向于关注应用层的便捷性,却忽视了支撑这一切的根本——底层技术。将模型简单视为产品是一种短视行为,长远来看,理…...
RuoYi框架添加自己的模块(学生管理系统CRUD)
RuoYi框架添加自己的模块(学生管理系统) 框架顺利运行 首先肯定要顺利运行框架了,这个我不多说了 设计数据库表 在ry数据库中添加表tb_student 表字段如图所示 如图所示 注意id字段是自增的 注释部分是后面成功后前端要展示的部分 导入…...
linux查看python版本
1.查看Linux是否安装python yum list all | grep python 2.Linux安装python yum install python 3.Linux查看python版本 python -V...
算法题(89):单项链表
审题: 本题需要我们实现一个可以执行三个指令的数据结构来解决这里的问题 思路: 方法一:利用数组模拟链表 由于这里涉及插入删除操作,所以我们不能使用数组结构存储数据,这样子会超时,所以我们就利用数组来…...
开源之夏经验分享|Koupleless 社区黄兴抗:在开源中培养工程思维
开源之夏经验分享|Koupleless 社区黄兴抗:在开源中培养工程思维 文|黄兴抗 电子信息工程专业 Koupleless 社区贡献者 就读于南昌师范学院,电子信息工程专业的大三学生。 本文 2634 字,预计阅读 7 分钟 今天 SOFAStack 邀…...
体验开源openeuler openharmony stratovirt模拟器
文档 openeuler社区面向数字基础设施的开源操作系统 openharmony社区 OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目, 目标是面向全场景、全连接、全智能时代、基于开源的方式,搭建一个智能终端设备操作系统…...
【AI实践】基于TensorFlow/Keras的CNN(卷积神经网络)简单实现:手写数字识别的工程实践
深度神经网络系列文章 【AI深度学习网络】卷积神经网络(CNN)入门指南:从生物启发的原理到现代架构演进【AI实践】基于TensorFlow/Keras的CNN(卷积神经网络)简单实现:手写数字识别的工程实践 引言 在深度…...
深入探讨AI-Ops架构 第一讲 - 运维的进化历程以及未来发展趋势
首先,让我们一起回顾运维的进化之路,然后再深入探讨AI-Ops架构的细节。 运维的进化历程 1. AI 大范围普及前的运维状态 (传统运维) 在AI技术尚未广泛渗透到运维领域之前,我们称之为传统运维,其主要特点是: 人工驱动…...
2025年全球生成式AI消费应用发展趋势报告
原文链接:The Top 100 Gen AI Consumer Apps - 4th Edition | Andreessen Horowitz 核心要点:本报告由a16z发布,深度解析了2025年全球生成式AI消费应用的发展格局,揭示了技术迭代与商业化加速的双重趋势。 报告显示,A…...
VBA 列方向合并单元格,左侧范围大于右侧范围
实现功能如下: excel指定行列范围内的所有单元格 规则1:每一列的连续相同的值合并单元格 规则2:每一列的第一个非空单元格与其下方的所有空白单元格合并单元 规则3:优先左侧列合并单元格,合并后,右侧的单元…...
设计AI芯片架构的入门 研究生入行数字芯片设计、验证的项目 opentitan
前言 这几年芯片设计行业在国内像坐过山车。时而高亢,时而低潮。最近又因为AI的热潮开始high起来。到底芯片行业的规律是如何? 我谈谈自己观点:芯片设计是“劳动密集型”行业。 “EDA和工具高度标准化和代工厂的工艺标准化之后,芯…...
【弹性计算】异构计算云服务和 AI 加速器(二):适用场景
异构计算云服务和 AI 加速器(二):适用场景 1.图形处理2.视频处理3.计算4.人工智能 异构计算 目前已经被广泛地应用于生产和生活当中,主要应用场景如下图所示。 1.图形处理 GPU 云服务器在传统的图形处理领域具有强大的优势&…...
JVM常用概念之移动GC和局部性
问题 非移动GC一定比移动GC好吗? 基础知识 移动GC和非移动GC 移动GC 在进行垃圾回收时,为了减少碎片而移动对象来顺利完成垃圾回收的GC。 Serial GC 在单线程环境下,它在标记-清除(Mark-Sweep)算法的基础上进行…...
微服务保护:Sentinel
home | Sentinelhttps://sentinelguard.io/zh-cn/ 微服务保护的方案有很多,比如: 请求限流 线程隔离 服务熔断 服务故障最重要原因,就是并发太高!解决了这个问题,就能避免大部分故障。当然,接口的并发…...
使用Wireshark截取并解密摄像头画面
在物联网(IoT)设备普及的今天,安全摄像头等智能设备在追求便捷的同时,往往忽视了数据传输过程中的加密保护。很多摄像头默认通过 HTTP 协议传输数据,而非加密的 HTTPS,从而给潜在攻击者留下了可乘之机。本文…...
IDEA 基础配置: maven配置 | 服务窗口配置
文章目录 IDEA版本与MAVEN版本对应关系maven配置镜像源插件idea打开服务工具窗口IDEA中的一些常见问题及其解决方案IDEA版本与MAVEN版本对应关系 查找发布时间在IDEA版本之前的dea2021可以使用maven3.8以及以前的版本 比如我是idea2021.2.2 ,需要将 maven 退到 apache-maven-3.…...
20250-3-8 树的存储结构
一、树的逻辑结构回顾 树:一个分支结点可以有多课子树 如果按照二叉树的存储来实现树的存储,则只依靠数组下标,无法反映结点之间的逻辑关系。 二、双亲表示法(顺序存储) 1.因此:我们可以用链式存储的方法&…...
Visual-RFT视觉强化微调:用「试错学习」教会AI看图说话
📜 文献卡 英文题目: Visual-RFT: Visual Reinforcement Fine-Tuning;作者: Ziyu Liu; Zeyi Sun; Yuhang Zang; Xiaoyi Dong; Yuhang Cao; Haodong Duan; Dahua Lin; Jiaqi WangDOI: 10.48550/arXiv.2503.01785摘要翻译: 像OpenAI o1这样的大型推理模型中的强化微调…...
PDF处理控件Aspose.PDF,如何实现企业级PDF处理
PDF处理为何成为开发者的“隐形雷区”? “手动调整200页PDF目录耗时3天,扫描件文字识别错误导致数据混乱,跨平台渲染格式崩坏引发客户投诉……” 作为开发者,你是否也在为PDF处理的复杂细节消耗大量精力?Aspose.PDF凭…...
DeepSeek-R1本地化部署(Mac)
一、下载 Ollama 本地化部署需要用到 Ollama,它能支持很多大模型。官方网站:https://ollama.com/ 点击 Download 即可,支持macOS,Linux 和 Windows;我下载的是 mac 版本,要求macOS 11 Big Sur or later,Ol…...
Swift Package Manager (SPM) 创建并集成本地库
在macOS 项目中,使用 Swift Package Manager (SPM) 创建并集成本地库的完整步骤。 创建一个macos应用程序,选择 swift、oc、swiftui都可以。 创建好应用之后,开始创建SPM本地库。 打开终端app,进入项目根目录,逐次输…...
分布式锁—6.Redisson的同步器组件
大纲 1.Redisson的分布式锁简单总结 2.Redisson的Semaphore简介 3.Redisson的Semaphore源码剖析 4.Redisson的CountDownLatch简介 5.Redisson的CountDownLatch源码剖析 1.Redisson的分布式锁简单总结 (1)可重入锁RedissonLock (2)公平锁RedissonFairLock (3)联锁MultiL…...
文献分享: ConstBERT固定数目向量编码文档
😂图放这了,大道至简的 idea \text{idea} idea不愧是 ECIR \text{ECIR} ECIR 👉原论文 1. ConstBERT \textbf{1. ConstBERT} 1. ConstBERT的原理 1️⃣模型的改进点:相较于 ColBERT \text{ColBERT} ColBERT为每个 Token \text{Tok…...
如何使用SSH命令安全连接并转发端口到远程服务器
ssh -p 22546 rootconnect.westc.gpuhub.com d6IS/mQKq/iG ssh -CNgv -L 6006:127.0.0.1:6006 rootconnect.westc.gpuhub.com -p 22546 第一条命令:用于登录远程服务器,进行交互式操作。第二条命令:用于建立 SSH 隧道,进行端口转…...
SolidWorks 转 PDF3D 技术详解
在现代工程设计与制造流程中,不同软件间的数据交互与格式转换至关重要。将 SolidWorks 模型转换为 PDF3D 格式,能有效解决模型展示、数据共享以及跨平台协作等问题。本文将深入探讨 SolidWorks 转 PDF3D 的技术原理、操作流程及相关注意事项,…...
9.2 EvictionManager源码解读
本节重点总结 : evictionManager初始化了两个相同的manager对象 evictionManager做本机驱逐pod的判定和厨房evictionAdmitHandler用来kubelet创建Pod前进依据本机的资源压力进行准入检查 evictionManager判断内存驱逐阈值有两种方法 第一种使用内核的memcg的通知机制ÿ…...
考研数一非数竞赛复习之Stolz定理求解数列极限
在非数类大学生数学竞赛中,Stolz定理作为一种强大的工具,经常被用来解决和式数列极限的问题,也被誉为离散版的’洛必达’方法,它提供了一种简洁而有效的方法,使得原本复杂繁琐的极限计算过程变得直观明了。本文&#x…...
整理一下高级设施农业栽培学这门课程的所有知识点
整理一下高级设施农业栽培学这门课程的所有知识点 以下是高级设施农业栽培学这门课程从入门到精通需要学习的知识点: 一、设施农业概述 设施农业的概念与发展历程 了解设施农业的定义、特点及作用,掌握其发展历程、现状与未来趋势。熟悉国内外设施农业…...
2025最新软件测试面试八股文(含答案+文档)
1、请试着比较一下黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的区别与联系。 参考答案: 黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。 白盒测试:已知产品的内部工作过程…...
系统架构设计师—系统架构设计篇—基于体系结构的软件开发方法
文章目录 概述基于体系结构的开发模型-ABSDM体系结构需求体系结构设计体系结构文档化体系结构复审体系结构实现体系结构演化 概述 基于体系结构(架构)的软件设计(Architecture-Based Software Design,ABSD)方法。 AB…...
求最大公约数【C/C++】
大家好啊,欢迎来到本博客( •̀ ω •́ )✧,我将带领大家详细的了解最大公约数的思想与解法。 一、什么是公约数 公约数,也称为公因数,是指两个或多个整数共有的因数。具体来说,如果一个整数能被两个或多个整数整除&…...
Transformer 代码剖析16 - BLEU分数(pytorch实现)
一、BLEU算法全景图 #mermaid-svg-uwjb5mQ2KAC6Rqbp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-uwjb5mQ2KAC6Rqbp .error-icon{fill:#552222;}#mermaid-svg-uwjb5mQ2KAC6Rqbp .error-text{fill:#552222;stroke:…...
手机屏幕摔不显示了,如何用其他屏幕临时显示,用来导出资料或者清理手机
首先准备一个拓展坞 然后 插入一个外接的U盘 插入鼠标 插入有数字小键盘区的键盘 然后准备一根高清线,一端链接电脑显示器,一端插入拓展坞 把拓展坞的连接线,插入手机充电口(可能会需要转接头) 然后确保手机开机 按下键盘…...
labelimg标注的xml标签转换为yolo格式标签
本文不生产技术,只做技术的搬运工!!! 前言 在yolo训练时,我们需要对图像进行标注,而使用labelimg标注时如果直接选择输出yolo格式的数据集,则原始数据的很多信息无法被保存,因此一版…...
Linux云计算SRE-第十七周
1. 做三个节点的redis集群。 1、编辑redis节点node0(10.0.0.100)、node1(10.0.0.110)、node2(10.0.0.120)的安装脚本 [rootnode0 ~]# vim install_redis.sh#!/bin/bash # 指定脚本解释器为bashREDIS_VERSIONredis-7.2.7 # 定义Redis的版本号PASSWORD123456 # 设置Redis的访问…...