SQL基础教程(第2版)第7章 集合运算:7-2 联结(以列为单位对表进行联结)
第7章 集合运算:7-2 联结(以列为单位对表进行联结)
■联结的特定语法和过时语法
● 联结( JOIN)就是将其他表中的列添加过来,进行“添加列”的集合运算。UNION是以行(纵向)为单位进行操作,而联结则是以列(横向)为单位进行的。
● 联结大体上分为内联结和外联结两种。首先请大家牢牢掌握这两种联结的使用方法。
● 请大家一定要使用标准SQL的语法格式来写联结运算,对于那些过时的或者特定SQL中的写法,了解一下即可,不建议使用。
■什么是联结
■内联结——INNER JOIN
首先我们来学习内联结( INNER JOIN),它是应用最广泛的联结运算。
本例中我们会继续使用Product 表和第 6 章创建的ShopProduct表。下面我们再来回顾一下这两张表的内容。 



试着从 Product 表中取出商品名称(product_name)和销售单价(sale_price),并与ShopProduct 表中的内容进行结合,所得到的结果如下所示。


由于表名太长会影响 SQL 语句的可读性,因此还是希望大家能够习惯使用别名。

像这样使用联结运算将满足相同规则的表联结起来时, WHERE、GROUP BY、 HAVING、 ORDER BY 等工具都可以正常使用。我们可以将联结之后的结果想象为新创建出来的一张表(表 7-4)
如果希望继续使用这张“表”,还是将它创建成视图吧。
■外联结——OUTER JOIN
相反,对于外联结来说,只要数据存在于某一张表当中,就能够读取出来。
在实际的业务中,例如想要生成固定行数的单据时,就需要使用外联结。
如果使用内联结的话,根据 SELECT 语句执行时商店库存状况的不同,
结果的行数也会发生改变,生成的单据的版式也会受到影响,而使用
外联结能够得到固定行数的结果。
●外联结要点①——选取出单张表中全部的信息
●外联结要点②——每张表都是主表吗?
大家可能会犹豫外联结到底应该使用 LEFT 还是 RIGHT,其实它们的功能没有任何区别,使用哪一个都可以。通常使用 LEFT 的情况会多一些。
■ 3张以上的表的联结
通常联结只涉及 2 张表,但有时也会出现必须同时联结 3 张以上的表的情况。
首先我们创建一张用来管理库存商品的表(表 7-5)。假设商品都保存在 P001 和 P002 这 2 个仓库之中。

代码清单7-13 创建InventoryProduct表并向其中插入数据
--MySQL
-- DDL:创建表
CREATE TABLE InventoryProduct
( inventory_id CHAR(4) NOT NULL,
product_id CHAR(4) NOT NULL,
inventory_quantity. INTEGER NOT NULL,
PRIMARY KEY (inventory_id, product_id)); -- DML:插入数据
START TRANSACTION; INSERT INTO InventoryProduct (inventory_id, product_id, inventory_quantity) VALUES ('S001', '', 0);
INSERT INTO InventoryProduct (inventory_id, product_id, inventory_quantity)VALUES ('S001', '', 120);
INSERT INTO InventoryProduct (inventory_id, product_id, inventory_quantity) VALUES ('S001', '', 200);
INSERT INTO InventoryProduct (inventory_id, product_id, inventory_quantity) VALUES ('S001', '', 3);
INSERT INTO InventoryProduct (inventory_id, product_id, inventory_quantity) VALUES ('S001', '', 0);
INSERT INTO InventoryProduct (inventory_id, product_id, inventory_quantity) VALUES ('S001', '', 99);
INSERT INTO InventoryProduct (inventory_id, product_id, inventory_quantity) VALUES ('S001', '', 999);
INSERT INTO InventoryProduct (inventory_id, product_id, inventory_quantity) VALUES ('S001', '', 200);
INSERT INTO InventoryProduct (inventory_id, product_id, inventory_quantity)VALUES ('S002', '', 10);
INSERT INTO InventoryProduct (inventory_id, product_id, inventory_quantity) VALUES ('S002', '', 25);
INSERT INTO InventoryProduct (inventory_id, product_id, inventory_quantity) VALUES ('S002', '', 34);
INSERT INTO InventoryProduct (inventory_id, product_id, inventory_quantity) VALUES ('S002', '', 19);
INSERT INTO InventoryProduct (inventory_id, product_id, inventory_quantity) VALUES ('S002', '', 99);
INSERT INTO InventoryProduct (inventory_id, product_id, inventory_quantity) VALUES ('S002', '', 0);
INSERT INTO InventoryProduct (inventory_id, product_id, inventory_quantity) VALUES ('S002', '', 0);
INSERT INTO InventoryProduct (inventory_id, product_id, inventory_quantity) VALUES ('S002', '', 18); COMMIT;
--MySQL


通过 ON 子句指定联结条件的方式也没有发生改变,使用等号将作为联结条件的 Product 表和 ShopProduct 表中的商品编号(product_id)联结起来。
由于 Product 表和 ShopProduct 表已经进行了联结,因此这里无需再对 Product 表和 InventoryProduct 表进行联结了(虽然也可以进行联结,但结果并不会发生改变)。
SQL基础教程(第2版)第7章 集合运算:7-2 联结(以列为单位对表进行联结)的更多相关文章
- 推荐《SQL基础教程(第2版)》中文PDF+源代码+习题答案
我认为<SQL基础教程(第2版)>非常适合数据库学习的初学者.论述的角度是读者的角度,会换位思考到读者在看到这一段时候会发出怎样的疑问,非常难得:原始数据的例题只有一道,但是可以反复从不同 ...
- 笔记-Python基础教程(第二版)第一章
第一章 快速改造:基础知识 01:整除.乘方 (Python3.0之前 如2.7版本) >>> 1/2 ==>0 1/2整除,普通除法: 解决办法1: 1.0/2.0 ==& ...
- SQL基础教程(第2版)第7章 集合运算:7-1 表的加减法
第7章 集合运算:7-1 表的加减法 ● 集合运算就是对满足同一规则的记录进行的加减等四则运算.● 使用UNION(并集). INTERSECT(交集). EXCEPT(差集)等集合运算符来进行集合运 ...
- SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)
SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1 ...
- [SQL基础教程] 5-1视图
[SQL基础教程] 5-1视图 视图和表 从SQL角度看视图就是一张表 视图与表的差别 表保存了实际的数据,视图保存的是SELECT语句: 视图的优点 节省存储空间: 将常用的Select 语句保存成 ...
- [SQL基础教程] 4-4 事务
[SQL基础教程] 4 数据更新 4-4 事务 事务 需要在同一处理单元中执行的一系列更新处理的集合 创建事务 事务开始语句; DML语句1; DML语句2; . . . 事务结束语句; 事务开始语句 ...
- [SQL基础教程] 4-3 数据的更新(UPDATE)
[SQL基础教程] C4 数据更新 4-3 数据的更新(UPDATE) UPDATE UPDATE <表名> SET <列名> = <表达式>; UPDATE &l ...
- [SQL基础教程] 4-2 数据删除(DELETE)
[SQL基础教程] C4 数据更新 4-2 数据删除(DELETE) DROP TABLE / DELETE DROP TABLE - 完全删除表 DELETE - 仅删除数据,保留表容器 DELET ...
- [SQL基础教程] 4-1 数据的插入(INSERT)
[SQL基础教程] C4 数据更新 4-1 数据的插入(INSERT) INSERT INSERT INTO <表名>(列1,列2...) VALUES(值1,值2...); 清单 用() ...
随机推荐
- gitlab访问慢,出现502,特别卡,耗内存cpu解决办法
前言 浏览器访问gitlab的web页面,发现非常慢,并且很容易出现502问题.其中一个原因就是8080端口被tomcat占用,前面一篇已经更换了端口,但还是很慢.后来搜了下,原因是gitlab占用内 ...
- B. Sport Mafia 二分
B. Sport Mafia time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- Shell脚本之awk篇
目录:一.概述二.awk基本语法格式三.awk基本操作四.awk条件及循环语句五.awk函数六.awk演示示例(源自于man手册) 一.概述 1. 产品概述: awk是一种编程语言,用于在linux/ ...
- C#无边框应用
引用using System.Runtime.InteropServices; 在窗体的全局模式下输入 [DllImport("user32.dll")] public stati ...
- Java的包装类
一.概述 因为基本数据类型的变量身上没有任何的方法和属性,所以针对基本数据类型提供了对应的类形式--包装类. 利用这个类产生对象,调用对象身上的方法来操作这个数据. 二.分类 包装类分为以下几种: 基 ...
- Codeforces Round #616 (Div. 2)
地址:http://codeforces.com/contest/1291 A题就不写解析了,就是给一个数,是不是本身满足这个条件或者删除某些数字来达到这个条件:奇数,各个位上的数字加起来是偶数. # ...
- [ACTF2020 新生赛]BackupFile
0x00 知识点 备份文件 index.php.bak str弱相等被转化为整型 0x01解题 根据提示下载备份文件得到源码 看到==弱相等 且被强制转为整型 http://7d5cccc5-4ecd ...
- Adobe Photoshop CC2014 for MAC 详细破解步骤
1,安装Adobe Photoshop CC2014 for MAC,可以断网安装,如果不断网的话,需要申请一个Adobe ID,是免费申请. 2,下载破解工具,https://sdifen.ctfi ...
- VS2012中MFC 操作mshflexgrid插入图片
CPictureHolder pic,picSection; pic.CreateFromBitmap(IDB_BITMAP); LPDISPATCH pPic = pic.GetPictureDis ...
- MySQL8.0安装caching_sha2_password问题
MySQL安装之后无法用工具连接上本地数据库 详情原因可见: https://mysqlserverteam.com/mysql-8-0-4-new-default-authentication-pl ...