【数据库作业6】SELECT单表查询

1、字符匹配:

[NOT] LIKE '<匹配串>' [ESCAPE '<换码字符>'];

[3.29]查询学号为201215121的学生的详细情况。
代码语句:

select * from student where sno like'201215121'
select * from student where sno = '201215121'

执行结果:
在这里插入图片描述
注意事项:此处的like与=表达的意思是相同的,但不同于其他编程语言中的赋值等号,相当于比较符号==。

[3.30]查询所有姓刘同学的姓名、学号和性别。
代码语句:

select sname,sno,ssex from student where sname like'刘%'

查询结果:
在这里插入图片描述
此处在原表格的基础上进行了编辑,添加了多个刘姓选项,以表现查询的有效性。

[3.31]查询姓刘且全名为三个汉字的学生的姓名。
查询代码:

select sname from student where sname like'刘__'

查询结果:
在这里插入图片描述
注意事项:此处按课本上来说,本来一个‘_'符号代表了一个字符,但经过多次尝试,我感觉在sql sever中,’刘__'意为:姓刘且不超过三个字符的同学的姓名,并且不论是汉字还是字母均占一个字符。
以下为四个下划线的结果再次验证以上结论:
在这里插入图片描述
[3.32]查询名字中第二个字为“阳”的学生的姓名和学号。
代码语句:

select sname,sno from student where sname like'_阳%'

查询结果:在这里插入图片描述

[3.33]查询所有不姓刘的学生姓名、学号和性别。
代码语句:

select sname,sno,ssex from student where sname not like '刘%'

查询结果:
在这里插入图片描述
注意事项:查询不姓刘的同学的只需在查询姓刘的代码like 前加not即可。特别注意的是:不可以用!=来查询,虽然语法上通过了,但查询出来的结果是错误的,是包含姓刘的同学的。

2、涉及空值的查询:

[3.34]查询DB_Design课程的课程号和学分。
代码语句:

select cno,ccredit from course where cname like'DB\_Design' escape'\'
select * from course

查询结果:
在这里插入图片描述
注意事项:最后一定要加ESCAPE,表示出了反斜线的部分为匹配串

[3.35]查询以“DB_”开头,且倒数第三个字符为i的课程的详细情况。
代码语句:

select * from course where cname like 'DB\_%i__' escape '\'
select * from course

查询结果:
在这里插入图片描述
若不加escape,则_代表的仍然是一个任意字符。

select * from course where cname like 'DB\_%i__' 
select * from course

查询结果:
在这里插入图片描述

[3.36]某些学生选修课程后没有参加考试,所以有选课记录,但没 有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
代码语句:

select sno,cno from sc where grade is null
select * from sc

查询结果:
在这里插入图片描述

注意事项:涉及空值的查询——is null 或is not null,这里的is不能用 = 代替。而且如果用了=,sql sever不会报错,但查询的结果是错误的!!!

[3.37]查所有有成绩的学生学号和课程号。

select sno,cno from sc where grade is not null
select * from sc

查询结果:
在这里插入图片描述

3、多重条件的查询,逻辑运算符:and和 or来连接多个查询条件,and的优先级高于or,可以用括号改变优先级。

[3.38]查询计算机系年龄在20岁以下的学生姓名。
代码语句:

select sname from student where sdept = 'cs' and sage<20
select *from student

查询结果:
在这里插入图片描述另外,上一章中的in,在此处可与or进行替换使用。
如[3.27]查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。
使用in代码:

select sname,ssex from student where sdept in('cs','ma')
select *from student

使用or代码:

select sname,ssex from student where sdept='cs' or sdept = 'ma'
select *from student

查询的结果均为:
在这里插入图片描述

4、order by子句(排序)可以按一个或多个属性列排序:
升序:ASC;
降序:DESC;
缺省值为ASC
对于空值,排序时显示的次序由具体系统实现来决定。

[3.39]查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
代码语句:

select sno,grade from sc where cno = '3' order by grade desc
select * from sc

查询结果:
在这里插入图片描述
[3.40]查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。

select * from student order by sdept asc,sage desc;

查询结果:
在这里插入图片描述
注意事项:这里有多个属性列,则先按第一个排列,第一个相同的情况下,按第二个属性排列。

6、聚集函数:
统计元组个数 :COUNT(*)
统计一列中值的个数 :COUNT([DISTINCT|ALL] <列名>)
计算一列值的总和 :SUM([DISTINCT|ALL] <列名>)
计算一列值的平均值 :AVG([DISTINCT|ALL] <列名>)
求一列中的最大值和最小值:MAX([DISTINCT|ALL] <列名>)、MIN([DISTINCT|ALL] <列名>)

[3.41]查询学生总人数。
代码语句:

select count(*) from student
select * from student

查询结果:
在这里插入图片描述

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

select count(distinct sno) from sc
select * from sc

查询结果:
在这里插入图片描述

[3.43]计算1号课程的学生平均成绩。
代码语句:

select avg(grade) from sc where cno='1'
select * from sc

查询结果:
在这里插入图片描述

[3.44]查询选修3号课程的学生最高分数。
代码语句:

select max(grade) from sc where cno='3'
select * from sc

查询结果:
在这里插入图片描述
[3.45]查询学生201215122选修课程的总学分数。
代码语句:

select * from sc,course
where sno = '201215122' and sc.cno = course.cno;

select sum(ccredit) from sc,course 
where sno = '201215122' and sc.cno = course.cno;

查询结果:
在这里插入图片描述
注意事项:此处需要用到两个表:学生选修课程表和学分计算表,先将sc表和course表做一下等值连接sc.cno = course.cno,然后在做选择。

7、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;

查询结果:
在这里插入图片描述
[3.48]查询平均成绩大于等于80分的学生学号和平均成绩
代码语句:

select sno,avg(grade) from sc 
group by sno having avg(grade)>=80

查询结果:
在这里插入图片描述
注意:以下语句是错误的,因为where子句中不能用聚集函数作为条件表达式

select sno,avg(grade) from sc 
where avg(grade)>=80 group by sno;

本次作业完成用时一个半小时,基本上每个题型完成的还是比较顺利,没有太大问题。

原创文章 25 获赞 20 访问量 9742

猜你喜欢

转载自blog.csdn.net/Freedomhy/article/details/104872837