子查询
子查询是指在另一个查询语句中的SELECT子句。
例句:SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2);
其中,SELECT * FROM t1,称为Outer Query或Outer Statement)[外查询],
还有,SELECT col2 FROM t2称为Sub Query[子查询]。子查询是嵌套在外查询内部,且必须始终出现在圆括号之间。
子查询有可能在子查询内部再嵌套子查询。
子查询可以包含多个关键字或条件,如DISTINCT、GROUP BY、ORDER BY、LIMIT、函数等。
子查询的外层查询可以是:SELECT,INSERT,UPDATE,SET或DO。
子查询返回值
- 子查询可以返回标量、一行、一列或子查询。
使用比较运算符的子查询
- 使用比较运算符的子查询:=、>、<、>=、<=、<>、!=、<=>
- 语法结构:operand comparison_operator subquery
示例:
求所有电脑产品的平均价格,并且保留两位小数,AVG、MAX、MIN、COUNT、SUM为聚合函数:
查询所有价格大于平均价格的商品,并且按价格降序排序:
使用子查询来实现:
用ANY、SOME、ALL修饰的比较运算符
语法结构:
- operand comparison_operator ANY (subquery)
- operand comparison_operator SOME (subquery)
- operand comparison_operator ALL (subquery)
示例:
使用[NOT] IN的子查询
- 语法结构:operand comparison_operator ANY (subquery)
- =ANY 或 =SOME 等价于 IN
- !=ANY 或 <>ALL 等价于 NOT IN
使用[NOT] EXISTS的子查询
- 如果子查询返回任何行,EXISTS将返回TRUE,否则为FALSE。
- 该过程相对而言用的比较少。
使用INSERT…SELECT插入记录
- 将查询结果写入数据表:
INSERT [INTO] tbl_name [(col_name,...)] SELECT...
示例:
查询tdb_goods表的所有记录,并且按”类别”分组:
将分组结果写入到tdb_goods_cates数据表:
多表更新
UPDATE table_reference
SET col_name1={expr1|DEFAULT}
[,col_name2={expr2|DEFAULT}]...
[WHERE where_condition];
示例:
- 通过tdb_goods_cates数据表来更新tdb_goods表:
多表更新之一步到位(CREATE…SELECT)
- 创建数据表同时将查询结果写入到数据表:
CREATE TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
select_statement
示例:
通过CREATE…SELECT来创建数据表并且同时写入记录:
通过tdb_goods_brands数据表来更新tdb_goods数据表(错误示范):
通过tdb_goods_brands数据表来更新tdb_goods数据表(正确示范):