Join关联

楼主
我是社区第238588位番薯,欢迎点我头像关注我哦~
1. 描述

由于一些特殊的数据展示,比如需要在一张报表上同时展示客户信息和对应的订单详情,这个时候就会用到客户表和订单表里的内容,虽然可以建立多个数据集然后通过单元格过滤来实现,但个人感觉还是不够直接,能不能有更便捷的方法呢?答案肯定是:有!


2. 思路

在创建数据集时,对事先相关表通过 SQL 的 Join 方法进行关联,然后直接使用。


3. Join 介绍

通过图文并茂的方式对 SQL 的 Join 进行简单的介绍:join 大致分为以下七种情况:


4. 示例4.1 准备数据

DROP TABLE [dbo].[test_a] GO CREATE TABLE [dbo].[test_a] ( [id] int NULL , [name] varchar(255) NULL ) GO -- ---------------------------- -- Records of test_a -- ---------------------------- INSERT INTO [dbo].[test_a] ([id], [name]) VALUES (N'1', N'苹果') GO GO INSERT INTO [dbo].[test_a] ([id], [name]) VALUES (N'2', N'橘子') GO GO INSERT INTO [dbo].[test_a] ([id], [name]) VALUES (N'3', N'菠萝') GO GO INSERT INTO [dbo].[test_a] ([id], [name]) VALUES (N'4', N'香蕉') GO GO INSERT INTO [dbo].[test_a] ([id], [name]) VALUES (N'5', N'西瓜') GO GO ----------------------------------------------------------- DROP TABLE [dbo].[test_b] GO CREATE TABLE [dbo].[test_b] ( [id] int NULL , [name] varchar(255) NULL ) GO -- ---------------------------- -- Records of test_b -- ---------------------------- INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'1', N'梨子') GO GO INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'2', N'苹果') GO GO INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'3', N'草莓') GO GO INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'4', N'桃子') GO GO INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'5', N'香蕉') GO GO

注:需要手动建 test_a,test_b 两个表。


4.2 示例介绍

1)Inner join

产生 A 和 B 的交集。

SELECT * FROM test_a INNER JOIN test_b ON test_a.name = test_b.name

2)Full outer join

产生 A 和 B 的并集。对于没有匹配的记录,则以 null 做为值。

SELECT * FROM test_a FULL OUTER JOIN test_b ON test_a.name = test_b.name

3)Left outer join

产生表 A 的完全集,而B表中匹配的则有值,没匹配的以 null 值取代。

SELECT * FROM test_a LEFT OUTER JOIN test_b ON test_a.name = test_b.name


4)Left outer join on where

产生在 A 表中有而在 B 表中没有的集合。

SELECT * FROM test_a LEFT OUTER JOIN test_b ON test_a.name = test_b.name WHERE test_b.name IS NULL

5)RIGHT OUTER JOIN

产生表 B 的完全集,而 A 表中匹配的则有值,没匹配的以 null 值取代。

SELECT * FROM test_a RIGHT OUTER JOIN test_b ON test_a.name = test_b.name

注:考虑到 MySQL 对 full join 不支持的原因,在 MySQL 如果要实现 full join 的效果可采取变通的方式。

SELECT * FROM test_a LEFT OUTER JOIN test_b ON test_a.name = test_b.name UNION SELECT * FROM test_a RIGHT OUTER JOIN test_b ON test_a.name =test_b.name

6)right outer join on where

产生在 B 表中有而在A表中没有的集合。

SELECT * FROM test_a RIGHT OUTER JOIN test_b ON test_a.name = test_b.name WHERE test_a.name IS NULL

7)FULL OUTER JOIN WHERE

产生(A 表中有但 B 表没有)和(B 表中有但 A 表中没有)的数据集。

SELECT * FROM test_a FULL OUTER JOIN test_b ON test_a.name = test_b.name WHERE test_a.name IS NULL OR test_b.name IS NULL

8)cross join

表 A 和表 B 的数据进行一个 N*M 的组合,即笛卡尔积(交差集)。一般来说,我们很少用到这个语法。因为这种集合的使用对于性能来说非常危险,尤其是表很大。


分享扩散:

沙发
发表于 2020-9-13 21:40:53
这个还是总结的不错的,有用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部 返回列表