原创

SQL Server 常用操作命令及内置函数大全

SQL Server 常用操作命令及内置函数大全

本文档汇总SQL Server日常开发、运维高频使用的数据库操作命令内置函数,包含完整语法、实战示例,分类清晰、可直接复制使用,适配日常查询、数据统计、数据处理等场景,可直接导出为Word文档。

一、SQL Server 基础查询操作命令

1.1 基础SELECT查询

SELECT 是SQL Server核心查询语句,用于从数据表中获取数据,支持全列查询、指定列查询、去重、别名设置等基础操作。

sql
-- 1. 查询表中所有数据(全列)
SELECT * FROM 表名;

-- 2. 查询指定字段数据
SELECT 字段1, 字段2, 字段3 FROM 表名;

-- 3. 字段设置别名(AS可省略)
SELECT 字段1 AS 别名1, 字段2 别名2 FROM 表名;

-- 4. 去重查询(去除重复数据行)
SELECT DISTINCT 字段1, 字段2 FROM 表名;

-- 5. 限制查询行数(TOP N)
SELECT TOP 10 * FROM 表名; -- 查询前10行数据
SELECT TOP 50 PERCENT * FROM 表名; -- 查询前50%数据

1.2 条件筛选 WHERE

WHERE 子句用于过滤查询数据,仅返回满足条件的记录,支持多种运算符组合条件。

sql
-- 基础条件查询
SELECT * FROM 表名 WHERE 字段 = '值'; -- 等于
SELECT * FROM 表名 WHERE 字段 > 100; -- 大于
SELECT * FROM 表名 WHERE 字段 <> '值'; -- 不等于(!= 等效)

-- 范围查询 BETWEEN ... AND ...
SELECT * FROM 表名 WHERE 数字字段 BETWEEN 10 AND 50;

-- 包含查询 IN / NOT IN
SELECT * FROM 表名 WHERE 字段 IN ('值1','值2','值3');
SELECT * FROM 表名 WHERE 字段 NOT IN ('值1','值2');

-- 空值判断 IS NULL / IS NOT NULL
SELECT * FROM 表名 WHERE 字段 IS NULL; -- 查询空值数据
SELECT * FROM 表名 WHERE 字段 IS NOT NULL; -- 查询非空数据

-- 模糊查询 LIKE(%匹配任意字符,_匹配单个字符)
SELECT * FROM 表名 WHERE 字段 LIKE '张%'; -- 以张开头
SELECT * FROM 表名 WHERE 字段 LIKE '%三'; -- 以三结尾
SELECT * FROM 表名 WHERE 字段 LIKE '%六%'; -- 包含六
SELECT * FROM 表名 WHERE 字段 LIKE '李_'; -- 李+单个字符

1.3 排序与分页

ORDER BY 实现数据排序,OFFSET FETCH 实现精准分页(SQL Server 2012及以上支持)。

sql
-- 排序:ASC升序(默认),DESC降序
SELECT * FROM 表名 ORDER BY 字段1 ASC, 字段2 DESC;

-- 分页查询:跳过N行,取M行
-- 示例:跳过0行,取10行(第一页,每页10条)
SELECT * FROM 表名 ORDER BY 主键
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;

-- 第二页:跳过10行,取10行
SELECT * FROM 表名 ORDER BY 主键
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

1.4 聚合查询与分组

GROUP BY 实现数据分组,配合聚合函数统计数据,HAVING 过滤分组后数据(WHERE过滤分组前)。

sql
-- 基础分组统计
SELECT 分组字段, COUNT(*) 总数, SUM(数字字段) 总和, AVG(数字字段) 平均值
FROM 表名
GROUP BY 分组字段;

-- 分组后条件过滤(HAVING)
SELECT 分组字段, COUNT(*) 数量
FROM 表名
GROUP BY 分组字段
HAVING COUNT(*) > 5; -- 筛选分组数量大于5的组

-- 分组+排序
SELECT 分组字段, MAX(数字字段) 最大值
FROM 表名
GROUP BY 分组字段
ORDER BY 最大值 DESC;

1.5 多表连接查询

多表关联核心语法,分为内连接、左连接、右连接、全连接,是多表数据查询核心。

sql
-- 1. 内连接 INNER JOIN(只返回两表匹配数据)
SELECT a.*, b.字段 FROM 表A a
INNER JOIN 表B b ON a.关联字段 = b.关联字段;

-- 2. 左连接 LEFT JOIN(左表所有数据,右表匹配数据,无匹配则为空)
SELECT a.*, b.字段 FROM 表A a
LEFT JOIN 表B b ON a.关联字段 = b.关联字段;

-- 3. 右连接 RIGHT JOIN(右表所有数据,左表匹配数据)
SELECT a.*, b.字段 FROM 表A a
RIGHT JOIN 表B b ON a.关联字段 = b.关联字段;

-- 4. 全连接 FULL JOIN(返回两表所有数据,无匹配则为空)
SELECT a.*, b.字段 FROM 表A a
FULL JOIN 表B b ON a.关联字段 = b.关联字段;

1.6 子查询

sql
-- 1. 单行子查询
SELECT * FROM 员工表
WHERE 部门ID = (SELECT 部门ID FROM 部门表 WHERE 部门名='技术部');

-- 2. 多行子查询(IN匹配多个结果)
SELECT * FROM 员工表
WHERE 部门ID IN (SELECT 部门ID FROM 部门表 WHERE 部门状态='正常');

-- 3. exists子查询(判断子查询是否有结果,效率高于IN)
SELECT * FROM 员工表 a
WHERE EXISTS (SELECT 1 FROM 工资表 b WHERE a.员工ID = b.员工ID);

二、SQL Server DML/DDL 常用操作命令

2.1 数据操作DML(增删改)

sql
-- 1. 插入数据
-- 全字段插入
INSERT INTO 表名 VALUES ('值1','值2',100);
-- 指定字段插入
INSERT INTO 表名(字段1,字段2) VALUES ('值1','值2');

-- 2. 更新数据(务必加WHERE,否则更新全表)
UPDATE 表名 SET 字段1='新值',字段2=200 WHERE 条件;

-- 3. 删除数据
DELETE FROM 表名 WHERE 条件; -- 删除指定数据
TRUNCATE TABLE 表名; -- 清空全表数据(不可回滚、速度快、自增主键重置)

2.2 表结构操作DDL

sql
-- 1. 创建数据表
CREATE TABLE 学生表(
    学生ID INT PRIMARY KEY IDENTITY(1,1), -- 自增主键
    姓名 NVARCHAR(20) NOT NULL,
    年龄 INT DEFAULT 18,
    手机号 VARCHAR(11) UNIQUE,
    入学时间 DATETIME
);

-- 2. 修改表结构
ALTER TABLE 表名 ADD 新字段 NVARCHAR(50); -- 新增字段
ALTER TABLE 表名 ALTER COLUMN 字段 INT; -- 修改字段类型
ALTER TABLE 表名 DROP COLUMN 字段名; -- 删除字段

-- 3. 删除数据表
DROP TABLE 表名;

三、SQL Server 常用内置函数大全

3.1 聚合函数(统计类)

用于分组统计、数据汇总,忽略NULL值,是数据分析核心函数。

sql
-- 统计总行数
SELECT COUNT(*) FROM 表名;
-- 统计指定字段非空行数
SELECT COUNT(字段) FROM 表名;
-- 统计去重后行数
SELECT COUNT(DISTINCT 字段) FROM 表名;

-- 求和、平均值、最大值、最小值
SELECT
SUM(数字字段) AS 总和,
AVG(数字字段) AS 平均值,
MAX(数字字段) AS 最大值,
MIN(数字字段) AS 最小值
FROM 表名;

3.2 字符串函数

用于字符串拼接、截取、替换、大小写转换、去空格等文本处理。

sql
-- 1. 字符串拼接
SELECT CONCAT('张三','-','25岁') AS 结果; -- 支持多参数,自动忽略NULL

-- 2. 截取字符串
SELECT LEFT('SQLServer',3); -- 从左截取3位:SQL
SELECT RIGHT('SQLServer',6); -- 从右截取6位:Server
SELECT SUBSTRING('SQLServer',4,3); -- 从第4位开始截取3位:Ser

-- 3. 字符串长度
SELECT LEN('测试文本'); -- 获取字符长度
SELECT DATALENGTH('测试文本'); -- 获取字节长度

-- 4. 大小写转换
SELECT UPPER('sql'); -- 转大写:SQL
SELECT LOWER('SQL'); -- 转小写:sql

-- 5. 去空格
SELECT LTRIM('  测试'); -- 去除左空格
SELECT RTRIM('测试  '); -- 去除右空格
SELECT TRIM('  测试  '); -- 去除首尾空格(2017+版本支持)

-- 6. 替换、查找字符串
SELECT REPLACE('abc123','123','456'); -- 替换:abc456
SELECT CHARINDEX('123','abc123'); -- 查找字符位置,无则返回0

3.3 日期时间函数

处理日期时间数据,获取当前时间、日期加减、日期格式化、提取年月日等。

sql
-- 1. 获取当前时间
SELECT GETDATE(); -- 当前系统时间(datetime)
SELECT GETUTCDATE(); -- 世界标准时间
SELECT SYSDATETIME(); -- 高精度当前时间

-- 2. 提取日期部分
SELECT YEAR(GETDATE()) AS 年;
SELECT MONTH(GETDATE()) AS 月;
SELECT DAY(GETDATE()) AS 日;

-- 3. 日期加减
SELECT DATEADD(DAY,7,GETDATE()); -- 当前时间+7天
SELECT DATEADD(MONTH,1,GETDATE()); -- 当前时间+1月
SELECT DATEADD(YEAR,-1,GETDATE()); -- 当前时间-1年

-- 4. 日期差值计算
SELECT DATEDIFF(DAY,'2025-01-01',GETDATE()); -- 天数差
SELECT DATEDIFF(MONTH,'2025-01-01',GETDATE()); -- 月份差

-- 5. 日期格式化
SELECT CONVERT(VARCHAR(10),GETDATE(),23); -- 格式:yyyy-MM-dd
SELECT CONVERT(VARCHAR(19),GETDATE(),120); -- 格式:yyyy-MM-dd HH:mm:ss

3.4 数学函数

用于数字计算、取整、四舍五入、绝对值、随机数等场景。

sql
SELECT ABS(-10); -- 绝对值:10
SELECT CEILING(3.2); -- 向上取整:4
SELECT FLOOR(3.8); -- 向下取整:3
SELECT ROUND(3.1415,2); -- 四舍五入保留2位小数:3.14
SELECT RAND(); -- 生成0-1随机小数
SELECT POWER(2,3); -- 幂运算:2的3次方=8
SELECT SQRT(16); -- 开平方:4

3.5 数据转换函数

实现不同数据类型之间的转换,解决类型不匹配问题。

sql
-- CAST 转换(通用转换)
SELECT CAST('123' AS INT); -- 字符串转数字
SELECT CAST(123 AS VARCHAR(10)); -- 数字转字符串

-- CONVERT 转换(支持日期格式化,专用)
SELECT CONVERT(VARCHAR,123456); -- 数字转字符串
SELECT CONVERT(DATETIME,'2025-01-01'); -- 字符串转日期

3.6 逻辑判断函数

sql
-- ISNULL 空值替换(字段为空则替换为指定值)
SELECT ISNULL(字段,'默认值') FROM 表名;

-- NULLIF 相等则返回空,否则返回原值
SELECT NULLIF(字段,'0'); -- 字段值为0则返回NULL

-- CASE 多条件判断(万能逻辑判断)
SELECT
    姓名,
    年龄,
    CASE
        WHEN 年龄 < 18 THEN '未成年'
        WHEN 年龄 BETWEEN 18 AND 35 THEN '青年'
        ELSE '中年及以上'
    END AS 年龄段
FROM 员工表;

四、常用运维快捷命令

sql
-- 查看数据库列表
SELECT name FROM sys.databases;

-- 查看当前数据库所有表
SELECT name FROM sys.tables;

-- 查看表结构
SP_HELP '表名';

-- 查看SQL执行计划(优化查询)
SET SHOWPLAN_XML ON;

-- 清除缓存、优化执行
DBCC DROPCLEANBUFFERS;
DBCC FREEPROCCACHE;

4.1 生成1-100连续序号(高频实用)

SQL Server 无自带序号表,以下提供三种主流生成 1~100 连续数字序号的命令,适配分页填充、序号补全、批量数据生成、循环数据校验等场景,可直接复制执行。

sql
-- 方式一:CTE递归生成1-100序号(最通用、推荐、无依赖)
WITH NumSeq AS (
    SELECT 1 AS SerialNum
    UNION ALL
    SELECT SerialNum + 1 FROM NumSeq WHERE SerialNum < 100
)
SELECT SerialNum FROM NumSeq OPTION (MAXRECURSION 100);

-- 方式二:系统表快速生成(简洁高效,无需递归配置)
SELECT TOP 100 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS SerialNum
FROM sys.all_columns a CROSS JOIN sys.all_columns b;

-- 方式三:创建临时表存储1-100序号(可反复调用)
-- 生成序号并存入临时表
WITH NumSeq AS (
    SELECT 1 AS SerialNum
    UNION ALL
    SELECT SerialNum + 1 FROM NumSeq WHERE SerialNum < 100
)
SELECT SerialNum INTO #Temp_Num FROM NumSeq OPTION (MAXRECURSION 100);

-- 查询临时表序号数据
SELECT * FROM #Temp_Num;

-- 使用完毕删除临时表
DROP TABLE IF EXISTS #Temp_Num;

命令说明

1. 递归CTE方式兼容性最强,支持所有SQL Server版本,可修改数值快速生成 1~N 任意连续序号;

2. 系统表方式执行速度最快,无需设置递归参数,适合快速生成序号;

3. 临时表方式适合需要多次引用序号数据的场景,用完可手动销毁释放资源。

五、两表对比差异专用命令

本节汇总SQL Server两张数据表结构对比数据差异对比高频命令,适用于数据同步校验、环境数据比对、版本数据核对、BUG数据校验等场景,命令可直接复制复用。

5.1 两表行数快速对比

快速核查两张结构、业务一致的表数据总量是否一致,初步判断数据是否存在差异。

sql
-- 对比表A、表B总行数
SELECT
 (SELECT COUNT(*) FROM 表A) AS 表A总行数,
 (SELECT COUNT(*) FROM 表B) AS 表B总行数;

5.2 两表数据差异完整对比(核心)

通过EXISTS、EXCEPT关键字实现精准数据比对,分别查询【表A有、表B无】和【表B有、表A无】的差异数据,是最常用的生产数据校验方式。

sql
-- 方式1:EXCEPT 极简差异对比(推荐,自动比对所有字段)
-- 查询:表A存在、表B不存在的数据
SELECT * FROM 表A
EXCEPT
SELECT * FROM 表B;

-- 查询:表B存在、表A不存在的数据
SELECT * FROM 表B
EXCEPT
SELECT * FROM 表A;

-- 方式2:EXISTS 精准比对(指定主键/唯一键,效率更高,大数据量推荐)
-- 主键不一致数据:表A独有数据
SELECT A.* FROM 表A A
WHERE NOT EXISTS(SELECT 1 FROM 表B B WHERE A.主键 = B.主键);

-- 主键不一致数据:表B独有数据
SELECT B.* FROM 表B B
WHERE NOT EXISTS(SELECT 1 FROM 表A A WHERE A.主键 = B.主键);

5.3 指定字段差异对比

无需全字段比对,仅校验核心业务字段(如数量、金额、状态)的差异,精准定位业务数据不一致问题。

sql
-- 仅对比核心字段,查询数据不一致记录
SELECT A.主键, A.金额 AS A表金额, B.金额 AS B表金额, A.状态 AS A表状态, B.状态 AS B表状态
FROM 表A A
INNER JOIN 表B B ON A.主键 = B.主键
WHERE A.金额 <> B.金额 OR A.状态 <> B.状态;

5.4 两表字段结构对比(表结构差异)

对比两张表的字段名、数据类型、长度、是否为空等结构差异,适用于新旧环境表结构同步校验。

sql
-- 替换 表A、表B 为需要对比的表名
SELECT
 ISNULL(A.COLUMN_NAME,B.COLUMN_NAME) AS 字段名,
 A.DATA_TYPE AS A表数据类型,
 A.CHARACTER_MAX_LENGTH AS A表字段长度,
 A.IS_NULLABLE AS A表是否为空,
 B.DATA_TYPE AS B表数据类型,
 B.CHARACTER_MAX_LENGTH AS B表字段长度,
 B.IS_NULLABLE AS B表是否为空,
 CASE
  WHEN A.COLUMN_NAME IS NULL THEN 'B表独有字段'
  WHEN B.COLUMN_NAME IS NULL THEN 'A表独有字段'
  WHEN A.DATA_TYPE<>B.DATA_TYPE OR A.CHARACTER_MAX_LENGTH<>B.CHARACTER_MAX_LENGTH OR A.IS_NULLABLE<>B.IS_NULLABLE THEN '结构不一致'
  ELSE '结构一致'
 END AS 差异状态
FROM
(SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAX_LENGTH,IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='表A') A
FULL JOIN
(SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAX_LENGTH,IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='表B') B
ON A.COLUMN_NAME = B.COLUMN_NAME
ORDER BY 字段名;

5.5 表对比使用注意事项

1. EXCEPT 对比会自动去重,若需要校验重复数据差异,优先使用 EXISTS 关联比对;

2. 大数据量表对比禁止使用 SELECT * 全表比对,必须指定主键/索引字段,大幅提升查询效率;

3. 含NULL值字段对比,<> 无法识别NULL差异,需额外增加 OR (A.字段 IS NULL AND B.字段 IS NOT NULL) 条件;

4. 结构对比语句仅对比常规字段属性,不包含主键、索引、约束、默认值差异。

六、使用说明

1. 本文档所有命令、函数均适配 SQL Server 2012及以上所有版本,兼容企业版、标准版、Express版;

2. 所有示例可直接复制到SSMS工具执行,只需替换对应表名、字段名;

3. 日常开发优先使用本文档语法,兼顾兼容性、简洁性和执行效率;

4. 增删改操作务必添加WHERE条件,避免误操作导致全表数据修改/删除。

|(注:部分内容可能由 AI 生成)


附件:SQL Server 常用操作命令及内置函数大全.docx


正文到此结束
本文目录