表连接

1.表连接
//>>> Ⅰ.不同数据表之间的连接
(1)内连接(inner join)
内连接组合两张表,并且基于两张表中的关联关系来连接它们。使用内连接需要指定表中哪些字段组成关联关系,并且需要指定基于什么条件进行连接。
内连接要求组成连接的两个表必须具有匹配的记录。(无法匹配NULL值的记录)
语法:
inner join table_name
on condition ;
举例: 检索所有的客户姓名为mike的客户的订单号及价格
SELECT FNumber ,FPrice FROM t_order
INNER JOIN t_customer
ON FCustomerId=t_customer.FId
WHERE t_customer.FName=‘mike‘;
注意:
在大多数数据库系统中,inner join 中的inner是可选的。inner join是默认的连接方式
为了避免列名的歧义,建议使用表连接的时候要显示字段所属的表。
(2)不等值连接
处理等值连接,还存在另一种不等值连接。在连接的条件中可以使用小于,大于,不等于等运算符,而且可以使用Like ,between and 等运算符,甚至可以使用函数。

如:需要检索价格小于每个客户年龄的5倍值的订单列表,那么就可以使用不等值连接:
SELECT t_order.`FNumber`,t_order.`FPrice`,t_order.`FCustomerId`
,t_customer.`FName`,t_customer.`FAge`
FROM t_order
NNER JOIN t_customer
ON t_order.`FPrice`<t_customer.`FAge`*5;
//>>>说明:
不等值连接产生大量的查询结果,因为它是对被连接的两张表做笛卡尔积运算。
 //>>>解决方案:
如果想查看客户对应的订单,那么就要在不等值连接后添加等值连接匹配条件
SELECT t_order.`FNumber`,t_order.`FPrice`,t_order.`FCustomerId`
,t_customer.`FName`,t_customer.`FAge`
FROM t_order
NNER JOIN t_customer
ON t_order.`FPrice`<t_customer.`FAge`*5
AND t_order.`FCustomerId`=t_customer.`FId`;---等值连接匹配条件清除重复
(3)交叉连接
与内连接比起来,交叉连接非常简单。因为它不存在on子句。
交叉连接会将涉及到的所有表中的所有记录都包含在结果集中。
1.隐式方式定义交叉连接 --->>只要在select 语句中的from语句后将要进行交叉连接的表名列出即可。(可以使用表的别名)
举例:将t_customer表和t_order表做交叉连接
SELECT * FROM t_order , t_customer
2.显示方式定义交叉连接--->>>使用cross join 关键字,语法类似inner join
SELECT t_order.`FNumber`,t_order.`FPrice`,t_order.`FCustomerId`
,t_customer.`FName`,t_customer.`FAge`
FROM t_order
CROSS JOIN t_customer
注意: cross join的声明方式只能被mysql ,MSSQLServer ,oracle所支持,db2不支持。
但隐式交叉连接所有数据库都支持。

(4)自连接 //>>>Ⅱ.同一张表直接的连接
自连接不是独立于前几种连接方式的。它只是那几种连接方式中的一种特例。也就是说,交叉连接,内连接,不等值连接用在同一张表就称为自连接。
举例:需要检索与另外一个订单的订单类型一样的所有订单的列表。
错误写法1:
SELECT FNumber ,FPrice ,FTypeId
FROM t_order
WHERE FTypeId=FTypeId;
错误分析:这里where语句条件永远为真,因为同行的相同列总是等于自己。因此结果集中将包含表中的所有记录。
解决方案: 假象存在另一个t_order表与t_order表完全相同的表,然后我们就可以在这两张表中进行任意的连接了。(需区分这两张表,使用表的别名)
//这里使用inner join进行连接如下: --->>>仍然存在一点问题???
SELECT o1.FNumber ,o1.FPrice ,o1.FTypeId,
o2.FNumber ,o2.FPrice ,o2.FTypeId
FROM t_order o1
INNER JOIN t_order o2
ON o1.FTypeId=o2.FTypeId;
//为t_order表取了两个别名o1,o2;
问题:存在‘A匹配B,B匹配A’的问题。如自己与自己的订单类型必定相同
解决方案:我们这里真正要查询的是具有相同的FTypedId字段值的两个不同的订单,因此需加个条件:and o1.FId=o2.FId;
最终正确的sql语句是:
SELECT o1.FNumber ,o1.FPrice ,o1.FTypeId,
o2.FNumber AS O2_FNumber ,o2.FPrice AS O2_FPrice ,o2.FTypeId AS o2_FTypeId
FROM t_order o1
INNER JOIN t_order o2
ON o1.FTypeId=o2.FTypeId
AND o1.FId<>o2.FId;
(5)外部连接--->主要用来解决空值匹配问题
语法与内部连接几乎一致,主要区别就是对空值的处理。。外部连接不需要两个表具有匹配记录,这样就可以指定给某个表中的记录总是放到结果集中。
根据哪个表的记录总是放在结果集中,外部连接分为三种类型:
类型一:右外部连接(RIGHT OUTER JOIN)
类型二:左外部连接(LEFT OUTER JOIN)
类型三:全外连接(FULL OUTER JOIN)
三者共同点: 都返回符合连接条件的数据,这一点和内部连接是一样的。
不同点:
◆左外部连接还返回左表中不符合条件是数据
◆右外部连接还返回右表中不符合条件是数据
◆全外部连接将返回左表中和右表中不符合条件的数据,是左外部连接和右外部连接的集合。
注意:这里的左表右表是相对join关键字来说的,在join关键字左侧的称为左表,右侧称为右表。
如:
SELECT o1.FNumber ,o1.FPrice ,o1.FTypeId,
o2.FNumber AS O2_FNumber ,o2.FPrice AS O2_FPrice ,o2.FTypeId AS o2_FTypeId
FROM t_order o1
INNER JOIN t_order o2
ON o1.FTypeId=o2.FTypeId
AND o1.FId<>o2.FId;
左表:o1
右表:o2

时间: 2024-08-09 02:19:17

表连接的相关文章

SQL Server三种表连接原理

http://msdn.microsoft.com/zh-cn/library/dn144699.aspx 简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge Join,Hash Join这三种物理连接中的一种.理解这三种物理连接是理解在表连接时解决性能问题的基础,下面我来对这三种连接的原理,适用场景进行描述. 嵌套循环连接(Nested Loop J

每天一点数据库之-----Day 9 表连接

每天一点数据库之-----Day 9 表连接 ----转载请注明出处:coder-pig 本节引言: 前面我们学习的都是针对一个表来进行操作的,上一节虽然学了UNION这个可以操作多个表 的关键字,但是又有两个限制(查询字段数目与数据类型要相同),本节就来学习通过表连接 来操作多个表!而表连接又有四种: 内连接,外连接,交叉连接与自连接,那么接下来开始本节学习! 数据准备: 在开始学习前,我们先准备一些数据,建三个表:T_Stu,T_Class,T_Dorm 建T_Stu表: CREATE TA

表连接查询与where后使用子查询的性能分析。

子查询就是在一条查询语句中还有其它的查询语句,主查询得到的结果依赖于子查询的结果. 子查询的子语句可以在一条sql语句的FROM,JOIN,和WHERE后面,本文主要针对在WHERE后面使用子查询与表连接查询的性能做出一点分析. 对于表连接查询和子查询性能的讨论众说纷纭,普遍认为的是表连接查询的性能要高于子查询.本文将从实验的角度,对这两种查询的性能做出验证,并就实验结果分析两种查询手段的执行流程对性能的影响. 首先准备两张表 1,访问日志表mm_log有150829条记录(相关sql文件已放在

Mysql 表连接查询

1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行.       2.外联接.外联接可以是左向外联接.右向外联接或完整外部联接.     在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:     1)LEFT  JOIN或LEFT OUTER JOIN     左向外联接的结果集包括  LEF

Mysql表连接

当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能. 从大类上分,表连接分为内连接和外连接,它们之间的最主要区别是內连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录.我们最常用的是内连接. 例如:查询出所有雇员的名字和所在部门名称,因为雇员名称和部门分别存放在表emp 和dept 中,因此,需要使用表连接来进行查询: select ename,deptname from emp,dept where emp.deptno=dept.deptno; ename是表emp

oracle 表连接 - hash join 哈希连接

一. hash 连接(哈希连接)原理 指的是两个表连接时, 先利用两表中记录较少的表在内存中建立 hash 表, 然后扫描记录较多的表并探測 hash 表, 找出与 hash 表相匹配的行来得到结果集的表连接方法. 哈希连接仅仅能用于等值连接条件(=). 如果以下的 sql 语句中表 T1 和 T2 的连接方式是哈希连接, T1 是驱动表 select * from T1, T2 where T1.id = T2.id and T1.name = 'David'; oracle 运行过程例如以下

MySQL多表查询之外键、表连接、子查询、索引

一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两张表:部门表(dept).员工表(emp).Id=Dept_id,而Dept_id就是员工表中的外键:因为员工表中的员工需要知道自己属于哪个部门,就可以通过外键Dep

表连接Join

--表连接Join--使用子查询select StudentNo,StudentName,(select classname from Classes where ClassId=Student.ClassId) from Student--使用from多表的方式select Student.StudentNo,Student.StudentName,Classes.classnamefrom Student,Classeswhere student.ClassId=classes.ClassI

Hadoop阅读笔记(三)——深入MapReduce排序和单表连接

继上篇了解了使用MapReduce计算平均数以及去重后,我们再来一探MapReduce在排序以及单表关联上的处理方法.在MapReduce系列的第一篇就有说过,MapReduce不仅是一种分布式的计算方法,更是一种解决问题的新思维.新思路.将原先看似可以一条龙似的处理一刀切成两端,一端是Map.一端是Reduce,Map负责分,Reduce负责合. 1.MapReduce排序 问题模型: 给出多个数据文件输入如: sortfile1.txt 11 13 15 17 19 21 23 25 27

mysql表连接,子查询以及if判断

创建表: CREATE TABLE emp ( ename varchar(10) DEFAULT NULL, hiredate date DEFAULT NULL, sal decimal(10,2) DEFAULT NULL, deptno int(2) DEFAULT NULL, age int(3) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 CREATE TABLE dept ( deptno int(2) DEFAULT NUL