数据库select 查询

说明:本篇博客操作的基本表是同上一篇博客,不在赘述

例 3.29:
查询一个特定的学号的学生信息
首先引入一个知识,模糊查询(某种程度上有点类似于正则表达式)。

[not ]like '<匹配串>' [escape '<换码字符>']

匹配串中可以有通配符’%’,’’,’%'表示任意长度的任意字符,‘’表示任意的单个字符,转码字符可以匹配通配符。下面有例子。
参考文档关于escape的用法

select Sname
from TEST.Student
where Sno like '2018'

例3.30:
查询所有的刘同学的姓名,学号

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

例3.31
查询刘同学并且只有两个字:
给出两个例子:
(1)

select Sno,Sname
from TEST.Student
where Sname like'刘__';

在这里插入图片描述
(2)

select Sno,Sname
from TEST.Student
where Sname like'刘_';

在这里插入图片描述
两个例子的唯一区别就是’’ ,第一个是2个,第二个是1个,但是结果是不同的做一个说明:在字符集ASCII时,一个汉字需要两个’_’,但是GBK就需要一个’_’。
在这里插入图片描述
这就解释了上面的差异,不过第一个代码中包含两个’_'那为什么也会匹配一个汉字,根据实验’刘
’也可以匹配‘刘’后的0-1个字符(至于为什么会匹配0个字符,我也没有想清楚)。
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。
字符集
【例3.32 】查询学号第二个字为“子”的学生学号,姓名

select Sno,Sname
from TEST.Student
where Sname like '_子%'

在这里插入图片描述
说明 这个例子如果写成’子_'那么会匹配 子后面0-1个字符,但是‘’在之前会匹配只会一个不会匹配0个。
为了检验’
'在中间会不会匹配0个字符做了一个实验:
在这里插入图片描述
(上图是Student表的内容)

select Sno,Sname
from TEST.Student
where Sname like '刘_子'

结果如图:
在这里插入图片描述
所以’_'在中间不会有匹配
例【3.33】 查询不姓刘的学生的学号姓名

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

【例3.34】查询课程为DB_Design的课程号以及学分

select Cno,Cpno
from TEST.Course
where Cname like 'DB\_Design'escape '\'

escape之后的称为是转码字符,再看这个例子

select Cno,Cpno
from TEST.Course
where Cname like 'DBC_Design'escape 'C'

在这里插入图片描述
escape规定了转码字符,那么第二个例子使用的是’C’,也就是转码字符可以不只是‘\’。
【例3.35】查询以‘DB_’开头倒数第三个为i的课程的信息。

select Cno,Cpno,Cname
from TEST.Course
where Cname like 'DB\_%i__' escape '\'

在这里插入图片描述
原因同【例3.31】不在赘述。
例【3.36】
查询缺少成绩的 学生的信息

select Sno,Cno
from TEST.SC
where Grade is NULL

例【3.37】
查询所有的学生的有成绩的学生的信息

select Sno,Cno
from TEST.SC
where Grade is  not NULL

【例3.38】
查询计算机系的年龄在20 岁以下的学生的姓名

select Sname
from TEST.STudent 
where Sdept='CS' and Sage <20
--区别于编程语言的‘==’ 

【例 3.39】

select Sno,Grade
from TEST.SC 
where Cno='3'
order by Grade desc

在这里引入一个知识点:
order by 子句 就是排序(说到排序 ,推荐一个不错的文章 数据结构排序
ASC 是升序,DESC降序 ,默认的ASC,对于NULL ,需要看具体的系统。
【例3.40】
查询学生的全体情况,专业升序,同一个专业的按照年龄降序

select *
from Student 
order by Sdept ASC,Asge DESC 

这个是先按照专业排序,之后是年龄。具体的是如何实现的我也不知道
【例3.41】
查询学生人数
再次引入知识点:
聚集函数:
统计元组的个数:count(*)
统计某个属性的个数:Count([distinct|all] <列名>)
计算属性的总和: Sum([distinct|all]<列名>)
计算属性的平均值:avg( [distinct |all] <列名>)
求一列的最大值最小值:max([distinct|all]<列名>)min([distinct |all]<列名>)
关于distinct 以及all上一篇有写到,不在赘述。

select count(*)
from TEST.Student

[例3.42]
查询选修了课程的学生人数

select count(distinct Sno)
from TEST.SC
--因为一个学生可能不仅仅选了一门课程

【例 3.43】
1号课程的平均成绩:

select avg(Grade)
from TEST.SC
where Cno='1'

[例 3.44]

select max(Grade)
from TEST.Student
where Cno='1'

[例 3.45]
查询某个学生的课程的总成绩

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

“where Sno=‘2018’ and TEST.SC.Cno=TEST.Course.Cno ”这是选择的条件,其中‘TEST.SC.Cno=TEST.Course.Cno’可以理解将两个关系做一次连接( \Join ),另外为了区别于两个关系具有相同属性名,使用了’.’。
再看一个例子:

在这里插入图片描述
【例3.46】
每个课程的人数以及选课人数
再次引入知识点:
group by 子句,这个是做划分使用的子句

select Cno, count(Sno)
from TEST.Sc
group by Cno

在这里插入图片描述
再做一个实验:
在这里插入图片描述
聚合函数会根据划分的不同组进行操作
【3.47】
引入:having
having 子句参考文档

select Sno
from TEST.SC
group by Sno
having count(*)>3
--where 作用于分组之前,having用于分组之后 
--这个例子里面先按学号分组,在选择个数>3的学生

【例3.48】

select Sno,avg(Grade)
from TEST.SC
group by Sno
having avg(Grade)>90

在这里插入图片描述
大致过程是先分组,计算每一组内的成绩,最后选择合格的学生学号以及成绩。

总结

(1)like 语句,用于模糊选择,其中% 表示任意长度,‘'代表任意的一个字符,不同字符集对于‘’在汉字的匹配方面不同。escape表示转码字符,可以不仅仅是‘\’
(2)order by 排序使用
(3)聚合函数 针对于属性进行的操作,可以是整个关系的,也可以是分组的
(4) group by 根据元组的 某个属性分组
(5)having 是选择的,可以与聚合函数一起使用,与where 的不同在 having 是在group by 之后。

发布了9 篇原创文章 · 获赞 8 · 访问量 5873

猜你喜欢

转载自blog.csdn.net/weixin_44724691/article/details/104821802