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 的组合,即笛卡尔积(交差集)。一般来说,我们很少用到这个语法。因为这种集合的使用对于性能来说非常危险,尤其是表很大。
|