当前位置:首页 > 问答 > 正文

SQL Server 操作语句 常用SQL Server操作语句全汇总

SQL Server操作语句大全:从入门到精通的必备指南

2025年8月最新消息:微软近期宣布SQL Server 2025将引入更强大的AI查询优化功能,预计将使复杂查询性能提升40%,虽然新版本即将发布,但基础SQL操作语句仍然是每位数据库从业者的核心技能。

SQL Server基础操作语句

数据库创建与管理

-- 创建新数据库
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 信用等级;

数据操作语言(DML)精华

增删改查(CRUD)基础

-- 插入数据
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';

SQL Server特有功能操作

存储过程与函数

-- 创建存储过程
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;

实用小技巧与最佳实践

  1. 快速生成测试数据

    SQL Server 操作语句 常用SQL Server操作语句全汇总

    -- 使用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 数字序列;
  2. 动态SQL执行

    DECLARE @表名 NVARCHAR(128) = '客户信息';
    DECLARE @SQL NVARCHAR(MAX);

SET @SQL = N'SELECT TOP 10 * FROM ' + QUOTENAME(@表名);

SQL Server 操作语句 常用SQL Server操作语句全汇总

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试试这些语句吧!

SQL Server 操作语句 常用SQL Server操作语句全汇总

发表评论