问题摘自精通SQL结构化查询语言详解中的一个实例(10.1.2),请大家帮忙分析一下,非常感谢。原题如下:从TEACHER表中查询教师的教工号、姓名、所在系、课程号,年龄,并要求教师所在系的平均年龄大于所有教师的平均年龄。
TEACHER表中的属性如下:TNO(教工号),TNAME(教师姓名),CNO(课程号),SAL(工资),DNAME(所在系),TSEX(性别),AGE(年龄)实例代码如下:SELECT TNO,TNAME,DNAME,CNO,AGE FROM TEACHER AS T WHERE (SELECT AVG(AGE) FROM TEACHER WHERE DNAME = T.DNAME)>(SELECT AVG(AGE) FROM TEACHER)(SELECT AVG(AGE) FROM TEACHER WHERE DNAME = T.DNAME)比较糊涂,这个代码是如何分析得到的,DNAME=T.DNAME是怎么回事?

解决方案 »

  1.   

    (SELECT AVG(AGE) FROM TEACHER WHERE DNAME = T.DNAME)比较糊涂,这个代码是如何分析得到的,DNAME=T.DNAME是怎么回事?DNAME:是TEACHER表中
    T.DNAME:主查询中TEACHER表中的。意思就是对于TEACHER表中的每一个DNAME按名字计算AGE平均値,效率低了,用连接查询,
    按DNAME分组,计算AGE平均値,再连接。
      

  2.   

    (SELECT AVG(AGE) FROM TEACHER WHERE DNAME = T.DNAME)比较糊涂,这个代码是如何分析得到的,DNAME=T.DNAME是怎么回事?DNAME:是子查询中TEACHER表中
    T.DNAME:是主查询中TEACHER表中的。意思就是对于TEACHER表中的每一个DNAME按名字计算AGE平均値,效率低了,用连接查询,
    按DNAME分组,计算AGE平均値,再连接。
      

  3.   

    如果写成:
    SELECT TNO,TNAME,DNAME,CNO,AGE FROM TEACHER AS T WHERE AGE >(SELECT AVG(AGE) FROM TEACHER) 
    是不是也能达到相同效果呢?
      

  4.   

    关键就是在这里,DNAME=T.DNAME 正是他的存在才得出了平均年龄大于所有教师的平均年龄的老师的信息