亲自实验让你彻底理解表连接

1.表连接的根本条件是共同字段,也叫关联字段也叫冗余字段,有关联字段(冗余字段)才能将两张表的记录匹配起来嘛。

其中关联字段,也即形成了表之间的关系,即1对1,还是1对多,还是多对多。

这些表之间的关系,就是通过关联字段形成的1对1,还是1对多,还是多对多关系。

也正因为表通过关联字段,联系起来了。关联字段所在的几张表又形成了几对几的关系。也就造成了关联结果表,即关联后产生的表。会存在记录(行冗余问题)。

即,想一想,为什么将一对多拆成两张表?因为怕冗余记录太多嘛。

举个例子:table(uid,age,address),一个人是有很多个地址的。所以就要把uid和address单独隔离出来的。否则放在一张表里,就会出现这样的记录:

张三,18,深圳南山区1路1号

张三,18,深圳福田区x路x号

发现张三,18这个字段无故出现了多次,白费。所以为了考虑数据库容量,直接将uid addres字段拆出来。这就是见表第二范式。

结关系:表关联->关联字段->防止记录和字段冗余

表关系,

1对多,是为了防止记录的某些不相关字段冗余,所以字段出现1对多关系必须要建立两张表。

1对1,是因为两个不相关的领域,虽然放在一张表里也可以,也不会出现记录无关系字段额外冗余,但这样会形成一张宽表。涉及insert,更改记录操作时,会很麻烦。所以1对1也要建立两张表。

多对多,

表关联刚好对原来的表之间关系拆分进行了你想处理,所以表关联的结果必然是

2.表连接冗余字段问题:

表连接就是将两个表连起来,字段默认都会有。除非你select 指定你想要的字段。

查询语句:select * from t_test t1 left join t_test2 t2 on t1.uid = t2.uid;

因为select *,所以默认俩表的全部字段会显示出来。如下:

此时就会发现,进行表关联的字段(此处是uid),就会有两个。因为两张表能有联系,全是靠共同字段嘛,select  * 肯定会有两列相同的字段出来,所以这时候,你就需要手动指定显示哪个表的共同字段,否则迷惑性太强,俩字段显示出来。太难看了。

改正后的sql:select t1.*,t2.id,t2.address from t_test t1 left join t_test2 t2 on t1.uid = t2.uid;

显示某张表的全部字段:t1.*即可。

查询结果如下:,你看,就没有多余的公共字段了吧,因为你select 指定了显示哪些字段。

时间: 2024-10-11 05:22:46

亲自实验让你彻底理解表连接的相关文章

深入理解Oracle表(3):三大表连接方式详解之Nested loop join和 Sort merge join

深入理解Oracle表(3):三大表连接方式详解之Nested loop join和 Sort merge join 分类: Oracle 基础管理 Oracle SQL 开发2013-01-28 00:33 2536人阅读 评论(1) 收藏 举报 关系数据库技术的精髓就是通过关系表进行规范化的数据存储       并通过各种表连接技术和各种类型的索引技术来进行信息的检索和处理       这里Think愿意和大家一起来学习分享Oracle的三大表连接技术              在早期版本,

深入理解Oracle表(5):三大表连接方式详解之Hash Join的定义,原理,算法,成本,模式和位图...

Hash Join只能用于相等连接,且只能在CBO优化器模式下.相对于nested loop join,hash join更适合处理大型结果集       Hash Join的执行计划第1个是hash表(build table),第2个探查表(probe table),一般不叫内外表,nested loop才有内外表       Hash表也就是所谓的内表,探查表所谓的外表       两者的执行计划形如:       nested loop           outer table    

MySql数据库再学习——简述多表连接查询的自我理解

一:序 这几天在学习数据库部分,因为在学校听课也是比较迷糊,经过学习之后感觉现在思路比较清楚,对于多表连接查询操作有了一个新的认识. 二:假设 假设现在有两个表 :A ,B. 三:两表之间的连接方式 两个表的连接方式分为,内,外,交叉三种. 内连接的查询方式又分为隐式和显式两种. 外连接的查询方式又分为左,右两种. 交叉是将两个表的记录做乘积,因为得到的记录很大程度上没有直接联系,所以交叉连接查询基本没什么意义. 四:内连接 内连接的关键词:inner join...(inner可以省略) 隐式

数据库表的查询操作(实验二),数据库表查询实验

[实验目的]:了解SQL语言的使用,进一步理解关系运算,巩固数据库的基础知识.[实验要求]:掌握利用Select语句进行各种查询操作:单表查询.多表连接及查询.嵌套查询.集合查询等.[实验内容]一.单表查询1.简单查询打开查询分析器,根建立teacher表,并加入数据.从teacher表中分别检索出教师的所有信息,以及仅查询教工号.姓名和职称.语句如下: select * from teacher select tno, tname from teacher 如要查询时改变列标题的显示,则从te

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

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

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

Mysql 表连接查询

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

浅析表连接

表连接 表连接是一个很有意思的事情,报表中常用的就是JOIN和LEFT JOIN,可能大家也会看到INNER JOIN , LEFT OUTER JOIN等,它们的关系,请读者自己网上查阅,在这里我们要卖个关子. 对初学者来说,表连接是很容易迷糊的一点.容易混淆的原因是因为进行表连接时,经常会把关联字段和关联字段中存的数据混在一起说,容易给人误解. 还是第2节中的例子,我们知道,<人员主集>.'国籍'和<代码项>.'代码项内码'的数据是有关联的,一般在我们的系统中,'国籍'中的数据

关于hibernate 多实体(多表)连接查询映射到实体的讨论

前提表与实体信息: 在hibernate 查询中,我们经过遇到三种情况: 1.查询事个实体,如: select  b from TableB b; 返回的LIst 中封装的是 实体TableB的实例. 2.查询单个属性,如: select b.id from TableB b; hibernate 返回的List 中封装的是ojbect对象. 3.当查询多于一个属性且又不是整个实体时,如:select b.id,b.mes from TableB b;返回的List中封装的是Object[]数组