⑴ sql经典50题
一、查询课程编号为“01”的课程比“02”的课程成绩高的所有学生的学号(重点)
一刷:
excel思路:
观察原始表格数据,在excel中想得到01比02高,我们需要将原始表格拆分成两个表,课程01表和课程02表,再进行vlookup得到c表,根据if条件判断筛出最终数据。
重点是:1.拆表 2.匹配
转成SQL语言:
1.拆表语言:
2.关联加匹配语言 :
3.完整语言:
----到这里其实就可以结束了;
4.若想加student的信息,则需要以上所有结果再作为c表再关联匹配:
若想让字段1和2为上下结果,即重复前面的信息,则语言如下:
二刷:
扩展一:查询成绩小于60分的学生的学号和姓名
1、先反向找出大于等于60分的学号 :
2、匹配:
扩展二:查询平均成绩小于60分的学生的学号、姓名和平均成绩
第一种
1、先找出小于60分和空的作为c表:
2、匹配:
三、查询所有学生的学号、姓名、选课数、总成绩(不重要)
四、查询姓“李”的老师的个数(不重要)
五、查询没学过“张三”老师课的学生的学号、姓名(重点)
六、查询学过“张三”老师所教的所有课的同学的学号、姓名(重点)
七、查询学过编号为“01”的课程并且也学过编号为“02”的课程的学生的学号、姓名(重点)
八、查询课程编号为“02”的总成绩(不重点)
九、查询成绩小于60分的学生的学号和姓名(同题目二)
十、查询没有学全所有课的学生的学号、姓名(重点)
十一、查询至少有一门课与学号为“01”的学生所学课程相同的学生的学号和姓名(重点)
十二、查询和“01”号同学所学课程完全相同的其他同学的学号(重点)
十五、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩(重点)
十六、检索"01"课程分数小于60,按分数降序排列的学生信息(和34题重复,不重点
十七、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩(重重点与35一样)
十八、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
-- 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 (超级重点)
十九、按各科成绩进行排序,并显示排名
二十、查询学生的总成绩并进行排名(不重点)
二十一、查询不同老师所教不同课程平均分从高到低显示(不重点)
二十二、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩(重要 25类似
二十三、 使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计各分数段人数:课程ID和课程名称(重点和18题类似)
二十四、查询学生平均成绩及其名次(同19题,重点)
二十五、查询各科成绩前三名的记录(不考虑成绩并列情况)(重点 与22题类似)
二十六、查询每门课程被选修的学生数(不重点)
二十七、查询出只有两门课程的全部学生的学号和姓名(不重点)
二十八、查询男生、女生人数(不重点)
二十九、查询名字中含有"风"字的学生信息(不重点)
三十一、 查询1990年出生的学生名单(重点year)
三十二、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩(不重要)
三十三、查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列(不重要)
三十四、查询课程名称为"数学",且分数低于60的学生姓名和分数(不重点)
三十五、查询所有学生的课程及分数情况(重点)
三十六、 查询任何一门课程成绩在70分以上的姓名、课程名称和分数(重点)
三十七、 查询不及格的课程并按课程号从大到小排列(不重点)
三十八、 查询课程编号为03且课程成绩在80分以上的学生的学号和姓名(不重要)
三十九、求每门课程的学生人数(不重要)
四十、查询选修“张三”老师所授课程的学生中成绩最高的学生姓名及其成绩(重要top)
四十一、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩 (重点)
四十二、查询每门功课成绩最好的前两名(同22和25题)
四十三、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列(不重要)
四十四、检索至少选修两门课程的学生学号(不重要)
四十五、查询选修了全部课程的学生信息(重点划红线地方)
四十六、查询各学生的年龄(精确到月份)
四十七、 查询没学过“张三”老师讲授的任一门课程的学生姓名(还可以,自己写的,答案中没有)
四十八、 查询两门以上不及格课程的同学的学号及其平均成绩
四十九、查询本月过生日的学生(无法使用week、date(now())
五十、 查询下月过生日的学生
⑵ SQL数据库几个题目,100分悬赏!高手请进!
1、 select eno, ename,age from emp where job_title=‘高级’ and gender=1
2、
∏eno, ename,age (φjob_title=‘高级’ and gender=1 (emp))
注:其中的∏表示投影,φ表示选择.
4、create index 索引名 on emp (eno)
5、select dept.dname ,count(emp .eno) from dept ,emp
where emp.dno=dept.dno
group by dename
6、select dept.dno ,dept.dname, avg(salary) from dept ,emp
where emp.dno=dept.dno and salary>3000
group by dename ,dno
⑶ 经典面试题-大厂SQL题目
正确答案:
正确答案:
给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。
正确答案:
Customers 表:
Orders 表:
例如给定上述表格,你的查询应返回:
正确答案:
例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。
正确答案:
或者
例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):
正确答案:
例如上述 Employee 表,n = 2 时,应返回第二高的薪水 200。如果不存在第 n 高的薪水,那么查询应返回 null。
正确答案:
示例:
假如数据输入的是上表,则输出结果如下:
注意:
如果学生人数是奇数,则不需要改变最后一个同学的座位。
正确答案:
例如,根据上述给定的 Weather 表格,返回如下 Id:
正确答案:
Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。
Department 表包含公司所有部门的信息。
编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。
正确答案:
表1: Person
PersonId 是上表主键
表2: Address
AddressId 是上表主键
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
FirstName, LastName, City, State
正确答案:
注意,您必只能写一个 Update 语句,请不要编写任何 Select 语句。
例如:
运行你所编写的更新语句之后,将会得到以下表:
正确答案:
这里有张 World 表
如果一个国家的面积超过300万平方公里,或者人口超过2500万,那么这个国家就是大国家。
编写一个SQL查询,输出表中所有大国家的名称、人口和面积。
例如,根据上表,我们应该输出:
正确答案:
Id 是这个表的主键。
例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:
正确答案:
Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id 。
Department 表包含公司所有部门的信息。
编写一个 SQL 查询,找出每个部门工资前三高的员工。例如,根据上述给定的表格,查询结果应返回:
正确答案
例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。
正确答案:
例如,下表 cinema:
对于上面的例子,则正确的输出是为:
正确答案:
请列出所有超过或等于5名学生的课。
例如,表:
应该输出:
Note:
学生在每个课中不应被重复计算。
正确答案:
Users 表存所有用户。每个用户有唯一键 Users_Id。Banned 表示这个用户是否被禁止,Role 则是一个表示(‘client’, ‘driver’, ‘partner’)的枚举类型。
写一段 SQL 语句查出 2013年10月1日 至 2013年10月3日 期间非禁止用户的取消率。基于上表,你的 SQL 语句应返回如下结果,取消率(Cancellation Rate)保留两位小数。
正确答案
示例:
根据以上输入,你的查询应返回以下结果:
说明:所有电子邮箱都是小写字母。
正确答案:
请编写一个查询语句,找出高峰期时段,要求连续三天及以上,并且每天人流量均不少于100。
例如,表 stadium:
对于上面的示例数据,输出为:
Note:
每天只有一行记录,日期随着 id 的增加而增加。
正确答案:
⑷ SQL语言的题目
1.一共有 4 个表。
2.customer表中有 0 记录。
3.staff关系中有 3 个属性。
4.一共执行了 5 条SQL命令。
5.deposit表中的amount字段是 NUMBER(14, 2) 数据类型。
6.account表中的 ACCOUNT_NO 字段被设置为了主键(主码)。
7.在customer关系中,不把cust_name属性设置为主键的原因是,客户的 cust_name(姓名)可能重复。
8.customer表和 account 表有公共属性。
9.insert命令中的 (STAFF_ID,STAFF_NAME,STAFF_PWD) 子句可以被省略。
10.deposit 表中没有设置主键。
⑸ SQL的题目,最基础的~等~~
1. 从职工关系中检索所有工资值。
答:select 工资 from 职工表
2. 检索仓库关系中的所有记录
答:select * from 仓库表
3. 检索工资多于1230元的职工号
答:select 职工号 from 职工表 where 工资>1230
4.检索哪些仓库有工资多于1210元的职工。
答:select distinct 仓库号 from 职工表 where 工资>1210
5. 给出在仓库“wh1”或“wh2”工作,并且工资少于1250元的职工号。
答:select 职工号 from 职工表 where 工资<1250 ;
and (仓库号="wh1" or 仓库号="wh2")
注意:逻辑运算符的优先级从高到低依次为not、and、or。运算符的优先级:括号 算术运算 关系运算 逻辑运算.
说明:前面的几个例子在from之后只指定了一张表,也就是说这些检索只基于一张表。如果有where子句,系统首先根据指定的条件依次检验关系中的每条记录,然后选出满足条件的记录(相当于关系的选择操作),并显示select子句中指定属性的值(相当于关系的投影操作)。
6. 找出工资多于1230元的职工号和他们所在的城市。
答:select 职工表.职工号, 仓库表.城市 from 职工表,仓库表 ;
where 职工表.仓库号=仓库表.仓库号 and 工资>1230
7. 找出工作在面积大于400的仓库的职工号以及这些职工工作所在的城市。
答:select 职工表.职工号, 仓库表.城市, 仓库表.面积 ;
from 职工表,仓库表 where 职工表.仓库号=仓库表.仓库号 ;
and 仓库表.面积>400
说明:以上两题为简单的联接查询.
8. 哪些城市至少有一个仓库的职工工资为1250元
答:
方法一:
Select 仓库表.城市 from 职工表,仓库表 where 职工表.仓库号=仓库表.仓库号 and 职工表.工资=1250
方法二:
select 仓库号 from 职工表 where 工资=1250 into dbf abc.dbf
select 仓库表.城市 from 仓库表,abc where 仓库表.仓库号=abc.仓库号
方法三:
select 城市 from 仓库表 where 仓库号 in (select 仓库号 from 职工表 where 工资=1250)
说明: 这属于嵌套查询. 这类查询所要求的结果出自一个关系,但相关的条件却涉及多个关系.
可以看到,方法三的命令中含有两个select-from-where查询块,即内层查询块和外层查询块,内层查询块检索到的仓库值是wh1和wh2,这样就可以写出等价命令:
select 城市 from 仓库表 where 仓库号 in ("wh1","wh2")
或者
select 城市 from 仓库表 where 仓库号="wh1" or 仓库号="wh2"
9. 查询所有职工的工资都多于1210元的仓库的信息。
答:
方法一:
select 仓库号,min(工资) as 工资 from 职工表 group by 仓库号 into dbf 仓库min工资.dbf
select 仓库表.* from 仓库表,仓库min工资 where 仓库表.仓库号=仓库min工资.仓库号 and 仓库min工资.工资>1210
方法二:
select * from 仓库表 where 仓库表.仓库号 not in (select 仓库号 from 职工表 where 工资<=1210 ) and 仓库表.仓库号 in (select 仓库号 from 职工表)
(错误方法)
select * from 仓库表 where 仓库表.仓库号 not in (select 仓库号 from 职工表 where 工资<=1210 )
注意:上述检索结果错误,会将没有职工的仓库检索出来.如果要求排除那些还没有职工的仓库,检索要求可以叙述为:检索所有职工的工资都大于1210元的仓库的信息,并且该仓库至少要有一名职工.
(错误方法)
select * from 仓库表 where 仓库表.仓库号 in (select 仓库号 from 职工表 where 工资>1210 )
注意:上述查询结果错误。它会查出仓库号为wh1的信息,但wh1的职工工资并不都大于1210。
10. 找出和职工e4挣同样工资的所有职工。
答: Select 职工号 from 职工表 where 工资 in (select 工资 from 职工表 where 职工号="e4")
说明:7、9、10题都是基于多个关系的查询,这类查询所要求的结果出自一个关系,但相关的条件却涉及多个关系.我们称之为嵌套查询。嵌套查询优选含有两个select-from-where查询块的查询结构。
11. 检索出工资在1220元到1240元范围内的职工信息。
答:select * from 职工表 where 工资 between 1220 and 1240
说明: "工资 between 1220 and 1240"等价于"工资>=1220 and 工资<=1240"
如果要求查询工资不在1220元到1240元范围内的职工信息
说明: select * from 职工表 where 工资 not between 1220 and 1240
12. 从供应商关系中检索出全部公司的信息,不要工厂或其他供应商的信息。
Select * from 供应商表 where "公司" $ 供应商名
13. 找出不在北京的全部供应商信息。
Select * from 供应商表 where 地址!="北京"
或者
Select * from 供应商表 where not(地址="北京")
14. 按职工的工资值升序检索出全部职工信息。
答:select * from 职工表 order by 工资
如果需要将结果按降序排列,只要加上desc
select * from 职工表 order by 工资 desc
说明:使用SQL SELECT可以将查询结果排序,排序的短语是order by ,具体格式如下:
order by order_item [ASC|DESC] [,order_item [ASC|DESC]……]
15. 先按仓库号排序,再按工资排序并输出全部职工信息。
答:Select * from 职工表 order by 仓库号,工资
16. 找出供应商所在地的数目。
答:select count(distinct 地址) from 供应商表
注意:除非对表中的记录数进行计数,一般count函数应该使用distinct
比如: select count(*) from 供应商表
查询结果是供应商表中的记录数.
说明:可用于计算检索的函数有:count——计数 sum——求和
avg——计算平均值 max——求最大值 min——求最小值
17. 求支付的工资总数
答:select sum(工资) from 职工表
18. 求北京和上海的仓库职工的工资总和
答: select sum(工资) from 职工表,仓库表 where 职工表.仓库号=仓库表.仓库号 and (城市="北京" or 城市="上海")
方法二:
select sum(工资) from 职工表 where 仓库号 in (select 仓库号 from 仓库表 where 城市="北京" or 城市="上海")
19. 求所有职工的工资都多于1210元的仓库的平均面积
答:Select avg(面积) from 仓库表 where 仓库号 not in(select 仓库号 from 职工表 where 工资<=1210) and 仓库号 in(select 仓库号 from 职工表)
20. 求在wh2仓库工作的职工的最高工资值
答:select max(工资) from 职工表 where 仓库号="wh2"
21. 求每个仓库的职工的平均工资
答:select 仓库号,avg(工资) from 职工表 group by 仓库号
说明:可以利用group by 子句进行分组计算查询.group by短语的格式如下:group by groupcolumn[,groupcolumn……][having filtercondition]
可以按一列或多列分组,还可以用having 进一步限定分组的条件.
注意:where /group by等子句都不能放在from子句之前.
22. 求至少有两个职工的每个仓库的平均工资。
答: select 仓库号,count(*),avg(工资) from 职工表 group by 仓库号 having count(*)>=2
说明:having子句总是跟在group by 子句之后,不可以单独使用.having子句用于限定分组.
23. 找出尚未确定供应商的订购单
答:select * from 订购单表 where 供应商号 is null
24. 列出已经确定了供应商的订购单信息
答:select * from 订购单表 where 供应商号 is not null
⑹ 关于数据库SQL的一些简单题
1.select 班级名称,班级代码 from 班级 where 系部代码='02' or 系部代码='03';
2.在'学生'表中查询姓'李'学员的学号,姓名,年龄;
3.在'读者表' 表中查询名称中含有'红'的所有内容;
5.select 姓名,年龄 from 教师 where 姓名 like '?梅%';
4.在'图书表'表中查询图书编号为'100111'的所有内容;
6.在'读者表'表中查询'系部名称'为'自动化'的读者的最小年龄;
7.在'用户表'表中查询姓名,年龄字段,并按年龄,姓名升序排列;
8.select * from 学生 where 姓名 like '张%' or 姓名 like '罗%' or 姓名 like '刘%' order by 姓名
9.在'读者表'表中查询年龄大于60或小于1810的读者姓名;
10.将编号为'115',姓名为'王梅',性别为'女'的记录插入'读者表'表;
11.select 姓名 as name,出生日期 as 'Birthday' from 学生 where 性别='女'.
排版没排好,看起来有点费力;顺序有点乱,不过我都按照你的顺序写了.
⑺ sql的4道题目.要正确答案
回如下,希望对您有帮助.
1.Inner Join 把两个表连接在一起,返回两个表中相匹配的记录
Left outer join,左侧表所有的记录都返回,右侧匹配的记录返回,没有匹配的返回Null
Right outer join 与Left outer join相反,右侧的记录返回,左侧返回匹配的记录,没有匹配返回Null
Cross join 两个表的笛卡儿积,返回所有可能的值,不允许有连接条件!
2.select 科目,avg(成绩) from 成绩表 group by 科目
order by 科目
3.建立索引是提高select语句最好的方法
(1).使用exists关键字检查结果集:不要用count(*)来检查结果集中是否包含行。
(2).使用标准联接代替嵌套查询:在执行嵌套查询时,SQL server将先执行内部的子查询,然后将查询结果返回给外部查询的作为检索的数据源,最后执行外部的主查询。而在执行包含标准联接的查询时,SQL server将要执行的仅仅是一个查询。
(3).有效避免整表扫描,使用索引。
(4).在like子句的匹配条件的开始使用了%,若在like子句的匹配条件的开始使用了%,那么包含这个like分句的查询将会调用整表扫描。
4.这个..简单的select * from table 结果这个是根据不同数据库不同类型表而有所区别的,要分情况来说的,一般认为是记录在数据库里面的物理位置吧,不过这样答也不完全正确,表是分有索引和无索引的,不同类型在不同数据库也有不同的处理方法 .
如果一次查询出来多个数据集,那么可以减少对数据库的连接和查询(这是很耗时的)
那么如果你想要一次查询出多个数据集,如果这些数据集与检索出的一批数据相关,因此可能用临时表将那些ID抽出来,然后再根据这些ID查其他的记录。
这里需要临时表。
临时表一般存在tempdb里,不会有大问题的。
⑻ SQL经典50题题解
本篇文章主要是对SQL经典50题进行详细解析。
解析包含:1、解题思路,2、考核知识点,3、答案;
首先,表结构用脑图输出出来,如下所示:
先进行数据准备,建表以及插入数据。
1.查询"01"课程比"02"课程成绩高的学生的信息及课程分数
解题思路:
第一步:关键词有“课程编号”、“课程成绩”、“学生信息”,锁定使用表:学生表、成绩表。
第二步:给出学生信息及课程分数,通过主键sid关联学生表和课程表。
第三步:比较同一个学生不同课程的成绩,再关联一次课程表,利用sid、cid进行关联。
第四步:根据题目,用where比较分数筛选结果。
考核知识点: join,where
答案:
1.1 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
解题思路:
第一步:关键词有“课程编号”、“学生编号”,锁定使用表:成绩表。
第二步:分别查询出存在" 01 "课程的学生和存在" 02 "课程的学生。
第三步:对两个子查询进行关联,用sid进行左联接。
考核知识点: where, 子查询,left join
答案:
1.2 查询同时存在01和02课程的情况
解题思路: 同1.1,把left join改为join
考核知识点: where, 子查询,join
答案:
1.3 查询选择了02课程但没有01课程的情况
解题思路: 类似1.1,把left join改为right join
考核知识点: where, 子查询,right join
答案:
小结: 上面的题主要考察join、left join、right join。
2.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
解题思路:
第一步:关键词有“平均成绩”、“学生编号”、“学生姓名”,锁定使用表:成绩表、学生表。
第二步:给出学生信息及课程分数,通过主键sid关联学生表和课程表。。
第三步:根据题目,用group by聚合计算出平均成绩,然后筛选出大于等于60分的学生。
考核知识点: join、group by、avg()
答案:
3.查询在 SC 表存在成绩的学生信息
解题思路:
第一步:关键词有“SC”、“学生信息”,锁定使用表:成绩表、学生表。
第二步:用EXISTS判断在SC表存在成绩的学生信息
考核知识点: EXISTS语句
答案:
4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的成绩总和
解题思路:
第一步:关键词有“学生编号”、“学生姓名”、“选课总数”、“课程成绩”,锁定使用表:成绩表、学生表。
第二步:通过主键sid关联学生表成绩表,得到学生信息、学生成绩的宽表
第三步:根据题目,用group by聚合计算选课总数和总成绩
考核知识点: left join、group by、count()、sum()、ifnull()
答案:
5.查询“李”姓老师的数量
解题思路:
第一步:关键词有“老师的数量”,锁定使用表:教师表。
第二步:先筛选出“李”姓老师,再汇总统计“李”姓老师的数量
考核知识点: like、where、%、count()
答案:
6.查询学过“张三”老师授课的同学的信息
解题思路:
第一步:关键词有“老师”、“学生信息”,锁定使用表:教师表、学生表、成绩表、课程表。
第二步:通过sid关联学生表、成绩表,再通过cid关联课程表,最后通过tid关联教师表。
第三步:用where筛选出“张三”老师授课的同学的信息。
考核知识点: 多重连接join
答案:
7.查询没有学全所有课程的同学的信息。
解题思路:
第一步:关键词有“课程”、“学生信息”,锁定使用表:学生表、成绩表、课程表。
第二步:先统计学生的课程数量,再筛选出小于所有课程数量的学生。
考核知识点: left join、group by、count()
答案:
8.查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息。
解题思路:
第一步:关键词有“课程”、“学生信息”,锁定使用表:学生表、成绩表。
第二步:先查询学号“01”的同学学习的课程。
第三步:通过sid关联学生表和成绩表,获取所有学生信息、课程信息。
第四步:用EXISTS筛选出至少1门课相同的同学信息。
考核知识点: left join、子查询、EXISTS
答案:
9.查询和" 01 "号的同学学习的课程完全相同的其他同学的信息
解题思路:
第一步:关键词有“课程”、“学生信息”,锁定使用表:学生表、成绩表。
第二步:用“01”号的同学学习的课程左关联学生课程表,筛选出关链课程数一致的其他同学的sid
第三步:通过sid关联学生表和成绩表,获取完整的学生信息。
考核知识点: left join、子查询、group by
答案:
10.查询没学过"张三"老师讲授的任一门课程的学生姓名
解题思路:
第一步:关键词有“老师”、“学生姓名”,锁定使用表:学生表、成绩表、课程表、教师表。
第二步:反向求解。先查询至少学过“张三”老师讲授的课程的学生sid
第三步:用NOT EXISTS筛选出不在第二步查询结果的学生信息,。
考核知识点: 多重连接join、NOT EXISTS、子查询
答案:
11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
解题思路:
第一步:关键词有“姓名”、“平均成绩”,锁定使用表:学生表、成绩表。
第二步:通过sid关联学生表和成绩表,得到学生成绩信息宽表
第三步:用group by聚合统计,having对聚合的结果进行筛选。
考核知识点: join、group by、having、case when语句、avg()
答案:
12.检索" 01 "课程分数小于 60,按分数降序排列的学生信息
解题思路:
第一步:关键词有“课程分数”、“学生信息”,锁定使用表:学生表、成绩表。
第二步:通过sid关联学生表和成绩表,得到学生成绩信息宽表
第三步:用where筛选" 01 "课程分数小于 60的记录,并按照分数降序排列。
考核知识点: join、where、order by
答案:
13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
解题思路:
第一步:关键词有“平均成绩”,锁定使用表:成绩表。
第二步:用group by将学生课程的成绩由行转换为列并计算平均成绩。
第三步:按照平均成绩降序显示学生的所有课程的成绩以及平均成绩。
考核知识点: join
答案:
14.查询各科成绩最高分、最低分和平均分,以如下形式显示:
以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,
优良率,优秀率
及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
解题思路:
第一步:关键词有“课程name”、“最高分”,锁定使用表:课程表、成绩表。
第二步:用group by聚合计算课程最高分、最低分、平均分。
第三步:用case语句判断及格、中等、优良、优秀,并结合group by计算。
考核知识点: join、group by、max()、min()、avg()、sum()、case when语句
答案:
15.按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺
解题思路:
第一步:关键词有“各科成绩”,锁定使用表:成绩表。
第二步:用rank()排名。
考核知识点: rank() over(partition by)
答案:
15.1 按各科成绩进行行排序,并显示排名, Score 重复时合并名次
解题思路:
第一步:关键词有“各科成绩”,锁定使用表:成绩表。
第二步:用dense_rank()排名。
考核知识点: dense_rank() over(partition by)
答案:
16.查询学生的总成绩,并进行排名,总分重复时保留名次空缺
解题思路:
第一步:关键词有“总成绩”,锁定使用表:成绩表。
第二步:用group by统计学生的总成绩。
第三步:用left join自关联进行排名。
考核知识点: group by、 left join
答案:
16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
解题思路:
第一步:关键词有“总成绩”,锁定使用表:成绩表。
第二步:用group by统计学生的总成绩。
第三步:用变量进行排名。
考核知识点: group by、变量
答案:
17. 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比
解题思路:
第一步:关键词有“各科成绩”、“课程名称”,锁定使用表:成绩表、课程表。
第二步:通过cid关联课程表和成绩表,得到课程、成绩信息宽表。
第三步:用group by聚合统计各分段的人数及百分比。
考核知识点: join、group by、case when条件语句
答案:
18.查询各科成绩前三名的记录
解题思路:
第一步:关键词有“各科成绩”,锁定使用表:成绩表。
第二步:筛选出各科比当前成绩高的人数小于3的学生记为各科的前三名。
考核知识点: 子查询
答案:
19.查询每门课程被选修的学生数
解题思路:
第一步:关键词有“每门课程”、“学生数”,锁定使用表:课程表、成绩表。
第二步:用left join关联课程表和成绩表,再用group by分组汇总各科的学生数。
考核知识点: left join、group by
答案:
20.查询出只选修两门课程的学生学号和姓名
解题思路:
第一步:关键词有“选修课程”、“学生姓名”,锁定使用表:学生表、成绩表。
第二步:用join关联学生表和成绩表,再用group by分组汇总每个学生的选修课程数,最后用having对分组汇总结果筛选出选修两门课程的学生。
考核知识点: join、group by、having
答案:
21. 查询男生、女生人数
解题思路:
第一步:关键词有“男生、女生”,锁定使用表:学生表。
第二步:通过ssex学生表用group by分组汇总男生、女生人数。
考核知识点: group by
答案:
22. 查询名字中含有“风”字的学生信息
解题思路:
第一步:关键词有“学生信息”,锁定使用表:学生表。
第二步:用like匹配姓名中含有风”字的学生。
考核知识点: like、%
答案:
23查询同名同性学生名单,并统计同名人数
解题思路:
第一步:关键词有“学生名单”,锁定使用表:学生表。
第二步:使用group by,汇总同名同性人数,再用having筛选出大于1的记录
考核知识点: group by、having
答案:
24.查询 1990 年出生的学生名单
解题思路:
第一步:关键词有“学生名单”,锁定使用表:学生表。
第二步:用where筛选出1990年出生的学生名单
考核知识点: where、year
答案:
25.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编
号升序排列。
解题思路:
第一步:关键词有“平均成绩”,锁定使用表:成绩表。
第二步:用group by分组计算各科平均成绩,再用order by完成多列排序
考核知识点: group by、order by
答案:
26.查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
解题思路:
第一步:关键词有“平均成绩”、“学生姓名”,锁定使用表:成绩表、学生表。
第二步:用join关联学生表和成绩表
第三步:用group by分组汇总计算每个学生的平均成绩,再用having筛选平均成绩>=85的记录
考核知识点: join、group by、having
答案:
27.查询课程名称为“数学”,且分数低于 60 的学生姓名和分数
解题思路:
第一步:关键词有“课程名称”、“分数”、“学生姓名”,锁定使用表:课程表、成绩表、学生表。
第二步:用join关联学生表、成绩表、课程表,再用where筛选
考核知识点: 多重join、where
答案:
28. 查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
解题思路:
第一步:关键词有“所有学生”、“分数”,锁定使用表:学生表、成绩表
第二步:用left join关联学生表、成绩表
考核知识点: left join
答案:
29.查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
解题思路:
第一步:关键词有“课程成绩”、“姓名”、“课程名称”,锁定使用表:学生表、成绩表、课程表
第二步:用join关联学生表、成绩表、课程表,再筛选出课程成绩在70分以上的。
考核知识点: 多重join
答案:
30.查询不及格的课程
解题思路:
第一步:关键词有“不及格的课程”,锁定使用表:成绩表、课程表
第二步:关联课程表和成绩表,再条件筛选出不及格的课程信息。
考核知识点: join、where、去重
答案:
31.查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
解题思路:
第一步:关键词有“课程编号”、“课程成绩”、“姓名”,锁定使用表:成绩表、学生表
第二步:关联成绩表和学生表,再条件筛选出结果。
考核知识点: join、where
答案:
32.求每门课程的学生人数
解题思路:
第一步:关键词有“课程”、“学生人数”,锁定使用表:成绩表
第二步:用group by分组汇总各科的学生人数。
考核知识点: group by
答案:
33.成绩不重复,查询选修“张三”老师所授课程的学生中,成绩最高的学生信息及其成绩
解题思路:
第一步:关键词有“成绩”、““张三”老师”、“学生信息”,锁定使用表:成绩表、课程表、学生表、教师表
第二步:关联所有表,筛选出选修“张三”老师所授课程的学生。
第三步:因为成绩不重复,对学生成绩由高到低排序,筛选出第一行记录。
考核知识点: 多重join、order by、limit
答案:
34.成绩有重复的情况下,查询选修“张三”老师所授课程的学生中,成绩最高的学生
信息及其成绩
解题思路:
第一步:关键词有“成绩”、““张三”老师”、“学生信息”,锁定使用表:成绩表、课程表、学生表、教师表
第二步:关联所有表,筛选出选修“张三”老师所授课程的学生。
第三步:因为成绩有重复,先求出最高成绩,再匹配最高成绩对应的学生信息。
考核知识点: 多重join、max()
答案:
35.查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
解题思路:
第一步:关键词有“成绩”,锁定使用表:成绩表
第二步:自联接,筛选出不同课程成绩相同的记录
考核知识点: 自联接join
答案:
36. 查询每门成绩最好的前两名
解题思路:
第一步:关键词有“成绩”,锁定使用表:成绩表
第二步:自联接,筛选出各科低于自身成绩的人数为2的。
考核知识点: left join
答案:
37. 统计每门课程的学生选修人数(超过 5 人的课程才统计)。
解题思路:
第一步:关键词有“选修人数”,锁定使用表:成绩表
第二步:先用group by分组汇总各科的选修人数,再条件筛选出超过5人的课程。
考核知识点: group by、having
答案:
38.检索至少选修两门课程的学生学号
解题思路:
第一步:关键词有“两门课程”,锁定使用表:成绩表
第二步:先用group by分组汇总每个学生的选修课程数,再用having筛选出至少2门课程的学生学号
考核知识点: group by、having
答案:
39.查询选修了全部课程的学生信息
解题思路:
第一步:关键词有“全部课程”、“学生信息”,锁定使用表:成绩表、课程表、学生表
第二步:关联学生表和成绩表,再用group by分组统计每个学生的选修课程数
第三步:最后用having筛选出等于全部课程数的学生信息。
考核知识点: join、 group by、having、子查询
答案:
40.查询各学生的年龄,只按年份来算
解题思路:
第一步:关键词有“学生的年龄”,锁定使用表:学生表
第二步:用year和now来统计
考核知识点: year、now
答案:
41. 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
解题思路:
第一步:关键词有“出生日期”,锁定使用表:学生表
第二步:用timestampdiff()统计年龄
考核知识点: timestampdiff()
答案:
42.查询本周过生日的学生
解题思路:
第一步:关键词有“过生日”,锁定使用表:学生表
第二步:用week函数
考核知识点: week()
答案:
43. 查询下周过生日的学生
解题思路:
第一步:关键词有“过生日”,锁定使用表:学生表
第二步:用week函数
考核知识点: week()
答案:
44.查询本月过生日的学生
解题思路:
第一步:关键词有“过生日”,锁定使用表:学生表
第二步:用month函数
考核知识点: month()
答案:
45.查询下月过生日的学生
解题思路:
第一步:关键词有“过生日”,锁定使用表:学生表
第二步:用month函数
考核知识点: month()
答案: