SqlServer:SELECT 查询数据

SELECT 语句#

SELECT 语句语法#

在基本的增删改查操作中,可以说数据库用到的最多的操作是查操作。SELECT 语句是应用最广泛的 SQL 语句,用于在数据库中查询数据,SELECT 的语法格式为。SELECT 语句是根据 WHERE 子句的筛选条件表达式,从 FROM 子句指定的表中找出满足条件的记录,再按 SELECT 语句中指定的字段顺序,筛选出记录中的字段值构造的结果。这个结果称为结果集(一个表或多个表),表示符合条件的指定列的内容。

Copy Highlighter-hljs
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 将查询结果分排显示 可缺少,分组依据通常是一个列名

查询样例#

假设 Student 表中有如下一些数据:

样例一#

无条件查询全部数据。

Copy Highlighter-hljs
SELECT * FROM student

样例二#

查询学生表的学生学号和姓名,在 SELECT 关键字后指明要检索的列名。

Copy Highlighter-hljs
SELECT SNO, SNAME FROM student

样例三#

查询 student 表中不重复的班级,需要用到 DISTINCT 关键字。

Copy Highlighter-hljs
SELECT DISTINCT class FROM STUDENT

样例四#

改变列标题的检索,可以用空格隔开列名和新标题,也可以用 “AS” 隔开。

Copy Highlighter-hljs
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” 班级的学生信息。

Copy Highlighter-hljs
SELECT * FROM student WHERE Class = '95033'

样例二#

在 student 表中检索姓“王”的学生信息,需要使用 LIKE 运算符和 % 通配符。

Copy Highlighter-hljs
SELECT * FROM student WHERE Sname LIKE '王%'

样例三#

检索年龄为 21,25,22 的学生学号、姓名,需要使用 IN 运算符。

Copy Highlighter-hljs
SELECT Sno, Sname FROM student WHERE YEAR(GETDATE())-YEAR([Sbirthday]) IN (21,25,22)

样例四#

查询 Student 表中不姓“王”且姓名第二字为“君”的同学记录。

Copy Highlighter-hljs
SELECT * FROM Student WHERE Sname LIKE '[^王]君%'

样例五#

假设此时有成绩表 Score,表中具有以下字段和记录。

查询 Score 表中成绩在 60 到 80 之间的所有记录,需要使用 BETWEEN 运算符。

Copy Highlighter-hljs
SELECT * FROM Score WHERE degree BETWEEN 60 AND 80;

对结果集排序#

ORDER BY 子句#

在 SELECT 语句中使用 ORDER BY 子句可以对查询结果进行升序或降序排列,排序时 NULL 被认为是最小值。ORDER BY 子句的基本格式如下,其中 ASC 表示升序(默认值),DESC 是降序。

Copy Highlighter-hljs
ORDER BY 列名 [ASC| DESC],…

查询样例#

样例一#

以 Cno 升序、Degree 降序查询 Score 表的所有记录。

Copy Highlighter-hljs
SELECT * FROM Score ORDER BY Cno, degree desc;

样例二#

查询 Student 表中最大和最小的 Sbirthday 日期值,不使用聚集函数时可以使用 TOP 关键字和 ORDER BY 子句实现。

Copy Highlighter-hljs
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 两个列必须是可以比较大小的,当使用 “=” 时为等值连接,若在等值连接中去除结果表中相同的字段名为自然连接,若有多个连接条件为复合条件连接,若一个表与自身进行连接称为自连接。

Copy Highlighter-hljs
表名1.列名1 运算符 表名2.列名2

在一个 SELECT 语句中,如果用到两个以上的表且两个表中有相同的列名,为了区别列的来源需要用“表名.列名”的形式。还可以为表名设置一个别名,用“FROM 表名 别名”这样的形式用别名代替表名。

Copy Highlighter-hljs
SELECT 列名列表 FROM 表名1 JOIN 表名2 ON 条件

多表连接查询用到多张表,原则是表越少越好,能够用一张表查询到数据就不要用两张表。至于要用到哪些表,主要考虑要输出的列来自于几个表,以及在查询务件中要用到哪些表才能写出表达式。

查询样例#

例如数据库中有 Course、Teacher 加上上述 2 张表共 4 张表,4 张表的字段和存在的记录如下。

样例一#

查询所有人的学号、姓名、课程号、课程名和成绩,需要将 Student、Course 和 Score 3 张表连接进行查询,使用 JOIN 子句并在 ON 指出 3 张表的相同列。

Copy Highlighter-hljs
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 张表连接进行查询

Copy Highlighter-hljs
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);

样例三#

查询所有学生信息,包括学号,姓名,课程号,课程名,任课教师和成绩(包括没上课的学生,没有选修的课程以及没上课的教师),此处需要用到完全连接。

Copy Highlighter-hljs
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 数据库技术实用教程》,胡伏湘、肖玉朝 主编,清华大学出版社

posted @   乌漆WhiteMoon  阅读(2561)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
CONTENTS