文章目录
第1关:自然连接
任务描述
本关任务:使用自然连接求选修了严敏老师的数学分析课程的学生的姓名、课程名称、教师名和成绩。
相关知识
为了完成本关任务,你需要掌握:如何使用自然连接。
自然连接
通过 MySql 自己的判断完成连接过程,不需要指定连接条件。MySql 会使用表内的,相同的字段,作为连接条件。
自然连接分为内外之分,内连接 natural join 和
左外 natural left join、右外 natural right join 连接。
答案
use teachingdb;
/****请在此编写代码,操作完毕之后点击评测******/
/**********Begin**********/
-- 自然连接
-- ... 表示省略相似, []表示可写可不写
-- select * from 表1 natural join 表2 natural join ... [where]
select s.sname,c.cname,t.tname,sc.grade
from teach t natural join score sc natural join course c natural join student s
where t.tname = '严敏' && c.cname = '数学分析';
/**********End**********/
第2关:等值连接
任务描述
本关任务:使用等值连接求选修了严敏老师的数学分析课程的学生的姓名、课程名称、教师名和成绩。
相关知识
等值连接
- 当连接运算符为等号时为等值连接
语法如下:
SELECT 查询的列表
FROM 表1 别名1,表2 别名2
WHERE 表1.关键词= 表2.关键词;
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序ASC,DESC】
答案
use teachingdb;
/****请在此编写代码,操作完毕之后点击评测******/
/**********Begin**********/
-- select * from student;
-- select s.sname, c.cname, t.tname, sc.grade
-- from student s, score sc, course c, teach t
-- where t.tname = '严敏' && c.cname = '数学分析'
-- 等值连接
-- select * from 表1,表2,... where 表1.字段 = 表2.字段 && ...
-- 本案例中score表刚好可以连接其余表
select s.sname, c.cname, t.tname, sc.grade
from student s, score sc, course c, teach t
where s.sno = sc.sno && sc.tno = t.tno && sc.cno = c.cno && t.tname = '严敏' && c.cname = '数学分析';
/**********End**********/
第3关:JOIN连接
任务描述
本关任务:使用 JOIN 连接求选修了严敏老师的数学分析课程的学生的姓名、课程名称、教师名和成绩。
相关知识
JOIN 连接(默认为内连接)
取得两个表中存在连接匹配关系的记录。
语法如下:
select * from A inner join B on A.name = B.name;
答案
use teachingdb;
/****请在此编写代码,操作完毕之后点击评测******/
/**********Begin**********/
-- join 连接 (内连接)
-- select * from 表1 join 表2 on 表1.字段 = 表2.字段
select sname, cname, tname, grade
from score s
join student st on s.sno = st.sno
join course c on s.cno = c.cno
join teach t on s.tno = t.tno
where t.tname = '严敏' && c.cname like '数学分析';
/**********End**********/
第4关:自身连接查询
任务描述
本关任务:使用自身连接查询求年龄大于’刘东明’ 的所有学生的姓名与出生日期。
相关知识
为了完成本关任务,你需要掌握如何使用自连接。
自连接
MySQL 自连接操作,没有特定的关键字,所谓自连接指的是同一个表不同实例之间的 join 操作。
特征:
自连接是同一个表不同实例的连接操作;
自连接必须指定别名(aliasName)区分不同实例。
答案
use teachingdb;
/****请在此编写代码,操作完毕之后点击评测******/
/**********Begin**********/
-- select * from student;
-- 自身连接
-- select * from 表 别名, 表 别名, ... , [where];
select b.sname,b.birthday
from student a, student b
where a.sname like '刘东明' && a.birthday > b.birthday
/*select sname, birthday
from student
where birthday <
(
select birthday
from student
where sname = '刘东明'
);*/
/**********End**********/
第5关:外部连接查询
任务描述
本关任务:使用外部连接查询求未选修任何课程的学生的学号和姓名。
相关知识
为了完成本关任务,你需要掌握:
1.什么是外连接查询;
2.如何使用外连接查询。
外连接查询
以某张表为主,取出里面的所有记录,然后每条与另外一张表进行连接,不管能不能匹配上条件,最终都会保留。能匹配,正确保留;不能匹配,其它表的字段都置空(null),称为外连接。
外连接查询分为左外连接查询和右外连接查询;
关键字:left/right [outer] join … on。
语法:
表1 left/right [outer] join 表2 on 表1.字段=表2.字段
语法解释:
左外连接:在内连接的基础上,还包含表1中所有不符合条件的数据行,并在其中的表2列填写 NULL;
右外连接:在内连接的基础上,还包含表2中所有不符合条件的数据行,并在其中的表1列填写 NULL。
答案
use teachingdb;
/****请在此编写代码,操作完毕之后点击评测******/
/**********Begin**********/
-- select * from 表1 left join 表2 on 表1.字段 = 表2.字段 [where]
select s.sno,s.sname
from student s left join score sc on s.sno = sc.sno
where sc.sno is null;
/*select sno, snaem
from student
where sno not in
(
select sno
from score
);*/
/**********End**********/