版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年SQL语句实操试题及答案现有三张业务表结构如下:学生表student(student_idINTPRIMARYKEYCOMMENT'学号',student_nameVARCHAR(20)COMMENT'学生姓名',ageINTCOMMENT'年龄',genderVARCHAR(2)COMMENT'性别',class_idINTCOMMENT'班级编号')成绩表score(score_idINTPRIMARYKEYCOMMENT'成绩id',student_idINTCOMMENT'学号',course_idINTCOMMENT'课程编号',scoreINTCOMMENT'课程成绩')课程表course(course_idINTPRIMARYKEYCOMMENT'课程编号',course_nameVARCHAR(50)COMMENT'课程名称',teacherVARCHAR(20)COMMENT'授课教师')请写出SQL语句:查询所有年龄大于18岁的男学生的姓名和班级编号,结果按年龄降序排序。参考答案:SELECTstudent_name,class_idFROMstudentWHEREage>18ANDgender='男'ORDERBYageDESC;基于上述三张表,查询每个班级的学生人数,要求显示班级编号和对应学生人数,过滤掉学生人数小于5的班级,结果按人数降序排序。参考答案:SELECTclass_id,COUNT(student_id)ASstudent_countFROMstudentGROUPBYclass_idHAVINGCOUNT(student_id)>=5ORDERBYstudent_countDESC;注:这里需要注意,WHERE是分组前过滤,HAVING是分组后聚合结果过滤,不能将条件写到WHERE中。基于上述三张表,查询所有选修了"数据库原理"这门课程的学生姓名和对应成绩,结果按成绩降序排序。参考答案:常用内连接写法(推荐,执行效率高):SELECTs.student_name,sc.scoreFROMstudentsINNERJOINscorescONs.student_id=sc.student_idINNERJOINcoursecONsc.course_id=c.course_idWHEREc.course_name='数据库原理'ORDERBYsc.scoreDESC;也可以使用子查询实现:SELECTs.student_name,sc.scoreFROMstudents,scoresc,coursecWHEREs.student_id=sc.student_idANDsc.course_id=c.course_idANDc.course_name='数据库原理'ORDERBYsc.scoreDESC;基于上述三张表,查询没有选修"高等数学"课程的学生学号和姓名。参考答案:本题有两种常见正确写法,需要注意空值问题:写法1(NOTIN实现):SELECTstudent_id,student_nameFROMstudentWHEREstudent_idNOTIN(SELECTDISTINCTsc.student_idFROMscorescINNERJOINcoursecONsc.course_id=c.course_idWHEREc.course_name='高等数学'ANDsc.student_idISNOTNULL);这里添加sc.student_idISNOTNULL是为了避免NOTIN碰到空值返回全空结果的问题。写法2(左连接实现,兼容性更好):SELECTs.student_id,s.student_nameFROMstudentsLEFTJOIN(SELECTDISTINCTsc.student_idFROMscorescINNERJOINcoursecONsc.course_id=c.course_idWHEREc.course_name='高等数学')tONs.student_id=t.student_idWHEREt.student_idISNULL;基于上述三张表,统计每门课程的及格人数和不及格人数,及格线为60分,要求显示课程编号、课程名称、及格人数(别名为pass_count)、不及格人数(别名为fail_count),包含没有任何学生选修的课程。参考答案:SELECTc.course_id,c.course_name,SUM(CASEWHENsc.score>=60THEN1ELSE0END)ASpass_count,SUM(CASEWHENsc.score<60ORsc.scoreISNULLTHEN1ELSE0END)ASfail_countFROMcoursecLEFTJOINscorescONc.course_id=sc.course_idGROUPBYc.course_id,c.course_name;本题需要注意使用左连接保留未选课程的记录,同时计算不及格人数时需要统计缺考(成绩为NULL)的情况。基于上述三张表,查询学生总分排名前三的学生姓名和总分,要求总分相同保留并列排名、不跳号,例如两个学生总分第一,下一名是第二,输出所有排名不大于3的学生信息,结果按总分降序排序。参考答案:本题考察窗口函数DENSE_RANK的使用,正确写法如下:WITHstudent_totalAS(SELECTs.student_id,s.student_name,SUM(sc.score)AStotal_scoreFROMstudentsINNERJOINscorescONs.student_id=sc.student_idGROUPBYs.student_id,s.student_name),ranked_studentAS(SELECTstudent_name,total_score,DENSE_RANK()OVER(ORDERBYtotal_scoreDESC)ASrkFROMstudent_total)SELECTstudent_name,total_scoreFROMranked_studentWHERErk<=3ORDERBYtotal_scoreDESC;如果使用RANK()函数会出现跳号,比如两个第一之后排名直接变成第三,不符合题目要求,使用ROW_NUMBER()会强制拆分同分数排名,也不符合要求。现有教师表teacher(teacher_idINTPRIMARYKEY,teacher_nameVARCHAR(20),dept_nameVARCHAR(50),salaryDECIMAL(10,2)),需要给所有所属学院为"计算机学院"的教师涨薪10%,要求写出保证原子性的完整事务操作SQL,操作异常可回滚。参考答案:标准SQL事务写法,适配绝大多数关系型数据库:开启事务STARTTRANSACTION;执行更新操作UPDATEteacherSETsalary=salary1.1WHEREdept_name='计算机学院';UPDATEteacherSETsalary=salary1.1WHEREdept_name='计算机学院';检查更新结果无误后提交事务,若有误则执行回滚COMMIT;异常回滚语句ROLLBACK;若为Oracle数据库,开启事务可省略STARTTRANSACTION,默认DML语句自动开启事务,提交回滚语法一致。基于上述学生、成绩、课程表,查询每个班级成绩最高的学生信息,输出班级编号、学生姓名、课程名称、成绩,如果同一班级有多个学生成绩相同且都是最高分,需要全部输出。参考答案:WITHclass_scoreAS(SELECTs.class_id,s.student_name,c.course_name,sc.score,RANK()OVER(PARTITIONBYs.class_idORDERBYsc.scoreDESC)ASrnFROMstudentsINNERJOINscorescONs.student_id=sc.student_idINNERJOINcoursecONsc.course_id=c.course_id)SELECTclass_id,student_name,course_name,scoreFROMclass_scoreWHERErn=1;如果题目要求只输出一名,将RANK()改为ROW_NUMBER()即可。现有订单表orders(order_idINTPRIMARYKEY,user_idINT,order_amountDECIMAL(10,2),create_timeDATETIME),查询2025年10月份每个日期的订单总金额,要求没有订单的日期总金额显示为0,结果按日期升序排序。参考答案:支持MySQL8.0+、PostgreSQL等支持递归CTE的数据库写法:WITHRECURSIVEdaily_date(date_val)AS(SELECT'2025-10-01'UNIONALLSELECTdate_val+INTERVAL1DAYFROMdaily_dateWHEREdate_val<'2025-10-31')SELECTd.date_val,IFNULL(SUM(o.order_amount),0)ASdaily_totalFROMdaily_datedLEFTJOINordersoONDATE(o.create_time)=d.date_valGROUPBYd.date_valORDERBYd.date_valASC;PostgreSQL可使用更简洁的generate_series生成日期序列,核心逻辑都是生成全日期序列后左连接订单表,补0即可。学生表student中存在重复记录,重复规则为:student_name和age都相同即为重复记录,要求保留student_id最小的重复记录,删除其余重复记录,请写出对应的SQL语句。参考答案:写法1(自连接删除,MySQL兼容):DELETEs1FROMstudents1INNERJOINstudents2WHEREs1.student_name=s2.student_nameANDs1.age=s2.ageANDs1.student_id>s2.st
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《公司生产耗材领用管理规范制度》
- 公寓租赁托管合同
- 物业临时托管合同
- 德语考试试题分析及答案
- 蚌埠中考地理试题及答案
- 2026年山东省招远市高考物理模拟预测试卷附答案详解(巩固)
- 2026年山西省孝义市高考物理二模测试卷附参考答案详解(综合题)
- 2026年湖北省宜都市高考物理二模考试卷带答案详解(考试直接用)
- 2026年云南省香格里拉市高考物理真题汇编测试卷含答案详解【培优B卷】
- 2025年吉林省延吉市高考物理强基计划模拟卷附参考答案详解【典型题】
- 江苏无锡惠山区2023年小学毕业考试语文试卷(含答案)
- 小儿川崎病护理查房课件
- 公司入围申请书范文模板
- 分体空调维保技术标书(分体空调维护保养技术标书)
- 2024年海南农垦旅游集团有限公司招聘笔试参考题库含答案解析
- 《新会计法解读》课件
- 幼儿园常见安全事故及其应对策略
- 悬挑式卸料平台监理实施细则
- 安全评价人员管理制度
- 20S517 排水管道出水口
- 土壤的物理性质课件
评论
0/150
提交评论