MySQL 查询练习
查询练习
准备数据
| |
1 到 10
| |
分组计算平均成绩
查询每门课的平均成绩。
| |
分组条件与模糊查询
查询 score 表中至少有 2 名学生选修,并以 3 开头的课程的平均分数。
| |
分析表发现,至少有 2 名学生选修的课程是 3-105 、3-245 、6-166 ,以 3 开头的课程是 3-105 、3-245 。也就是说,我们要查询所有 3-105 和 3-245 的 degree 平均分。
| |
多表查询 - 1
查询所有学生的 name,以及该学生在 score 表中对应的 c_no 和 degree 。
| |
通过分析可以发现,只要把 score 表中的 s_no 字段值替换成 student 表中对应的 name 字段值就可以了,如何做呢?
| |
多表查询 - 2
查询所有学生的 no 、课程名称 ( course 表中的 name ) 和成绩 ( score 表中的 degree ) 列。
只有 score 关联学生的 no ,因此只要查询 score 表,就能找出所有和学生相关的 no 和 degree :
| |
然后查询 course 表:
| |
只要把 score 表中的 c_no 替换成 course 表中对应的 name 字段值就可以了。
| |
三表关联查询
查询所有学生的 name 、课程名 ( course 表中的 name ) 和 degree 。
只有 score 表中关联学生的学号和课堂号,我们只要围绕着 score 这张表查询就好了。
| |
只要把 s_no 和 c_no 替换成 student 和 srouse 表中对应的 name 字段值就好了。
首先把 s_no 替换成 student 表中的 name 字段:
| |
再把 c_no 替换成 course 表中的 name 字段:
| |
子查询加分组求平均分
查询 95031 班学生每门课程的平均成绩。
在 score 表中根据 student 表的学生编号筛选出学生的课堂号和成绩:
| |
这时只要将 c_no 分组一下就能得出 95031 班学生每门课的平均成绩:
| |
子查询 - 1
查询在 3-105 课程中,所有成绩高于 109 号同学的记录。
首先筛选出课堂号为 3-105 ,在找出所有成绩高于 109 号同学的的行。
| |
子查询 - 2
查询所有成绩高于 109 号同学的 3-105 课程成绩记录。
| |
YEAR 函数与带 IN 关键字查询
查询所有和 101 、108 号学生同年出生的 no 、name 、birthday 列。
| |
多层嵌套子查询
查询 '张旭' 教师任课的学生成绩表。
首先找到教师编号:
| |
通过 sourse 表找到该教师课程号:
| |
通过筛选出的课程号查询成绩表:
| |
多表查询
查询某选修课程多于5个同学的教师姓名。
首先在 teacher 表中,根据 no 字段来判断该教师的同一门课程是否有至少 5 名学员选修:
| |
查看和教师编号有有关的表的信息:
| |
我们已经找到和教师编号有关的字段就在 course 表中,但是还无法知道哪门课程至少有 5 名学生选修,所以还需要根据 score 表来查询:
| |
根据筛选出来的课程号,找出在某课程中,拥有至少 5 名学员的教师编号:
| |
在 teacher 表中,根据筛选出来的教师编号找到教师姓名:
| |
子查询 - 3
查询 “计算机系” 课程的成绩表。
思路是,先找出 course 表中所有 计算机系 课程的编号,然后根据这个编号查询 score 表。
| |
UNION 和 NOTIN 的使用
查询 计算机系 与 电子工程系 中的不同职称的教师。
| |
ANY 表示至少一个 - DESC ( 降序 )
查询课程 3-105 且成绩 至少 高于 3-245 的 score 表。
| |
表示所有的 ALL
查询课程 3-105 且成绩高于 3-245 的 score 表。
| |
复制表的数据作为条件查询
查询某课程成绩比该课程平均成绩低的 score 表。
| |
子查询 - 4
查询所有任课 ( 在 course 表里有课程 ) 教师的 name 和 department 。
| |
条件加组筛选
查询 student 表中至少有 2 名男生的 class 。
| |
NOTLIKE 模糊查询取反
查询 student 表中不姓 “王” 的同学记录。
| |
YEAR 与 NOW 函数
查询 student 表中每个学生的姓名和年龄。
| |
MAX 与 MIN 函数
查询 student 表中最大和最小的 birthday 值。
| |
多段排序
以 class 和 birthday 从大到小的顺序查询 student 表。
| |
子查询 - 5
查询 “男” 教师及其所上的课程。
| |
MAX 函数与子查询
查询最高分同学的 score 表。
| |
子查询 - 6
查询和 “李军” 同性别的所有同学 name 。
| |
子查询 - 7
查询和 “李军” 同性别且同班的同学 name 。
| |
子查询 - 8
查询所有选修 “计算机导论” 课程的 “男” 同学成绩表。
需要的 “计算机导论” 和性别为 “男” 的编号可以在 course 和 student 表中找到。
| |
按等级查询
建立一个 grade 表代表学生的成绩等级,并插入数据:
| |
查询所有学生的 s_no 、c_no 和 grade 列。
思路是,使用区间 ( BETWEEN ) 查询,判断学生的成绩 ( degree ) 在 grade 表的 low 和 upp 之间。
| |
连接查询
准备用于测试连接查询的数据:
| |
分析两张表发现,person 表并没有为 cardId 字段设置一个在 card 表中对应的 id 外键。如果设置了的话,person 中 cardId 字段值为 6 的行就插不进去,因为该 cardId 值在 card 表中并没有。
内连接
要查询这两张表中有关系的数据,可以使用 INNER JOIN ( 内连接 ) 将它们连接在一起。
| |
注意:
card的整张表被连接到了右边。
左外连接
完整显示左边的表 ( person ) ,右边的表如果符合条件就显示,不符合则补 NULL 。
| |
右外链接
完整显示右边的表 ( card ) ,左边的表如果符合条件就显示,不符合则补 NULL 。
| |
全外链接
完整显示两张表的全部数据。
| |