5)from子句中的子查询

因为SQL任何select-from-where表达式返回的都是关系,所以from子句中允许使用子查询表达式。

考虑查询“找出平均工资超过42000美元的那些系中教师的平均工资”,之前我们用having子句来书写该查询。

现在我们不用having子句,如下:

  select dept_name,avg_salary

  from(select dept_name,avg(salary) as avg_salary

    from instructor

    group by dept_name)

  where avg_salary>42000;

我们还可以用 as子句给此子查询结果关系起个名字,并对属性进行重命名。如下:

  select dept_name, avg_salary

  from(select dept_name,avg(salary)

    from instructor

    group by dept_name)

    as dept_avg(dept_name,avg_salary)  /*as常用场合*/

  where avg_salary>42000;

另一例子,假设我们要找出所有系中工资总额最大的系,在此having子句则无能为力。但from嵌套子查询可以轻易写出:

  select max(tot_salary)

  from(select dept_name,sum(salary)

    from instructor

    group by dept_name)as dept_total(dept_name,tot_salary);

注:并非全部sql实现都支持在from子句中嵌套子查询。

from子句嵌套不允许使用来自from子句其他关系的相关变量。

6)with子句

with子句提供了定义临时关系的方法。这个定义只对包含with子句的查询有效。

考虑查询“找出具有最大预算值的系”。如下

  with max_budget(value) as

    (select max(budget)

    from department)

  select budget

  from department,max_budget

  where department.budget=max_budget.value;

with子句定义了临时关系max_budget,随后被使用。

7)标量子查询

sql允许子查询出现在返回单个值的表达式能够出现的任何地方,只要该子查询只返回单个属性的单个元组,称为标量子查询。它可以出现在select、where和having子句中。

考虑查询“列出所有的系以及它们拥有的教师数:

  select dept_name,(select count(*)

            from instructor

            where department.dept_name = instructor.dept_name)

            as num_instructors

  from department;

posted on 2015-04-19 18:02  惊呆!  阅读(210)  评论(0编辑  收藏  举报