<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      用SQL進行集合運算

      [摘要]這篇文章主要介紹了關于用SQL進行集合運算 ,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下1、比較表和表drop table if exists tbl_a;create table...

      這篇文章主要介紹了關于用SQL進行集合運算 ,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

      1、比較表和表

      drop table if exists tbl_a;create table tbl_a(
      key1 varchar(10),
      col_1 int4,
      col_2 int4,
      col_3 int4
      );insert into tbl_a values('A', 2, 3, 4);
      insert into tbl_a values('B', 0, 7, 9);
      insert into tbl_a values('c', 5, 1, 6);
      drop table if exists tbl_b;create table tbl_b(
      key1 varchar(10),
      col_1 int4,
      col_2 int4,
      col_3 int4
      );
      insert into tbl_b values('A', 2, 3, 4);
      insert into tbl_b values('B', 0, 7, 9);
      insert into tbl_b values('c', 5, 1, 6);-- ## 如果union a b 行數一致則兩張表相等 select count(1) row_cnt  from ( select * 
                 from tbl_A           union 
                select *            from tbl_b
              ) tmp
      ;


      直接求兩表的不同之處

      (select * from tbl_a except
       select * from tbl_b) union all
       (select * from tbl_b  except
        select * from tbl_a);

      2、用差集實現關系除法運算

      建表

      drop table if exists skills;create table skills(
      skill varchar(10)
      );insert into skills values('oracle');
      insert into skills values('unix');insert into skills values('java');drop table if exists empskills;create table empskills(
      emp varchar(10),
      skill varchar(10)
      );insert into empskills values('相田','oracle');
      insert into empskills values('相田','unix');
      insert into empskills values('相田','java');
      insert into empskills values('相田','c#');
      insert into empskills values('神奇','oracle');
      insert into empskills values('神奇','unix');
      insert into empskills values('神奇','java');
      insert into empskills values('平井','oracle');
      insert into empskills values('平井','unix');
      insert into empskills values('平井','PHP');
      insert into empskills values('平井','Perl');
      insert into empskills values('平井','C++');
      insert into empskills values('若田部','Perl');
      insert into empskills values('度來','oracle');
      --把除法變成減法select distinct emp  from empskills es1 where not exists
              (select skill from skills
               expect         select skill from empskills es2          where es1.emp = es2.emp);

      3、尋求相等的子集

      drop table if exists supparts;create table supparts(
      sup varchar(10),
      part varchar(10)
      );insert into supparts values('A', '螺絲');
      insert into supparts values('A', '螺母');
      insert into supparts values('A', '管子');
      insert into supparts values('B', '螺絲');
      insert into supparts values('B', '管子');
      insert into supparts values('C', '螺絲');
      insert into supparts values('C', '螺母');
      insert into supparts values('C', '管子');
      insert into supparts values('D', '螺絲');
      insert into supparts values('D', '管子');
      insert into supparts values('E','保險絲');
      insert into supparts values('E', '螺母');
      insert into supparts values('E', '管子');
      insert into supparts values('F','保險絲');

      思路: 兩個供應商都經營同種類型的零件 (簡單的按照零件列進行連接) 兩個供應商的零件類型數相同(即存在一一映射)(count限定)

      select a.sup s1, b.sup s2  from supparts a, supparts b where a.sup < b.sup                       -- 生成供應商的全部組合 
         and a.part = b.part                     -- 條件1:經營同種類型的零件 
       group by a.sup, b.suphaving count(*) = (select count(1)         -- 條件2:經營的零件的數量種類相同 a = 中間數                     from supparts c                    where c.sup = a.sup)   and count(*) = (select count(1)         -- 條件2:經營的零件的數量種類相同 b = 中間數                     from supparts d                    where d.sup = b.sup)
      ;

      4、刪除重行

      drop table if exists products;create table products(
      rowid int4,
      name1 varchar(10),
      price int4
      );insert into products values(1,'蘋果',50);insert into products values(2,'橘子',100);
      insert into products values(3,'橘子',100);insert into products values(4,'橘子',100);
      insert into products values(5,'香蕉',80);-- 刪除重行高效SQL語句(1):通過EXCEPT求補集delete from productswhere rowid  in (select rowid           -- 全部rowid                   from products 
                       except                 -- 減去                 select max(rowid)      -- 要留下的rowid                   from products                  group by name1, price
                        );-- 刪除重行高效SQL語句(2):通過not indelete from products where rowid not in (select max(rowid)                      from products                     group by name1, price
                          );

      練習

      -- 改進中用union的比較select 
          case when count(1) = (select count(1) from tbl_A)          
          and count(1) = (select count(1)+1 from tbl_b)         
          then count(1) else '不相等' end row_cnt  from ( select * from tbl_A          union 
               select * from tbl_b
              ) tmp
      ;

      內容多來自 《SQL進階教材》,僅做筆記。練習部分代碼均為原創。

      以上就是用SQL進行集合運算 的詳細內容,更多請關注php中文網其它相關文章!


      學習教程快速掌握從入門到精通的SQL知識。




      日韩精品一区二区三区高清