数据库学习总结(六)——查询练习题(1)

这篇博客是我再学习数据库过程中所练习的查询操作题
供大家学习参考用
查询所使用的数据库是teach.sql,已上传资源,下载后导入在数据库中即可,具体步骤文末贴图
练习题可在导入的数据库中运行
建议先自己做再看答案,答案是我自己做的,不是唯一的,如果有问题也欢迎指出~

1、列出XSB表中所有记录的XM、XB和ZY列。
select xm,xb,zy
form xsb;

2、显示所有的专业名称即不重复的专业列。
SELECT DISTINCT zy
from xsb;

distinct去掉重复值

3、显示CJB表中成绩在60到80之间的所有记录。
select *
form cjb
where cj>=60 and cj<=80;

或者
select *
from cjb
where cj between 60 and 80;

4、显示CJB表中成绩为85,86或88的记录。
select * from cjb where cj=85 or cj=86 or cj=88;
select * from cjb where cj in(85,86,88);

5、显示XSB表中“计算机”专业或性别为“女”的同学记录。

select * from xsb where zy=‘计算机’ or xb=‘女’;

6、显示“计算机”专业的学生人数。
select count(*)
from xsb
where zy=‘计算机’;

sum(),avg(),max(),min(),count() 5个统计函数(聚合函数)
这5个函数不能直接在where的条件中使用

7、显示CJB表中的最高分的学生学号和课程号。
select xh,kch
from cjb
where cj=(select max(cj) from cjb);

8、显示课程号以“2”开头的课程的课程号和平均分。
select kch as 课程号 ,avj(cj) as 平均分
from cjb
where kch like ‘2%’

模糊查询
% 任意一串字符 _任意一个字符

9、显示课程号中姓刘”,三个字学生的所有信息
select * from xsb where xm like ‘刘__’

10、显示CJB表中至少有5名学生选修的课程的平均分数。
select kch,ayg(cj)
from cjb
goup by kch
having count(*)>=5;

having 筛选分组 去掉分组之后不满足条件的行,和group by 嵌套使用

11、统计学生表中有多少学生
select count(*)
from xsb;

12、统计各专业男女生的数
select zy,xb,count(XH)
from xsb
GROUP BY zy,xb;

13、请统计各专业姓王的男女生人数,只显示人数多于2人的
select zy,xb,count(xh)
from xsb
where xm like ‘王%’
group by zy,xb,
having count(*)>=2;

如果有group by,则select 后只能放分组相关的列及统计函数,否则会出错或无意义;
如果有统计函数,且统计函数值可能多于一个,此时必须用group by
order by 对查询结果排序

在分组前筛选 where 分组后筛选 having

14、显示CJB表中各门课程的平均分数
SELECT kch,avg(cj)
from cjb
GROUP BY kch;

15、显示最低分大于70,最高分小于90 的XH。
select xh
from cjb
group by xh
having max(cj)<=90 and min(cj)>=70;

SELECT xh,MAX(cj),MIN(cj),COUNT(*)
from cjb
group by xh
having max(cj)<=90 and min(cj)>=70;

16、查询所有学生的 XM、 KCH和CJ列,只显示前面10条记录。
select xsb.xh,xm,kch,cj – 对学号要设定是哪个表,否则是一个模糊值 会出错
from cjb,xsb
where cjb.xh=xsb.xh
limit 0,10; – 0可以省略 偏移量

17、查询所有学生的 XM、 KCM和CJ列。
select xm,kcm,cj
from cjb,kcb,xsb
where cjb.xh=xsb.xh and cjb.kch=kcb.kch;

18、查询所有学生的 XM、 KCM和CJ列,按kcm,cj排序
select xm,kcm,cj
from cjb,kcb,xsb
where cjb.xh=xsb.xh and cjb.kch=kcb.kch – 第一列相等 再按第二列排序
ORDER BY KCM,cj DESC;

19、列出“计算机”专业学生的总平均分。
select avg(cj)
from cjb,xsb
where cjb.xh=xsb.xh and zy=‘计算机’;

20、显示成绩高于学号为“101101”、课程号为“101”的成绩的所有成绩记录。
select *
from cjb
where cj>(select cj from cjb where xh=‘101101’ and kch=‘101’);

21、显示出和学号为“101101”的同学同年出生的所有学生的 XH、XM和 CSSJ列。
select xh,xm,cssj
from xsb
where year(cssj)=(SELECT year(cssj) from xsb where xh=‘101101’);

子查询,先查询括号内部的语句

22、显示“软件工程”课程的学生成绩。
SELECT cjb.*
FROM cjb,kcb
WHERE kcb.kch=cjb.KCH and kcm=‘软件工程’;

23、显示选修人数多于5人的课程名称。

SELECT kcm
from cjb,kcb
where cjb.kch=kcb.KCH
GROUP BY kcb.KCH
HAVING COUNT(*)>=5

KCH前加kcb ,否则是模糊查找
如果有group by,则select 后只能放分组相关的列及统计函数,否则会出错或无意义;
如果有统计函数,且统计函数值可能多于一个,此时必须用group by

24、显示 “101”课程成绩高于“102”课程成绩的同学的学号、姓名和成绩。
数据库是逐行扫描,不在一行要放入一行内
学号相等得两份成绩表交叉相连
SELECT xsb.xh,xm,a.cj,b.cj
from xsb,cjb a,cjb b
where xsb.xh=a.xh and a.xh=b.xh and a.kch=101 and b.kch=102 and a.cj>b.cj;

SELECT xsb.xh,xm,a.cj 101成绩,b.cj 102成绩
from xsb,cjb a,cjb b
where xsb.xh=a.xh and a.xh=b.xh and a.kch=101 and b.kch=102 and a.cj>b.cj;

25、列出没有学生选修的课程的基本信息。

select * from kcb where not EXISTS(SELECT * FROM cjb where kch=kcb.KCH)

SELECT * from kcb
where kch not in (SELECT DISTINCT KCH from cjb)
外连接,把原本舍弃的信息保存下来 right join 右连接,以右边的表为主,全部保存下来

26、请查询所有课程的课程号即其选课人数
SELECT kcb.KCH,COUNT(xh)
FROM cjb
RIGHT JOIN kcb on cjb.kch=kcb.KCH
GROUP BY kch;
ORDER BY COUNT(xh);

27、检索所有学生都选修的课程名称。

SELECT kcm from kcb
where not EXISTS ( SELECT * FROM xsb WHERE not EXISTS (SELECT * from cjb where xh=xsb.xh AND kch=KCb.kch))

导入数据库操作
1.打开MySQL,右击任意一个数据库,选择新建数据库,数据库名为teach
2下载我的资源里上传得到teach.mysql,右击选择打开方式,选择记事本的方式打开,复制里面的全部内容
teach.mysql点这里
3.点击这个新建的数据库,在菜单栏里选择 工具——命令列界面
在这里插入图片描述
4.在打开的窗口里把刚刚复制的文本粘贴上去,然后敲回车,出现如下图情况则成功,刷新一下数据库里面会有题目中涉及的数据表
在这里插入图片描述
5.然后CTRL+Q 新建查询编辑器就可以进行查询操作啦

猜你喜欢

转载自blog.csdn.net/qq_43501509/article/details/85957778