1、简单子查询
查询的结果:
4、
内联视图子查询
查询结果作为一列出现在数据表中
运行结果:
子查询作为 FROM 子句的查询依据
实现在挂账明细数据表(tb_gzmx)中查询排名第三的挂账单位即总计金额
2、
多列子查询
3、
多行子查询
5、
在HAVING子句中使用子查询
在 HAVING 子句使用查询过滤一组数据
技术要点:
HAVING,WHERE,GROUP BY 子句的正确序列对编写高效的查询代码会有所帮助,他们 3 个应用的具体含义如下:
·WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行;
·GROUP BY 子句用来分组 WHERE 子句的输出;
·HAVING 子句用来从分组的结果中筛选行。
例子:
应用 HAVING 关键字进行分组查询,首先通过 GROUP BY 对公司员工表 中的人名和年龄进行分组查询,之后通过 HAVING 执行分组的查询条件,其中,通过子查询计算员工的平均年龄。
6、
相关子查询
相关子查询指的是查询中再查询,通常是以一个查询作为条件来供另一个查询使用1>非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。 相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。
例子:求出部门内职员工资最高的职员信息(IN)
在职员工资表 (tb_treatment)和职员信息表 (tb_employee) 中查询部门内职员工资最高的职员信息
例子:查询图书销量大于某值得图书信息 ( EXISTS)
利用 EXISTS 谓词在图书信息表 (tb_BookInfo) 和图书销量排名表 (tb_BookOrder) 中查询图书销量大于 400 册的图书信息
例子:返回商品采购量不小于某值得商品销售信息 (NOT EXISTS)
利用 NOT EXISTS 谓词在商品采购信息表 (tb_商品采购)和 商品销售表 (tb_商品销售) 中查询采购量不小于 2000 (即大于或等于2000)的商品销售信息
注意,使用 EXISTS 引入的子查询在下列方面与其他子查询略有不同:
- EXISTS 关键字前面没有列名、常量或其他表达式。
- 由 EXISTS 引入的子查询的选择列表通常几乎都是由星号 (*) 组成。由于只是测试是否存在符合子查询中指定条件的行,因此不必列出列名。
由于通常没有备选的、非子查询的表示法,因此 EXISTS 关键字很重要。尽管一些使用 EXISTS 创建的查询不能以任何其他方法表示,但许多查询都可以使用 IN 或者由 ANY 或 ALL 修改的比较运算符来获取类似结果。
7、
嵌套子查询
在 WHERE 子句中可以嵌套 SQL 语句。可以使用 IN,ALL , SOME/ANY 等关键字引入嵌套的 SQL 语句。使用嵌套查询可以使用一个复杂的查询分解成一系列的逻辑步骤,使语句的思路更加清晰。
例子:查询指定学历的部门经理当月工资情况
在 人员表(tb_aMRem),部门表(tb_MRDe),工资表(tb_MRPay),这 3 个表中查询学历是本科的部门经理的 2008 年 10 月份工资情况。
例子:返回学科成绩小于指定的多个成绩任意一个的学生信息
在学生成绩表(tb_StuMark)中查询软件工程课程成绩小于学生编号从 "200941004"到"200941005"的任何一个学生该们课程成绩的学生信息。
8、
在 UPDATE 语句中使用子查询更新数据
例子:
在 UPDATE 语句的 SET 子句中,利用子查询返回药品登记表中与药品销售表药品编号对应的药品名称,并为药品销售表中的药品名称赋值
9、
在 INSERT INTO 语句中使用子查询添加数据
例子:
通过子查询将药品登记表(tb_药品登记)中存在而药品销售表(tb_药品销售)不存在的记录插入到药品销售表。
10、
在 DELETE 语句中使用子查询删除数据
例子:
通过查询药品登记表(tb_药品登记),删除药品销售表(tb_药品销售)中药品生产厂家为 "长春一通" 的药品销售信息