• MySQL:子查询


    1 什么是子查询 

    <1>子查询概念 

        一条select 查询语句的结果, 作为另一条 select 语句的一部分 

    <2>子查询的特点

        子查询必须放在小括号中 

        子查询一般作为父查询的查询条件使用 

    <3>子查询常见分类 

        where型 子查询:  将子查询的结果, 作为父查询的比较条件 

        from型 子查询 :  将子查询的结果, 作为 一张表,提供给父层查询使用

        exists型 子查询:   子查询的结果是单列多行, 类似一个数组, 父层查询使用 IN 函数 ,包含子查 询的结果 

    2 子查询的结果作为查询条件

    语法格式

    SELECT 查询字段 FROMWHERE 字段=(子查询); 

    1. 通过子查询的方式, 查询价格最高的商品信息:

    # 通过子查询的方式, 查询价格最高的商品信息 
    -- 1.先查询出最高价格 
    SELECT MAX(price) FROM products;
    
    -- 2.将最高价格作为条件,获取商品信息 
    SELECT * FROM products WHERE price = (SELECT MAX(price) FROM products);

    2. 查询化妆品分类下的, 商品名称 & 商品价格

    #查询化妆品分类下的 商品名称 商品价格
    
    -- 先查出化妆品分类的 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 = '化妆品');

    3. 查询小于平均价格的商品信息

    -- 1.查询平均价格
    SELECT AVG(price) FROM products; -- 1866
    
    -- 2.查询小于平均价格的商品 
    SELECT * FROM products 
    WHERE price < (SELECT AVG(price) FROM products);

    3 子查询的结果作为一张表 

    语法格式

    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;

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

     

    4 子查询结果是单列多行 

        子查询的结果类似一个数组, 父层查询使用 IN 函数 ,包含子查询的结果

    语法格式

    SELECT 查询字段 FROMWHERE 字段 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);

    <2>查询家电类 与 鞋服类下面的全部商品信息

    # 查询家电类 与 鞋服类下面的全部商品信息
    -- 先查询出家电与鞋服类的 分类ID
    SELECT cid FROM category WHERE cname IN ('家电','鞋服');
    
    -- 根据cid 查询分类下的商品信息 
    SELECT * FROM products 
    WHERE category_id IN (SELECT cid FROM category WHERE cname IN ('家电','鞋服'));

    5 子查询总结

        1. 子查询如果查出的是一个字段(单列), 那就在where后面作为条件使用.

        2. 子查询如果查询出的是多个字段(多列), 就当做一张表使用(要起别名).

  • 相关阅读:
    C#读写xml文件
    实现SQL_SERVER的双机实时备份
    Microsoft .NET Pet Shop 4 架构与技术分析
    xp系统运行asp.net时候出现“服务器应用程序不可用”的必杀
    获取服务器根域名
    C#如何创建Xml文件
    用C#创建XML[简单代码]
    关闭Viewstate
    数字签名
    IE插件
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/15020777.html
Copyright © 2020-2023  润新知