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

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

图片 1

 

目录

  • 表的加减法
  • 合并(以列为单位)

 

一、表的加减法

  1.相会:记录的集合(表、视图和询问的施行结果)。

 

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

图片 2图片 3

-- 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');

起头化测试数据

图片 4

 图

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

图片 5

 

  3.注意事项:

  (1)作为运算对象的笔录的列数必须一致

图片 6

图:列数不匹配

  (2)作为运算对象的笔录中列的花色必须一致

图片 7

图:类型不雷同

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

 

  4.ALL 选项 – 包含重复行的集纳运算

图片 8

图:保留重复行

 

   5.INTERSECT(交集) – 采取表中集体的部分

图片 9

   类似该并集图:

图片 10

 

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

图片 11

  需要留意,被减数和减数的地点交流,结果是见仁见智的:

图片 12

 

二、联结(以列为单位)

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

  2.集合(JOIN)运算:“添加列”的演算,从其余表的列添加过来。

  3.INNER JOIN – 内联结

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

图片 13

  要点:

    ①FROM 子句:FROM dbo.TenpoShohin AS TS INNER JOIN dbo.Shohin AS

    那里运用 INNER JOIN 将两张表关联起来,TS 和 S
分别是两张表的别名,可以提升表的可读性。

    ②ON 子句:ON S.shohin_id = TS.shohin_id

    ON
前边记载的是统一条件,联结两张表所使用的的列,可以叫做联结键。

    这是一个比较直观的例子,多少个小镇,中间隔了一条河,通过 ON
子句作为他们两者之间的大桥。

图片 14

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

    采用“<表的别名>.<列名>”格式来展现,这样就足以知道的知情该列来自哪张表。

 

  4.OUTER JOIN – 外联结

  图片 15

  (1)要点:

    ①精选出单张表中全体的信息

    与往日的内联表相相比,15 行比此前 13行多了 2 行。因为多出的 2
条记下在 TenpoShohin
表并不存在。内统一只可以拔取出同时设有于两张表中的多寡,而外联结,只要数据存在某一张表中,就可以读取出来。也就是说,希望生成固定行数的笔录,就需要采用外集合。

    ②主表的选项

    最后的结果只会含有主表内所有的数量。指定主表的重中之重字是 LEFT 和
RIGHT,使用 LEFT 时左边的表为主表,使用 RIGHT 时右手的表为主表(如上图的
Shohin 表)。

  【备注】外集合使用 LEFT 和 RIGHT 来指定主表。

 

  5.多张表的集合

图片 16图片 17

-- 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);

初阶化测试数据

图片 18

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

 

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

  那种统一在实质上业务中很少使用。

图片 19

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

 

相关文章