题目:学生们参加各科测试的次数
测试样例
- 结果需要对学生student_id和姓名namestudent_name进行排序
关于笛卡尔积的解释
解题步骤
- 通过笛卡尔积(CROSS JOIN)连接学生表Students、科目表Subjects (表1)
select * from Students a cross join Subjects b
- 将表1 与 考试表 Examinations 进行左连接
(select * from Students a cross join Subjects b) left join Examinations e on a.student_id=e.student_id and b.subject_name =e.subject_name
- 按照条件查询结果
select a.student_id,a.student_name,b.subject_name,count(e.subject_name) attended_exams from (Students a cross join Subjects b) left join Examinations e on a.student_id=e.student_id and b.subject_name =e.subject_name group by a.student_id , b.subject_name order by a.student_id , b.subject_name
笛卡尔积
笛卡尔积的解释
一:笛卡尔积的解释 例 给出二个域: 假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为
| (a,0) | (a,1) | (a,2) |
|---|---|---|
| (b,0) | (b,1) | (b,2) |
类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。 例 给出三个域: D1=SUPERVISOR ={ 张清玫,刘逸 } D2=SPECIALITY={计算机专业,信息专业} D3=POSTGRADUATE={李勇,刘晨,王敏} 则D1,D2,D3的笛卡尔积为D: D=D1×D2×D3 =
| (张清玫,计算机专业,李勇) | (张清玫,计算机专业,刘晨) | (张清玫,计算机专业,王敏) |
|---|---|---|
| (张清玫,信息专业,李勇) | (张清玫,信息专业,刘晨) | (张清玫,信息专业,王敏) |
| (刘逸,计算机专业,李勇) | (刘逸,计算机专业,刘晨) | (刘逸,计算机专业,王敏) |
| (刘逸,信息专业,李勇) | (刘逸,信息专业,刘晨) | (刘逸,信息专业,王敏) |
笛卡尔积在sql中的原理
- MySQL的多表查询(笛卡尔积原理)
- 先确定数据要用到哪些表。
- 将多个表先通过笛卡尔积变成一个表。
- 然后去除不符合逻辑的数据(根据两个表的关系去掉)。
- 最后当做是一个虚拟表一样来加上条件即可。