视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQL子查询的优化
2020-11-09 14:25:09 责编:小采
文档


一、MySQL子查询的位置当一个查询是另一个查询的子部分是,称之为子查询(查询语句中嵌套含有查询语句)。子查询也是使用频率比较高的一种查询类型。因此,优化

一、MySQL子查询的位置

当一个查询是另一个查询的子部分是,,称之为子查询(查询语句中嵌套含有查询语句)。子查询也是使用频率比较高的一种查询类型。因此,优化子查询,对于整个系统的性能也有直接的影响。

从查询出现在SQL语句的位置来看,它可以出现在目标列中,也可以出现在from子句中,还可以出现在JOIN/ON子句、GROUPBY子句、HAVING子句、ORDERBY子句等位置。下面依次来看这几种形式的子查询,以及对他们进行优化的一些想法。

1、子查询出现在目标列位置

当子查询出现在目标列位置的时候,这种查询只能是标量子查询。也就是说子查询返回的结果只能是一个元组的一个属性。否则,数据库会返回错误信息。

下面为了实验上面这段话,我们来新建一些表,并插入一些数据。

create table t1 (k1 int primary key, c1 int); create table t2 (k2 int primary key, c2 int); insert into t2 values (1, 10), (2, 2), (3,30);

SQL语句的结果为:

mysql> select t1.c1, (select t2.c2 from t2) from t1, t2; Empty set (0.00sec)

t1表中插入一些数据:

mysql> insert into t1 values (1, 1), (2, 2), (3, 3); Query OK, 3 rows affected (0.00 sec)

a中的查询,我们可以看到执行的结果

mysql>select t1.c1, (select t2.c2 from t2) from t1, t2; ERROR 1242(21000): Subquery returns more than 1 row

t2表,然后再执行a中所做的查询。

mysql>delete from t2; QueryOK, 3 rows affected (0.00 sec) mysql> select t1.c1, (select t2.c2 from t2) from t1, t2; Empty set (0.00 sec)

t2表中删除的数据在插入到t2表:

mysql>insert into t2 values (1, 10), (2, 2), (3, 30); Query OK,3 rows affected (0.00 sec)

然后执行如下查询:

mysql> select t1.c1, (select t2.c2 from t2 where k2=1) from t1, t2; +------+-----------------------------------+ | c1 | (select t2.c2 from t2 where k2=1) | +------+-----------------------------------+ | 1 | 10 | | 2 | 10 | | 3 | 10 | | 1 | 10 | | 2 | 10 | | 3 | 10 | | 1 | 10 | | 2 | 10 | | 3 | 10 | +------+-----------------------------------+

我们可以清楚的看到MySQL为我们返回的结果。

f、我们对e中的查询再换一种写法,可以看到返回的结果为

mysql> select t1.c1, (selectt2.c2 from t2 where c2 > 1) from t1, t2; ERROR 1242 (21000): Subqueryreturns more than 1 row

下载本文
显示全文
专题