SqlServer:SELECT 查询数据
SELECT 语句#
SELECT 语句语法#
在基本的增删改查操作中,可以说数据库用到的最多的操作是查操作。SELECT 语句是应用最广泛的 SQL 语句,用于在数据库中查询数据,SELECT 的语法格式为。SELECT 语句是根据 WHERE 子句的筛选条件表达式,从 FROM 子句指定的表中找出满足条件的记录,再按 SELECT 语句中指定的字段顺序,筛选出记录中的字段值构造的结果。这个结果称为结果集(一个表或多个表),表示符合条件的指定列的内容。
SELECT [ALL|DISTINCT| TOP n] 列名列表
FROM 表名列表
INTO 新表名
WHERE 条件
ORDER BY 列名
GROUP BY 列名
其中 ALL 表示显示全部记录,DISTINCT 表示只显示唯一的值,即如果有多个记录的选择字段的数据相同时,只返回第一个。TOP n 表示只显示前 n 条记录,n 是一个用户指定的正整数。SELECT 的各个子句的功能如下:
子句 | 功能 | 说明 |
---|---|---|
SELECT | 显示指定列的内容 | 不可缺少,可以为列名指定别名,列名也可以是表达式 |
FROM | 指明数据来源 | 不可缺少,可以为表名指定别名 |
INTO | 将查询结果存储到新表中 | 可缺少,新表中各列的参数与原表相同,用于快速建表 |
WHERE | 指定条件 | 若缺少此项,则表示全部记录 |
ORDER BY | 将查询结果排序 | 可缺少,可以指定排序方式为升序(默认)和降序 |
GROUP BY | 将查询结果分排显示 | 可缺少,分组依据通常是一个列名 |
查询样例#
样例一#
无条件查询全部数据。
SELECT * FROM student
样例二#
查询学生表的学生学号和姓名,在 SELECT 关键字后指明要检索的列名。
SELECT SNO, SNAME FROM student
样例三#
查询 student 表中不重复的班级,需要用到 DISTINCT 关键字。
SELECT DISTINCT class FROM STUDENT
样例四#
改变列标题的检索,可以用空格隔开列名和新标题,也可以用 “AS” 隔开。
SELECT SNO 学号, SNAME 姓名 FROM student
SELECT SNO AS '学号', SNAME AS '姓名' FROM student
运算符#
运算符包括比较运算符、范围运算符、列表运算符、空值判断符、逻辑运算符、通配符、模式匹配符等。这些运算符不仅可以用在 SELECT 语句中,也可以用在程序中或者其他地方。
比较运算符#
比较运算符用于比较两个值的大小,也叫关系运算符。
运算符 | 功能 |
---|---|
> | 大于 |
>= | 大于或等于 |
< | 小于 |
<= | 小于或等于 |
!> | 不大于 |
!< | 不小于 |
<> | 不等于 |
!= | 不等于 |
范围运算符#
指的是一个值是否在指定的范围内,包括两个运算符。
运算符 | 功能 |
---|---|
BETWEEN … AND … | 在某个范围之间 |
NOT BETWEEN … AND … | 不在某个范围之间 |
列表运算符#
用于判断表达式是否出现在列表中,包括两个运算符。
运算符 | 功能 |
---|---|
IN(项1,项2……) | 在列表中 |
NOT IN(项1,项2……) | 不在列表中 |
空值判断符#
用于判断表达式是否为空,有两个运算符。
运算符 | 功能 |
---|---|
IS NULL | 为空 |
IS NOT NULL | 不为空 |
逻辑运算符#
用于连接多个条件构成复杂的表达式,其结果是一个逻辑值,表示成立(逻辑真)或不成立(逻辑假),包括 NOT、AND、OR 三个运算符。
运算符 | 功能 |
---|---|
NOT | 逻辑非运算 |
AND | 逻辑与运算 |
OR | 逻辑或运算 |
通配符#
常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可使用以下通配字符:
运算符 | 功能 |
---|---|
% | 匹配任意类型和长度的字符 |
_ | 匹配单个任意字符,常用来限制表达式的字符长度 |
[] | 指定一个字符、字符串或范围,要求所匹配对象为括号中的任一个 |
[^] | 匹配对象为指定字符以外的任意一个字符 |
模式匹配符#
用于判断值是否与指定的字符通配格式相符,包括两个运算符。
运算符 | 功能 |
---|---|
LIKE | 匹配 |
NOT LIKE | 不匹配 |
带过滤条件的查询#
WHERE 子句#
在 SELECT 语句中的 WHERE 子句可以查询符合要求的记录,不符合要求的记录将被过滤掉,不返回在结果集中。
查询样例#
样例一#
在 student 表检索 “95033” 班级的学生信息。
SELECT * FROM student WHERE Class = '95033'
样例二#
在 student 表中检索姓“王”的学生信息,需要使用 LIKE 运算符和 % 通配符。
SELECT * FROM student WHERE Sname LIKE '王%'
样例三#
检索年龄为 21,25,22 的学生学号、姓名,需要使用 IN 运算符。
SELECT Sno, Sname FROM student WHERE YEAR(GETDATE())-YEAR([Sbirthday]) IN (21,25,22)
样例四#
查询 Student 表中不姓“王”且姓名第二字为“君”的同学记录。
SELECT * FROM Student WHERE Sname LIKE '[^王]君%'
样例五#
假设此时有成绩表 Score,表中具有以下字段和记录。
查询 Score 表中成绩在 60 到 80 之间的所有记录,需要使用 BETWEEN 运算符。
SELECT * FROM Score WHERE degree BETWEEN 60 AND 80;
对结果集排序#
ORDER BY 子句#
在 SELECT 语句中使用 ORDER BY 子句可以对查询结果进行升序或降序排列,排序时 NULL 被认为是最小值。ORDER BY 子句的基本格式如下,其中 ASC 表示升序(默认值),DESC 是降序。
ORDER BY 列名 [ASC| DESC],…
查询样例#
样例一#
以 Cno 升序、Degree 降序查询 Score 表的所有记录。
SELECT * FROM Score ORDER BY Cno, degree desc;
样例二#
查询 Student 表中最大和最小的 Sbirthday 日期值,不使用聚集函数时可以使用 TOP 关键字和 ORDER BY 子句实现。
SELECT TOP 1 Sbirthday FROM Student ORDER BY Sbirthday DESC;
SELECT TOP 1 Sbirthday FROM Student ORDER BY Sbirthday;
多表查询#
在数据查询时,数据的来源经常是数据库中两个或者两个以上的表。系统先按照一定的条件将这些表连接起来,将两个表通过列相加、行组合而形成一个虚拟表。通常情况下,两个表之间有着公共的字段或者通过外键约束来建立关联关系。如果两个表没有任何相同的字段,则可以通过比较类型相同的两个列的值的大小进行查询。
JOIN ON 子句#
可以在 SELECT 语句的 WHERE 子句中使用比较运算符给出连接条件对表进行连接,其基本格式为如下。列名 1 和列名 2 两个列必须是可以比较大小的,当使用 “=” 时为等值连接,若在等值连接中去除结果表中相同的字段名为自然连接,若有多个连接条件为复合条件连接,若一个表与自身进行连接称为自连接。
表名1.列名1 运算符 表名2.列名2
在一个 SELECT 语句中,如果用到两个以上的表且两个表中有相同的列名,为了区别列的来源需要用“表名.列名”的形式。还可以为表名设置一个别名,用“FROM 表名 别名”这样的形式用别名代替表名。
SELECT 列名列表 FROM 表名1
JOIN 表名2 ON 条件
多表连接查询用到多张表,原则是表越少越好,能够用一张表查询到数据就不要用两张表。至于要用到哪些表,主要考虑要输出的列来自于几个表,以及在查询务件中要用到哪些表才能写出表达式。
查询样例#
例如数据库中有 Course、Teacher 加上上述 2 张表共 4 张表,4 张表的字段和存在的记录如下。
样例一#
查询所有人的学号、姓名、课程号、课程名和成绩,需要将 Student、Course 和 Score 3 张表连接进行查询,使用 JOIN 子句并在 ON 指出 3 张表的相同列。
SELECT s.Sno, Sname, c.Cno, Cname, Degree
FROM Student s
JOIN Score sc ON s.Sno = sc.Sno
JOIN Course c ON c.cno = sc.cno
样例二#
查询 Student 表本月过生日同学的信息,包括学号,姓名,课程号,课程名,任课教师和成绩,需要将 4 张表连接进行查询
SELECT S.Sno,Sname,C.Cno,Cname,T.Tname,Degree
FROM Student S
JOIN Score SC ON S.Sno = SC.Sno
JOIN Course C ON C.Cno = SC.Cno
JOIN Teacher T ON T.Tno = C.Tno
WHERE MONTH(GETDATE()) = MONTH(Sbirthday);
样例三#
查询所有学生信息,包括学号,姓名,课程号,课程名,任课教师和成绩(包括没上课的学生,没有选修的课程以及没上课的教师),此处需要用到完全连接。
SELECT s.Sno, Sname, c.Cno, Cname, t.Tname, sc.Degree
FROM Student s
FULL OUTER JOIN Score sc on s.Sno = sc.Sno
FULL OUTER JOIN Course c on sc.Cno = c.Cno
FULL OUTER JOIN Teacher t on c.Tno = t.Tno
参考资料#
《SqlServer 2014 数据库技术实用教程》,胡伏湘、肖玉朝 主编,清华大学出版社
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)