1、子查询
在查询语句中包含着有另外一条查询语句,被包含的查询语句称为子查询,包含着子查询的查询就称为父查询。总之,子查询就是在查询语句里嵌套一条或者多条查询语句。
子查询也可以称为内部查询或内部选择,而包含子查询的语句称为外部查询或者外部选择
1.1子查询的语法规则:
子查询的select查询总使用圆括号括起来
不能包括compute或for browse子句
如果同时指定top子句,则可能只包括order by子句
子查询最多嵌套32层,个别查询可能会不支持32层嵌套
任何可以使用表达式的地方都可以使用子查询,主要它返回的是单个值
如果某个表只出现在子查询中而不出现在外部查询中,那么该表中的列就无法包含在输出中
1.2 语法格式:
where 查询表达式 [not] in(子查询)
where 查询表达式 比较运算符 [any|all] (子查询)
where [not] exists (子查询)
假设Books表如下:
然后显示单条数据的情况,这个是高于平均价格的数据
2、嵌套查询
嵌套查询是指将一个查询块嵌套在另一个查询块的where子句或having短语的条件中的查询。嵌套查询中上层的查询块称为外侧查询或父查询,下层查询块称为内层查询或子查询。SQL语言允许多层嵌套,但是在子查询中不允许出现order
by子句,order by子句只能用在最外层的查询中。
嵌套查询的处理方法是:先处理最内侧的子查询,然后一层一层地向上处理,直到最外层的查询块。
2.1简单的运算符有=、<>、<、>、<= 、>=
举一个简单的例子
带IN的嵌套查询
带EXISTS
2、Any 是一个逻辑运算符
,它将标量值与子查询返回的单列值集进行比较。它将值与子查询返回的一组进行比较。any运算符必须要结合比较运算符使用,虽然说我也没用过
条件 含义
C=ANY(…) c列中的值必须与集合中的一个或多个值匹配,以评估为true。
c!=ANY(…) c列中的值不能与集合中的一个或多个值匹配以评估为true。
C>ANY(…) c列中的值必须大于要评估为true的集合中的最小值。
c<ANY(…) c列中的值必须小于要评估为true的集合中的最大值。
C>=ANY(…) c列中的值必须大于或等于要评估为true的集合中的最小值。
C<=ANY(…) c列中的值必须小于或等于要评估为true的集合中的最大值。
2、ALL运算符是一个逻辑运算符,它将标量值与子查询返回的单列值列表进行比较。
他和ANY是不一样的。他们是区别是:
All:只有当其所有数据都满足条件时,条件才成立
Any:只要有一条数据满足条件,条件就成立
以下是SQL ALL运算符的语法:
WHERE column_name comparison_operator ALL (subquery)
SQL ALL运算符必须以比较运算符开头,例如:>,>=,<,<=,<>,=,后跟子查询。
某些数据库系统(如Oracle)允许使用文字值列表而不是子查询。这个all我也没用过,就是老师给的文档中的东西!
ALL的基本含义:
条件 描述
c > ALL(…) c列中的值必须大于要评估为true的集合中的最大值。
c >= ALL(…) c列中的值必须大于或等于要评估为true的集合中的最大值。
c < ALL(…) c列中的值必须小于要评估为true的集合中的最小值。
c <= ALL(…) c列中的值必须小于或等于要评估为true的集合中的最小值。
c <> ALL(…) c列中的值不得等于要评估为true的集合中的任何值。
c = ALL(…) c列中的值必须等于要评估为true的集合中的任何值。