设为首页 收藏本站
查看: 1098|回复: 0

[经验分享] [SQL] SQL 基础知识梳理(七)- 集合运算

[复制链接]

尚未签到

发表于 2017-7-14 13:44:32 | 显示全部楼层 |阅读模式
SQL 基础知识梳理(七)- 集合运算
DSC0000.png


目录


  • 表的加减法
  • 联结(以列为单位)

一、表的加减法
  1.集合:记录的集合(表、视图和查询的执行结果)。
  2.UNION(并集):表的加法


DSC0001.gif DSC0002.gif


-- DDL:创建表
CREATE TABLE Shohin2
(shohin_id     CHAR(4)      NOT NULL,
shohin_mei    VARCHAR(100) NOT NULL,
shohin_bunrui VARCHAR(32)  NOT NULL,
hanbai_tanka  INTEGER      ,
shiire_tanka  INTEGER      ,
torokubi      DATE         ,
PRIMARY KEY (shohin_id));
-- DML:插入数据
INSERT INTO Shohin2 VALUES ('0001', 'T恤' ,'衣服', 1000, 500, '2009-09-20');
INSERT INTO Shohin2 VALUES ('0002', '打孔器', '办公用品', 500, 320, '2009-09-11');
INSERT INTO Shohin2 VALUES ('0003', '运动T恤', '衣服', 4000, 2800, NULL);
INSERT INTO Shohin2 VALUES ('0009', '手套', '衣服', 800, 500, NULL);
INSERT INTO Shohin2 VALUES ('0010', '水壶', '厨房用具', 2000, 1700, '2009-09-20');
CREATE TABLE Shohin
(shohin_id     CHAR(4)      NOT NULL,
shohin_mei    VARCHAR(100) NOT NULL,
shohin_bunrui VARCHAR(32)  NOT NULL,
hanbai_tanka  INTEGER ,
shiire_tanka  INTEGER ,
torokubi      DATE ,
PRIMARY KEY (shohin_id));
INSERT INTO Shohin VALUES ('0001', 'T恤' ,'衣服', 1000, 500, '2009-09-20');
INSERT INTO Shohin VALUES ('0002', '打孔器', '办公用品', 500, 320, '2009-09-11');
INSERT INTO Shohin VALUES ('0003', '运动T恤', '衣服', 4000, 2800, NULL);
INSERT INTO Shohin VALUES ('0004', '菜刀', '厨房用具', 3000, 2800, '2009-09-20');
INSERT INTO Shohin VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');
INSERT INTO Shohin VALUES ('0006', '叉子', '厨房用具', 500, NULL, '2009-09-20');
INSERT INTO Shohin VALUES ('0007', '擦菜板', '厨房用具', 880, 790, '2008-04-28');
INSERT INTO Shohin VALUES ('0008', '圆珠笔', '办公用品', 100, NULL, '2009-11-11');
初始化测试数据
DSC0003.png

  图
  并集图,会移除重复的记录。
DSC0004.png

  3.注意事项:
  (1)作为运算对象的记录的列数必须相同
DSC0005.png

  图:列数不匹配
  (2)作为运算对象的记录中列的类型必须一致
DSC0006.png

  图:类型不一致
  【备注】可以使用类型转换函数 CAST
  4.ALL 选项 - 包含重复行的集合运算
DSC0007.png

  图:保留重复行
  5.INTERSECT(交集) - 选取表中公共的部分
DSC0008.png

  类似该并集图:
DSC0009.png

  6.EXCEPT(差集) - 记录的减法
DSC00010.png

  需要注意,被减数和减数的位置调换,结果是不同的:
DSC00011.png


二、联结(以列为单位)
  1.上一节集合运算的特征是以“行方向”为单位操作,在进行集合运算时会导致记录行数的增减,不过队列不会影响,因为它们的列数要一致。
  2.联结(JOIN)运算:“添加列”的运算,从其它表的列添加过来。
  3.INNER JOIN - 内联结
  联结运算:以 A 表中的列作为桥梁,将 B 表中满足同样条件的列汇集到同一结果中。
DSC00012.png

  要点:
  ①FROM 子句:FROM dbo.TenpoShohin AS TS INNER JOIN dbo.Shohin AS S
  这里使用 INNER JOIN 将两张表关联起来,TS 和 S 分别是两张表的别名,可以增强表的可读性。
  ②ON 子句:ON S.shohin_id = TS.shohin_id
  ON 后面记载的是联结条件,联结两张表所使用的的列,可以称为联结键。
  这是一个比较直观的例子,两个小镇,中间隔了一条河,通过 ON 子句作为他们两者之间的桥梁。
DSC00013.png

  ③SELECT 子句:SELECT TS.tenpo_id ,TS.tenpo_mei ,S.shohin_mei ,S.hanbai_tanka
  采用“<表的别名>.<列名>”格式来显示,这样就可以清楚的知道该列来自哪张表。
  4.OUTER JOIN - 外联结
DSC00014.png

  (1)要点:
  ①选取出单张表中全部的信息
  与之前的内联表相比,15 行比之前 13行多了 2 行。因为多出的 2 条记录在 TenpoShohin 表并不存在。内联结只能选取出同时存在于两张表中的数据,而外联结,只要数据存在某一张表中,就能够读取出来。也就是说,希望生成固定行数的记录,就需要使用外联结。
  ②主表的选择
  最终的结果只会包含主表内所有的数据。指定主表的关键字是 LEFT 和 RIGHT,使用 LEFT 时左侧的表为主表,使用 RIGHT 时右侧的表为主表(如上图的 Shohin 表)。
  【备注】外联结使用 LEFT 和 RIGHT 来指定主表。
  5.多张表的联结





-- DDL:创建表
CREATE TABLE ZaikoShohin
( souko_id        CHAR(4)      NOT NULL,
shohin_id     CHAR(4)      NOT NULL,
zaiko_suryo    INTEGER      NOT NULL,
PRIMARY KEY (souko_id, shohin_id));
-- DML:插入数据
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001',    '0001',    0);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001',    '0002',    120);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001',    '0003',    200);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001',    '0004',    3);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001',    '0005',    0);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001',    '0006',    99);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001',    '0007',    999);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001',    '0008',    200);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002',    '0001',    10);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002',    '0002',    25);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002',    '0003',    34);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002',    '0004',    19);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002',    '0005',    99);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002',    '0006',    0);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002',    '0007',    0);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002',    '0008',    18);
初始化测试数据
DSC00015.png

  3 表联结就是多 1 行 JOIN 子句而已,多表联结就多几行 JOIN 字句呗。
  6.CROSS JOIN(笛卡儿积)- 交叉联结
  这种联结在实际业务中很少使用。
DSC00016.png

  TenpoShohin 表 13 条记录, Shohin 表 8 条记录,13*8=104 条记录。

备注
  这里采用 MS SQL Server 进行验证,不保证所有的 DBMS 执行结果正确。
  本章思维导图下载

《SQL 基础知识梳理》系列
  《SQL 基础知识梳理(一) - 数据库与 SQL》
  《SQL 基础知识梳理(二) - 查询基础》
  《SQL 基础知识梳理(三) - 聚合和排序》
  《SQL 基础知识梳理(四) - 数据更新》
  《SQL 基础知识梳理(五) - 复杂查询》
  《SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式》
  《SQL 基础知识梳理(七)- 集合运算》

  【博主】反骨仔
  【原文】http://www.cnblogs.com/liqingwen/p/6575668.html
  【参考】《SQL ゼロからはじめるデータベース操作》

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-393758-1-1.html 上篇帖子: HeidiSQL数据库mysql/sql-server连接工具 下篇帖子: SQL 2014 AlwaysOn 搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表