SQLZOO 基础练习题汇总:从语法到查询,助你快速掌握数据处理技能

2025-07-09| 2429 阅读
? SELECT 基础:从表中提取数据
刚开始接触 SQLZOO 练习题时,很多人会被 “如何从表中拿到想要的数据” 难住。其实最基础的 SELECT 语句就是解决这个问题的关键。比如有个 students 表,里面存着学生的 idnameagescore 这些信息,要是想看看所有学生的名字和分数,该怎么写呢?很简单,用 SELECT name, score FROM students; 就搞定了。这里要注意,列名之间用逗号隔开,而且顺序可以按自己的需求调整,比如先看分数再看名字,写成 SELECT score, name FROM students; 就行。

还有一种情况是,表中的数据太多,不想把所有行都显示出来,这时候就需要 WHERE 子句来筛选了。比如想找出分数大于 80 分的学生,语句就是 SELECT name, score FROM students WHERE score > 80;。这里的 > 是比较运算符,除了它还有 =<>=<=!= 等,根据不同的筛选条件选择合适的就行。需要注意的是,字符串比较的时候要加引号,比如 WHERE name = 'Alice';,而数字就不用了。

? 聚合函数:快速统计数据
当需要对数据进行统计时,聚合函数就派上大用场了。常见的聚合函数有 COUNT()SUM()AVG()MAX()MIN()。比如想知道 students 表中有多少个学生,用 COUNT(id) 或者 COUNT(*) 都可以,不过 COUNT(id) 会忽略 idNULL 的行,而 COUNT(*) 会统计所有行,包括有 NULL 值的。如果想计算所有学生的总分和平均分,就可以用 SUM(score)AVG(score),语句是 SELECT SUM(score) AS total_score, AVG(score) AS avg_score FROM students;,这里的 AS 是给统计结果起别名,方便查看。

还有一个容易出错的地方是,聚合函数默认会把所有行作为一个整体来统计,如果想按某个字段分组统计,比如按 age 分组,看看每个年龄的学生人数和平均分数,就需要用到 GROUP BY 子句。语句是 SELECT age, COUNT(*) AS student_count, AVG(score) AS avg_score FROM students GROUP BY age;。这时候要注意,GROUP BY 后面的字段要和 SELECT 后面的非聚合字段一致,不然就会报错。

? JOIN 操作:关联多个表
实际应用中,数据往往分布在多个表中,这时候就需要用 JOIN 来关联表了。常见的 JOIN 类型有 INNER JOINLEFT JOINRIGHT JOINFULL OUTER JOIN。比如有两个表,students 表和 courses 表,students 表中有学生的基本信息,courses 表中有学生的选课信息,两个表通过 student_id 关联。如果想找出每个学生选的课程名称,就需要用 INNER JOIN,语句是 SELECT students.name, courses.course_name FROM students INNER JOIN courses ON students.id = courses.student_id;

LEFT JOIN 是左边表的所有行都会显示,右边表匹配不到的行用 NULL 填充,比如想看看所有学生的信息,包括那些没有选课的学生,就用 SELECT students.*, courses.course_name FROM students LEFT JOIN courses ON students.id = courses.student_id;,这里的 .* 表示选择所有列。RIGHT JOINLEFT JOIN 相反,是右边表的所有行都会显示,FULL OUTER JOIN 则是两个表的所有行都会显示,匹配不到的用 NULL 填充。需要注意的是,不同的数据库对 FULL OUTER JOIN 的支持可能不一样,比如 MySQL 就不支持,这时候可以用 UNION 来代替。

? 子查询:在查询中嵌套查询
子查询就是在一个查询语句中嵌套另一个查询语句,通常用来解决需要先得到一个结果,再用这个结果进行下一步查询的问题。子查询可以出现在 SELECTFROMWHERE 子句中。比如想找出分数高于平均分的学生,就可以在 WHERE 子句中用子查询来获取平均分,语句是 SELECT name, score FROM students WHERE score > (SELECT AVG(score) FROM students);

子查询还可以用在 FROM 子句中,把一个查询结果当作临时表来使用。比如想找出每个年龄中分数最高的学生,就可以先按年龄分组,找出每个组的最高分,然后再和原表关联,语句是 SELECT s.name, s.age, s.score FROM students s INNER JOIN (SELECT age, MAX(score) AS max_score FROM students GROUP BY age) t ON s.age = t.age AND s.score = t.max_score;。这里的 t 就是临时表,通过 INNER JOIN 和原表关联,找出每个年龄中分数等于最高分的学生。

? 字符串处理:清洗和转换数据
数据处理中经常会遇到字符串需要处理的情况,比如去除空格、转换大小写、提取子字符串等。SQLZOO 中也有很多关于字符串处理的练习题。比如有个 names 表,里面的 name 字段可能前后有空格,需要去除,就可以用 TRIM() 函数,语句是 SELECT TRIM(name) AS cleaned_name FROM names;。如果想把名字全部转换成大写或者小写,就用 UPPER()LOWER() 函数,比如 SELECT UPPER(name) AS upper_name FROM names;

提取子字符串常用的函数是 SUBSTRING(),比如想提取名字中的姓氏,假设姓氏是前两个字,就可以用 SELECT SUBSTRING(name, 1, 2) AS last_name FROM names;,这里的第一个参数是字符串,第二个参数是起始位置,第三个参数是长度。还有 REPLACE() 函数可以替换字符串中的某个部分,比如把名字中的 “张” 换成 “章”,语句是 SELECT REPLACE(name, '张', '章') AS replaced_name FROM names;

? 日期处理:处理时间相关数据
涉及到日期和时间的数据时,需要用到日期处理函数。比如有个 orders 表,里面有 order_date 字段,想找出某年某月的订单,或者计算两个日期之间的天数差。YEAR()MONTH()DAY() 函数可以分别提取日期中的年、月、日,比如 SELECT YEAR(order_date) AS order_year, MONTH(order_date) AS order_month FROM orders;。计算两个日期之间的天数差可以用 DATEDIFF() 函数,语句是 SELECT DATEDIFF(order_date, create_date) AS days_diff FROM orders;,这里的 order_date 是结束日期,create_date 是开始日期。

还有 DATE_FORMAT() 函数可以把日期转换成指定的格式,比如想把 order_date 转换成 “YYYY - MM - DD” 的格式,语句是 SELECT DATE_FORMAT(order_date, '%Y-%m-%d') AS formatted_date FROM orders;,这里的 %Y 表示四位年,%m 表示两位月,%d 表示两位日。不同的数据库可能函数名称和用法略有不同,比如 MySQL 中用 DATE_FORMAT(),而 SQL Server 中用 FORMAT() 函数,需要根据具体的数据库来选择合适的函数。

? CASE 语句:实现条件逻辑
当需要根据不同的条件返回不同的结果时,CASE 语句就非常有用了。比如想根据学生的分数划分等级,80 分以上是 “A”,60 - 80 分是 “B”,60 分以下是 “C”,就可以用 CASE 语句,语句是 SELECT name, score, CASE WHEN score >= 80 THEN 'A' WHEN score >= 60 THEN 'B' ELSE 'C' END AS grade FROM students;。这里的 CASE 语句以 CASE 开头,然后用 WHEN 来设置条件,THEN 是条件成立时返回的结果,最后用 END 结束,并可以给结果起别名。

CASE 语句还可以用在聚合函数中,比如想统计每个等级的学生人数,就可以在 COUNT() 函数中使用 CASE 语句,语句是 SELECT COUNT(CASE WHEN score >= 80 THEN 1 END) AS a_count, COUNT(CASE WHEN score >= 60 AND score < 80 THEN 1 END) AS b_count, COUNT(CASE WHEN score < 60 THEN 1 END) AS c_count FROM students;。这里的 CASE 语句在满足条件时返回 1,否则返回 NULL,而 COUNT() 函数会忽略 NULL 值,所以就能统计出每个等级的人数。

? 综合练习:解决复杂问题
前面介绍了 SQLZOO 中常见的基础练习题类型,现在来看看如何综合运用这些知识解决复杂问题。比如有一个问题:找出选修了 “数学” 和 “英语” 两门课程的学生名字。首先,我们需要知道 “数学” 和 “英语” 的课程 ID,假设在 courses 表中,“数学” 的 course_id 是 1,“英语” 的 course_id 是 2。然后,学生选课信息在 student_courses 表中,里面有 student_idcourse_id 字段。

这时候可以用子查询来解决,先找出选了 “数学” 课程的学生 student_id,再找出选了 “英语” 课程的学生 student_id,然后找出同时存在于这两个结果中的 student_id,最后根据这些 student_idstudents 表中查找学生名字。语句是 SELECT name FROM students WHERE id IN (SELECT student_id FROM student_courses WHERE course_id = 1) AND id IN (SELECT student_id FROM student_courses WHERE course_id = 2);。或者用 JOIN 的方式,将 student_courses 表自连接两次,分别关联 “数学” 和 “英语” 课程,然后筛选出同一个学生的记录,语句是 SELECT s.name FROM students s INNER JOIN student_courses sc1 ON s.id = sc1.student_id INNER JOIN student_courses sc2 ON s.id = sc2.student_id WHERE sc1.course_id = 1 AND sc2.course_id = 2;

再比如一个问题:找出每个学生的选课数量,并按选课数量从多到少排序,选课数量相同的按学生名字升序排序。这里需要用到 GROUP BY 子句和 ORDER BY 子句,先按 student_id 分组,计算每个学生的选课数量,然后用 ORDER BY 子句排序。语句是 SELECT student_id, COUNT(course_id) AS course_count FROM student_courses GROUP BY student_id ORDER BY course_count DESC, student_name ASC;,这里假设 students 表中有 student_name 字段,需要和 student_courses 表关联,所以完整的语句应该是 SELECT s.name, COUNT(sc.course_id) AS course_count FROM students s INNER JOIN student_courses sc ON s.id = sc.student_id GROUP BY s.id, s.name ORDER BY course_count DESC, s.name ASC;

通过这些练习题的练习,我们可以逐步掌握 SQL 的各种语法和查询技巧,提高数据处理的能力。在做练习题的时候,要注意理清思路,先明确问题需要什么数据,再考虑如何从表中获取这些数据,可能需要用到哪些函数和语句,然后一步步写出 SQL 语句,最后检查是否正确。遇到错误时,不要着急,仔细查看错误信息,分析哪里出错了,是语法错误还是逻辑错误,慢慢调试就能解决问题。

【该文章由dudu123.com嘟嘟 ai 导航整理,嘟嘟 AI 导航汇集全网优质网址资源和最新优质 AI 工具】

分享到:

相关文章

创作资讯2025-04-03

2025 最新!朱雀 AI 检测腾讯混元模型快速入门教程

🔍 2025 最新!朱雀 AI 检测腾讯混元模型快速入门教程 📌 一、检测前的准备工作 想玩转朱雀 AI 检测腾讯混元模型,第一步得把基础工具和账号准备好。先登录朱雀 AI 官网,用微信或者 QQ

第五AI
创作资讯2025-03-02

公众号推荐池的“内容消费”场景分析:用户想看什么?

📱碎片化场景:用户要的是 “30 秒抓眼球”​地铁里刷手机的人,手指在推荐池里滑动的速度比电梯还快。这种场景下,用户给每个公众号封面和标题的时间不会超过 3 秒。你去看那些高点击的内容,标题要么带数

第五AI
创作资讯2025-05-11

免费AI写作软件使用心得:如何“调教”AI,写出满意的文章

🔍 明确需求:给 AI 一个清晰的「剧本」 刚开始用免费 AI 写作软件的时候,我也经常遇到这样的情况。让它写篇种草文,结果出来的内容像说明书;让它想个活动方案,思路比白开水还淡。后来才发现,问题出

第五AI
创作资讯2025-06-17

可爱 TV 每日更新热门影视:免费看动漫电影电视剧无负担观影

? 可爱 TV:每日更新热门影视,免费看动漫电影电视剧无负担观影 在如今这个快节奏的生活里,追剧已经成为很多人放松的方式。要是能有一个平台,既能免费观看各种热门影视,还能每日更新,那可真是太方便了。可

第五AI
推荐2025-08-08

力扣模拟面试防作弊指南:双机位 + 实时代码审查策略揭秘

?双机位布置:打造360°无死角面试环境力扣模拟面试的双机位要求让不少同学犯难,其实把它想象成给电脑装个「监控搭档」就简单了。主机位就是咱们平时用的电脑摄像头,记得调整到能露出整张脸和桌面的角度——下巴别藏在阴影里,键盘也别只露出半个。副机位一般用手机支架固定,放在身体侧后方45度角,这个位置既能拍

第五AI
推荐2025-08-08

Examify AI 是一款怎样的考试平台?2025 最新个性化学习计划解析

?精准提分黑科技!ExamifyAI如何重塑2025考试备考模式?一、核心功能大揭秘:AI如何让考试准备更高效?ExamifyAI作为新一代智能考试平台,最吸引人的地方就是它的自适应学习引擎。这个系统就像一个贴心的私人教练,能根据你的答题数据自动调整学习路径。比如你在数学几何题上错误率高,系统会优先

第五AI
推荐2025-08-08

公众号注册的“蝴蝶效应”:一个选择,可能影响未来三年的运营 - 前沿AIGC资讯

你可能觉得公众号注册就是填几个信息的事,殊不知,这里面的每个选择都像蝴蝶扇动翅膀,未来三年的运营轨迹可能就被悄悄改变了。很多人刚开始没当回事,等到后面想调整,才发现处处受限,那叫一个后悔。今天就跟你好好聊聊,注册时那些看似不起眼的选择,到底能给未来的运营带来多大影响。​📌账号类型选不对,三年运营路难

第五AI
推荐2025-08-08

AI写作如何进行事实核查?确保头条文章信息准确,避免误导读者 - AI创作资讯

上周帮同事核查一篇AI写的行业报告,发现里面把2023年的用户增长率写成了2025年的预测数据。更离谱的是,引用的政策文件号都是错的。现在AI生成内容速度快是快,但这种硬伤要是直接发出去,读者信了才真叫坑人。今天就掰开揉碎了说,AI写作怎么做好事实核查,别让你的头条文章变成 误导重灾区 。​📌AI写

第五AI
推荐2025-08-08

10w+阅读量爆文案例拆解分析:高手都从这5个维度入手 - AI创作资讯

🎯维度一:选题像打靶,靶心必须是「用户情绪储蓄罐」做内容的都清楚,10w+爆文的第一步不是写,是选。选题选不对,后面写得再好都是白搭。高手选选题,就像往用户的「情绪储蓄罐」里投硬币,投对了立刻就能听到回响。怎么判断选题有没有击中情绪?看三个指标:是不是高频讨论的「街头话题」?是不是藏在心里没说的「抽

第五AI
推荐2025-08-08

135编辑器会员值得买吗?它的AI模板库和秀米H5比哪个更丰富? - AI创作资讯

📌135编辑器会员值不值得买?AI模板库和秀米H5谁更胜一筹?🔍135编辑器会员的核心价值解析企业级商用保障与效率提升135编辑器的企业会员堪称新媒体运营的「合规保险箱」。根据实际案例,某团队通过企业会员节省了大量设计费用,完成多篇内容创作,单篇成本从千元降至百元内。这得益于其海量正版模板和素材库,

第五AI
推荐2025-08-08

新公众号被限流怎么办?粉丝增长影响分析及 2025 恢复指南 - AI创作资讯

新公众号被限流怎么办?粉丝增长影响分析及2025恢复指南🔍新公众号限流的核心原因解析新公众号被限流,往往是多个因素叠加的结果。根据2025年最新数据,超过70%的限流案例与内容质量直接相关。比如,有些新手喜欢用“震惊体”标题,像“惊!某公众号三天涨粉十万”,这类标题在2025年的算法里已经被明确标记

第五AI
推荐2025-08-08

AI内容重复率太高怎么办?掌握这些技巧轻松通过AIGC检测 - AI创作资讯

⚠️AI内容重复率高的3大核心原因现在用AI写东西的人越来越多,但很多人都会遇到同一个问题——重复率太高。明明是自己用工具生成的内容,一检测却显示和网上某些文章高度相似,这到底是为什么?最主要的原因是AI训练数据的重叠性。不管是ChatGPT还是国内的大模型,训练数据来源其实大同小异,都是爬取的互联

第五AI
推荐2025-08-08

135编辑器让排版更简单 | 专为公众号运营者设计的效率工具 - AI创作资讯

🌟135编辑器:公众号运营者的效率革命做公众号运营的朋友都知道,排版是个费时费力的活。一篇文章从内容到排版,没几个小时根本搞不定。不过现在好了,135编辑器的出现,彻底改变了这一现状。135编辑器是提子科技旗下的在线图文排版工具,2014年上线至今,已经成为国内新媒体运营的主流工具之一。它的功能非常

第五AI
推荐2025-08-08

用对prompt指令词,AI内容的原创度能有多高?实测效果惊人 - 前沿AIGC资讯

现在做内容的人几乎都离不开AI,但最头疼的就是原创度。平台检测一严格,那些模板化的AI文很容易被打回,甚至判定为“非原创”。但你知道吗?同样是用AI写东西,换个prompt指令词,原创度能差出天壤之别。我最近拿不同的prompt测了好几次,结果真的吓一跳——好的指令能让AI内容原创度直接从“及格线”

第五AI