子查询相关子查询

举报
Ustinian_2022 发表于 2022/07/27 17:40:23 2022/07/27
【摘要】 13.6 子查询语句MySQL支持将一个查询语句嵌套在另一个查询语句中,嵌套在另一个查询语句中的SQL语句就是子查询语句。子查询语句可以添加到SELECT、UPDATE和DELETE语句中,常用的操作符包括ANY、SOME、ALL、EXISTS、NOT EXISTS、IN和NOT IN等。13.6.1 ANY子查询ANY关键字表示如果与子查询返回的任何值相匹配,则返回TRUE,否则返回FAL...

13.6 子查询语句

MySQL支持将一个查询语句嵌套在另一个查询语句中,嵌套在另一个查询语句中的SQL语句就是子查询语句。子查询语句可以添加到SELECT、UPDATE和DELETE语句中,常用的操作符包括ANY、SOME、ALL、EXISTS、NOT EXISTS、IN和NOT IN等。


13.6.1 ANY子查询

ANY关键字表示如果与子查询返回的任何值相匹配,则返回TRUE,否则返回FALSE。

例如,查询t_goods数据表中t_category_id字段值大于t_goods_category数据表中任意一个id字段值的数据。


mysql> SELECT id, t_category_id, t_category, t_name, t_price
    -> FROM t_goods
    -> WHERE t_category_id > ANY (SELECT id FROM t_goods_category); 
+----+---------------+----------------+------------+---------+
| id | t_category_id | t_category     | t_name      | t_price |
+----+---------------+----------------+------------+---------+
|  7 |              2 | 户外运动        | 自行车      |  399.90 |
|  8 |              2 | 户外运动        | 山地自行车  | 1399.90 |
|  9 |              2 | 户外运动        | 登山杖      |   59.90 |
| 10 |              2 | 户外运动        | 骑行装备    |  399.90 |
| 11 |              2 | 户外运动        | 运动外套    |  799.90 |
| 12 |              2 | 户外运动        | 滑板        |  499.90 |
| 13 |              5 | 水果            | 葡萄        |   49.90 |
| 14 |              5 | 水果            | 香蕉        |   39.90 |
+----+---------------+----------------+------------+---------+
8 rows in set (0.00 sec)

注意:SOME子查询的作用与ANY子查询的作用相同,不再赘述。


13.6.2 ALL子查询

ALL关键字表示如果同时满足所有子查询的条件,则返回TRUE,否则返回FALSE。

例如,查询t_goods数据表中t_category_id字段值大于t_goods_category数据表中所有id字段值的数据。


mysql> SELECT id, t_category_id, t_category, t_name, t_price
    -> FROM t_goods
    -> WHERE t_category_id > ALL (SELECT id FROM t_goods_category);
+----+---------------+----------------+------------+---------+
| id | t_category_id | t_category     | t_name      | t_price |
+----+---------------+----------------+------------+---------+
| 13 |              5 | 水果            | 葡萄        |   49.90 |
| 14 |              5 | 水果            | 香蕉        |   39.90 |
+----+---------------+----------------+------------+---------+
2 rows in set (0.00 sec)


13.6.3 EXISTS子查询

EXISTS关键字表示如果存在某种条件,则返回TRUE,否则返回FALSE。

例如,查询t_goods_category数据表中是否存在id为1的数据,如果存在,则查询t_goods数据表中t_category_id为1的数据。


mysql> SELECT id, t_category_id, t_category, t_name, t_price
    -> FROM t_goods
    -> WHERE EXISTS (
    -> SELECT t_category 
    -> FROM t_goods_category 
    -> WHERE id = 1
    -> )
    -> AND t_category_id = 1;
+----+---------------+----------------+------------+---------+
| id | t_category_id | t_category     | t_name      | t_price |
+----+---------------+----------------+------------+---------+
|  1 |              1 | 女装/女士精品  | T恤        |   39.90 |
|  2 |              1 | 女装/女士精品  | 连衣裙      |   79.90 |
|  3 |              1 | 女装/女士精品  | 卫衣        |   79.90 |
|  4 |              1 | 女装/女士精品  | 牛仔裤      |   89.90 |
|  5 |              1 | 女装/女士精品  | 百褶裙      |   29.90 |
|  6 |              1 | 女装/女士精品  | 呢绒外套    |  399.90 |
+----+---------------+----------------+------------+---------+
6 rows in set (0.00 sec)


13.6.4 NOT EXISTS子查询

NOT EXISTS关键字表示如果不存在某种条件,则返回TRUE,否则返回FALSE。

例如,查询t_goods_category数据表中是否不存在id为5的数据,如果不存在,则查询t_goods数据表中t_category_id为2的数据。


mysql> SELECT id, t_category_id, t_category, t_name, t_price
    -> FROM t_goods
    -> WHERE NOT EXISTS (
    -> SELECT t_category
    -> FROM t_goods_category
    -> WHERE id = 5
    -> )
    -> AND t_category_id = 2;
+----+---------------+----------------+------------+---------+
| id | t_category_id | t_category     | t_name      | t_price |
+----+---------------+----------------+------------+---------+
|  7 |              2 | 户外运动        | 自行车      |  399.90 |
|  8 |              2 | 户外运动        | 山地自行车  | 1399.90 |
|  9 |              2 | 户外运动        | 登山杖      |   59.90 |
| 10 |              2 | 户外运动        | 骑行装备    |  399.90 |
| 11 |              2 | 户外运动        | 运动外套    |  799.90 |
| 12 |              2 | 户外运动        | 滑板        |  499.90 |
+----+---------------+----------------+------------+---------+
6 rows in set (0.00 sec)


13.6.5 IN子查询

IN关键字表示如果比较的数据在IN列表中,则返回TRUE,否则返回FALSE。

例如,查询t_goods_category数据表中名称为“女装/女士精品”的id数据,并根据查询出的id数据查询t_goods数据表中的数据。


mysql> SELECT id, t_category_id, t_category, t_name, t_price
    -> FROM t_goods
    -> WHERE t_category_id IN (
    -> SELECT id
    -> FROM t_goods_category
    -> WHERE t_category = '女装/女士精品'
    -> );
+----+---------------+----------------+------------+---------+
| id | t_category_id | t_category     | t_name      | t_price |
+----+---------------+----------------+------------+---------+
|  1 |              1 | 女装/女士精品  | T恤        |   39.90 |
|  2 |              1 | 女装/女士精品  | 连衣裙      |   79.90 |
|  3 |              1 | 女装/女士精品  | 卫衣        |   79.90 |
|  4 |              1 | 女装/女士精品  | 牛仔裤      |   89.90 |
|  5 |              1 | 女装/女士精品  | 百褶裙      |   29.90 |
|  6 |              1 | 女装/女士精品  | 呢绒外套    |  399.90 |
+----+---------------+----------------+------------+---------+
6 rows in set (0.00 sec)


13.6.6 NOT IN子查询

NOT IN关键字表示如果比较的数据不在IN列表中,则返回TRUE,否则返回FALSE。

例如,查询t_goods_category数据表中名称为“女装/女士精品”的id数据,并查询t_goods数据表中不在id列表中的数据。


mysql> SELECT id, t_category_id, t_category, t_name, t_price
    -> FROM t_goods
    -> WHERE t_category_id NOT IN (
    -> SELECT id
    -> FROM t_goods_category
    -> WHERE t_category = '女装/女士精品'
    -> );
+----+---------------+----------------+------------+---------+
| id | t_category_id | t_category     | t_name      | t_price |
+----+---------------+----------------+------------+---------+
|  7 |              2 | 户外运动        | 自行车      |  399.90 |
|  8 |              2 | 户外运动        | 山地自行车  | 1399.90 |
|  9 |              2 | 户外运动        | 登山杖      |   59.90 |
| 10 |              2 | 户外运动        | 骑行装备    |  399.90 |
| 11 |              2 | 户外运动        | 运动外套    |  799.90 |
| 12 |              2 | 户外运动        | 滑板        |  499.90 |
| 13 |              5 | 水果            | 葡萄        |   49.90 |
| 14 |              5 | 水果            | 香蕉        |   39.90 |
+----+---------------+----------------+------------+---------+
8 rows in set (0.00 sec)


13.6.7 子查询作为结果字段

MySQL支持使用子查询的结果数据作为最终查询结果的某一列数据。

例如,查询t_goods_category数据表中的数据,并统计每个商品类别下的商品数量。


mysql> SELECT category.id, category.t_category, 
    -> (SELECT COUNT(*)
    -> FROM t_goods goods
    -> WHERE goods.t_category_id = category.id)
    -> AS goods_count
    -> FROM t_goods_category category;
+------+---------------------+-------------+
| id   | t_category          | goods_count |
+------+---------------------+-------------+
|    1 | 女装/女士精品       |           6 |
|    2 | 户外运动            |           6 |
|    3 | 男装                |           0 |
|    4 | 童装                |           0 |
+------+---------------------+-------------+
4 rows in set (0.00 sec)

可以看到,使用子查询统计t_goods_category数据表中每个商品类别下的商品数量,并作为最终结果的goods_count字段的数据进行输出。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。