数据库的连接 (十)
目录
内连接 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的结果是相同的
数据库的连接 (十)相关推荐
- 孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(三十九)——数据库连接池 一、应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要
孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(三十九)--数据库连接池 一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对 ...
- jmeter连接mysql数据库驱动_十八、JMeter实战-JDBC连接MySQL数据库
前言 连接数据库进行测试在工作中会比较常用,首先可以读取数据库的数据进行参数化.关联等,批量添加测试数据以及清理数据,还可以直接对SQL语句进行压测. 一.基本介绍 1. 首先第一步要导入mysql驱 ...
- Zjh游戏(十)注册功能的实现以及数据库的连接
注册功能的实现 创建账号模块下的注册登陆的子操作码 创建注册登陆的数据模型 注册登陆的子操作码 using System; using System.Collections.Generic; usin ...
- mysql入门优化_MySQL数据库:MySQL十大优化技巧详解
本文主要向大家介绍了MySQL数据库的MySQL十大优化技巧详解,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. WEB开发者不光要解决程序的效率问题,对数据库的快速访问和相应也是 ...
- Oracle(11g)数据库教程之十:Oracle操作题 (复习课)
Oracle(11g)数据库教程之十:Oracle操作题 (复习课) 操作题 Sutdent表的定义 字段名 字段描述 数据类型 主键 非空 Id 学号 INT(10) 是 是 Name 姓名 VAR ...
- 数据库原理(十 一)- 概念结构设计
数据库原理(十 一)- 概念结构设计 前言 概念结构的特点 E-R模型 概念结构设计 实体划分的原则 E-R的集成 借鉴 前言 将需求分析得到的用户需求抽象为信息结构(即概念模型)的过程就是概念结构设 ...
- 国外数据库风云五十载:老骥伏枥,新秀辈出
作者:姜洪军,来源:CSDN云计算 推荐:<中国数据库往事:国产数据库崛起史> 提醒:文末参考文献极具收藏价值 "在数据库技术方面,亚马逊落后甲骨文10至20年".20 ...
- 数据库风云五十载:老骥伏枥,新秀迭起!
作者 | 姜洪军 出品 | CSDN云计算(ID:CSDNcloud) "在数据库技术方面,亚马逊落后甲骨文10至20年".2018年10月23日,甲骨文(Oracle)创始人.执 ...
- ODBC、OLE连接各种数据库的连接字符串
简介 我们在使用数据库的时候,首先需要打开这个数据库. 我们可以找到集中类型的数据库,每个都使用不同的连接方式. 下面列举了一下主要的数据库的连接字符串 A:使用ODBC方式 1:dBASE连接字符串 ...
- SQL Relay开源的数据库池连接代理服务器
一.SQL Relay是什么? SQL Relay是一个开源的数据库池连接代理服务器 二.SQL Relay支持哪些数据库? * Oracle * MySQL * mSQL * PostgreSQL ...
最新文章
- 计算机原理说课教案,《 计算机组成原理 》 说课
- oracle快速导出1t数据,使用sqluldr2快速高效大批量导出Oracle数据
- UNITY 接讯飞语音过程总结
- BugkuCTF-Misc:Linux2
- redis实战之使用redis实现排行榜
- 战略模式并不意味着春天!
- ios html gif 显示,显示gif时出现巨大的内存使用Swift iOS
- 打印工资条怎么做到每个人都有表头明细_一分钟生成500人的工资条?还有2种方法?...
- Script component 用法
- 苹果Siri 部门前负责人加入微软人工智能部门
- 德力西双电源自动转换开关说明书_今日优品:南开区FLQ3-25双电源自动转换开关全国服务-老友网...
- [Linux] 头文件加载顺序
- 能力提升综合题单 Part 8.3.3 最近公共祖先
- 成人高考想学计算机专业,成人高考计算机类专业有哪些?
- UOS家庭版(21.2)安装SecureCRT(scrt-9.1.1-2638.ubuntu20-64.x86_64.deb)无法运行问题
- UDP网络基础知识简介
- 内存卡误删除文件怎么恢复
- 对创建的screen会话进行恢复时出现:There is no screen to be resumed matching XXX 解决办法
- Android Gradle 7.x新版本的依赖结构变化
- debian系统安装Google浏览器