实验二 单表查询


在实验一创建库、表、录入数据的基础上,完成下列操作。

1.查询年级为2016的所有学生的学号、姓名和年级。

select sno,sname,Ssex
from Students
where grade='2016';

分析:要显示的是学生的学号姓名班级,所以用select sno,sname,Ssex,这些属性都在Students表中,所以可以直接选取from Students,要选择的条件是年级为2016的,条件选择用where

2. 查询课时为64或48的课程名称和学时。

select Cname,Chour
from Courses
where Chour=64 or Chour=48;

分析:我们需要的是课程名称(cname)和学时(chour)这两个属性都在courses表中,所以可以直接选取courses表(from Courses),条件是chour为64或48,where条件可以用比较运算符or连接

常用的比较运算符:

运算符 含义
=, >,<,>=,<=, !=,> 比较大小
AND, OR, NOT 多重条件
IN 确定集合
BETWEEN AND 确定范围
IS NULL 空值
LIKE 字符匹配

3.查询所有被选课程的课程号。

select distinct cno
from STC;

DISTINCT:返回所有不重复行,不写默认是ALL(返回所有行,包括重复行)

4.查询所有课中含有“数”的课程号及课程名称。

select Cno,Cname
from Courses
where Cname LIKE '%数%';

此条涉及到模糊查询字符串匹配

字符串匹配

格式:属性名 LIKE ‘<匹配串>’
属性名 NOT LIKE ‘<匹配串>’
例如

Cname LIKE '%数%'  #含有“数”的
Cname NOT LIKE '%数%'  #不含有“数”的 例如 数学 高数 只要字符串里有‘数’都符合条件
Cname LIKE '数%'  #以“数”开头的,例如 数学 数字 ,但是‘高数’不符合,因为‘高数’是高开头的

◆<匹配串>=字符常量+通配符
两种通配符:
%:代表任意长度(长度可以为0)的字符串
_:代表任意单个字符

5. 统计所有教师的平均工资。

select AVG(salary)
from Teachers

SQL 拥有很多可用于计数和计算的内建函数。
AVG() 函数返回数值列的平均值。
点击查看更多函数

6. 查询没有参加考试的学生学号。

select Sno
from STC
where score is null;

没有参加考试的学生,也就是成绩为空的学生

注意:

值为空,score is null 中的null不能加引号 ‘ ’ ,加了引号后表示字符串null,这种写法是错误的score is 'null'

7. 查询每位教师所任课程的平均成绩,按平均成绩降序排列(提示:每个教师只担任一门课程)。

select Tno,avg(score)
from STC
group by Tno
order by avg(score) desc;
代码 含义
select Tno,avg(score) 选择(select)显示平均成绩(avg(score))和教师编号(Tno),
group by Tno 根据教师编号(Tno)来分组
order by avg(score) desc 根据平均成绩,降序(desc)

8.统计各个课程的选课人数和最高成绩。

select count(*),max(Score)
from STC
group by Cno
代码 含义
group by Cno 统计各个课程的东西,所以要以课程号来分组
count(*) 统计选课人数,也就是,在stc表中统计每一个课程号出现的次数count(cno),因为已经以cno分组了(group by Cno),所以可以写成count(*),count(cno)也不错
max(Score) 最高成绩可以用max函数

9.查询至少选修了3门课程的学生编号和选修课程数。

select Sno,count(Cno)
from STC
group by Sno having count(Cno)>=3;

要以学号来分组,统计每个学号的课程号个数。
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。
HAVING 子句可以让我们筛选分组后的各组数据。.

10.查询选修了B001或B0 02任意一门课程的学生学号。

select distinct sno
from STC
where Cno='B001' or Cno='B002';

11. 查询至少被三名学生选修的课程号。

select Cno
from STC
group by Cno HAVING count(Cno)>=3;

总结

  1. 你select后面跟的东西,就是你想要显示的东西,例如:select Cno,那结果就会只显示Cno的内容
  2. 使用group by时,不能用where,WHERE 关键字无法与聚合函数一起使用,要改用having,HAVING 子句可以让我们筛选分组后的各组数据
  3. count()统计括号中内容的个数,COUNT (*) 函数返回表中的记录有几条,常常和group by连用,分组后统计以group by分组的每个内容的个数,例如,我们根据cno分组,group by cno,COUNT(*) 就会返回每一种cno的个数

猜你喜欢

转载自blog.csdn.net/qq_25887493/article/details/124074176