【问题标题】:Trying to understand the logic of complex SQL queries in MySQL and relational algebra试图理解 MySQL 和关系代数中复杂 SQL 查询的逻辑
【发布时间】:2010-12-01 17:00:37
【问题描述】:

我正在做一个简单的项目来创建表并将数据插入其中,最后执行一些查询。请注意:我使用的是 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)

我的第一个问题:

  1. 查找员工平均年龄最高的部门。

当我第一次阅读这个问题时,似乎很容易。但是,在实施时我无法得到结果。我有很多这样的查询,有人可以解释一下使这些查询更容易的步骤吗?

我使用以下查询来获取所有员工的平均年龄。下一步是获取 MAX 年龄,但是怎么做呢?

> 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

如果你知道任何好书来理解这些类型的查询,那对我来说很好。

第二个问题:

有时一些教师或数据库管理员想要查询的关系代数?

为什么了解查询的关系代数很重要?

我们都可以使用关系代数来实现所有这些复杂的查询吗?

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    回答您的三个不同的“第二个问题”:

    “有时一些教师或数据库管理员想要查询的关系代数?”

    我不知道讲师,但我相当肯定数据库管理员永远不会(唉)。他们只想“完成工作”。哦等等,他们通常也不希望在他们宝贵的数据库中看到任何“异国情调”的查询。如果他们这样做了,他们会过来告诉你一些事情,这基本上意味着你应该在你的那个他们认为如此可疑的查询中使用代数的全部表达能力。有时有充分的理由,有时则不然。

    了解查询的关系代数,为什么重要?

    因为如果您不了解代数,您基本上就是不知道您的 SQL 的含义/作用。但这不必让您担心 - 绝大多数所谓的并且通常自称为“数据库专业人员”的人也没有任何线索,他们仍然可以靠自己的无知谋生。问问你环境中的十几个人,是否有人能告诉你一些关于广义及物闭包的明智之举,你就会明白我的意思。

    我们都可以使用关系代数来实现所有这些复杂的查询吗?

    是的。关系代数/关系演算(不同但等效)是基础。它们通常被认为是“表达完整的”(意思是:它们足以表达人们可能想象的任何查询)。

    【讨论】:

      【解决方案2】:

      你很亲密。试试这个:

      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
      

      关于关系代数,阅读this

      享受吧。

      【讨论】:

      • 感谢您的回答,但 MAX(AVG(age)) 不能一起使用:)
      【解决方案3】:

      帮自己一个忙,获得一个带有 GUI 的 MySQL 客户端。它将为您节省大量时间,尤其是在您编辑更复杂的查询时。

      我可以推荐HeidiSQL,但还有很多其他免费的。

      你的第一个问题:

      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
      

      也许其他人想为你完成剩下的作业。

      【讨论】:

      • 感谢您的评论,这不是家庭作业。我正在努力学习。就是这样。如果是家庭作业,我可以把所有问题都过去,然后等待有人解决它们......无论如何,非常感谢。
      • 实际上,当我查看您的查询时,似乎效率不高,其他一些选项是否可以通过使用嵌套查询来提高效率?
      • 你怎么能说它没有效率呢?除非您查看它的执行计划,否则您不知道 DBMS 对查询做了什么。不管怎样,这个查询非常简单,因此只要数据库有合适的索引就应该很快。
      • 实际上我有索引方面的基本知识,据我所知,它只是获取“所有”员工的平均年龄,然后通过使用 order by 来限制它。
      猜你喜欢
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多