SQL基础——集合运算(上)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: SQL基础——集合运算(上)

集合运算

前言

系统学习SQL的笔记,用于记录学习过程。

思维导图



表的加减法

集合运算就是对满足同一规则的记录进行的加减等四则运算

表的加法——UNION(并集)

在学习具体的使用方法之前,先添加一张表

代码示例7.1 创建表Product2

CREATE TABLE Product2 (
    product_id CHAR ( 4 ) NOT NULL,
    product_name VARCHAR ( 100 ) NOT NULL,
    product_type VARCHAR ( 32 ) NOT NULL,
    sale_price INTEGER,
    purchase_price INTEGER,
regist_date DATE,
PRIMARY KEY ( product_id ));

为表Product2添加记录,商品编号(product_id)为0001-0003的商品与之前Product表中的商品相同,而编号为0009和手套和0010的水壶是Product表中没有的商品。

代码示例7.2 将数据插入到表Product2中(MYSQL)

--指定mysql
START TRANSACTION;
INSERT INTO Product2
VALUES
    ('0001', 'T恤衫', '衣服', 1000, 500, '2008-09-20' );
INSERT INTO Product2
VALUES
    ('0002', '打孔器', '办公用品', 500, 320, '2009-09-11' );
INSERT INTO Product2
VALUES
    ('0003', '运动T恤', '衣服', 4000, 2800, NULL );
INSERT INTO Product2
VALUES
    ('0009', '手套', '衣服', 800, 500, NULL );
INSERT INTO Product2
VALUES
    ('0010', '水壶', '厨房用具', 2000, 1700, '2009-09-20' );
COMMIT;

进行两张表的加法运算,Product表+Product2表的加法运算

代码示例7.3 使用UNION对表进行加法运算

SELECT
    product_id,
    product_name 
FROM
    Product UNION
SELECT
    product_id,
    product_name 
FROM
    Product2;

执行结果为两张表的全部商品


注意: 集合运算符会除去重复的记录

集合运算的注意事项

注意事项①——作为运算对象的记录的列数必须相同

注意事项②——作为运算对象的记录中列的类型必须相同

注意事项③——可以使用任何SELECT语句,但ORDER BY子句只能在最后使用一次

包含重复行的集合运算——ALL选项

在UNION的结果中保留重复行的语法。只需要在UNION后面添加ALL关键字就可以了。

代码示例7.5 保留重复行

SELECT
    product_id,
    product_name 
FROM
    Product UNION ALL
SELECT
    product_id,
    product_name 
FROM
    Product2;

执行结果


法则7.2 在集合运算符中使用ALL选项,可以保留重复行

选取表中公共部分——INTERSECT(交集)

选取两个记录集合中公共部分。

目前仅支持:Oracle SQL Server DB2 PostgreSQL

代码示例 7.6 使用INTERSECT选取出表中公共部分

--目前仅支持:Oracle  SQL Server  DB2  PostgreSQL
SELECT
    product_id,
    product_name 
FROM
    Product INTERSECT
SELECT
    product_id,
    product_name 
FROM
    Product2ORDER BY product_id;

执行结果



记录的减法——EXCEPT(差集)

代码示例7.7 使用EXCEPT对记录进行减法运算

目前仅支持:SQL Server DB2 PostgreSQL

--目前仅支持:SQL Server  DB2  PostgreSQL
SELECT
    product_id,
    product_name 
FROM
    Product EXCEPT
SELECT
    product_id,
    product_name 
FROM
    Product2 ORDER BY product_id;

执行结果



代码示例7.8 被减数和减数位置不同,得到的结果也不同

--SQL Server  DB2  PostgreSQL
-- 从Product2的记录中除去Product中的记录
SELECT
    product_id,
    product_nam e 
FROM
    Product2 EXCEPT
SELECT
    product_id,
    product_nam e 
FROM
    Product 
ORDER BY
    product_id;

执行结果



联结(以列为单位对表进行联结)

什么是联结

联结(JOIN)就是将其他表中的列添加过来,进行“添加列”的集合运算。UNION是以行(纵向)为单位进行操作,而联结则是以列(横向)为单位进行的。


内连接——INNER JOIN

使用product表和Product表表进行练习

相应的建表语句

CREATE TABLE ShopProduct (
    shop_id CHAR ( 4 ) NOT NULL,
    shop_name VARCHAR ( 200 ) NOT NULL,
    product_id CHAR ( 4 ) NOT NULL,
quantity INTEGER NOT NULL,
PRIMARY KEY ( shop_id, product_id ));

插入的数据

--指定mysql
START TRANSACTION;
INSERT INTO ShopProduct ( shop_id, shop_name, product_id, quantity )
VALUES
    ( '000A', '东京', '0001', 30 );
INSERT INTO ShopProduct ( shop_id, shop_name, product_id, quantity )
VALUES
    ( '000A', '东京', '0002', 50 );
INSERT INTO ShopProduct ( shop_id, shop_name, product_id, quantity )
VALUES
    ( '000A', '东京', '0003', 15 );
INSERT INTO ShopProduct ( shop_id, shop_name, product_id, quantity )
VALUES
    ( '000B', '名古屋', '0002', 30 );
INSERT INTO ShopProduct ( sho _id, shop_name, product_id, quantity )
VALUES
    ( '000B', '名古屋', '0003', 120 );
INSERT INTO ShopProduct ( shop_id, shop_name, product_id, quantity )
VALUES
    ( '000B', '名古屋', '0004', 20 );
INSERT INTO ShopProduct ( shop_id, shop_name, product_id, quantity )
VALUES
    ( '000B', '名古屋', '0006', 10 );
INSERT INTO ShopProduct ( shop_id, shop_name, product_id, quantity )
VALUES
    ( '000B', '名古屋', '0007', 40 );
INSERT INTO ShopProduct ( shop_id, shop_name, product_id, quantity )
VALUES
    ( '000C', '大阪', '0003', 20 );
INSERT INTO ShopProduct ( shop_id, shop_name, product_id, quantity )
VALUES
    ( '000C', '大阪', '0004', 50 );
INSERT INTO ShopProduct ( shop_id, shop_name, product_id, quantity )
VALUES
    ( '000C', '大阪', '0006', 90 );
INSERT INTO ShopProduct ( shop_id, shop_name, product_id, quantity )
VALUES
    ( '000C', '大阪', '0007', 70 );
INSERT INTO ShopProduct ( shop_id, shop_name, product_id, quantity )
VALUES
    ( '000D', '福冈', '0001', 100 );
COMMIT;

Product表

CREATE TABLE `Product` (
  `product_id` char(4) CHARACTER SET utf8 NOT NULL,
  `product_name` varchar(100) CHARACTER SET utf8 NOT NULL,
  `product_type` varchar(32) CHARACTER SET utf8 NOT NULL,
  `sale_price` int(11) DEFAULT NULL,
  `purchase_price` int(11) DEFAULT NULL,
  `regist_date` date DEFAULT NULL,
  PRIMARY KEY (`product_id`)
)

Product表与ShopProduct表的数据

Product:


ShopProduct:


代码示例7.9 将两张表进行内联结

--支持 SQL Server  DB2  PostgreSQL  MySQL
SELECT
    SP.shop_id,
    SP.shop_name,
    SP.product_id,
    P.product_name,
    P.sale_price 
FROM
    ShopProduct AS SP
    INNER JOIN Product AS P ON SP.product_id = P.product_id;

执行结果

内联结要点①——FROM子句

进行联结是需要在FROM子句中使用多张表

内联结要点②——ON子句

ON后面为联结条件,进行内联结时必须使用ON子句,并且要书写在FROM和WHERE之间。

内联结要点③——SELECT子句

使用联结时SELECT子句中的列需要按照<表的别名>.<列名>的格式进行书写,避免书写格式出错。

内连接与WHERE子句结合使用

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
10月前
|
SQL Serverless 数据库
|
SQL 分布式计算 Unix
阿里云-DataWorks- ODPS SQL开发3-日期与字符、数学运算、聚合函数函数
阿里云-DataWorks- ODPS SQL开发3 本文主要讲解日常大量会接触到的一些常用的日期与字符、数学运算、聚合函数函数。
|
SQL
SQL基础——集合运算(下)
SQL基础——集合运算(下)
47 0
|
4月前
|
SQL 关系型数据库 MySQL
第四章:集合运算---SQL学习笔记
第四章:集合运算---SQL学习笔记
83 0
|
SQL 数据采集 关系型数据库
【教奶奶学SQL】(task4)集合运算
集合在数学领域表示“各种各样的事物的总和”, 在数据库领域表示记录的集合. 具体来说,表、视图和查询的执行结果都是记录的集合, 其中的元素为表或者查询结果中的每一行。
206 0
【教奶奶学SQL】(task4)集合运算
|
SQL 数据采集 关系型数据库
【教奶奶学SQL】(task4)集合运算
集合在数学领域表示“各种各样的事物的总和”, 在数据库领域表示记录的集合. 具体来说,表、视图和查询的执行结果都是记录的集合, 其中的元素为表或者查询结果中的每一行。
128 0
【教奶奶学SQL】(task4)集合运算
|
SQL 存储 移动开发
Java 搞定 SQL 集合运算的最简方法
问题介绍  作为 java 程序员,用代码直接实现类似 SQL 中的交并补差的集合运算,总是要编写大量的代码,如果能有一个专门的外部数据工具,通过写简单类似 SQL 的脚本来实现,在 java 中直接调用并可以返回结果集,就再好不过了。
1457 0