目录

内连接 INNER JOIN

等值连接

自然连接

自连接

联合连接(UNION JOIN)

外连接

全外连接(FULL OUTER JOIN)

交叉连接


内连接 INNER JOIN

内连接(INNER JOIN)有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。
内连接使用比较运算符(包括=、>、<、<>、>=、<=、!> 和!<)进行表间的比较操作,查询与连接条件相匹配的数据。根据所使用的比较方式不同,内连接分为等值连接、自然连接和自连接三种。

语句1:隐式的内连接,没有INNER JOIN,形成的中间表为两个表的笛卡尔积。

SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME
FROM CUSTOMERS C,ORDERS O
WHERE C.ID=O.CUSTOMER_ID;

**语句2**:显示的内连接,一般称为内连接,有INNER JOIN,形成的中间表为两个表经过ON条件过滤后的笛卡尔积。

SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME
FROM CUSTOMERS C
INNER JOIN ORDERS O ON C.ID=O.CUSTOMER_ID;

语句3和语句4的查询结果。

等值连接

使用”=”关系将表连接起来的查询,其查询结果中列出被连接表中的所有列,包括其中的重复列。

SELECT PM_ACT_JOB_RLS.*, PM_ACT_RLS.*
FROM PM_ACT_JOB_RLS
INNER JOIN PM_ACT_RLS ON PM_ACT_JOB_RLS.RlsPK = PM_ACT_RLS.RlsPK

自然连接

等值连接中去掉重复的列,形成的连接。
说真的,这种连接查询没有存在的价值,既然是SQL2标准中定义的,就给出个例子看看吧。自然连接无需指定连接列,SQL会检查两个表中是否相同名称的列,且假设他们在连接条件中使用,并且在连接条件中仅包含一个连接列。不允许使用ON语句,不允许指定显示列,显示列只能用*表示(ORACLE环境下测试的)。对于每种连接类型(除了交叉连接外),均可指定NATURAL。
inner join是内连接,显示符合连接条件的记录
natural join是对两张表中字段名和数据类型都相同的字段进行等值连接,并返回符合条件的结果 。
natural join是自然连接,自动对两个表按照同名的列进行内连接
使用自然连接要注意,两个表同名的列不能超过1个

SELECT
PM_ACT_JOB_RLS.JobPK, PM_ACT_RLS.RlsPK, RlsName
FROM
PM_ACT_JOB_RLS
Natural INNER JOIN PM_ACT_RLS ON PM_ACT_JOB_RLS.RlsPK = PM_ACT_RLS.RlsPK

语句1:

SELECT * FROM ORDERS O
NATURAL INNER JOIN CUSTOMERS C;

语句2:

SELECT *
FROM ORDERS O
NATURAL LEFT OUTER JOIN CUSTOMERS C;

语句3:

SELECT *
FROM ORDERS ONATURAL RIGHT OUTER JOIN CUSTOMERS C;

语句4:

SELECT *
FROM ORDERS O
NATURAL FULL OUTER JOIN CUSTOMERS C;//自然全外连接

自连接

 如果在一个连接查询中,设计到的两个表都是同一个表,这种查询称为自连接查询。
--c1、c2逻辑上是两张表,物理上是一张表 SELECT c1.CategoryID,
c1.CategoryName
FROM
[dbo].[Category] c1
INNER JOIN [dbo].[Category] c2 ON c1.[CategoryID] = c2.[ParentID]

联合连接(UNION JOIN)

这是一种很少见的连接方式。Oracle、MySQL均不支持,其作用是:找出全外连接和内连接之间差异的所有行。这在数据分析中排错中比较常用。也可以利用数据库的集合操作来实现此功能。
语句1:联合查询(UNION JOIN)例句,还没有找到能执行的SQL环境。

SELECT1 O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O UNION JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID

语句2:语句11在DB2下的等价实现。还不知道DB2是否支持语句11呢!


SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID
EXCEPT
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O INNER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

语句3:语句1在Oracle下的等价实现。

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID
MINUS
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O INNER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

外连接

内连接只返回满足连接条件的数据行,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。
外连接分为左外连接、右外链接、全外连接三种。

1)LEFT JOIN或LEFT OUTER JOIN 
左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。 
2)RIGHT JOIN 或 RIGHT OUTER JOIN 
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。 
3)FULL JOIN 或 FULL OUTER JOIN
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

语句1:左外连接(LEFT OUTER JOIN)

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

语句2:右外连接(RIGHT OUTER JOIN)

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

注意:WHERE条件放在ON后面查询的结果是不一样的。例如:

语句3:WHERE条件独立。

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID
WHERE O.ORDER_NUMBER<>'MIKE_ORDER001';

语句4:将语句7中的WHERE条件放到ON后面。

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID AND O.ORDER_NUMBER<>'MIKE_ORDER001';

从语句3和语句4查询的结果来看,显然是不相同的,语句8显示的结果是难以理解的。因此,推荐在写连接查询的时候,ON后面只跟连接条件,而对中间表限制的条件都写到WHERE子句中。

全外连接(FULL OUTER JOIN)

注意:MySQL是不支持全外的连接的,这里给出的写法适合Oracle和DB2。但是可以通过左外和右外求合集来获取全外连接的查询结果。

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

左外和右外的合集

实际上查询结果和上面的全外连接语句是相同的

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID
UNION
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

交叉连接

交叉连接(CROSS JOIN):有两种,显式的和隐式的。不带ON子句,返回的是两表的乘积,也叫笛卡尔积。

语句1:隐式的交叉连接,没有CROSS JOIN。


SELECT O.ID, O.ORDER_NUMBER, C.ID, C.NAME
FROM ORDERS O , CUSTOMERS C
WHERE O.ID=1;

语句2:显式的交叉连接,使用CROSS JOIN。

SELECT O.ID,O.ORDER_NUMBER,C.ID,
C.NAME
FROM ORDERS O CROSS JOIN CUSTOMERS C
WHERE O.ID=1;

语句1和语句2的结果是相同的

数据库的连接 (十)相关推荐

  1. 孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(三十九)——数据库连接池 一、应用程序直接获取数据库连接的缺点   用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要

    孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(三十九)--数据库连接池 一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对 ...

  2. jmeter连接mysql数据库驱动_十八、JMeter实战-JDBC连接MySQL数据库

    前言 连接数据库进行测试在工作中会比较常用,首先可以读取数据库的数据进行参数化.关联等,批量添加测试数据以及清理数据,还可以直接对SQL语句进行压测. 一.基本介绍 1. 首先第一步要导入mysql驱 ...

  3. Zjh游戏(十)注册功能的实现以及数据库的连接

    注册功能的实现 创建账号模块下的注册登陆的子操作码 创建注册登陆的数据模型 注册登陆的子操作码 using System; using System.Collections.Generic; usin ...

  4. mysql入门优化_MySQL数据库:MySQL十大优化技巧详解

    本文主要向大家介绍了MySQL数据库的MySQL十大优化技巧详解,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. WEB开发者不光要解决程序的效率问题,对数据库的快速访问和相应也是 ...

  5. Oracle(11g)数据库教程之十:Oracle操作题 (复习课)

    Oracle(11g)数据库教程之十:Oracle操作题 (复习课) 操作题 Sutdent表的定义 字段名 字段描述 数据类型 主键 非空 Id 学号 INT(10) 是 是 Name 姓名 VAR ...

  6. 数据库原理(十 一)- 概念结构设计

    数据库原理(十 一)- 概念结构设计 前言 概念结构的特点 E-R模型 概念结构设计 实体划分的原则 E-R的集成 借鉴 前言 将需求分析得到的用户需求抽象为信息结构(即概念模型)的过程就是概念结构设 ...

  7. 国外数据库风云五十载:老骥伏枥,新秀辈出

    作者:姜洪军,来源:CSDN云计算 推荐:<中国数据库往事:国产数据库崛起史> 提醒:文末参考文献极具收藏价值 "在数据库技术方面,亚马逊落后甲骨文10至20年".20 ...

  8. 数据库风云五十载:老骥伏枥,新秀迭起!

    作者 | 姜洪军 出品 | CSDN云计算(ID:CSDNcloud) "在数据库技术方面,亚马逊落后甲骨文10至20年".2018年10月23日,甲骨文(Oracle)创始人.执 ...

  9. ODBC、OLE连接各种数据库的连接字符串

    简介 我们在使用数据库的时候,首先需要打开这个数据库. 我们可以找到集中类型的数据库,每个都使用不同的连接方式. 下面列举了一下主要的数据库的连接字符串 A:使用ODBC方式 1:dBASE连接字符串 ...

  10. SQL Relay开源的数据库池连接代理服务器

    一.SQL Relay是什么? SQL Relay是一个开源的数据库池连接代理服务器 二.SQL Relay支持哪些数据库? * Oracle * MySQL * mSQL * PostgreSQL ...

最新文章

  1. 计算机原理说课教案,《 计算机组成原理 》 说课
  2. oracle快速导出1t数据,使用sqluldr2快速高效大批量导出Oracle数据
  3. UNITY 接讯飞语音过程总结
  4. BugkuCTF-Misc:Linux2
  5. redis实战之使用redis实现排行榜
  6. 战略模式并不意味着春天!
  7. ios html gif 显示,显示gif时出现巨大的内存使用Swift iOS
  8. 打印工资条怎么做到每个人都有表头明细_一分钟生成500人的工资条?还有2种方法?...
  9. Script component 用法
  10. 苹果Siri 部门前负责人加入微软人工智能部门
  11. 德力西双电源自动转换开关说明书_今日优品:南开区FLQ3-25双电源自动转换开关全国服务-老友网...
  12. [Linux] 头文件加载顺序
  13. 能力提升综合题单 Part 8.3.3 最近公共祖先
  14. 成人高考想学计算机专业,成人高考计算机类专业有哪些?
  15. UOS家庭版(21.2)安装SecureCRT(scrt-9.1.1-2638.ubuntu20-64.x86_64.deb)无法运行问题
  16. UDP网络基础知识简介
  17. 内存卡误删除文件怎么恢复
  18. 对创建的screen会话进行恢复时出现:There is no screen to be resumed matching XXX 解决办法
  19. Android Gradle 7.x新版本的依赖结构变化
  20. debian系统安装Google浏览器

热门文章

  1. matlab导出图片背景_matlab美化图片之添加背景颜色
  2. Android中多行文本末尾添加图片 图标在文字后面 换行
  3. 野兽北京读书记:关于精神力量的层次
  4. python培训学费多少钱-上海学习儿童编程学费多少钱
  5. js中obj与json之间的转换
  6. 【security】spring项目出现【Please sign in】登录界面
  7. opencv去除印章痕迹
  8. pwcorr_a:输出相关系数矩阵至Word和Excel
  9. 英才学院计算机与技术学院院长,信息工程学院计算机应用技术研究院副院长
  10. php 的pre,pre标签的作用是什么