数据库系列之查询(4)

主查询与子查询

如果一个SELECT语句能够返回一个单值或一列值并嵌套在一个SELECT、INSERT、UPDATE或DELETE语句中,则称之为子查询或内层查询,而包含一个子查询的语句则称为主查询或外层查询
子查询可实现多层嵌套,且要用圆括号括起来
常把子查询用在外层查询的WHERE子句或HAVING子句中,与比较或逻辑运算符一起构成查询条件

子查询又分为嵌套子查询和相关子查询

嵌套子查询总是最先执行最内层查询
相关子查询的执行过程依赖于值的外部查询。相关子查询的 WHERE 子句引用外部查询的 FROM 子句中的表。这就是说子查询是以循环的方式进行处理的 —— 对外部查询选择的每行都执行一次

语法

SELECT …FROM 表1 WHERE 字段1 比较运算符 ( 子查询 )
或者:
UPDATE 表1 SET  …… WHERE 字段1 比较运算符 ( 子查询 )

示例

当子查询的结果多于一个时,就不能使用比较运算符了,要使用IN关键字。
1 查询有订单的客户信息:

--相关子查询
SELECT * FROM customers 
WHERE EXISTS 
      (SELECT * FROM orders     
       WHERE customers.客户编号=orders.客户编号)
--嵌套子查询
SELECT * FROM customers 
WHERE 客户编号 IN 
       (SELECT 客户编号 FROM orders)
2 查询没有订单的客户信息:外连接或者not in或者exists三种方法
从customers表中检索数据,以查询一次订货金额大于等于100的客户编号和姓名
SELECT a.customerid,a.customername 
FROM customers a 
WHERE 100 <=ANY
    (SELECT total FROM orders 
      WHERE a.customerid=orders.customerid)

使用子查询进行比较测试

(1)通过比较运算符(>,>=,<,<=,=,<>,!=,!>,!<),将一个表达式的值与子查询返回的单值进行比较。如果比较运算的结果为TRUE,则比较测试也返回TRUE
(2)通过逻辑运算符IN或NOT IN将一个表达式的值与子查询返回的一列值进行比较。使用IN运算符时,如果该表达式的值与此列中的任何一个值相等,则集成员测试返回TRUE,否则返回FALSE;使用NOT IN的测试结果则正好取反
(3)通过逻辑运算符EXISTS或NOT EXISTS,检查子查询返回的结果集是否包含有记录。使用EXISTS运算符时,如果子查询的结果集中包含一条或多条记录,则存在性测试返回TRUE,否则返回FALSE;使用NOT EXISTS的测试结果则正好取反
使用子查询进行批量比较测试时,除了使用各种比较运算符外,还需要用到两个逻辑运算符ANY ALL
测试表达式  比较运算符  ANY/all  (子查询)
(4)使用ANY运算符进行批量比较测试
通过比较运算符将一个表达式的值与子查询返回的一列值中的每一个进行比较。只要有一次比较的结果为TRUE,则ANY测试返回TRUE
(5)测试表达式  比较运算符  ALL  (子查询)
通过比较运算符将一个表达式的值与子查询返回的一列值中的每一个进行比较。只要有一次比较的结果为FALSE,则ALL测试返回FALSE

原文地址:https://www.cnblogs.com/cmhunter/p/4278971.html