多表连接语法:
where链接:略
from链接:略
例子:
教职工表Teacher(Tno, TName, age, sal, mgr, DNo),TNo为教职工编号,TName为教职工姓名,age年龄,sal为月薪,mgr为教职工的上一级领导的职工号,DNo为部门号;
课程表Course(Cno, CName, CCredits, CTno),Cno为课程编号,CName为课程名字,CCredits为课程学分, CTno为该课程上课老师的编号,其中外键CTno来自表Teacher的Tno键;
学生表Student(Sno, CLno, SName, SSex, SBir, Email),其中Sno为学生学号,CLno为系别编号,SName为学生姓名,SSex为学生性别,SBir为学生出生日期;
学生选课表SC(Sno, Cno, Score)。
- 查询选修了数据库的学生的学号;
- 查询JAVA成绩不及格的学生学号、姓名、成绩;
- 使用内连接查询每个学生及其选修课程情况;
- 使用左连接查询查询每个学生及其选修课程情况,并讨论和上一题结果的区别;
左连接:student表左连接sc表,意味着查询结果集中必须包含student表的全部记录,然后student表按学号与sc表连接,因为00005~00007号无sc表信息,所以插入NULL值代替。 - 使用连接查询选修了张三老师所授课程的学生学号和姓名;
SELECT student.SNo,SName
FROM student INNER JOIN sc ON student.SNo=sc.SNo
INNER JOIN course ON sc.CNo=course.CNo
INNER JOIN teacher ON course.CTno=teacher.Tno
WHERE TName='张三'
6. 查询和马行空在同一个系的学生名字;
7. 查询001号课程的最高分学生学号和姓名;
8. 使用IN查询教师张七的下属教师名字;
9. 使用NOT IN查询未选修”数据库”课程的学生学号;
10. 使用EXISTS查询00014号选修的课程名;
11. 使用NOT EXISTS查询00014号未选修的课程名;
12. 查询选修了两名课程及以上的学生姓名和学号;
13. 查询选修了所有课程的学生学号、姓名;
14. 在选修课001中,使用ALL查询比学号00001和学号00004的成绩都低的学生学号;
SELECT SNO
FROM SC
WHERE CNo='001' AND score<ALL
(SELECT score
FROM SC WHERE (SNO='00001' OR SNO='00004') AND CNo='001')
- 在选修课001中,使用ANY查询比学号00001或学号00004的成绩低的学生学号;
SELECT SNO
FROM SC
WHERE CNo='001' AND score<ANY
(SELECT score
FROM SC WHERE (SNO='00001' OR SNO='00004') AND CNo='001')
- 在选修课001中,查询最高分的学生学号;
- 查询系号为01成绩都及格的学生的姓名和平均成绩,按平均成绩降序排序;
- 分别查询选修了001号课程的学生学号和选修了002号课程的学生学号,使用UNION和UNION ALL把两个查询结果合并起来,并讨论查询结果异同;
因为union将多个查询结果合并起来时,系统自动去掉重复元组;union all将多个查询结果合并起来时,保留重复元组 ,所以上面结果集中的sno值出现重复。 - 查询课程名以英文字母开头的课程信息。
- 查询课程名纯英文字母的课程信息
select *
from course
where CName regexp '^[a-z]*[a-z]$';