码迷,mamicode.com
首页 > 数据库 > 详细

Sql学习笔记4——嵌套子查询(下)

时间:2015-04-19 19:13:49      阅读:313      评论:0      收藏:0      [点我收藏+]

标签:

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;

Sql学习笔记4——嵌套子查询(下)

标签:

原文地址:http://www.cnblogs.com/Dezhong-chen/p/4439557.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!