MySQL子查询的优化

WBOY
풀어 주다: 2016-06-07 16:08:18
원래의
1556명이 탐색했습니다.

一、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.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!