2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > mysql 优化子查询_MySQL子查询的优化

mysql 优化子查询_MySQL子查询的优化

时间:2022-12-08 21:22:02

相关推荐

mysql 优化子查询_MySQL子查询的优化

一、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

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。