Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图理解MySQL和关系代数中复杂SQL查询的逻辑_Mysql_Sql_Database - Fatal编程技术网

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

试图理解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)

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

  • 查找员工平均年龄最高的部门
  • 当我第一次读到这个问题时,它似乎很简单。然而,在实施过程中,我无法得到结果。我有很多这样的疑问,有人能解释一下让这些疑问更简单的步骤吗

    我使用以下查询来获得所有员工的平均年龄。下一步是获得最大年龄,但如何获得

    > 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(平均年龄))不能一起使用:)