• 【Mysql】子查询


    子查询 (SubQuery)

    什么是子查询

    1)子查询概念
    •一条select 查询语句的结果, 作为另一条 select 语句的一部分

    2)子查询的特点
    •子查询必须放在小括号中
    •子查询一般作为父查询的查询条件使用

    3)子查询常见分类
    •where型 子查询: 将子查询的结果, 作为父查询的比较条件
    •from型 子查询 : 将子查询的结果, 作为 一张表,提供给父层查询使用
    •单列多行子查询: 子查询的结果是单列多行, 类似一个数组, 父层查询使用 IN 函数 ,包含子查询的结果

    子查询的结果作为查询条件
    语法格式

    •SELECT 查询字段 FROM 表 WHERE 字段 运算符(子查询);

    1. 通过子查询的方式, 查询价格最高的商品信息
    -- 通过子查询的方式, 查询价格最高的商品信息
    -- 1.先查询出最高价格
    SELECT MAX(price) FROM products;
    
    -- 2.将最高价格作为条件,获取商品信息
    SELECT * FROM products WHERE price = (SELECT MAX(price) FROM products);
    
    1. 查询化妆品分类下的 商品名称 商品价格
    -- 查询化妆品分类下的 商品名称 商品价格
    
    -- 先查出化妆品分类的 id
    SELECT cid FROM category WHERE cname = '化妆品';
    
    -- 根据分类id ,去商品表中查询对应的商品信息
    SELECT 
        p.`pname`,
        p.`price`
    FROM products p 
    WHERE p.`category_id` = (SELECT cid FROM category WHERE cname = '化妆品');
    
    1. 查询小于平均价格的商品信息
    -- 1.查询平均价格
    SELECT AVG(price) FROM products; -- 1866
    
    -- 2.查询小于平均价格的商品
    SELECT * FROM products 
    WHERE price < (SELECT AVG(price) FROM products);
    

    子查询的结果作为一张表
    语法格式

    •SELECT 查询字段 FROM (子查询)表别名 WHERE 条件;

    查询商品中,价格大于500的商品信息,包括 商品名称 商品价格 商品所属分类名称

    -- 1. 先查询分类表的数据
    SELECT * FROM category;
    
    -- 2.将上面的查询语句 作为一张表使用
    SELECT 
        p.`pname`,
        p.`price`,
        c.cname
    FROM products p 
    -- 子查询作为一张表使用时 要起别名 才能访问表中字段
    INNER JOIN (SELECT * FROM category) c 
    ON p.`category_id` = c.cid WHERE p.`price` > 500;
    

    注意: 当子查询作为一张表的时候,需要起别名,否则无法访问表中的字段。

    子查询结果是单列多行
    子查询的结果类似一个数组, 父层查询使用 IN 函数 ,包含子查询的结果
    语法格式

    •SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);

    1. 查询价格小于两千的商品,来自于哪些分类(名称)
    -- 查询价格小于两千的商品,来自于哪些分类(名称)
    
    -- 先查询价格小于2000 的商品的,分类ID
    SELECT DISTINCT category_id FROM products WHERE price < 2000;
    
    -- 在根据分类的id信息,查询分类名称
    -- 报错:  Subquery returns more than 1 row
    -- 子查询的结果 大于一行
    SELECT * FROM category 
    WHERE cid = (SELECT DISTINCT category_id FROM products WHERE price < 2000);
    

    在这里插入图片描述

    使用in函数, in( c002, c003 )

    -- 子查询获取的是单列多行数据
    SELECT * FROM category 
    WHERE cid IN (SELECT DISTINCT category_id FROM products WHERE price < 2000);
    
    1. 查询家电类 与 鞋服类下面的全部商品信息
    -- 查询家电类 与 鞋服类下面的全部商品信息
    -- 先查询出家电与鞋服类的 分类ID
    SELECT cid FROM category WHERE cname IN ('家电','鞋服');
    
    -- 根据cid 查询分类下的商品信息
    SELECT * FROM products 
    WHERE category_id IN (SELECT cid FROM category WHERE cname IN ('家电','鞋服'));
    

    子查询总结
    •子查询如果查出的是一个字段(单列), 那就在where后面作为条件使用。
    •子查询如果查询出的是多个字段(多列), 就当做一张表使用(要起别名)。

  • 相关阅读:
    如何高效率学习思政知识?现在终于明白了!
    ZZNUOJ_用Java编写程序实现1527:简单加法(附源码)
    银行分布式存储基础设施创新实践分享
    R语言提取站点的nc文件时间序列数据
    企业数据共享机制的建立,是一次企业内部的重新梳理
    SpringCloud - 服务调用
    设计模式总结
    Python+Requests+Pytest+Excel+Allure 接口自动化测试项目实战【框架之间的对比】
    11_ue4进阶_男性角色换成女性角色,并修改动画
    【leetcode】【2022/9/18】827. 最大人工岛
  • 原文地址:https://blog.csdn.net/weixin_51401546/article/details/140038258