zoukankan      html  css  js  c++  java
  • SQL:七 集合运算

    表的加减法

    什么是集合运算

    • 集合在数学领域表示“(各种各样的)事物的总和”,在数据库领域表示记录的集合
    • 表、视图和查询的执行结果都是记录的集合
    • 集合运算,就是对满足同一规则的记录进行的加减等四则运算
    • 进行集合运算的运算符称为集合运算符

    表的加法

    • UNION(并集)
    • 集合运算符会除去重复的记录
    • -- 使用UNION对表进行加法运算 
      SELECT product_id, product_name  
      FROM Product 
      UNION 
      SELECT product_id, product_name  
      FROM Product2;

       

    集合运算的注意事项

    • ①作为运算对象的记录的列数必须相同 
    • ②作为运算对象的记录中列的类型必须一致
    • ③可以使用任何SELECT语句,但ORDER BY子句只能在最后使用一次 
    • -- 列数不一致时会发生错误 
      SELECT product_id, product_name  
      FROM Product 
      UNION 
      SELECT product_id, product_name, sale_price  
      FROM Product2;
      
      -- 数据类型不一致时会发生错误 
      SELECT product_id, sale_price  
      FROM Product 
      UNION 
      SELECT product_id, regist_date  
      FROM Product2;
      
      -- ORDER BY子句只在最后使用一次 
      SELECT product_id, product_name
      FROM Product 
      WHERE product_type = '厨房用具' 
      UNION 
      SELECT product_id, product_name  
      FROM Product2 
      WHERE product_type = '厨房用具' 
      ORDER BY product_id;

    包含重复行的集合运算

    • ALL选项
    • 在集合运算符中使用ALL选项,可以保留重复行
    • -- 保留重复行 
      SELECT product_id, product_name  
      FROM Product 
      UNION ALL 
      SELECT product_id, product_name  
      FROM Product2;

    选取表中公共部分

    • INTERSECT(交集)
    • INTERSECT 应用于两张表,选取出它们当中的公共记录
    • -- 使用INTERSECT选取出表中公共部分
      SELECT product_id, product_name  
      FROM Product 
      INTERSECT 
      SELECT product_id, product_name  
      FROM Product2 
      ORDER BY product_id;

       

    记录的减法

    • EXCEPT(差 集)
    • 减法运算中减数和被减数的位置不同,所得到的结果也不相同
    • -- 使用EXCEPT对记录进行减法运算
      SELECT product_id, product_name  
      FROM Product 
      EXCEPT 
      SELECT product_id, product_name  
      FROM Product2 
      ORDER BY product_id;

       

    联结(以列为单位对表进行联结)

    什么是联结

    • 联结(JOIN)运算
    • 将其他表中的 列添加过来,进行“添加列”的运算
    • 实际上,期望得到的数据往往会分散在不同的表之中。使用联结就可以从多张表(3 张以上的表也没关系) 中选取数据了

    内联结

    • INNER JOIN 

    • 所谓联结运算,以A中的列作为桥梁,将 B中满 足同样条件的列汇集到同一结果之中

    • 内联结要点

      • ①FROM子句 

        • FROM ShopProduct AS SP INNER JOIN Product AS P
        • 进行联结时需要在FROM子句中使用多张表
      • ②ON子句 

        • ON SP.product_id = P.product_id
        • 在 ON 之后指定两张表联结所使用的列(联结键)
        • 进行内联结时必须使用ON子句,并且要书写在FROM和WHERE之间
      • ③SELECT子句 

        • SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price
        • 使用联结时SELECT子句中的列需要按照“<表的别名>.<列名>”的格式进行书写
    • 内联结和WHERE子句结合使用 

      • 联结运算将满足相同规则的表联结起来时,WHERE、 GROUP BY、HAVING、ORDER BY 等工具都可以正常使用
      • 将联结之后的结果想象为新创建出来的一张表,对这张表使用 WHERE 子句等工具
      • 这张“表”只在 SELECT 语句执行期间存在,SELECT 语 句执行之后就会消失。如果希望继续使用这张“表”,将它创建成视图
    -- 将两张表进行内联结
    SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price  
    FROM ShopProduct AS SP INNER JOIN Product AS P 
    ON SP.product_id = P.product_id;
    
    -- 内联结和WHERE子句结合使用
    SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price  
    FROM ShopProduct AS SP INNER JOIN Product AS P 
    ON SP.product_id = P.product_id 
    WHERE SP.shop_id = '000A';

    外联结

    • OUTER JOIN 

    • 外联结要点

      • ①选取出单张表中全部的信息 

      • ②每张表都是主表吗

        • 把哪张表作为主表,最终的结果中会包含主表内所有的数据

        • 指定主表的关键字是 LEFT 和 RIGHT

          • 使用LEFT 时FROM 子句中写在左侧的表是主表,使用RIGHT 时右侧的表是主表
    • 3张以上的表的联结 

    • 交叉联结

      • CROSS JOIN(笛卡 儿积)

        • 对满足相同规则的表进行交叉联结的集合运算符
      • 进行交叉联结时无法使用内联结和外联结中所使用的ON 子句, 这是因为交叉联结是对两张表中的全部记录进行交叉组合,因此结果中 的记录数通常是两张表中行数的乘积

    • 联结的特定语法和过时语法 

      • 对于联结的过时语法和特定语法,虽然不建议使用,但还是希望能够读懂。
    -- 将两张表进行外联结
    SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name,  P.sale_price  
    FROM ShopProduct AS SP RIGHT OUTER JOIN Product AS P 
    ON SP.product_id = P.product_id;
    
    -- 对3张表进行内联结
    SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price, IP.inventory_quantity  
    FROM ShopProduct AS SP INNER JOIN Product AS P 
    ON SP.product_id = P.product_id
              INNER JOIN InventoryProduct AS IP
                 ON SP.product_id = IP.product_id 
    WHERE IP.inventory_id = 'P001';
    
    -- 将两张表进行交叉联结
    SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name  FROM ShopProduct AS SP CROSS JOIN Product AS P;
    
    -- 使用过时语法的内联结
    SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price  
    FROM ShopProduct SP, Product P 
    WHERE SP.product_id = P.product_id   
    AND SP.shop_id = '000A';
  • 相关阅读:
    ABP Xunit单元测试 第五篇
    ABP 异常处理 第四篇
    ABP Quartz 作业调度第三篇
    ABP 权限拦截 第二篇
    ABP .NET corej 版本 第一篇
    Vue生命周期
    vue中的import、export、requre的区别
    ES6最新语法
    Vux项目搭建
    对象克隆
  • 原文地址:https://www.cnblogs.com/dc2019/p/13795458.html
Copyright © 2011-2022 走看看