数据库重要的是结构,用小学语句拆分,数据库题目也可以很简单
数据库重要的是结构,用小学语句拆分,数据库题目也可以很简单
1,数据库结构:(学生数据表)
题目:查询与学生“热巴”密码相同的同学信息。
分析:
同学信息:(学生表)--密码:(学生表)--热巴【学生姓名】:(学生表)
查询顺序反过来:
学生姓名是热巴 --- 密码 -- 同学信息
select * from stu where Login in
(select Login from Stu where in
stuName=‘热巴’;)
以上是偏重于用语文的理解能力,不够直接(问一究一):
以下是找答案人的思考角度:
查询与学生“热巴”密码相同的同学信息:
主干:查询学生信息:select * from stu;
限制:与热巴密码相同:直接翻译where login=‘热巴’,不过login 并不会直接等于‘热巴’,等于“热巴”也在Stu表是属性stuName(stuName=“热巴” 的学生表一行记录可以得到密码信息),于是乎,在以stuName=“热巴” 为前提下得到密码信息, 同一张表select姓名是热巴的密码出来后,在从该表找密码。
最新理解角度(请用英语定语从句理解+与已经属性处在同一行记录的其他属性!!!):
查询与学生“热巴”密码相同的同学信息。查询同学信息,前提是密码是与“热巴”相同。 select * from stu where “密码是与“热巴”相同”。
“密码是与“热巴”相同”:“热巴”是stuName,即stuName=‘热巴’ 的密码。的 得前提where stuName=‘热巴’。 密码 where where stuName=‘热巴’。
请用英语定语从句理解!!!
2,数据库结构:(学生数据表、学科表、成绩表)
题目:查看参加 ‘思想与法律基础’课程 考试 的所有学生信息:
分析:
所有学生信息:学生表-------》考试:考试表--------》‘思想与法律基础’课程:学科表
查询顺序反过来:
学科表(where ‘‘思想与法律基础’’)-课程编号- ——> 考试表(where ‘‘课程编号’’)-学生编号- 学生表学生信息
语法:
select * from stu where stuId in
(select stuId from score where subjectId in
(select subjectId from Subject where subjectName=’思想与法律基础’))
以上是偏重于用语文的理解能力,不够直接(问一究一):
以下是找答案人的思考角度:
主干:查看学生信息 from stu(学生表)
限制:参加“思想与法律基础”课程考试:
① 直接翻译过来的限制条件是where score=‘思想与法律基础’,但是学生表还没有score属性,score属性是在成绩表中。
② 所以需要跨表select获取属性,通过共同属性子查询实现跨表,使得学生表拥有了成绩表score属性,
③ 但是,发现成绩表的score属性不会直接等于“思想与法律基础”, 等于“思想与法律基础”的是在学科表的学科名称subjectName,所以,需要再一次通过共同属性跨表select子查询获得subjectName 属性。且“思想与法律基础”。
最新理解角度(请用英语定语从句理解+与已经属性处在同一行记录的其他属性!!!):
查看参加 ‘思想与法律基础’课程 考试 的所有学生信息:
①查询所有学生信息 where 参加 ‘思想与法律基础’课程的考试: select * from stu where 参加 ‘思想与法律基础’课程的考试
参加 ‘思想与法律基础’课程的考试 :②考试 where ‘思想与法律基础’的课程
‘思想与法律基础’的课程:③(其他属性) 课程 where 课程名= ‘思想与法律基础’。 (课程--->考试---得知,其他属性是学科编号,通过学科编号可以到达考试表)
③select 学科编号 from 学科表(学科表即课程表)where 课程名=‘思想与法律基础’---》② (其他属性)考试表 where 学科编号 in (select 学科编号 from 学科表)where 课程名=‘思想与法律基础’) (课程--->学生
---得知,其他属性是学生编号,通过学生编号可以到达学生表)
---》① select * from stu where 学生编号 in 学生编号 考试表 where 学科编号 in (select 学科编号 from 学科表)where 课程名=‘思想与法律基础’)
请用英语定语从句理解!!!
3,数据库结构:(成绩数据表)
题目: 筛选平均分及格的科目(筛选的前提是分组:即分组了平均分及格的科目)
分析:
分组科目:group by subjectId, 注意,分组的属性,需要出现在select之后 select subjectId ………… group by subjectId;
平均分及格:平均分—成绩表的分数的平均—>父表:score
及格:avg(score) > 60; ‘筛选’----having
select subjectId,avg(score)from score group by subjectId having avg(score) > 60;
4,数据库结构:(年级表、学生表)
题目:分别统计每个年级男生、女生人数
注意不要麻烦拆解为:统计每个年级的男生数量、每个年级的女生数量(虽然也可以,不过有点点麻烦)这样的话,分组条件为年级:-----------分组 grop by gradeId
例如:select gradeId as '年级',(select count(sex) from Stu where sex='男' and gradeId=grade.GradeId) as '男生数量',(select count(sex) from Stu where sex='女' and gradeId=grade.GradeId) as '女生数量' from grade group by(gradeId);
思考角度:统计每个年级的男生、女生数量
看到(统计:提示要分组啦;每个:提示要分组啦; 比较害羞的’、’: 提示要分组啦)
分组条件:年级、性别
select gradeId as '年级', sex as '性别',count(*) as '人数' from stu group by gradeId,sex;
5,查询没有参加“马克思基本原理”课程考试的学生信息:
分析:
(1) 没有:提示了可以利用左连接的不足补null (left join – 读一下题意,发现左表是学生表,右表是成绩表,通过共同属性(学生编号)连接),到这里得到了 含成绩为null的学生成绩表。
(2)限制: 参加“马克思基本原理”课程考试 ,直接翻译 where score=‘马克思基本原理’,score属性是在成绩表中,但是score不会直接等于“思想与法律基础”, “思想与法律基础”是在学科表的学科名称 SubjectName,所以,需要通过共同属性跨表select子查询获得subjectName 属性。且“马克思基本原理”。
select StuId,Stu,Score from( select stu.StuId,StuName,Score from stu left join Score on(stu.StuId=score.StuId
and score.SubjectId=( select SubjectId from subject where SubjectName=’马克思基本原理’)) as tempwhere Score is null;
本文来自博客园,作者:一乐乐,转载请注明原文链接:https://www.cnblogs.com/shan333/p/14696384.html