SQL 基础知识梳理(七)- 集合运算

目录

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

一、表的加减法

  1.集合:记录的集合(表、视图和查询的执行结果)。

  2.UNION(并集):表的加法

-- 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 ('', 'T恤' ,'衣服', 1000, 500, '2009-09-20');
INSERT INTO Shohin2 VALUES ('', '打孔器', '办公用品', 500, 320, '2009-09-11');
INSERT INTO Shohin2 VALUES ('', '运动T恤', '衣服', 4000, 2800, NULL);
INSERT INTO Shohin2 VALUES ('', '手套', '衣服', 800, 500, NULL);
INSERT INTO Shohin2 VALUES ('', '水壶', '厨房用具', 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 ('', 'T恤' ,'衣服', 1000, 500, '2009-09-20');
INSERT INTO Shohin VALUES ('', '打孔器', '办公用品', 500, 320, '2009-09-11');
INSERT INTO Shohin VALUES ('', '运动T恤', '衣服', 4000, 2800, NULL);
INSERT INTO Shohin VALUES ('', '菜刀', '厨房用具', 3000, 2800, '2009-09-20');
INSERT INTO Shohin VALUES ('', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');
INSERT INTO Shohin VALUES ('', '叉子', '厨房用具', 500, NULL, '2009-09-20');
INSERT INTO Shohin VALUES ('', '擦菜板', '厨房用具', 880, 790, '2008-04-28');
INSERT INTO Shohin VALUES ('', '圆珠笔', '办公用品', 100, NULL, '2009-11-11');

初始化测试数据

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

  3.注意事项:

  (1)作为运算对象的记录的列数必须相同

图:列数不匹配

  (2)作为运算对象的记录中列的类型必须一致

图:类型不一致

  【备注】可以使用类型转换函数 CAST

  4.ALL 选项 - 包含重复行的集合运算

图:保留重复行

  5.INTERSECT(交集) - 选取表中公共的部分

  类似该并集图:

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

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

二、联结(以列为单位)

  1.上一节集合运算的特征是以“行方向”为单位操作,在进行集合运算时会导致记录行数的增减,不过队列不会影响,因为它们的列数要一致。

  2.联结(JOIN)运算:“添加列”的运算,从其它表的列添加过来。

  3.INNER JOIN - 内联结

  联结运算:以 A 表中的列作为桥梁,将 B 表中满足同样条件的列汇集到同一结果中。

  要点:

    ①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 子句作为他们两者之间的桥梁。

    ③SELECT 子句:SELECT TS.tenpo_id ,TS.tenpo_mei ,S.shohin_mei ,S.hanbai_tanka

    采用“<表的别名>.<列名>”格式来显示,这样就可以清楚的知道该列来自哪张表。

  4.OUTER JOIN - 外联结

  

  (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', '', 0);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001', '', 120);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001', '', 200);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001', '', 3);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001', '', 0);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001', '', 99);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001', '', 999);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001', '', 200);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002', '', 10);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002', '', 25);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002', '', 34);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002', '', 19);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002', '', 99);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002', '', 0);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002', '', 0);
INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002', '', 18);

初始化测试数据

  3 表联结就是多 1 行 JOIN 子句而已,多表联结就多几行 JOIN 字句呗。

  6.CROSS JOIN(笛卡儿积)- 交叉联结

  这种联结在实际业务中很少使用。

  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 ゼロからはじめるデータベース操作》

[SQL] SQL 基础知识梳理(七)- 集合运算的更多相关文章

  1. 【SQL】- 基础知识梳理(二) - SQL简介

    一.引言 在梳理这些知识之前,说实话,如果有人问我SQL是什么?我可能会回答就是“INSERT,DELETE,UPDATE,SELECT”语句呗,还能是啥. 二.SQL概念 SQL是什么? SQL是S ...

  2. 【SQL】- 基础知识梳理(七) - 索引

    索引的概念 在关系型数据库中,索引是对数据库表中一列或多列的值进行排序的一种结构. SQL SERVER中有索引的类型:按存储结构区分:“聚集索引(又称聚类索引,簇集索引)”,“分聚集索引(非聚类索引 ...

  3. 【SQL】- 基础知识梳理(四) - 存储过程

    存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行 存储过程的好处 A. 存储过程允许标准组件式编程  ...

  4. 【SQL】- 基础知识梳理(六) - 游标

    游标的概念 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标(Cursor): 是处理数据的一种方法. 它可以定位到结果集中的某一行,对数据进行读写. 也可以移动游标定位到你需要的 ...

  5. 【SQL】- 基础知识梳理(一) - 数据库

    一.引言 知识分享这个事情在公司会议上被提出过几次,可一直因各种事情耽搁下来,“我不如地狱,谁入地狱”,怀着这样一种心态,写下了 数据库系列知识分享. 本文将一步步通过循序渐进的方式带你去了解数据库. ...

  6. 【SQL】- 基础知识梳理(八) - 事务与锁

    事务的概念 事务:若干条T-SQL指令组成的一个操作数据库的最小执行单元,这个整体要么全部成功,要么全部失败.(并发控制) 事务的四个属性:原子性.一致性.隔离性.持久性.称为事务的ACID特性. 原 ...

  7. 【SQL】- 基础知识梳理(三) - SQL连接查询

    一.引言 有时为了得到一张报表的完整数据,需要从两个或更多的表中获取结果,这时就用到了"连接查询". 二.连接查询 连接查询的定义: 数据库中的表通过键将彼此联系起来,从而获取这些 ...

  8. 【SQL】- 基础知识梳理(五) - 触发器

    触发器的概念 触发器对表进行插入.更新.删除的时候会自动执行的特殊存储过程 触发器的语法 create trigger tgr_name on table_name with encrypion –加 ...

  9. python基础知识梳理----6set 集合的应用

    集合内容简介: set 一: 集合简介 集合set集合是python的一个基本数据类型.一般不是很常用set.中的元素是不重复的.无序的.里里面的元素必须是可hash的tuple,bool),str, ...

随机推荐

  1. 【G】开源的分布式部署解决方案(一) - 开篇

    做这个开源项目的意义是什么?(口水自问自答,不喜可略过) 从功能上来说,请参考 预告篇,因自知当时预告片没有任何含金量,所以并没有主动推送到首页,而是私下的给一些人发的. 从个人角度上来说,我希望.n ...

  2. Android几行代码实现实时监听微信聊天

    实现效果: 实时监听当前聊天页面的最新一条消息,如图:            实现原理: 同样是利用AccessibilityService辅助服务,关于这个服务类还不了解的同学可以先看下我上一篇关于 ...

  3. WebForm 三级联动

    三级联动 数据库根据父级代号条件写查询 返回list<>集合 方法一: 创建三个下拉列表: ※AutoPostBack:否发生自动回传到服务器的操作.如果把该属性设置为 TRUE,则启用自 ...

  4. 如何在linux下制作一个windows的可启动u盘?

    如何在linux下制作一个windows的可启动u盘? 情景是这样的,有一个windows10的iso,现在想通过U盘安装,要求即支持UEFI(启动引导器),又支持Legacy(启动引导器),因为有一 ...

  5. mdadm命令详解及实验过程

    一.概念 mdadm是multiple devices admin的简称,它是Linux下的一款标准的软件 RAID 管理工具,作者是Neil Brown 二.特点 mdadm能够诊断.监控和收集详细 ...

  6. php编译安装

    php编译安装含mcrypt扩展 开始前准备 1.php源码下载 这里用的是php5.6.22版本 wget -c http://cn2.php.net/get/php-5.6.22.tar.gz/f ...

  7. devexpress chartcontrol实现非连续点数据的显示

    1.先上图: 其中暗红的曲线中数据不连续的,在实际开发中可能也会遇到这种情况,由于断电或其他原因导致部分日期数据无法采集,如果按一般情况来显示可能会显示如下图所示: 图中可以看出非连续曲线中,3月5号 ...

  8. Excel与XML相互转换 - C# 简单实现方案

    Excel与XML相互转换 - C# 简单实现方案 在日常工作中,我需要将数据存储在Excel中进行数据分析和处理,然后再将数据转换为XML格式进行跨平台的数据交换.网上搜索Excel转换为XML的实 ...

  9. 【openstack N版】——网络服务neutron

    一.openstack网络服务neutron 1.1neutron介绍 neutron是openstack重要组件之一,在以前是时候没有neutron项目,早期的时候是没有neutron,早期所使用的 ...

  10. 字符串查找算法总结(暴力匹配、KMP 算法、Boyer-Moore 算法和 Sunday 算法)

    字符串匹配是字符串的一种基本操作:给定一个长度为 M 的文本和一个长度为 N 的模式串,在文本中找到一个和该模式相符的子字符串,并返回该字字符串在文本中的位置. KMP 算法,全称是 Knuth-Mo ...