前言
本文主要是列举了一些有关于数据查询的练习,比较综合,在学习完相关知识点后可以通过这六道题来检验自测一下
本文中所用到表格
Student
S# | SName | AGE | SEX |
001 | 张小红 | 23 | 女 |
002 | 小芳 | 18 | 女 |
003 | 赵六 | 24 | 男 |
004 | 李华 | 23 | 男 |
005 | 刘晓华 | 28 | 男 |
006 | 刘某 | NULL | NULL |
Course
C# | CName | Teacher |
C01 | 数据库 | 徐老师 |
C02 | Java编程 | 孟博士 |
C05 | 数据结构与算法 | 唐老师 |
StudentCourse
S# | C# | Score |
001 | C01 | 91 |
001 | C02 | 87 |
001 | C03 | 85 |
002 | C01 | 88 |
002 | C02 | 79 |
002 | C03 | NULL |
003 | C01 | 87 |
003 | C02 | 76 |
003 | C03 | 82 |
004 | C01 | 87 |
004 | C02 | 93 |
004 | C03 | 97 |
005 | C01 | NULL |
005 | C02 | 89 |
005 | C03 | 78 |
006 | C01 | 69 |
006 | C02 | NULL |
第一题
题目
统计有学生选修的课程门数
思路
- 统计门数:
COUNT(···)
- 所要查询的表格既要包含课程信息,又要包含学生信息:
StudentCourse
- 选秀课程肯定有重复,要去重:
DISTINCT(···)
完整语句
SELECT COUNT (DISTINCT C#) FROM StudentCourse;
执行结果
第二题
题目
求选修C02课程的女学生的平均年龄
思路
- 需要得到属性值:年龄
- 题目可以看出是“嵌套查询”
- 查询女学生的平均年龄是外层查询,选修C02课程是内层查询
- 外层查询所用表:Student
- 外层查询函数:AVG(AGE)
- 外层查询条件:SEX = '女'
- 内层查询所用表:StudentCourse
- 内层查询条件:C# = 'C02'
- 内外层逻辑关系:在符合外层查询条件下满足课程号为C02:S# IN(内层循环)
完整语句
SELECT AVG(AGE)FROM Student WHERE SEX = '女' AND S# IN (SELECT S# FROM StudentCourse WHERE C# = 'C02');
验证结果
我们将所有符合条件的女学生都查询出来,手动算一下平均值,看是否正确
SELECT * FROM Student WHERE SEX = '女' AND S# IN (SELECT S# FROM StudentCourse WHERE C# = 'C02');
第三题
题目
检索学号比赵六大,且年龄比他小的姓名
思路
- 需要得到的属性值:姓名
- 需要检索的表格:
Student
- 需要先得到的结果(内层查询):赵六的学号和姓名
- 内层查询所用表:
Student
- 内层查询条件:
SName = '赵六'
- 查询条件(内外层逻辑):
WHERE S# > (内层查询) AND AGE < (内层查询)
完整语句
SELECT SName FROM Student WHERE S# > (SELECT S# FROM Student WHERE SName = '赵六') AND AGE < (SELECT Age FROM Student WHERE SName = '赵六');
第四题
题目
求年龄大于女同学平均年龄的男同学的姓名和年龄
思路
- 需要得到属性值:姓名和年龄
- 先要得到的查询结果(内层查询):女同学平均年龄
- 内层查询函数:
AVG(Age)
- 内层查询所用表:
Student
- 内层查询条件:
Sex = '女'
- 内外层逻辑:
WHERE Sex = '男' AND Age > (内层查询)
完整语句
SELECT SName,AGE FROM Student WHERE Sex = '男' AND Age >(SELECT AVG(Age) FROM Student WHERE Sex = '女');
验证结果
为了验证真实性,这里我们也来求一下所有女生的平均年龄
SELECT AVG(Age) FROM Student WHERE Sex = '女';
第五题
题目
检索姓刘的学生的姓名和年龄
思路
- 需要得到的属性值:姓名和年龄
- 需要查询的表格:
Student
- 模糊查询:
LIKE···
- 由于不知道姓名长度,使用通配符
%
完整语句
SELECT SName,Age FROM Student WHERE SName LIKE '刘%';
第六题
题目
在StudentCourse表中检索成绩为空值的学生的学号和课程号
思路
- 需要得到属性值:学号和课程号
- 需要查询的表格:
StudentCourse
- 查询条件:
··· NOT NULL
完整语句
SELECT S#,C# FROM StudentCourse WHERE Score IS NULL;
验证结果
我们在表格中自己查询成绩值为NULL的行,如下图所示
结语
本文题目是博主自己的解题思路,如果有任何问题或者错误欢迎留言评论