美文网首页程序员
MySQL连接查询:子查询

MySQL连接查询:子查询

作者: kangyiii | 来源:发表于2017-02-22 17:55 被阅读0次

    一个查询,通常就是一个select语句,但如果一个select查询语句中,又嵌套了select查询语句,其后者就称为"子查询",前者就是"主查询"。

    语法

    selelct 字段或表达式或(子查询1) [as 别名] from 表名或(子查询2) where 字段或表达式或(子查询3) 的条件判断
    

    其中每个位置所放置的子查询结果应该符合该位置的数据要求,子查询1应该是一个数据结果,子查询2可以是任意结果,此位置的查询结果通产作为数据源,可以设置一个别名,自查询3可以是一个数据或一列数据甚至是一行数据。

    子查询按结果分类

    1. 表子查询 : 一个子查询返回的结果理论上是“多行多列”的时候。此时可以当做一个“表”来使用,通常是放在from后面。
    2. 行字查询 : 一个子查询返回的结果理论上是“一行多列”的时候。此时可以当做一个“行”来使用,通常放在“行比较语法”中。
    3. 列子查询 : 一个子查询返回的结果理论上是“多行一列”的时候。此时可以当做“多个值”使用,类似这种:(5, 17, 8, 22)。
    4. 标量子查询:一个子查询返回的结果理论上是“一行一列”的时候。此时可以当做“一个值”使用,类似这种:select 5 as c1; 或select ...where a = 17,或select ... where b > 8;

    子查询按使用场合分

    1. 作为主查询的结果数据:select c1,(select f1 from tab2) as f11 from tab1; #这里子查询应该只有一个数据(一行一列,标量子查询)
    2. 作为主查询的条件数据:select c1 from tab1 where c1 in (select f1 from tab2); #这里子查询可以是多个数据(多行一列,列子查询,以及标量子查询,实际上行子查询也可能,但极少)
    3. 作为主查询的来源数据:select c1 from (select f1 as c1, f2 from tab2) as t2; #这里子查询可以是任意查询结果(表子查询)。

    常见子查询和相关关键字

    数据表1,下面案例会用到 数据表2,下面案例会用到
    1. 比较运算符中使用子查询:判断字段的值是否满足比较结果,形式一般写为:操作数 比较运算符 (标量子查询)。
      案例:找出所有大于平均价的商品
    //步骤:
    //1.找平均价
    select avg(price) as avg_price from product;
    //2.找商品
    select * from product where price > xxxxx;
    //合并起来一起写
    select * from product where price >(select avg(price) as avg_price from product);
    
    1. 使用in子查询:表示该操作数(字段值)等于该子查询的任意一个值就满足条件
      案例:找出所有带"电"字的类别的ID
    //1.找出所有带"电"字的类别ID
    select protype_id from product_type where protype_name like '%电';
    //2.根据结果找出这些类别的产品
    select * from product where protype id in xxx
    //使用in子查询
    select * from product where protype id in 
    (
    select protype_id from product_type where protype_name like '%电'
    );
    
    1. 使用any子查询:表示该操作数的值跟列子查询的任意一个值满足条件就行 。
      案例:找出所有带"电"字的类别的产品
    select * from product where protype_id=any
    (
      select protype_id from product_type where protype_name like '%电%'
    );
    
    1. 使用all子查询:表示该操作数的值必须跟列子查询的所有值都满足给定的比较运算,才算满足了条件。
      案例:找出产品表中的价格最高得产品
    //法1:使用all子查询
    select * from product where price>=all
    (
      select price from product
    );
    //法2:
    select * from product where price = 
    (
      select price from product
    );
    
    1. 使用exists的子查询:如果该子查询有结果数据(无论什么数据,只要大于等于1行),则为true,否则为false
      案例:找出具有在售商品的那些类别
    select * from product_type where exists
    (
    select * from product where product.protype_id=product_type.protype_id
    );
    
    1. 使用not exists的子查询:与exists的子查询相反
      注意:使用exists或not exists子查询,如果涉及到2个表,其内部其实会自动进行"连接查询",且其逻辑过程较为负责,而且不明确。无法自行设置。

    相关文章

      网友评论

        本文标题:MySQL连接查询:子查询

        本文链接:https://www.haomeiwen.com/subject/mphswttx.html