上一篇
2025年8月最新消息:微软近期宣布SQL Server 2025将引入更强大的AI查询优化功能,预计将使复杂查询性能提升40%,虽然新版本即将发布,但基础SQL操作语句仍然是每位数据库从业者的核心技能。
-- 创建新数据库 CREATE DATABASE 客户管理系统 ON PRIMARY ( NAME = '客户管理系统_Data', FILENAME = 'C:\Data\客户管理系统.mdf', SIZE = 100MB, MAXSIZE = UNLIMITED, FILEGROWTH = 10% ) LOG ON ( NAME = '客户管理系统_Log', FILENAME = 'C:\Data\客户管理系统.ldf', SIZE = 50MB, MAXSIZE = 2GB, FILEGROWTH = 5MB ); -- 修改数据库 ALTER DATABASE 客户管理系统 MODIFY FILE (NAME = '客户管理系统_Data', SIZE = 200MB); -- 删除数据库(慎用) DROP DATABASE 客户管理系统;
-- 创建表 CREATE TABLE 客户信息 ( 客户ID INT PRIMARY KEY IDENTITY(1,1), 姓名 NVARCHAR(50) NOT NULL, 电话 VARCHAR(20), 邮箱 VARCHAR(100) CHECK(邮箱 LIKE '%@%.%'), 注册日期 DATETIME DEFAULT GETDATE(), 信用等级 INT DEFAULT 1 ); -- 添加列 ALTER TABLE 客户信息 ADD 最后购买日期 DATETIME; -- 修改列 ALTER TABLE 客户信息 ALTER COLUMN 电话 VARCHAR(30); -- 删除列 ALTER TABLE 客户信息 DROP COLUMN 信用等级;
-- 插入数据 INSERT INTO 客户信息(姓名, 电话, 邮箱) VALUES ('张三', '13800138000', 'zhangsan@example.com'), ('李四', '13900139000', 'lisi@example.com'); -- 批量插入(从其他表) INSERT INTO 客户信息(姓名, 电话) SELECT 员工姓名, 联系电话 FROM 员工表 WHERE 部门='销售部'; -- 更新数据 UPDATE 客户信息 SET 电话 = '13800138888', 最后购买日期 = GETDATE() WHERE 客户ID = 1; -- 删除数据 DELETE FROM 客户信息 WHERE 最后购买日期 < DATEADD(YEAR, -1, GETDATE()); -- 查询基础 SELECT 客户ID, 姓名, 电话, 邮箱 FROM 客户信息 WHERE 注册日期 > '2025-01-01' ORDER BY 注册日期 DESC;
-- 分页查询(2025语法) SELECT 客户ID, 姓名, 电话 FROM 客户信息 ORDER BY 客户ID OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY; -- 条件查询 SELECT 客户ID, 姓名, 电话, CASE WHEN 注册日期 > DATEADD(MONTH, -3, GETDATE()) THEN '新客户' WHEN 最后购买日期 IS NULL THEN '潜在客户' ELSE '老客户' END AS 客户类型 FROM 客户信息; -- 模糊查询 SELECT * FROM 客户信息 WHERE 姓名 LIKE '张%' OR 邮箱 LIKE '%gmail.com';
-- 创建存储过程 CREATE PROCEDURE 获取客户购买记录 @客户ID INT, @开始日期 DATE = NULL, @结束日期 DATE = NULL AS BEGIN SET NOCOUNT ON; IF @开始日期 IS NULL SET @开始日期 = DATEADD(MONTH, -3, GETDATE()); IF @结束日期 IS NULL SET @结束日期 = GETDATE(); SELECT o.订单ID, o.订单日期, SUM(od.数量 * od.单价) AS 订单金额 FROM 订单 o JOIN 订单明细 od ON o.订单ID = od.订单ID WHERE o.客户ID = @客户ID AND o.订单日期 BETWEEN @开始日期 AND @结束日期 GROUP BY o.订单ID, o.订单日期 ORDER BY o.订单日期 DESC; END; -- 调用存储过程 EXEC 获取客户购买记录 @客户ID = 123, @开始日期 = '2025-01-01';
-- 创建索引 CREATE NONCLUSTERED INDEX IX_客户信息_姓名 ON 客户信息(姓名); -- 创建包含列的索引 CREATE NONCLUSTERED INDEX IX_客户信息_电话包含邮箱 ON 客户信息(电话) INCLUDE (邮箱); -- 查看索引使用情况 SELECT OBJECT_NAME(i.object_id) AS 表名, i.name AS 索引名, user_seeks, user_scans, user_lookups, user_updates FROM sys.dm_db_index_usage_stats s JOIN sys.indexes i ON s.object_id = i.object_id AND s.index_id = i.index_id WHERE OBJECT_NAME(i.object_id) = '客户信息'; -- 重建索引 ALTER INDEX IX_客户信息_姓名 ON 客户信息 REBUILD;
-- 完整备份 BACKUP DATABASE 客户管理系统 TO DISK = 'C:\Backups\客户管理系统_Full_20250801.bak' WITH COMPRESSION, STATS = 10; -- 差异备份 BACKUP DATABASE 客户管理系统 TO DISK = 'C:\Backups\客户管理系统_Diff_20250801.bak' WITH DIFFERENTIAL, COMPRESSION; -- 事务日志备份 BACKUP LOG 客户管理系统 TO DISK = 'C:\Backups\客户管理系统_Log_20250801.trn'; -- 恢复数据库 RESTORE DATABASE 客户管理系统 FROM DISK = 'C:\Backups\客户管理系统_Full_20250801.bak' WITH NORECOVERY; RESTORE DATABASE 客户管理系统 FROM DISK = 'C:\Backups\客户管理系统_Diff_20250801.bak' WITH RECOVERY;
-- 查看当前运行的查询 SELECT session_id, start_time, status, command, DB_NAME(database_id) AS database_name, wait_type, wait_time, blocking_session_id, text FROM sys.dm_exec_requests CROSS APPLY sys.dm_exec_sql_text(sql_handle); -- 查找最耗CPU的查询 SELECT TOP 10 qs.total_worker_time/qs.execution_count AS avg_cpu_time, qs.execution_count, SUBSTRING(qt.text, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(qt.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) AS query_text, DB_NAME(qt.dbid) AS database_name FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt ORDER BY avg_cpu_time DESC;
快速生成测试数据:
-- 使用ROW_NUMBER()快速生成序列 ;WITH 数字序列 AS ( SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS n FROM sys.objects a CROSS JOIN sys.objects b ) INSERT INTO 测试表(序号, 随机值) SELECT n, ABS(CHECKSUM(NEWID())) % 100 FROM 数字序列;
动态SQL执行:
DECLARE @表名 NVARCHAR(128) = '客户信息'; DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N'SELECT TOP 10 * FROM ' + QUOTENAME(@表名);
EXEC sp_executesql @SQL;
3. **事务处理示例**:
```sql
BEGIN TRY
BEGIN TRANSACTION;
UPDATE 账户 SET 余额 = 余额 - 1000 WHERE 账户ID = 123;
UPDATE 账户 SET 余额 = 余额 + 1000 WHERE 账户ID = 456;
INSERT INTO 交易记录(转出账户, 转入账户, 金额, 交易时间)
VALUES (123, 456, 1000, GETDATE());
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
THROW;
END CATCH
掌握这些SQL Server操作语句,你已经能够应对90%以上的日常数据库工作,好的SQL不仅仅是能运行,还要考虑性能、可读性和可维护性,随着SQL Server 2025的发布,虽然会有新功能加入,但这些基础操作仍然是数据库管理的核心技能,实践是最好的学习方式,赶紧打开SQL Server Management Studio试试这些语句吧!
本文由 司丰羽 于2025-08-04发表在【云服务器提供商】,文中图片由(司丰羽)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/536455.html
发表评论