SQL Server 查询核心仍以 SELECT 为基础,语法与 MySQL 有少量差异(如分页、函数),以下是高频场景命令,直接复制即可适配使用。
一、基础查询(数据提取)
1. 查询所有字段(不推荐生产环境)
sql
-- 语法:SELECT * FROM 表名;(* 效率低,易受表结构变更影响)
SELECT * FROM dbo.Student; -- dbo是默认架构,可省略,提议显式写
2. 查询指定字段 + 别名
sql
-- 语法:SELECT 字段1 [AS] 别名1, 字段2 别名2 FROM 表名;([]内为可选)
SELECT
Id AS 学生ID,
Name 姓名,
Age 年龄,
CreateTime 注册时间
FROM dbo.Student;
3. 去重查询(消除重复记录)
sql
-- 语法:SELECT DISTINCT 字段 FROM 表名;
SELECT DISTINCT ClassId 班级ID FROM dbo.Student; -- 查询所有不重复的班级ID
4. 常量字段(新增固定值列)
sql
-- 场景:报表中添加固定标识,如“数据来源”
SELECT
Name 姓名,
Age 年龄,
'XX小学' AS 数据来源 -- 常量字段,所有行值均为“XX小学”
FROM dbo.Student;
二、条件查询(数据筛选)
核心用 WHERE 子句,支持多条件组合,SQL Server 特有:TOP 取前 N 条、IIF 简单判断,运算符与通用 SQL 一致。
1. 单条件 + 范围查询
sql
-- 常用运算符:=、<>、>、<、BETWEEN...AND...、IN、LIKE、IS NULL
SELECT Name 姓名, Age 年龄 FROM dbo.Student
WHERE Age BETWEEN 8 AND 12; -- 年龄8-12岁(包含边界)
SELECT Name 姓名 FROM dbo.Student
WHERE ClassId IN (1, 3, 5); -- 班级ID为1、3、5的学生
2. 多条件组合(AND/OR/NOT)
sql
SELECT Name 姓名, Score 成绩 FROM dbo.Exam
WHERE Subject = '数学' AND Score >= 85
AND NOT Score = 100; -- 数学成绩≥85且不等于100的学生
3. 模糊查询(LIKE)
sql
-- %:匹配任意0-N个字符;_:匹配1个任意字符;[]:匹配指定范围/集合
SELECT Name 姓名 FROM dbo.Student
WHERE Name LIKE '李%'; -- 姓张的所有学生
SELECT Name 姓名 FROM dbo.Student
WHERE Name LIKE '李[小大]%'; -- 名字以“李小”或“李大”开头的学生(如“李小华”“李大壮”)
4. 空值查询(IS NULL/IS NOT NULL)
sql
-- 注意:不能用 = NULL 或 != NULL,必须用 IS 关键字
SELECT Name 姓名 FROM dbo.Student
WHERE Phone IS NULL; -- 查询无手机号的学生
SELECT Name 姓名 FROM dbo.Student
WHERE Phone IS NOT NULL; -- 查询有手机号的学生
三、排序 + 取前 N 条(数据整理)
1. 排序查询(ORDER BY)
sql
-- 语法:ORDER BY 字段1 [ASC/DESC], 字段2 [ASC/DESC];(ASC升序默认,DESC降序)
SELECT Name 姓名, Age 年龄, Score 成绩 FROM dbo.Exam
ORDER BY Score DESC, Age ASC; -- 先按成绩降序,同成绩按年龄升序
2. 取前 N 条数据(TOP,SQL Server 特有)
sql
-- 语法:SELECT TOP N 字段 FROM 表名;(N为数字,可搭配ORDER BY)
SELECT TOP 10 Name 姓名, Score 成绩 FROM dbo.Exam
ORDER BY Score DESC; -- 查询成绩前10的学生
3. 取百分比数据(TOP + PERCENT)
sql
-- 场景:取成绩前20%的学生
SELECT TOP 20 PERCENT Name 姓名, Score 成绩 FROM dbo.Exam
ORDER BY Score DESC;
四、聚合查询(数据统计)
常用聚合函数:COUNT()(计数)、SUM()(求和)、AVG()(平均)、MAX()(最大)、MIN()(最小),支持 DISTINCT 去重统计。
sql
-- 1. 计数(统计总人数、非空字段数)
SELECT
COUNT(*) AS 总学生数, -- 统计所有行(包含空值字段)
COUNT(DISTINCT ClassId) AS 班级数, -- 统计不重复的班级数
COUNT(Phone) AS 有手机号人数 -- 统计非空手机号的人数
FROM dbo.Student;
-- 2. 求和、平均、最大最小
SELECT
SUM(Score) AS 数学总分,
AVG(Score) AS 数学平均分,
MAX(Score) AS 最高分,
MIN(Score) AS 最低分
FROM dbo.Exam
WHERE Subject = '数学';
五、分组查询(按类别统计)
用 GROUP BY 分组,搭配聚合函数;HAVING 过滤分组结果(区别:WHERE 过滤行,HAVING 过滤分组,支持聚合函数)。
sql
-- 1. 按班级分组,统计每个班级的人数和平均年龄
SELECT
ClassId 班级ID,
COUNT(*) 人数,
AVG(Age) 平均年龄
FROM dbo.Student
GROUP BY ClassId; -- 分组字段必须出目前SELECT中(聚合函数除外)
-- 2. 过滤分组:只显示人数≥30的班级
SELECT
ClassId 班级ID,
COUNT(*) 人数
FROM dbo.Student
GROUP BY ClassId
HAVING COUNT(*) >= 30; -- HAVING后可直接用聚合函数
六、关联查询(多表联合)
支持 INNER JOIN(内连接)、LEFT JOIN(左连接)、RIGHT JOIN(右连接)、FULL JOIN(全连接),SQL Server 表别名提议用 AS(可选)。
示例表结构
- 学生表(Student):Id、Name、ClassId
- 班级表(Class):Id、ClassName、Teacher
1. 内连接(只显示匹配数据)
sql
-- 语法:表1 INNER JOIN 表2 ON 关联条件
SELECT
s.Name 学生姓名,
c.ClassName 班级名称,
c.Teacher 班主任
FROM dbo.Student s -- s是Student表别名
INNER JOIN dbo.Class c -- c是Class表别名
ON s.ClassId = c.Id; -- 关联条件:学生表的ClassId = 班级表的Id
2. 左连接(左表全显,右表匹配不到为 NULL)
sql
-- 场景:查询所有学生,无班级的学生显示“未分班”
SELECT
s.Name 学生姓名,
IIF(c.ClassName IS NULL, '未分班', c.ClassName) 班级名称 -- IIF是SQL Server特有判断函数
FROM dbo.Student s
LEFT JOIN dbo.Class c
ON s.ClassId = c.Id;
七、分页查询(SQL Server 2012+ 推荐)
SQL Server 分页有两种方式:OFFSET FETCH(2012 及以上版本,推荐)、ROW_NUMBER()(兼容旧版本),以下是主流用法。
1. OFFSET FETCH 分页(简洁高效)
sql
-- 语法:OFFSET 起始索引 ROWS FETCH NEXT 每页条数 ROWS ONLY;(起始索引从0开始)
-- 场景:第2页,每页10条数据(起始索引=10)
SELECT Id, Name, Age FROM dbo.Student
ORDER BY Id ASC -- 分页必须搭配ORDER BY,否则报错
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
2. ROW_NUMBER () 分页(兼容旧版本)
sql
-- 先给数据加行号,再筛选行号范围
SELECT * FROM (
SELECT
Id, Name, Age,
ROW_NUMBER() OVER (ORDER BY Id ASC) AS RowNum -- 按Id升序加行号
FROM dbo.Student
) AS Temp -- 子查询必须加别名
WHERE Temp.RowNum BETWEEN 11 AND 20; -- 第2页,每页10条(11-20行)
八、常用辅助查询(实用场景)
1. 查询表结构(字段、类型、约束)
sql
-- 方式1:系统视图(推荐,详情完整)
SELECT
COLUMN_NAME 字段名,
DATA_TYPE 数据类型,
IS_NULLABLE 是否允许空,
COLUMN_DEFAULT 默认值
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Student'; -- 表名区分大小写(部分环境)
-- 方式2:存储过程(简洁)
EXEC sp_help 'dbo.Student'; -- 快速查看表的所有信息(字段、索引、约束等)
2. 模糊查询表名(找目标表)
sql
-- 场景:查找包含“Student”关键字的所有表
SELECT NAME 表名 FROM sys.tables
WHERE NAME LIKE '%Student%';
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...


