更新时间:作者:佚名
老铁们,大家好,相信还有很多朋友对于SQL Server常用查询命令和的相关问题不太懂,没关系,今天就由我来为大家分享分享SQL Server常用查询命令以及的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
-- 语法:SELECT * FROM 表名; (*效率低,易受表结构变化影响) SELECT * FROM dbo.Student; -- dbo 是默认架构,可以省略。建议显式写

sql
-- 语法:SELECT 字段1 [AS] 别名1,字段2 别名2 FROM 表名; ([]为可选) SELECT Id AS 学生ID、姓名、年龄、CreateTime 注册时间FROM dbo.Student;
sql
-- 语法:SELECT DISTINCT FROM 表名;从dbo.Student 中选择不同的ClassId 班级ID; -- 查询所有唯一类ID
。核心使用WHERE子句,支持多种条件组合,是SQL Server独有的:TOP取前N项,IIF进行简单判断,操作符与一般SQL一致。
sql
-- 常用运算符:=, BETWEEN.AND. IN, LIKE, IS NULLSELECT 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
sql 的学生
选择名称name,分数FROM dbo.Exam,其中主题='数学' AND 分数=85 AND NOT 分数=100; -- 数学成绩85且不等于100的学生
sql
-- %:匹配任意0-N个字符; _:匹配1个任意字符; []:匹配指定范围/集合SELECT Name FROM dbo.Student WHERE Name LIKE '李%'; -- 所有姓张的学生SELECT Name FROM dbo.Student WHERE Name LIKE '李[小大]%'; -- 名字以“李小”或“李大”开头的学生(如“李小华”、“李大庄”)
sql
-- 注意:不能使用=NULL 或!=NULL,必须使用IS 关键字。从dbo.Student 中选择姓名,其中电话为NULL; -- 查询没有手机号码的学生。从dbo.Student 中选择姓名,其中电话不为空; -- 查询学生手机号码。
SQL
-- 语法:ORDER BY 字段1 [ASC/DESC],字段2 [ASC/DESC]; (默认ASC升序,DESC降序) SELECT Name, Age, Score FROM dbo.Exam ORDER BY Score DESC, Age ASC; -- 首先按成绩降序排列,同分则按年龄升序排列
sql
-- 语法:SELECT TOP N fields FROM 表名; (N是数字,可与ORDER BY一起使用) SELECT TOP 10 Name, Score FROM dbo.Exam ORDER BY Score DESC; -- 查询前10名学生
sql
-- 场景: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='Math';
使用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(全连接)。建议使用AS(可选)作为SQL Server表别名。
学生表(Student):Id、Name、ClassId 班级表(Class):Id、ClassName、Teacher
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
sql
-- 场景:查询所有学生,没有班级的学生显示“未分类” SELECT s.Name 学生姓名,IIF(c.ClassName IS NULL, '未分类', c.ClassName) 班级名-- IIF 是SQL Server 的唯一判断函数FROM dbo.Student sLEFT JOIN dbo.Class cON s.ClassId=c.Id;
SQL Server 分页有两种方式:OFFSET FETCH(2012及以上版本,推荐)、ROW_NUMBER()(兼容老版本),以下是主流用法。
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;
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 行)
sql