热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLServer的InnerJoin及OuterJoin

当然Join如何将不同的数据库的材料联合,还要看你如何应用它,一共有四种不同的Join的方法,在这篇文章中我们将为你先容InnerJoin及OuterJoin以及其利用。在一个正规化的数据库环

当然 Join 如何将不同的数据库的材料联合, 还要看你如何应用它, 一共有四种不同的 Join 的方法, 在这篇文章中我们将为你先容 Inner Join 及 Outer Join 以及其利用。


在一个正规化的数据库环境中, 我们常会碰到这款情况: 所需的材料并不是放在同一个材料表中, 在这个时候, 你就要用到 Join。

  当然 Join 如何将不同的数据库的材料联合, 还要看你如何应用它, 一共有四种不同的 Join 的方法, 在这篇文章中我们将为你先容 Inner Join 及 Outer Join 以及其利用。

  Inner Join
  Inner Join 应当是最常用的 Join 方法, 它只会传回符合 Join 规矩的纪录, 还是先来看看语法:
Select <要选择的字段> From <重要材料表> <次要材料表> [On ]
  现在我们利用 MS SQL 内建的北风数据库来实际练习一下! 想多懂得 MS SQL 的内建数据库, 你可以看看 SQL Server 的内建数据库这篇文章。

  请打开 QA (Query Analyzer), 为了应用北风数据库, 请先履行 Use Northwind, 然后履行
Select ProductId, ProductName, SupplierId From Products
  从 Products 产品材料表中取出三个字段, 分辨是产品代码, 产品名称, 供货商代码, 但查询出来的成果保证让你的老板很不满足, 由于供货商代码对于人类实在是无什么意义, 这个时候 Join 就可以帮上忙了, 藉由 Join Suppliers 这个材料表我们便可以查询到供货商名称
Select ProductId, ProductName, Suppliers.SupplierId
From Products
Inner Join Suppliers
Products.Suppliers = Suppliers.SupplierId
  这款的查询成果是不是明白呢! Inner Join 的重要精力就是 exclusive , 叫它做排他性吧! 就是讲 Join 规矩不相符的材料就会被消除掉, 譬如讲在 Product 中有一项产品的供货商代码 (SupplierId), 没有呈现在 Suppliers 材料表中, 那么这笔记录便会被消除掉

  Outer Join
  这款的 Join 方法是一般人比拟少用到的, 甚至有些 SQL 的治理者也从未用过, 这真是一件悲哀的代志, 由于善用 Outer Join 是可以简化一些查询的工作的, 先来看看 Outer Join 的语法 Select <要查询的字段> From [Outer] Join On

  语法中的 Outer 是可以省略的, 例如你可以用 Left Join 或是 Right Join, 在本质上, Outer Join 是 inclusive, 叫它做包容性吧! 不同于 Inner Join 的排他性, 因此在 Left Outer Join 的查询成果会包含所有 Left 材料表的材料, 颠倒过来讲, Right Outer Join 的查询就会包含所有 Right 材料表的材料, 接下来我们还是来做些实际把持, 仍然是应用北风数据库, 但要先做一些小小的修正, 才干达到我们要的成果。

  首先要拿掉 Products 材料表的 Foreign Key, 否则没有法式在 Products 材料表新增一笔 SupplierId 没有对映到 Suppliers 材料表的纪录, 要知影一个材料表的 Constraint 你可以履行 SQL 内建的 sp_helpconstraint , 在 QA 履行
sp_helpconstraint Products

  接下来删除 FK_Products_Suppliers 这个 Foreign Key
Alter Table Products
Drop Constraint FK_Products_Suppliers
  再来新增一笔纪录于 Products 材料表, SupplierId 应用 50 是由于它并没有对映到 Suppliers 材料表中的记录
Insert Into Products (ProductName,SupplierId,CategoryId)
values ('Test Product','50','1')
  现在我们再履行头前的查询, 只是将 Inner Join 改为 Left Outer Join
Select ProductId, ProductName, Suppliers.SupplierId
From Products
Left Outer Join Suppliers
Products.Suppliers = Suppliers.SupplierId
  比拟一下两种 Join 方法的查询成果, 你应当就会知影其中的差别!
  再来看看 Right Outer Join, 请新增下底这笔记录
Insert Into Suppliers (CompanyName)
values ('LearnASP')
  现在请应用 Right Out Join 来作查询, 比拟看看查询的成果和 Inner Join 有什么不同!
  寻找不相符纪录
  这里我们来看看如何应用 Out Join 来找不相符纪录, 可能是有子纪录却没有父纪录或是颠倒过来
Select Suppliers.CompanyName From Products
Right Join Suppliers
On Products.SupplierId = Suppliers.SupplierId
Where Products.SupplierId is Null

  履行成果你会找到一笔材料为 LearnASP, 该笔供货商材料存在, 但基础上已经没有产品是来自这个供货商, 想象一下假如不用 Outer Join 你要怎么以一个 SQL 指令完成同一查询成果! 知道 Outer Join 的好用了吧! 再履行
Select Products.ProductName
From Products
Left Join Suppliers
On Products.SupplierId = Suppliers.SupplierId
Where Suppliers.SupplierId is Null

  这个查询成果你会发明 Test Product 这项产品竟然找不到供货商的材料!




推荐阅读
  • 程序员妻子吐槽:丈夫北漂8年终薪3万,存款情况令人意外
    一位程序员的妻子在网上分享了她丈夫在北京工作八年的经历,月薪仅3万元,存款情况却出乎意料。本文探讨了高学历人才在大城市的职场现状及生活压力。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Valve 发布 Steam Deck 的新版 Windows 驱动程序
    Valve 最新发布了针对 Steam Deck 掌机的 Windows 驱动程序,旨在提升其在 Windows 环境下的兼容性、安全性和性能表现。 ... [详细]
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 在 Windows 10 中,F1 至 F12 键默认设置为快捷功能键。本文将介绍几种有效方法来禁用这些快捷键,并恢复其标准功能键的作用。请注意,部分笔记本电脑的快捷键可能无法完全关闭。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 计算机网络复习:第五章 网络层控制平面
    本文探讨了网络层的控制平面,包括转发和路由选择的基本原理。转发在数据平面上实现,通过配置路由器中的转发表完成;而路由选择则在控制平面上进行,涉及路由器中路由表的配置与更新。此外,文章还介绍了ICMP协议、两种控制平面的实现方法、路由选择算法及其分类等内容。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • This guide provides a comprehensive step-by-step approach to successfully installing the MongoDB PHP driver on XAMPP for macOS, ensuring a smooth and efficient setup process. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
author-avatar
zh1234之歌
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有