代码之家  ›  专栏  ›  技术社区  ›  berkay

试图理解MySQL和关系代数中复杂SQL查询的逻辑

  •  0
  • berkay  · 技术社区  · 16 年前

    我的模式易于实现;没问题。

       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. 查找员工平均年龄最高的部门。

    当我第一次读到这个问题时,它似乎很简单。然而,在实施过程中,我无法得到结果。我有很多这样的疑问,有人能解释一下让这些疑问更简单的步骤吗?

    > 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
    

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

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

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

    我们能用关系代数实现所有这些复杂的查询吗?

    3 回复  |  直到 13 年前
        1
  •  1
  •   NawaMan    16 年前

    你很接近。试试这个:

    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

    享受

        2
  •  1
  •   Erwin Smout    16 年前

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

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

    在你的询问中充分运用了代数的表达能力,他们觉得很可疑。有时有充分的理由,有时没有。

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

    因为如果你不理解代数,你基本上就不知道你的SQL是什么意思/做什么的。但这不必让你担心——绝大多数所谓的,而且经常自称是“数据库专业人士”的人也没有任何线索,他们仍然可以靠自己的无知谋生。问问你周围的十几个人,是否有人能告诉你一些关于广义传递闭包的合理的事情,你就会明白我的意思了。

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

        3
  •  0
  •   Wouter van Nifterick Andrey    16 年前

    帮自己一个忙,买一个带有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
    

    也许其他人想帮你做剩下的家庭作业。