当前位置: 首页 > news >正文

别再死记硬背SQL了!我用这30个PTA数据库练习题,带你从零到实战通关

从零到实战:30个PTA数据库练习题构建SQL思维体系

当我在大学第一次接触SQL时,那些SELECT、WHERE、JOIN就像天书一样令人困惑。直到我发现PTA平台的这套数据库练习题,才真正理解了SQL不是用来死记硬背的语法规则,而是解决实际问题的思维工具。今天,我将分享如何通过这些练习题,建立起从基础查询到复杂操作的完整知识框架。

1. 基础查询:从筛选数据开始

任何SQL学习之旅都始于最简单的SELECT语句。PTA的前几道题教会我们如何用WHERE子句精确抓取需要的数据。

比如第10-1题要求查询重量在40到65之间的产品,这看似简单,却包含了几个关键点:

  • 范围查询的两种写法:BETWEEN 40 AND 65Weight >= 40 AND Weight <= 65
  • 字段类型对比较操作的影响(decimal类型的精确比较)
-- 方案A:使用BETWEEN(包含边界值) SELECT Pid, PName, Weight FROM product WHERE Weight BETWEEN 40 AND 65; -- 方案B:使用比较运算符 SELECT Pid, PName, Weight FROM product WHERE Weight >= 40 AND Weight <= 65;

类似的基础筛选模式在第10-2题(按姓氏查询)和第10-19题(按性别查询)中再次出现:

题目编号筛选条件关键语法实际应用场景
10-2姓名以"刘"开头LIKE '刘%'客户分类统计
10-19性别为女生(sex=0)WHERE sex = 0用户画像分析
10-21姓"李"的学生WHERE sname LIKE '李%'校友信息检索

提示:LIKE操作符中,%匹配任意多个字符,_匹配单个字符。在大型表中过度使用LIKE可能导致性能问题。

2. 数据操作:增删改的实战技巧

当我们需要修改数据时,INSERT、UPDATE和DELETE语句就派上用场了。PTA的这部分练习题特别有价值,因为它们展示了真实业务场景中的数据维护需求。

2.1 精准更新数据

第10-11题演示了如何定位并修改特定记录:

-- 修改学号为1911203的学生的联系电话 UPDATE students SET phone = '590987' WHERE sno = '1911203';

而第10-15题则展示了基于条件的批量更新:

-- 将所有低于75分的女生成绩提高5% UPDATE sc SET grade = grade * 1.05 WHERE sno IN ( SELECT sno FROM stu WHERE sex = 0 ) AND grade < 75;

2.2 安全删除数据

第10-16题强调了删除操作的外键约束处理:

-- 先删除从表(sc)中的相关记录 DELETE FROM sc WHERE sno IN ( SELECT sno FROM stu WHERE sname = '周强' ); -- 再删除主表(stu)中的记录 DELETE FROM stu WHERE sname = '周强';

关键要点

  1. 更新前先用SELECT测试WHERE条件是否准确
  2. 删除操作要考虑外键约束,可能需要事务处理
  3. 重要数据删除前建议先备份

3. 高级查询:多表关联与聚合分析

真正的业务场景很少只涉及单表查询。PTA中期的练习题开始引入多表关联和聚合函数,这是SQL真正强大的地方。

3.1 多表连接实战

第10-7题展示了典型的INNER JOIN应用:

-- 查询供应商信息及其订单 SELECT orders.Sid, supplier.SName, supplier.City, orders.OrdNo FROM orders JOIN supplier ON orders.Sid = supplier.Sid;

而第10-9题则演示了LEFT JOIN的重要性:

-- 查询职工及其仓库信息(包括没有分配仓库的职工) SELECT employee.Eid, employee.EName, employee.Wno, warehouse.City FROM employee LEFT JOIN warehouse ON employee.Wno = warehouse.Wno;

连接类型对比

连接类型保留哪些记录典型应用场景
INNER JOIN只保留两表匹配的记录精确关联查询
LEFT JOIN保留左表所有记录包含可能为空的关系数据
RIGHT JOIN保留右表所有记录较少使用
FULL JOIN保留两表所有记录数据比对与合并

3.2 聚合函数与分组统计

第10-8题介绍了基本的聚合函数:

-- 计算销售价格的最大值和进货价格的最小值 SELECT MAX(sale_price) AS top_sale, MIN(purchase_price) AS bottom_pur FROM Product;

而第10-31题则展示了复杂的分组统计:

-- 统计各专业学生的平均成绩(无成绩的计为0) SELECT mname AS 专业名, IFNULL(AVG(grade), 0) AS 平均成绩 FROM major LEFT OUTER JOIN ( SELECT mno, grade FROM stu, sc WHERE stu.sno = sc.sno ) AS a ON major.mno = a.mno GROUP BY major.mno ORDER BY major.mno;

常见聚合函数

  • COUNT():计数
  • SUM():求和
  • AVG():平均值
  • MAX()/MIN():最大/最小值
  • GROUP_CONCAT():连接字符串(MySQL特有)

4. 视图与复杂查询:封装查询逻辑

当某些查询变得复杂或需要重复使用时,视图(View)就成为得力工具。PTA的最后几题引导我们创建和使用视图。

4.1 创建视图简化查询

第10-32题创建平均分视图:

CREATE VIEW V_average_grade AS SELECT Student.Sdept, SC.Sno, Student.Sname, AVG(SC.Grade) AS Average_grade FROM Student JOIN SC ON SC.Sno = Student.Sno GROUP BY Student.Sdept, SC.Sno, Student.Sname HAVING AVG(SC.Grade) > 80;

第10-33题创建不及格学生视图:

CREATE VIEW V_FailedCourseStudent AS SELECT Student.Sdept, SC.Sno, Student.Sname, Course.Cname, SC.Grade FROM Student JOIN SC ON Student.Sno = SC.Sno JOIN Course ON Course.Cno = SC.Cno WHERE Grade < 60;

4.2 子查询与高级筛选

第10-28题展示了如何使用子查询进行比较:

-- 查询比"网络工程"专业所有学生年龄都小的学生 SELECT sname FROM stu WHERE birdate > ( SELECT MAX(birdate) FROM stu WHERE mno = ( SELECT mno FROM major WHERE mname = '网络工程' ) );

第10-30题演示了NOT IN的用法:

-- 查询S001选修而S003未选修的课程 SELECT cno AS 课程号 FROM sc WHERE sno = 'S001' AND cno NOT IN ( SELECT cno FROM sc WHERE sno = 'S003' );

视图的优势

  1. 简化复杂查询
  2. 提高安全性(隐藏敏感字段)
  3. 保持逻辑一致性
  4. 向后兼容(表结构变更不影响应用)

这套PTA练习题最宝贵的地方在于它模拟了真实的数据处理场景。当我第一次成功写出那个多表连接的查询时,突然明白了SQL不是孤立的语法点,而是一套解决数据问题的完整思维方式。

http://www.jsqmd.com/news/620621/

相关文章:

  • 【实战解析】陌陌开源 LinkWork(灵工):企业级 AI 员工平台,一岗位一镜像的 K8s Agent 架构全拆解
  • SITS2026专家内部复盘会议纪要(非公开版):AI原生研发失败的87%源于这2个被忽视的底层协议缺陷
  • 如何用 objectStore.add 向本地数据库插入一条新记录
  • 【Python】蒙特卡洛树搜索(MCTS)在动态障碍环境中的自适应寻路策略
  • 2025届必备的降重复率神器横评
  • 中文NLP神器GTE文本向量:快速部署教程与六大核心功能实测
  • Windows/Mac双平台实测:Caption滚动字幕软件如何5分钟打造高逼格桌面特效
  • 搜维尔科技:某工业大学机器人训练中心,利用Manus数据手套大规模采集真实世界操作数据
  • 保姆级教程:在WebRTC项目中集成OpenH264,实现SVC分层编码(附监控场景完整配置代码)
  • 如何自动更新SQL标签状态_利用触发器实现基于逻辑的状态机
  • 【AI原生研发版本控制黄金法则】:20年GitLab+DVC+LLM协同实战验证的7大不可逆规范
  • 挂起、阻塞、锁和cpu占用
  • MacCMSPro视频影视系统源码:构建专业视频平台的理想选择
  • 我是如何压缩 CLAUDE.md / AGENTS.md 的:尽可能节约 AI 的 Token 消耗
  • 武昌区文化墙设计制作一体
  • 基于PLC的私人车库自动门毕业设计:软件为博图1200,采用梯形图、组态动画、接线图及IO分配表
  • 短纤针刺非织造土工布性能指标及标准;短纤土工布
  • align-items 和 align-self,
  • 实战解析:基于Selenium与多线程的东方财富股吧数据采集方案
  • ComfyUI Manager完整教程:高效管理你的AI绘画插件生态
  • OPUS编解码器在audio DSP上的移植和应用贫
  • 打字不如说话,说话不如截图——AI 代码助手的多模态输入实践仝
  • 别再吹牛了,% Vibe Coding 存在无法自洽的逻辑漏洞!衙
  • Cursor+DeepSeek省钱攻略:每月省下20刀,手把手教你配置国产大模型
  • AspNet MVC4 教学:AspNet MVC4 页面动态生成演示
  • LLM 最大支持的提示词注意事项: Python字符串最大长度完全解析
  • 告别默认样式:CSS 自定义滚动条从入门到实战
  • Jenkins 学习总结暗
  • 别再用扁网线了!实测小米AX3600刷OpenWRT后断流的元凶排查与硬件避坑指南
  • SEATA分布式事务——AT模式凭