MySQL教程(十三)—— 子查询

1  准备工作

建立数据库,按照附件中的指令,先建立表,再插入数据:

更改编码:

(以显示gbk编码格式,只能生效一次)

查询数据:

(‘\G’是按照表格的形式输出)

2  子查询(Subquery)概念

2.1  子查询

定义:子查询是指在另一个查询语句中的SELECT子句。

1 SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

备注:

  1. SELECT * FROM t1 ...称为Outer Query[外查询](或者Outer Statement)。
  2. SELECT column1 FROM t2 称为Sub Query[子查询]。
  3. 子查询是嵌套在外查询内部。
  4. 事实上它有可能在子查询内部再嵌套子查询。
  5. 子查询必须出现在圆括号内。
  6. 子查询可以包含多个关键字或条件,如DISTINCT、GROUP BY、ORDER BY、LIMIT、函数等。
  7. 子查询的外层查询可以是:SELECT、INSERT、UPDATE、SET或DO。
  8. 子查询返回结果可以是标量、一行、一列或子查询。

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);

备注:

  1. 行级子查询的返回结果最多为一行。
  2. 优化子查询。

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数据表写入任意记录)

posted @ 2018-02-19 20:24  祁俊辉  阅读(431)  评论(0编辑  收藏  举报