首页 > 技术文章 > 数据库重要的是结构,用小学语句拆分,数据库题目也可以很简单

shan333 2021-04-24 10:41 原文

数据库重要的是结构,用小学语句拆分,数据库题目也可以很简单

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;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 

推荐阅读