签到成功

知道了

CNDBA社区CNDBA社区

Mysql子查询

2021-11-28 20:43 930 0 原创 mysql
作者: hbhe0316

子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从 MySQL 4.1 开始引入,在 SELECT 子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。http://www.cndba.cn/hbhe0316/article/22647http://www.cndba.cn/hbhe0316/article/22647

http://www.cndba.cn/hbhe0316/article/22647

子查询中常用的操作符有 ANY(SOME)、ALL、IN 和 EXISTS。http://www.cndba.cn/hbhe0316/article/22647

子查询可以添加到 SELECT、UPDATE 和 DELETE 语句中,而且可以进行多层嵌套。子查询也可以使用比较运算符,如“<”、“<=”、“>”、“>=”、“!=”等。

1.在t1表中找到id最大的行http://www.cndba.cn/hbhe0316/article/22647http://www.cndba.cn/hbhe0316/article/22647

mysql> select * from t1 order by id desc limit 1;
+----------+------+
| id       | name |
+----------+------+
| 17530622 | aaa  |
+----------+------+
1 row in set (11.04 sec)

如果使用子查询

mysql> select * from t1 where id = (select max(id ) from t1);
+----------+------+
| id       | name |
+----------+------+
| 17530622 | aaa  |
+----------+------+
1 row in set (22.25 sec)

为什么这么慢?两张表成绩去查询。

mysql> explain select * from t1 where id = (select max(id ) from t1);
+----+-------------+-------+------------+------+---------------+------+---------+------+----------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows     | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+----------+----------+-------------+
|  1 | PRIMARY     | t1    | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 15728923 |    10.00 | Using where |
|  2 | SUBQUERY    | t1    | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 15728923 |   100.00 | NULL        |
+----+-------------+-------+------------+------+---------------+------+---------+------+----------+----------+-------------+
2 rows in set, 1 warning (0.00 sec)

优化一下继续下一步吧

mysql> create index index_t1 on t1 (id);
Query OK, 0 rows affected (57.51 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> explain select * from t1 where id = (select max(id ) from t1);
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+------------------------------+
| id | select_type | table | partitions | type | possible_keys | key      | key_len | ref   | rows | filtered | Extra                        |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+------------------------------+
|  1 | PRIMARY     | t1    | NULL       | ref  | index_t1      | index_t1 | 5       | const |    1 |   100.00 | Using where                  |
|  2 | SUBQUERY    | NULL  | NULL       | NULL | NULL          | NULL     | NULL    | NULL  | NULL |     NULL | Select tables optimized away |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+------------------------------+
2 rows in set, 1 warning (0.00 sec)

mysql> select * from t1 where id = (select max(id ) from t1);
+----------+------+
| id       | name |
+----------+------+
| 17530622 | aaa  |
+----------+------+
1 row in set (0.00 sec)

2.查询大于平均id值的数量http://www.cndba.cn/hbhe0316/article/22647

mysql> select count(*) from t1 where id > (select avg(id ) from t1);
+----------+
| count(*) |
+----------+
|  8983266 |
+----------+
1 row in set (21.00 sec)

3.子查询中带有INhttp://www.cndba.cn/hbhe0316/article/22647http://www.cndba.cn/hbhe0316/article/22647

http://www.cndba.cn/hbhe0316/article/22647

mysql> select * from t1 where id in (select max(id) from t2);
+--------+------+
| id     | name |
+--------+------+
| 499999 | aaa  |
+--------+------+
1 row in set (23.79 sec)

版权声明:本文为博主原创文章,未经博主允许不得转载。

MYSQL

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
hbhe0316

hbhe0316

关注

1.只有承认无知,才能装下新的东西; 2.进步来自一点点滴滴的积累; 3.广博让你更优秀,而专业让你无法替代; 4.挫折和失败能够转换为一种财富。

  • 889
    原创
  • 1
    翻译
  • 13
    转载
  • 24
    评论
  • 访问:2645738次
  • 积分:1523
  • 等级:核心会员
  • 排名:第6名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ