2021-4-3课程——SQL Server查询【2】


Posted in SQL Server onApril 05, 2021
本篇主要总结基于单表的查询,内容涉及去重查找,条件查询,模糊查询,分组查询等内容。测试结果一律采用先显示SQL语句,再显示测试结果(以图片的形式进行展现)的方式。
一、准备工作

本次的所有操作都将基于三张表,分别是学生表(Student),课程表(Course),学生选课表(SC)。具体建表语句这里不再赘述,直接给出表中数据内容。

1.学生表(Student)

2021-4-3课程——SQL Server查询【2】

2.课程表(Course)

2021-4-3课程——SQL Server查询【2】

3.学生选课表(SC)

2021-4-3课程——SQL Server查询【2】

二、单表查询——仅涉及一个表的查询
0.查询的一般格式为:

select (distinct) 目标列表达式
from 表名或视图名
where 条件表达式
group by 列名 having 条件表达式
order by ASC|DESC

1.选择表中的若干列
(1)查询指定列(这里回顾了上篇内容,其实上一篇已经写过)

例1:查询全体学生的学号和姓名。其中各个列的先后顺序可以自己根据需要决定,没有硬性规定。

select Sno,Sname
from Student;

2021-4-3课程——SQL Server查询【2】
例2:查询全体学生的姓名、学号、所在系。

select Sname,Sno,Sdept
from Student;

2021-4-3课程——SQL Server查询【2】

(2)查询全部列

方式一:列出所有的列名

select Sno,Sname,Ssex,Sage,Sdept
from Student;

方式二:使用通配符*

select *
from Student;

可以发现,二者结果是一样的,不过*的查询结果是和建表时的列名出现的顺序是一致的,而自己列出所有的列名时,可以自定义各个列的顺序。
2021-4-3课程——SQL Server查询【2】

(3)查询经过计算的值

select子句的目标表达式不仅可以是表中的属性列,也可以是表达式
例1:查询全体学生的姓名及其出生年份
Student表中实际存储的是学生的年龄,即Sage,要查询出生年份,可以使用计算,即用当前的年份-学生的年龄

select Sname,2021-Sage
from Student

2021-4-3课程——SQL Server查询【2】
容易发现,当前的出生年份的查询结果没有显示列名,但实际上我们可以给它指定一个列名,这里我为该列命名为Birth

select Sname,2021-Sage as Birth
from Student

2021-4-3课程——SQL Server查询【2】
目标列的表达式不仅可以是算术表达式,还可以是字符串常量、函数等
例2:查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示系名。

补充:起别名,由于直接写最终的结果会显示无列名,所以可以通过在查询内容后加一个空格或者使用as关键字,之后加所起的名字即可。

select Sname,'Year of Birth' as 'Year of Birth',2021-Sage as Birth,LOWER(Sdept)as Sdept
from Student;

可以发现,系名全都变成了小写
2021-4-3课程——SQL Server查询【2】

相应的,可以转换为小写,就可以转换成大写,这里在小写的基础上进行转换。转换后,可以发现所有的系名已经由小写全部转换为大写

select Sname,'Year of Birth' as 'Year of Birth',2021-Sage as Birth,UPPER(Sdept)as Sdept
from Student;

2021-4-3课程——SQL Server查询【2】

2.选择表中的若干元组
(1)消除取值重复的行

两个本来并不完全相同的元组在投影到指定的某些列上后,可能会变成相同的行,可以使用distinct关键字来消除它们。
例1:查询选修了课程的学生学号

select Sno
from SC;

2021-4-3课程——SQL Server查询【2】
上述查询结果中包含了许多重复的行,出现的原因是一个人可以选不止一门的课程,为了去掉重复的行,使用关键字distinct

select distinct Sno
from SC;

2021-4-3课程——SQL Server查询【2】
如果没有distinct,则默认是all,即查询所有,查询的结果和不加all,也不加distinct的结果是一样的。
2021-4-3课程——SQL Server查询【2】

(2)查询满足条件的元组——通过where子句实现

常用的查询条件如下

查询条件 谓词
比较 =,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符
确定范围 BETWEEN AND , NOT BETWEEN AND
确定集合 IN,NOT IN
字符匹配 LIKE,NOT LIKE
空值 IS NULL,NOT IS NULL
多重条件 AND,OR,NOT
①比较大小

例1:查询计算机科学系全体学生的名单

select Sname
from Student
where Sdept='CS';

2021-4-3课程——SQL Server查询【2】
例2:查询所有年龄在20岁以下的学生姓名及其年龄

select Sname,Sage
from Student
where Sage<20;

2021-4-3课程——SQL Server查询【2】
例3:查询考试成绩不及格的学生的学号(由于一个学生可能不止一科不及格,所以使用了distinct关键字来去重)

select distinct Sno
from SC
where Grade<60;

查询结果为空,说明没有不及格的学生
2021-4-3课程——SQL Server查询【2】

②确定范围

谓词BETWEEN···AND···和NOT BETWEEN ··· AND···可以用来查找属性在某个范围内的元组,其中BETWEEN后的是范围的下限,即低值,AND后的是范围的上限,即高值。
例1:查询年龄在20-23(包括20和23)之间的学生的姓名、系别和年龄

select Sname,Sdept,Sage
from Student
where Sage between 20 and 23;

2021-4-3课程——SQL Server查询【2】
例2:查询年龄不在20-23之间的学生姓名、系别和年龄

select Sname,Sdept,Sage
from Student
where Sage not between 20 and 23;

2021-4-3课程——SQL Server查询【2】

③确定集合

谓词IN可以用来查找属性值属于指定集合的元组。
例1:查询计算机科学系(CS),数学系(MA)和信息系(IS)学生的姓名和性别

select Sname,Ssex
from Student
where Sdept in('CS','MA','IS');

2021-4-3课程——SQL Server查询【2】
与IN相对的是NOT IN,即不在指定集合中的元组

④字符匹配(模糊查询)

使用关键字like(not like),后面是响应的匹配,可以使用通配符%或者_
%(百分号)代表任意长度(长度可以为0)的字符串
下横线代表任意单个字符,长度有限制,即有多少个下横线就代表最多可以匹配的字符数
例1:查询所有姓刘的学生的姓名、学号和性别

select Sname,Sno,Ssex
from Student
where Sname like '刘%';

2021-4-3课程——SQL Server查询【2】
例2:查询姓欧阳且全名为三个汉字的学生的姓名(由于之前建的表中没有,这里新添了三条有关欧阳的数据)
我的不知道为啥,不能正常显示,我需要打8个下横线才会正常显示,少于8个,一个都不显示,还没找到合适的解决办法,但是%可以正常使用

select Sname
from Student
where Sname like '欧阳________';

2021-4-3课程——SQL Server查询【2】
例3:查询名字中第二个字为“阳”的学生的姓名和学号(这个的下横线又可以正常使用了,好奇怪。。。。)

select Sname,Sno
from Student
where Sname like '_阳%';

2021-4-3课程——SQL Server查询【2】
例4:查询所有不姓刘的学生的姓名、学号和性别

select Sname,Sno,Ssex
from Student
where Sname not like '刘%';

2021-4-3课程——SQL Server查询【2】
如果要查询的字符串本身就含有通配符%或_,这时就要使用ESCAPE '<换码字符>'短语对通配符进行转义了
例5:查询DB_Design课程的课程号和学分(在Course表中插入该课程,用于测试)
escape ''表示“\”为换码字符,这样匹配后它会将下横线转义为普通的下横线字符。

select Cno,Ccredit
from Course
where Cname like 'DB\_Design' escape '\';
⑤涉及空值的查询

例1:某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩,查询缺少成绩的学生的学号和相应的课程号(插入一条这样的数据)

==PS:==这里的is绝对不可以用=代替!!!

select Sno,Cno
from SC
where Grade is null;

2021-4-3课程——SQL Server查询【2】

⑥多重条件查询

逻辑运算符AND和OR可用来连接多个查询条件,AND的优先级高于OR,但可以用括号改变优先级
例1:查询计算机科学系年龄在20岁以下的学生姓名

select Sname
from Student
where Sdept='CS' and Sage<20;

2021-4-3课程——SQL Server查询【2】
IN谓词实际上是多个OR运算符的缩写,因此前边的IN运算符的测试的SQL语句可以更改为

select Sname,Ssex
from Student
where Sdept='CS' or Sdept='MA' or Sdept='IS';
3.ORDER BY子句

可以使用order by子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,默认为升序
例1:查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列

select Sno,Grade
from SC
where Cno=3
order by Grade desc;

2021-4-3课程——SQL Server查询【2】
对于空值,排序时显示的次序由具体的系统实现决定,若为升序,则空值在最后,若为降序,则空值在最前边
例2:查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列

select *
from Student
order by Sdept,Sage desc;

2021-4-3课程——SQL Server查询【2】

4.聚集函数
①count()统计元组个数

例1:查询学生总数

select count(*)
from Student;

2021-4-3课程——SQL Server查询【2】
例2:查询选修了课程的学生人数(去重之后的,因为一个学生可以选修多门课程,而这里主要是统计都有谁选课了)

select count(distinct Sno)
from SC;

2021-4-3课程——SQL Server查询【2】

②AVG()计算一列值的平均值

例:计算选修1号课程的学生的平均成绩

select avg(Grade)
from SC
where Cno=1;

2021-4-3课程——SQL Server查询【2】

③MAX()计算某一列的最大值

例::查询选修1号课程的学生最高分数

select max(Grade)
from SC
where Cno=1;

2021-4-3课程——SQL Server查询【2】

④SUM求某一列值的总和

例:查询学生201215121选修课程的总学分数

select sum(Ccredit)
from SC,Course
where Sno='201215121'and SC.Cno=Course.Cno

2021-4-3课程——SQL Server查询【2】

5.GROUP BY子句

该子句将查询结果按某一列或多列的值分组,值相等的为一组,分组后聚集函数将作用于每一个组,即每一个组都有一个函数值
例:求各个课程号及相应的选课人数

select Cno,count(Sno)
from SC
group by Cno;

2021-4-3课程——SQL Server查询【2】
该语句对查询结果按照Cno的值分组,所有具有相同Cno值的元组为一组,然后对每一组作用聚集函数count进行计算,以求得该组的学生人数。如果分组后还要求按一定的条件对这些组进行筛选,可以使用having短语指定筛选条件

例:查询选修了三门及以上课程的学生学号

select Sno
from SC
group by Sno
having count(*)>=3;

2021-4-3课程——SQL Server查询【2】

6.遇到的问题:

模糊查询中的下横线通配符无法正常使用,百度查了好久,还没有看到合适的解决办法,希望尽快找到解决办法。

SQL Server 相关文章推荐
SQL SERVER中常用日期函数的具体使用
Apr 08 SQL Server
sqlserver2017共享功能目录路径不可改的解决方法
Apr 16 SQL Server
SQL Server中交叉联接的用法详解
Apr 22 SQL Server
如何有效防止sql注入的方法
May 25 SQL Server
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
Jul 07 SQL Server
SQL SERVER触发器详解
Feb 24 SQL Server
SQLServer RANK() 排名函数的使用
Mar 23 SQL Server
sqlserver连接错误之SQL评估期已过的问题解决
Mar 23 SQL Server
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
May 25 SQL Server
SQL使用复合索引实现数据库查询的优化
May 25 SQL Server
SQL中的连接查询详解
Jun 21 SQL Server
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021-4-5课程——SQL Server查询【3】
SQL Server数据定义——模式与基本表操作
SQL Server基本使用和简单的CRUD操作
SQL Server 数据库实验课第五周——常用查询条件
Sql-Server数据库单表查询 4.3实验课
【HBU】数据库第四周 单表查询
You might like
关于Iframe如何跨域访问Cookie和Session的解决方法
2013/04/15 PHP
PHP 下载文件时自动添加bom头的方法实例
2014/01/10 PHP
php中require和require_once的区别说明
2014/02/27 PHP
理解PHP中的stdClass类
2014/04/18 PHP
php模板引擎技术简单实现
2016/03/15 PHP
javascript知识点收藏
2007/02/22 Javascript
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
2012/01/13 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
bootstrap data与jquery .data
2014/07/07 Javascript
jquery超简单实现手风琴效果的方法
2015/06/05 Javascript
js仿淘宝和百度文库的评分功能
2016/05/15 Javascript
jquery html动态添加的元素绑定事件详解
2016/05/24 Javascript
基于JavaScript代码实现自动生成表格
2016/06/15 Javascript
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
Vue项目中使用better-scroll实现菜单映射功能方法
2019/09/11 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
何时/使用 Vue3 render 函数的教程详解
2020/07/25 Javascript
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
python 七种邮件内容发送方法实例
2014/04/22 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
pycham查看程序执行的时间方法
2018/11/29 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
浅谈h5自定义audio(问题及解决)
2016/08/19 HTML / CSS
美国第二大团购网站:LivingSocial
2016/07/24 全球购物
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
请写出char *p与"零值"比较的if语句
2014/09/24 面试题
诉讼财产保全担保书
2014/05/20 职场文书
十八大宣传标语
2014/10/09 职场文书
2014年劳动部工作总结
2014/12/11 职场文书
民事二审代理词
2015/05/25 职场文书
研究生论文答辩开场白
2015/05/27 职场文书
领导莅临指导欢迎词
2015/09/30 职场文书
小学五年级班主任工作经验交流材料
2015/11/02 职场文书
用Python的绘图库(matplotlib)绘制小波能量谱
2021/04/17 Python