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
。
|
|
全外链接
完整显示两张表的全部数据。
|
|