首先要确定这四个表的表间关系:
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>查询教师的所有课程,以及课程的平均成绩