试图理解MySQL和关系代数中复杂SQL查询的逻辑
我正在做一个简单的项目,创建表并向其中插入数据,最后执行一些查询。请注意:我使用的是MySQL命令客户端 我的模式易于实现;没问题试图理解MySQL和关系代数中复杂SQL查询的逻辑,mysql,sql,database,Mysql,Sql,Database,我正在做一个简单的项目,创建表并向其中插入数据,最后执行一些查询。请注意:我使用的是MySQL命令客户端 我的模式易于实现;没问题 Emp(eid: integer, ename: string, age: integer, salary: real) Works(eid: integer, did: integer, pct_time: integer) Dept(did: integer, budget: real, managerid: integer)
Emp(eid: integer, ename: string, age: integer, salary: real)
Works(eid: integer, did: integer, pct_time: integer)
Dept(did: integer, budget: real, managerid: integer)
我的第一个问题:
> SELECT AVG(E.age) FROM DEPT D,EMP E,WORKS W
> WHERE D.did=W.did and
> W.eid=E.eid GROUP BY D.did
如果您知道任何关于理解这些类型的查询的好书,那对我来说都很好
第二个问题:
有时一些讲师或数据库管理员想要查询的关系代数
为什么了解查询的关系代数很重要
我们能用关系代数实现所有这些复杂的查询吗?帮你自己一个忙,用GUI获得一个MySQL客户端。这将为您节省大量时间,尤其是在编辑更复杂的查询时 我可以推荐,但是还有很多其他的免费的 你的第一个问题:
select
dept.did as `department`,
avg(age) as `avgAge`
from
dept,works,emp
where
emp.eid=works.eid and
dept.did=works.did
group by
dept.did
order by
2 desc
limit 1
也许其他人想帮你做剩下的家庭作业 你很接近。试试这个:
SELECT
MAX(AVG(age)) AS Department_id_with_the_highest_average_age
FROM
dept, emp, works
WHERE
dept.did=works.did
AND
works.eid=emp.eid
GROUP BY dept.did
关于关系代数,请阅读
享受。回答三个不同的“第二个问题”: “有时一些讲师或数据库管理员想要查询的关系代数?” 我不知道讲师的情况,但我相当肯定数据库管理员永远不会知道(唉)。他们只想“完成任务”。哦,等等,他们通常也不想看到任何“异国情调”的查询出现在他们宝贵的数据库上。如果他们这样做了,他们会来告诉你一些事情,这基本上意味着你不应该在你的问题中使用代数的全部表达能力,他们发现你的问题如此可疑。有时有充分的理由,有时没有 了解查询的关系代数,为什么重要 因为如果你不理解代数,你基本上就不知道你的SQL是什么意思/做什么的。但这不必让你担心——绝大多数所谓的,而且经常自称是“数据库专业人士”的人也没有任何线索,他们仍然可以靠自己的无知谋生。问问你周围的十几个人,是否有人能告诉你一些关于广义传递闭包的合理的事情,你就会明白我的意思了 我们能用关系代数实现所有这些复杂的查询吗
对。关系代数/关系演算(区分但等价)是基础。它们通常被认为是“表达完整的”(意思是:它们足以表达人们可能想象得到的任何问题)。谢谢你的评论,这不是家庭作业。我正在尽力学习。就是这样。如果是家庭作业,我可以把所有的问题都过去,然后等别人解决。。。无论如何,非常感谢。事实上,当我查看您的查询时,它似乎没有效率。其他一些选项是否可以通过使用嵌套查询来提高效率?您如何判断它没有效率?除非查看查询的执行计划,否则您不知道DBMS对查询做了什么。无论如何,这个查询非常简单,因此只要数据库有合适的索引,就应该很快。事实上,我有索引方面的基本知识,因为我知道它只获取“所有”员工的平均年龄,然后使用order by对其进行限制。谢谢你的回答,但是MAX(平均年龄))不能一起使用:)