SQL Server单表查询实战:从导入到高级检索全解析
掌握SQL Server单表查询是数据分析的基础。本文通过实际案例,系统讲解如何执行数据导入后的验证,并详细演示SELECT语句的核心用法,包括指定返回列、复杂条件过滤(BETWEEN/LIKE/IS NULL)、结果集限制(TOP/DISTINCT)以及基于聚合函数的数据统计,帮助读者快速构建规范的查询逻辑。
一、数据准备与验证
在进行查询操作前,确保源数据已成功导入至数据库表中。以下是数据导入过程的可视化示意:
导入成功后,建议展开表格查看具体内容以确认数据完整性。此过程同样适用于其他相关数据表的导入工作,且支持批量导入:
二、核心查询场景与实现
以下通过具体例题,逐步演示SQL Server中常用的单表查询技术。
第1步:基础列选择与计算
目的:根据需求提取特定字段或进行基础计算。
查询所有学生的全部信息:*代表通配符,返回所有列。
SELECT * FROM student
查询学生的学号和姓名:明确指定需要的列名,提高查询效率。
SELECT sno,sname FROM student
查询所有学生的姓名和出生年:利用日期函数 GETDATE() 获取当前年份,减去年龄(sage)得到出生年份。
SELECT sname,YEAR(GETDATE())-sage FROM student
为计算列设置中文标题:使用空格或AS关键字重命名列,提升可读性。
SELECT sname 姓名,YEAR(GETDATE())-sage 出生年 FROM student
第2步:单条件过滤
目的:筛选满足特定单一条件的记录。
查询CS系的所有学生信息:使用 WHERE 子句配合等于号(=)。
select * FROM student WHERE sdept='CS'
查询姓张的学生信息:使用 LIKE 结合百分号(%)通配符,匹配任意后缀。
select * from student where sname like '张%'
查询姓名只有两个字且姓李的学生:使用下划线(_)匹配恰好一个字符。
select sno,sname from student WHERE sname LIKE '李_';
第3步:多条件组合与逻辑运算
目的:处理复杂的逻辑判断,如同时满足多个条件或排除特定范围。
查询CS系的所有男同学信息:使用 AND 连接两个条件,要求同时成立。
select * FROM student WHERE sdept='CS' AND ssex='男'
查询年龄在18到20之间的学生:提供两种写法。
(1) 使用比较运算符:>= 和 <=。
select * from student where sage>=18 and sage<=20
(2) 使用区间操作符:BETWEEN ... AND ...,包含边界值。
select * from student where sage BETWEEN 18 AND 20
查询年龄不在18到20之间的学生:对上述区间的取反。
(1) 使用逻辑非的组合:<18 OR >20。
select * from student where sage<18 or sage>20
(2) 使用 NOT BETWEEN。
select * from student where sage not BETWEEN 18 AND 20
查询所在系为CS和JD的学生:匹配多个离散值。
(1) 使用 OR 连接。
select * from student where sdept='CS' or sdept='JD'
(2) 使用 IN 集合操作,语法更简洁。
select * from student where sdept in('CS','JD')
查询没有成绩的學生:在数据库中,空值需用特殊关键字 IS NULL 判断,不能使用 =NULL。
select * from sc WHERE grade IS NULL;
第4步:结果集去重与限制
目的:优化输出结果,仅保留唯一值或限定返回行数。
消除重复行查看CS系年龄:使用 DISTINCT 关键字去除重复的记录值。
select DISTINCT sage FROM student WHERE sdept='cs'
查询前三个同学的信息:使用 TOP N 限制返回行数(适用于SQL Server)。
select TOP 3 * from student
第5步:聚合统计分析
目的:对数据进行数学汇总,如计数、求和、平均、最大最小值。
统计男学生人数:COUNT 用于计数。可以直接计数字段或使用星号。AS 用于给结果列起别名。
(1) 方法一:
select COUNT(sno) 男生人数 from student where ssex='男'
(2) 方法二:
select COUNT(*) AS 男生人数 from student where ssex='男'
统计选修过课程的学生人数(去重):若直接使用 COUNT(sno) 会重复计算选多门课的学生,需先 DISTINCT 再计数。
select COUNT(distinct sno) from sc
查询所有成绩中的最高分和最低分:使用 MAX() 和 MIN()。
select max(grade) 最高分,MIN(grade) 最低分 from sc
统计特定学生的总成绩和平均分:使用 SUM() 和 AVG(),通常需配合 WHERE 指定目标对象。
select SUM(grade) 总分,AVG(grade) 平均分 from sc where sno='1204304102'
三、关键技巧小结
1. 列别名的三种指定方式
在结果集中自定义列名称,提升报表可读性:
- 空格分隔:直接写别名,如
sname 姓名。 - AS关键字:显式声明,如
sname AS 姓名。 - 等号赋值:将别名写在左边,如
院系=sdept。
select sname 姓名, YEAR(GETDATE())-sage as 出生年, 院系=sdept from student
2. 模糊查询模式总结 (LIKE)
| 需求描述 | SQL表达式 |
|---|---|
| 查询姓张的学生(后续任意字) | WHERE sname like '张%' |
| 查询姓黄且名字仅两字的学生 | WHERE sname like '黄_' |
| 查询名字中包含“文”字的學生(前后各一字) | WHERE sname like '_文_' |
3. 排序与分页扩展
查询结果常需按特定顺序展示,可结合 ORDER BY 使用:
降序排列特定课程分数:DESC 表示降序(Descending),默认为升序 ASC。
select grade from sc where cno='2102' order by grade desc
获取排在前几名的记录:结合 TOP 和 ORDER BY 可快速获取头部数据。
select TOP 2 grade from sc where cno='2102' order by grade desc
以上就是SQL Server单表数据查询的详细内容,更多关于SQL Server基础查询与优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













