mysql零距离接触-子查询和链接

一,概念

(1)子查询指嵌套在查询内部,且必须始终出如今圆括号内。
(2)子查询能够包含多个关键字或条件,如:
DISTINCT / GROUP BY / ORDER BY / LIMIT / 函数等。
(3)子查询的外层查询能够是:SELECT, INSERT, UPDATE , SET 或DO
(4)子查询能够返回标量、一行、一列或子查询。函数

二,MySQL 子查询分类

上面演示了一个简单的子查询例子,根据子查询的返回数据形式(如上例中返回的 uid 序列),能够分为以下几类:学习

    - 标量子查询:返回单一值的标量,最简单的形式。ui

    - 列子查询:返回的结果集是 N 行一列。spa

    - 行子查询:返回的结果集是一行 N 列。blog

    - 表子查询:返回的结果集是 N 行 N 列。教程

子查询操做符

在主查询中,可使用比较操做符以使用操做符来对子查询返回的结果进行比较,从而肯定查询的条件。如上面例子使用了 IN 操做符。字符串

可使用的操做符有:= > < >= <= <> ANY IN SOME ALL EXISTS ,咱们将在本节余下的教程中学习这些操做符在子查询中的使用方法。it

三,具体

标量子查询

标量子查询是指子查询返回的是单一值的标量,如一个数字或一个字符串,也是子查询中最简单的返回形式。io

可使用 = > < >= <= <> 这些操做符对子查询的标量结果进行比较table

SELECT * FROM t1 WHERE column1 = (SELECT MAX(column2) FROM t2)

列子查询

列子查询是指子查询返回的结果集是 N 行一列,该结果一般来自对表的某个字段查询返回。

一个列子查询的例子以下:

SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=1)

列子查询中使用 IN、ANY、SOME 和 ALL 操做符(= ANY 或 = SOME 等价于 IN)

因为列子查询返回的结果集是 N 行一列,所以不能直接使用 = > < >= <= <> 这些比较标量结果的操做符。在列子查询中可使用 IN、ANY、SOME 和 ALL 操做符:

    - IN:在指定项内,同 IN(项1,项2,…)。

    - ANY:与比较操做符联合使用,表示与子查询返回的任何值比较为 TRUE ,则返回 TRUE 。

    - SOME:ANY 的别名,较少使用。

    - ALL:与比较操做符联合使用,表示与子查询返回的全部值比较都为 TRUE ,则返回 TRUE 。

行子查询

行子查询是指子查询返回的结果集是一行 N 列,该子查询的结果一般是对表的某行数据进行查询而返回的结果集。

一个行子查询的例子以下:

SELECT * FROM table1 WHERE (1,2) = (SELECT column1, column2 FROM table2)

在该例子中,在保证子查询返回单一行数据的前提下,若是 column1=1 且 column2=2 ,则该查询结果为 TRUE。

MySQL 行构造符

在上面的例子中,WHERE 后面的 (1,2) 被称为行构造符,也能够写做 ROW(1,2)。行构造符一般用于与对能返回两个或两个以上列的子查询进行比较。

表子查询

表子查询是指子查询返回的结果集是 N 行 N 列的一个表数据。

SELECT * FROM article WHERE (title,content,uid) IN (SELECT title,content,uid FROM blog)

四,insert使用子查询

INSERT [INTO] tbl_name [(col_name,...)] SELECT ...将查询结果写入数据表

INSERT tdb_goods_cates (cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;

五,多表更新

UPDATE table_references SET col_name1={expr1 | DEFAULT} [,col_name2={expr2 | DEFAULT}]... [WHERE where_condition]

table_references 变成:

table_references {[INNER|CROSS] JOIN } | {[LEFT|RIGHT] [OUTER] JOIN} table_references ON conditional_exp

如:

update tdb_goods inner join tdb_goods_cates on goods_cate=cate_name set goods_cate=cate_id;

六,链接

MySQL在SELECT语句、多表更新、多表删除语句中支持JOIN操做。

table reference A
{[INNER|CROSS] JOIN | {LEFT|RIGHT} [OUTER] JOIN}
table_reference B
ON condition_expr

使用ON设定链接条件,也能够用WHERE代替
· ON:设定链接条件
· WHERE:进行结果集记录的过滤

内链接:
在MySQL中JOIN,INNER JOIN,CROSS JOIN是等价的


外链接:

LEFT JOIN左外链接;RIGHT JOIN右外链接

多表链接:

多表的链接跟两张表的链接同样
表的链接实质就是外键的逆向约束

七,无限分类

即在同一张表中既有父类,又有子类

自身链接:本身与本身链接,经过别名的方式将一张物理表,变成两张逻辑表来实现,而后拼接出一张逻辑表!

八,多表删除

(1)INSERT ... SELECT实现复制 INSERT tdb_goods(goods_name,cate_id,brand_id) SELECT goods_name,cate_id,brand_id FROM tdb_goods WHERE goods_id IN (19,20); (2)查找重复记录 SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2; (3) 删除重复记录 DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2 ) AS t2 ON t1.goods_name = t2.goods_name WHERE t1.goods_id > t2.goods_id;

相关文章
相关标签/搜索