MySQL进阶实战:解密复杂查询

需积分: 14 5 下载量 176 浏览量 更新于2024-09-14 收藏 22KB DOCX 举报
"MySQL进阶练习" 在MySQL数据库管理中,进阶练习通常涉及到更复杂的查询和操作,这对于提升数据库技能至关重要。本练习主要关注SQL查询语句的使用,特别是涉及分组、聚合函数以及连接查询的场景。 首先,我们来看第一道练习题。题目要求查询出所有每门课程得分都超过80分的学生姓名。给出的表`score`包含了`name`(学生姓名)、`kecheng`(课程)和`socre`(分数)三列。解答此题的关键在于理解`HAVING`子句和`GROUP BY`子句的区别。`WHERE`子句通常用于在数据分组前进行筛选,而`HAVING`则是在数据分组后进行条件筛选。由于我们需要找出每个学生所有课程的最低分是否都超过80分,因此需要先按学生姓名`name`进行分组,然后使用`MIN(score)`找到每个学生的最低分,最后使用`HAVING`来筛选出最低分大于80的学生。正确答案是: ```sql SELECT name, MIN(score) AS min_score FROM score GROUP BY name HAVING min_score > 80; ``` 接下来的练习涉及到三个表:`project`(项目)、`contract`(合同)和`pay`(付款)。这些练习展示了如何处理多表连接和聚合函数。 第二个问题要求列出各个项目的合同金额总数。`project`表包含项目ID和项目名称,`contract`表有合同ID、项目ID和合同金额。我们需要通过`LEFT JOIN`将`project`与`contract`连接,然后按项目ID`project_id`分组,使用`SUM()`计算每组的`money`总和。正确答案是: ```sql SELECT project.name, SUM(contract.money) AS total_money FROM project LEFT JOIN contract ON project.id = contract.project_id GROUP BY project.name; ``` 第三个问题是列出ID为1的项目所有已付款的记录。这需要同时考虑`contract`和`pay`表。`pay`表记录了合同ID和付款金额,所以我们需要找到合同ID与项目ID为1的记录匹配的合同。正确答案是: ```sql SELECT * FROM contract, pay WHERE contract.id = pay.contract_id AND contract.project_id = 1; ``` 第四个问题要求列出所有已有付款记录的合同及其对应的项目。这需要找出存在于`pay`表中的合同ID,然后将这些合同ID与`contract`表和`project`表连接。正确答案是: ```sql SELECT * FROM project, contract WHERE contract.project_id = project.id AND contract.id IN (SELECT contract_id FROM pay); ``` 最后,练习提到了`student`表和`score`表,但没有提供具体的问题。通常,这两个表可以用于查询学生的成绩信息,例如找出平均分最高的学生、按课程平均分排序等。 通过这些练习,我们可以深入理解SQL中的分组、聚合函数、连接查询以及子查询的运用,这些都是在实际工作中处理复杂数据查询时不可或缺的技能。对于有一定基础的MySQL学习者或工作一年左右的数据库管理员来说,这些练习能有效提升问题解决能力,对于刚入门的学习者来说,通过思考和讨论也能加深对SQL的理解。