当前位置:主页 > 查看内容

【数据库实验】 单表查询

发布时间:2021-04-30 00:00| 位朋友查看

简介:[例3.19] 查全体学生的姓名及其出生年份。 select Sname , 2021 - Sage from student ; [例3.20] 查询全体学生的姓名、出生年份和所在的院系要求用小写字母表示系名。 select Sname , 出生月份 , 2021 - Sage , LOWER ( Sdept ) from student ; 这里还可以使……
[例3.19] 查全体学生的姓名及其出生年份。
select Sname,2021-Sage
from student;

在这里插入图片描述

[例3.20] 查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示系名。
select Sname,'出生月份:',2021-Sage,LOWER(Sdept)
from student;

这里还可以使用列的别名。具体用法就是在查询的列名后面加上那个别名,空格隔开。
例如:
在这里插入图片描述

在这里插入图片描述
大写函数:UPPER

查询行

[例3.21] 查询选修了课程的学生学号。

关于all修饰和distinct修饰,之前提到过,distinct就是去掉重复的。
缺省为distinct。
在这里插入图片描述

[例3.22] 查询计算机科学系全体学生的名单。
select Sname
from student 
where Sdept='CS';

在这里插入图片描述

[例3.23]查询所有年龄在20岁以下的学生姓名及其年龄。
select Sname
from student
where Sage<20;

在这里插入图片描述

[例3.24]查询考试成绩有不及格的学生的学号。
select Sno
from SC
where Grade<60;

在这里插入图片描述

[例3.25] 查询年龄在18~23岁(包括18岁和23岁)之间的学生的姓名、系别和年龄
select Sname , Sdept,Sage
from student
where Sage between 18 and 23;

在这里插入图片描述

[例3.26] 查询年龄不在20~23岁之间的学生姓名、系别和年龄
select Sname , Sdept,Sage
from student
where Sage not between 18 and 23;

IN NOT IN

谓词:IN <值表>, NOT IN <值表>
[例3.27]查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。
select Sname,Ssex
from student 
where Sdept in ('cs','ma','is');

在这里插入图片描述

[例3.28]查询既不是计算机科学系、数学系,也不是信息系的学生的姓名和性别。
select Sname,Ssex
from student 
where Sdept not in ('cs','ma','is');

模糊查询 LIKE

谓词: [NOT] LIKE<匹配串>[ESCAPE<换
码字符>]

注意两点:

  1. 通配符:% _,%表示的是长度为任意(包括0)的字符串,_表示的是一个字符。
  2. 关于转义字符,这里叫换码字符:比如我们要查询的字符串里真的有%号这个字符,那我们就使用下面这种形式处理:WHERE Cname LIKE 'DB\%Design' ESCAPE '\' ;表示的是\后面的那个字符是真正的字符而不是通配字符。
[例3.29] 查询学号为201215130的学生的详细情况。
select *
from student
where Sno like '201215130';

在这里插入图片描述
这样这样写其实没什么意义(doge),直接Sno=就可

[例3.30] 查询所有姓梁学生的姓名、学号和性别。
select Sname,Sno,Ssex
from student
where Sname like '梁%';

在这里插入图片描述

[例3.31] 查询姓"欧阳"且全名为三个汉字的学生的姓名。
select Sname '姓名'
from student
where Sname like '欧阳_';

注意:关于编码问题,我们在c语言的时候就遇到过,当时一个汉字占两个字符,因为c语言是asc编码,而我们在学Java的时候,Java用的Unicode编码,所以每个汉字也是一个char(但这时char是两个字节),所以这里应该是Unicode或者gbk的。
在这里插入图片描述
然后是关于SQL sever里的char他是固定的长度,所以实际的“欧阳修”,由于是nchar(10),他在里面存的是 “欧阳修 ”,所以按理说 like’欧阳_'应该查询不成功,但是想必sql server做了处理。

下图,当like’欧阳_'或者’欧阳修___________'都可以查到’欧阳修’。
在这里插入图片描述

[例3.32] 查询名字中第2个字为"阳"字的学生的姓名和学号。
select Sname '姓名'
from student
where Sname like '_阳%'

在这里插入图片描述

[例3.33] 查询所有不姓梁的学生姓名、学号和性别。
select Sname '姓名',Sno '学号',Ssex '性别'
from student
where Sname not like '梁%'

在这里插入图片描述

[例3.34] 查询DB_Design课程的课程号和学分。
select Cno , Ccredit
from course
where Cname like 'DB/_Design' escape '/';
[例3.35] 查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。
select Cno , Ccredit
from course
where Cname like 'DB/_%i__' escape '/';

NULL

[例3.36] 某些学生选修课程后没有参加考试,所以有选课记录,但没 有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
select Sno,Cno
from sc
where Grade is null;

“注意:IS” 不能用 “=” 代替
在这里插入图片描述

[例3.37] 查所有有成绩的学生学号和课程号。
select Sno,Cno
from sc
where Grade is not null;

多重条件查询

[例3.38] 查询计算机系年龄在20岁以下的学生姓名。
select Sname
from student 
where Sdept='CS' AND Sage <20
[例3.27] 查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别
select Sname 
from student 
where Sdept ='cs' OR Sdept ='ma' OR Sdept ='is'

ORDER BY子句

注意:可以按照好几个属性排序,有优先级。(类似写的cmp,asc升序;desc降序,默认为asc);对于空值,由具体系统实现决定(也就是说没有规定)

[例3.39]查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列
select Sno,Grade
from sc
where Cno='3'
order by grade desc

在这里插入图片描述

[例3.40]查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
select *
from student
order by Sdept ,Sage desc

在这里插入图片描述

聚集函数

常用函数

? 统计元组个数 COUNT(*) 
? 统计一列中值的个数 COUNT([DISTINCT|ALL] <列名>) 
? 计算一列值的总和 SUM([DISTINCT|ALL] <列名>) 
? 计算一列值的平均值 AVG([DISTINCT|ALL] <列名>) 
? 求一列中的最大值和最小值
MAX([DISTINCT|ALL] <列名>)
MIN([DISTINCT|ALL] <列名>)
[例3.41] 查询学生总人数。
select count(*)
from student ;

在这里插入图片描述

[例3.42] 查询选修了课程的学生人数。
select count(distinct sno) '学生的个数'
from sc ;

在这里插入图片描述
在这里插入图片描述

[例3.43] 计算1号课程的学生平均成绩。
select avg(grade)'平均分'
from sc 
where cno=1;

在这里插入图片描述

[例3.44] 查询选修1号课程的学生最高分数。
select max(grade)'最高分'
from sc 
where cno=1;

在这里插入图片描述

[例3.45 ] 查询学生201215129选修课程的总学分数。
select sum(Ccredit)
from sc,course
where sc.cno=course.cno 

在这里插入图片描述

在这里插入图片描述
关于这里还不太懂,应该是俩表连接了
在这里插入图片描述

GROUP BY子句

细化聚集函数的作用对象
? 如果未对查询结果分组,聚集函数将作用于整个查询结果
? 对查询结果分组后,聚集函数将分别作用于每个组
? 按指定的一列或多列值分组,值相等的为一组
[例3.46] 求各个课程号及相应的选课人数。
select Cno,count(sno) '每个课程里的学生的数目'
from sc
group by Cno;

在这里插入图片描述

[例3.47] 查询选修了2门以上课程的学生学号。
select sno
from sc
group by Sno
having count (*) >2;

在这里插入图片描述
终于写完了,昨天写了一半。
关于许多细节,有很多不明白的地方。

;原文链接:https://blog.csdn.net/Chantec/article/details/115413433
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐