MySQL教程(十三)—— 子查询
1 准备工作
建立数据库,按照附件中的指令,先建立表,再插入数据:
更改编码:
(以显示gbk编码格式,只能生效一次)
查询数据:
(‘\G’是按照表格的形式输出)
2 子查询(Subquery)概念
2.1 子查询
定义:子查询是指在另一个查询语句中的SELECT子句。
1 SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
备注:
- SELECT * FROM t1 ...称为Outer Query[外查询](或者Outer Statement)。
- SELECT column1 FROM t2 称为Sub Query[子查询]。
- 子查询是嵌套在外查询内部。
- 事实上它有可能在子查询内部再嵌套子查询。
- 子查询必须出现在圆括号内。
- 子查询可以包含多个关键字或条件,如DISTINCT、GROUP BY、ORDER BY、LIMIT、函数等。
- 子查询的外层查询可以是:SELECT、INSERT、UPDATE、SET或DO。
- 子查询返回结果可以是标量、一行、一列或子查询。
2.2 行级子查询
1 SELECT * FROM t1 WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10); 2 SELECT * FROM t1 WHERE ROW(col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
备注:
- 行级子查询的返回结果最多为一行。
- 优化子查询。
3 使用比较运算符的子查询
比较运算符:=、<、>、<=、>=、<>、!=、<=>等。
语法结构:operand comparison_operator subquery
(求所有商品的平均价格,AVG为聚合函数(MAX、MIN、COUNT、SUM))
(同上,但是只保留两位小数)
(查询所有价格大于平均价格的商品,并且按价格降序排序,但是平均价格是一个数)
(与上述功能相同,但是将上面两条语句联合起来,组合成一条子查询语句)
(查询类型为“超级本”的商品价格)
(使用子查询语句,查询价格大于或等于"超级本"价格的商品,并且按价格降序排列)
注意:如果子查询在返回多个结果时,可以使用ANY、SOME、ALL来做修饰。ANY=SOME,指只要符合其中的一个就行,而ALL要符合全部。如上例,若不加ANY则会出现错误。
4 使用[ NOT ] IN 的子查询
4.1 使用[ NOT ] IN 的子查询
语法结构:
- operand comparison_operator [ NOT ] IN (subquery)
- IN 与 = ANY 等效,注意是与“=ANY”等效。
- != ALL或<>ALL运算符与NOT IN等效。
(与上述例子相同,只不过用IN代替=ANY)
4.2 使用[ NOT ] EXISTS 的子查询
如果子查询返回任何行,EXISTS将返回TRUE,否则返回FALSE。
5 使用INSERT...SELECT插入记录
(创建一张商品分类表,注意与普通表的不同)
(查看机型的分类)
(将分组结果写入到tdb_goods_cates数据表)
(查看商品分类表)
6 多表更新
作用:参照另外的表,来更新本表内的数据。
1 UPDATE table_references 2 SET col_name1={expr1 | DEFAULT} 3 [,col_name2={expr2 | DEFAULT}]... 4 [WHERE where_condition]
语法结构:
1 table_references 2 {[INNER | CROSS]JOIN | {LEFT | RIGHT} [OUTER] JOIN} 3 table_reference 4 ON conditional_expr
连接类型:
- INNER JOIN,内连接
- 在MySQL中,JOIN,CROSS JOIN和INNER JOIN是等价的。
- LEFT [OUTER] JOIN,左外连接
- RIGHT [OUTER] JOIN,右外连接
(通过tdb_goods_cates数据表来更新tdb_goods表)
(更新后查看,确实被更改)
7 多表更新之一步到位
CREATE...SELECT语句:
1 //创建表的同时,将查询结果写入到数据表中 2 CREATE TABLE [IF NOT EXISTS] tbl_name 3 [(create_definition,...)] 4 select_statement
(查看品牌的分类)
(通过CREATE...SELECT来创建数据表并且同时写入记录)
(查看新表数据)
(按照正常语法,会提示错误,说是字段模糊,这种情况下只能给表起别名)
(利用AS语句给表起别名)
(查看表结构)
(通过ALTER TABLE语句修改数据表结构)
(再次查看表结构,发现数据类型以改变)
(分别在tdb_goods_cates和tdb_goods_brands表插入记录)
(在tdb_goods数据表写入任意记录)