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

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;

时间: 2024-10-13 07:17:54

Sql学习笔记4——嵌套子查询(下)的相关文章

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

嵌套子查询 子查询是嵌套在另一个查询中的select-from-where表达式.子查询嵌套在where子句中时,通常用于对集合的成员资格.集合的比较以及集合的基数进行检查. 1.集合成员资格 SQL允许测试元组在关系中的成员资格.连接词in测试元组是否是集合中的成员,集合是由select子句产生的一组值构成的.连接词not in测试元组是否不是集合中的成员. 考虑“找出在2009年秋季和2010年春季学期同时开课的所有课程.”按之前所学知识,可以通过对两个集合进行并运算来书写该查询.如下: (

SQL学习之学会使用子查询

1.SELECT语句是SQL的查询.我之前的随笔中所用的SELECT语句都是简单的查询,即从单个数据库表中检索数据的单条SELECT语句. 查询:任何SQL语句都是查询,但此术语一般指SELECT语句. 2.SQL不仅允许简单的SELECT查询,还允许创建子查询,即嵌套在其他查询中的查询. 下面通过实例来了解子查询在实际项目中的应用: create database Study gouse Study go create table Customers( Id int identity(1,1)

《MySQL必知必会学习笔记》:子查询

子查询 在开始了解子查询之前,首先做下准备工作,建立3个表, 一个是customers表,其中包括:客户名字.客户ID.客户Tel等. 一个是orders表,其中包括:订单号.客户ID.订单时间等. 一个是ordersitems表,其中包括:订单物品.订单号.物品数量. 准备工作 1.建表 建customers表的命令如下,其它的表与之类似: create table customers(cust_name varchar(10),cust_id int(10),cust_tel varchar

SQL学习笔记_04_多表查询

一.概念: 1.多表连接有以下几种分法: (1)内连接           vs          外连接 (左.右.满) (2)等值连接        vs         不等值连接 (3)非自连接        vs         自连接 2.笛卡尔集:  所有表中的所有行互相连接 产生条件:(1)多表查询没有连接条件 (2)连接条件无效 3. 内连接   :  结果集中不包含一个表与另一个表不匹配的行 外连接   :  两个表在连接过程中除了返回满足连接条件的行以外(这里的数据是内连接

SQL嵌套子查询和相关子查询的执行过程有什么区别(推荐)

SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类.前提, 假设Books表如下: 类编号 图书名 出版社 价格 -------------------------------------------------------- 2 c#高级应用 圣通出版 23.00 2 Jsp开发应用 机械出版社 45.00 3 高等数学 济南出版社 25.00 3 疯狂英语 清华大学出版社 32.00 嵌套子查询的执行不依赖与外部的查询. 执行过程: (1)执行子查询,其结果不被显示,而是传递

Oracle之PL/SQL学习笔记

自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家批评指正. PL/SQL定义:PL/SQL是由Oracle开发,专门用于Oracle的程序设计语言. PL---Procedural Language. SQL—Structure QueryLanguage.PL/SQL包括过程化语句和SQL语句     PL/SQL的单位:块. 一个块中可以嵌套

SQL点滴10—使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比

原文:SQL点滴10-使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比 今天偶尔看到sql中也有with关键字,好歹也写了几年的sql语句,居然第一次接触,无知啊.看了一位博主的文章,自己添加了一些内容,做了简单的总结,这个语句还是第一次见到,学习了.我从简单到复杂地写,希望高手们不要见笑.下面的sql语句设计到三个表,表的内容我用txt文件复制进去,这里不妨使用上一个随笔介绍的建立端到端的package的方法将这些表导入到数据库中,具体的就不说了. 从这里下载文件employ

IBatis.Net学习笔记六--再谈查询

在IBatis.Net学习笔记五--常用的查询方式 中我提到了一些IBatis.Net中的查询,特别是配置文件的写法. 后来通过大家的讨论,特别是Anders Cui 的提醒,又发现了其他的多表查询的方式.在上一篇文章中我提到了三种方式,都是各有利弊:第一种方式当数据关联很多的情况下,实体类会很复杂:第二种方式比较灵活,但是不太符合OO的思想(不过,可以适当使用):第三种方式最主要的问题就是性能不太理想,配置比较麻烦. 下面是第四种多表查询的方式,相对第二种多了一点配置,但是其他方面都很好(当然

mybatis学习笔记(11)-多对多查询

mybatis学习笔记(11)-多对多查询 mybatis学习笔记11-多对多查询 示例 多对多查询总结 resultMap总结 本文实现多对多查询,查询用户及用户购买商品信息. 示例 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表:orders.orderdetail.items sql SELECT orders.*, user.username, user.sex, user.address, orderdetail.id orderdeta