学生-班级-教师-课程,四表查询

首先要确定这四个表的表间关系:

1.学生-班级,一个学生只能对应一个班级,一个班级可以对应多个学生,所以在学生表中添加了class_id来对应班级;1-n

2.学生-课程,一个课程对于不同学生有多个分数,所以在学生和课程关系表中添加了score字段,用来获取学生学科分数;学生和课程n-n

3.学生-教师,不设置学生和教师的关系,依赖于班级来进行限定;

4.班级-教师,一个班级可以对应多个教师,一个教师也可以对应多个班级;n-n

5.班级-课程,一个班级可以对应多个课程,一个课程也可以对应多个班级;n-n

6.教师-课程,一个教师可以对应多个课程,一个课程也可以对应多个教师;n-n

所以表结构的构造为4个基本表,5个表间关系,其中学生和班级的关系设置为,在学生表中添加班级编号字段来设置关系,其它三个表设置表间关系表,所以一共需要设置8个表;

学生表(students):id,name,sno,class_id;              班级表(classes):id,name,class_id;                  

教师表(teachers):id,name,teach_id;                    课程表(courses):id,name,course_id; 

学生表                                          班级表                                    教师表                                  课程表
id name sno class_id   id name class_id   id name teach_id   id name course_id
1 张三 140238 1402   1 计算机1402 1402   1 张老师 20001   1 计算机基础 10001
2 李四 140130 1402   2 计算机1401 1401   2 李老师 20002   2 mysql数据库 10002

学生_课程表(stu_course):id,sno,course_id,score;     班级_教师表(class_teach):id,class_id,teach_id;

班级_课程表(class_course):id,class_id,course_id;     教师_课程表(teach_course):id,teach_id,course_id; 

学生_课程表                     班级_教师表                           班级_课程表                            教师_课程表
id sno course_id score   id class_id teach_id   id class_id course_id   id teach_id course_id
1 140238 10001 80   1 1402 20001   1 1402 10001   1 20001 10001
2 140238 10002 75   2 1401 20002   2 1402 10002   2 20002 10002

在进行查询之前,说几个概念,左连接,右连接,内连接;这几个概念在表的n-n的关系上,也就是有两个基本表和一个表间关系表时特别有用,我这里就不再复述;

例如:学生表-学生_课程表-课程表,通过学生表的一个属性,借助于中间的关系表,我可以获取到另外一个表的内容;

1> 获取140238学号所对应的课程信息,一条sql语句就够了,框架语句更容易理解,把表间关系表放在第一个位置,table('表间关系表名');后面as设置别名是为了方便书写,join中满足两个条件也就是学号和表间关系表对应,课程号和表间关系对应;select再次as设置别名,是为了获取到想要的数据,如果同样是name字段,就被其它表覆盖了,这个时候就已经获取了一个id,sname,sno,cname的表了,再次进行select查询,获取结果集。

$course_name = DB::table('stu_course as sc')
            ->join('students as s', 's.sno', '=', 'sc.sno')
            ->join('courses as c', 'c.class_id', '=', 'sc.course_id')
            ->select('c.id', 's.name as sname', 's.sno', 'c.name as cname')
            ->where('sno', '=', '140238')
            ->tosql();
"select `c`.`id`, `s`.`name` as `sname`, `s`.`sno`, `c`.`class_id`, `t`.`name` as `tname` 
from `class_teach` as `c` inner join `students` as `s` on `c`.`class_id` = `s`.`class_id` 
inner join `teachers` as `t` on `c`.`teach_id` = `t`.`teach_id` where `sno` = 140238"

2>通过学号140238,所对应的老师,原生sql语句

"select `c`.`id`, `s`.`name` as `sname`, `s`.`sno`, `c`.`class_id`, `t`.`name` as `tname` 
from `class_teach` as `c` inner join `students` as `s` on `c`.`class_id` = `s`.`class_id`
inner join `teachers` as `t` on `c`.`teach_id` = `t`.`teach_id` where `sno` = 140238"

laravel框架的sql语句

$teach_name = DB::table('class_teach as c')
            ->join('students as s', 'c.class_id', '=', 's.class_id')
            ->join('teachers as t', 'c.teach_id', '=', 't.teach_id')
            ->select('c.id', 's.name as sname', 's.sno', 'c.class_id', 't.name as tname')
            ->where('sno', '=', '140238')
            ->get();

谈谈我对join的连接,它很好的将两个表或者三个表连接成了一个大表,在这个三个表组成的大表中,再去执行判断语句;三个表的话第一个表需要是中间表,作为媒介,不然怎么写满足条件的语句。 还有就是由于这三个表之间的表间字段的重叠,导致一些字段被覆盖,所以需要设置as别名;

3>通过学号查询到对应学生的所有学科成绩

4>查询教师的所有课程,以及课程的平均成绩

猜你喜欢

转载自blog.csdn.net/qq_21885337/article/details/81138824
今日推荐