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

查询样例

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

样例一

无条件查询全部数据。

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

posted @ 2021-05-20 00:03  乌漆WhiteMoon  阅读(2510)  评论(0编辑  收藏  举报