• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > 用SQL进行集合运算

用SQL进行集合运算

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-05

匿名通过本文主要向大家介绍了运算,集合,进行等相关知识,希望本文的分享对您有所帮助

这篇文章主要介绍了关于用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进行集合运算 的详细内容,更多请关注微课江湖其它相关文章!

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • MySQL笔记之运算符使用详解
  • MySQL中的运算符使用实例展示
  • 用SQL进行集合运算
  • PHP运算符与操作符入门详解
  • Mysql之运算符与函数的总结
  • MySQL优化—运算符具体详解(图)
  • MySQL数值运算符和函数
  • MySQL学习系列4:运算符
  • SQLServer APPLY表运算符使用介绍
  • 通过SQL Server的位运算功能巧妙解决多选查询方法

相关文章

  • 2017-05-11win32安装配置非安装版的MySQL
  • 2017-09-08mysql5.7第一次登录修改root密码
  • 2017-05-11深入探讨:MySQL数据库MyISAM与InnoDB存储引擎的比较
  • 2018-12-05SQL Server 触发器 表的特定字段更新时,触发Update触发器
  • 2018-12-05mysql数据库在线帮助的使用
  • 2018-12-05MySQL安全设置图文教程
  • 2018-12-05浅谈 改善性能 核心架构设计
  • 2018-12-05 MySQL 基础知识小结
  • 2017-05-11防止服务器宕机时MySQL数据丢失的几种方案
  • 2018-12-05ERROR 1222 (21000): The used SELECT statements have a differ

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • SQL Server中的T-SQL的基本对象
    • oracle下一条SQL语句的优化过程(比较详细)
    • 关于mysql数据表中NULL值的详解
    • SQLServer 设置单词首字母大写
    • mysql中Table is read only的解决方法小结
    • MySQL中修改库名的操作教程
    • MySQL基本调度策略浅析
    • Mysql5.7.17在windows下安装启动时提示不成功问题的解决办法
    • 在Linux下写的MySQL无法插入,sql语句在复制中变'脏'了
    • mysql进阶(十八)完全卸载mysql数据库图文教程

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有