数据库几种表关联的汇总

添加测试表和一些测试数据。

----------t1-----------

CREATE TABLE `t1` (

`id` int(20) NOT NULL default ‘0‘,

`field01` varchar(100) default NULL,

`field02` varchar(100) default NULL,

PRIMARY KEY  (`id`)

)

数据:

----------t2-----------

CREATE TABLE `t2` (
  `id` int(20) NOT NULL default ‘0‘,
  `field01` varchar(100) default NULL,
  `field03` varchar(100) default NULL,
  `field04` varchar(100) default NULL,
  PRIMARY KEY  (`id`)
)

数据:

1:NATURAL JOIN(自然连接)  

两张表通过NATURAL JOIN连接的时候,相当于有个隐含的WHERE子句,对两张表中同名的对应列相比较看是否相等。

测试:SELECT * FROM t1 NATURAL JOIN t2

相当于:select * from t1, t2 where t1.id = t2.id and t1.field01 = t2.field01

采用自然连接的相同列合并成一列

结果:

2:CROSS JOIN(创建笛卡尔积)  

对两张表通过交叉联合产生第三张返回结果集的表。相当于普通的连接。如下返回6行=2*3

测试:select * from t1 cross join t2;

结果:

3:INNER JOIN(内连接)  

内连接就相当于普通的CROSS JOIN,只是格式不一样,INNER JOIN在后面有一个ON子句(相当于WHERE)的搜索条件,用于过滤返回的行。

测试:select * from t1 inner join t2;

结果:与cross一样

测试:SELECT * FROM t1 INNER JOIN t2 WHERE t1.id = t2.id

等价于:SELECT * FROM t1 , t2 WHERE t1.id = t2.id

结果:

4:OUTER JOIN (外连接)  

select * from t1 outer join t2 on (t1.id=t2.id)

outer join告诉DBMS生成结果表,在此表中不仅带有相关(t1.id=t1.id)行对,而且还有来自两个源表中任一表的不匹配的行。

就是说没匹配到的也要显示出来,这里有left outer join、right outer join、full outer join(mysql要通过另外的方式实现)。

LEFT OUTER JOIN(左连接)

测试:select * from t1 left outer join t2 on (t1.id=t2.id)

结果:

 RIGHT OUTER JOIN(右连接)

测试:select * from t1 right outer join t2 on (t1.id=t2.id)

结果:

FULL OUTER JOIN(全连接),Oracel测试,Mysql不支持;

FULL OUTER JOIN 返回组合了LEFT OUTER JOIN 和RIGHT OUTER JOIN结果的表

测试:select * from t1 full join t2 on (t1.id=t2.id);

结果:

特别注意:

左连接与左外连接是一样的,其他类似,只是为了保证语法一致。

LEFT JOIN = LEFT OUTER JOIN

RIGHT JOIN = RIGHT OUTER JOIN

FULL JOIN = FULL OUTER JOIN

参考:

时间: 2024-10-06 12:25:57

数据库几种表关联的汇总的相关文章

003thinkphp 数据库查询及表关联

$user = M("sysUser");$list=$user->find();echo $user->getLastSql();dump($list);$user = M("sysDept");$list=$user->find();echo $user->getLastSql();dump($list);查询结果:SELECT * FROM `tp_sys_user` LIMIT 1 array(1) { [0] => array

Android数据库高手秘籍(四)——使用LitePal建立表关联

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/39207945 目前我们已经对LitePal的用法有了一定了解,学会了使用LitePal来创建表和升级表的方式,那么今天就让我们一起继续进阶,探究一下如何使用LitePal来建立表与表之间的关联关系.还没有看过前一篇文章的朋友建议先去参考 Android数据库高手秘籍(三)--使用LitePal升级表 . LitePal的项目地址是:https://github.com/LiteP

数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案

作为一种数据存储层面上的水平伸缩解决方案,数据库Sharding技术由来已久,很多海量数据系统在其发展演进的历程中都曾经历过分库分表的Sharding改造阶段.简单地说,Sharding就是将原来单一数据库按照一定的规则进行切分,把数据分散到多台物理机(我们称之为Shard)上存储,从而突破单机限制,使系统能以Scale-Out的方式应对不断上涨的海量数据,但是这种切分对上层应用来说是透明的,多个物理上分布的数据库在逻辑上依然是一个库.实现Sharding需要解决一系列关键的技术问题,这些问题主

Oracle 数据库(oracle Database)Select 多表关联查询方式

Oracle数据库中Select语句语法及介绍 SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名2>[,…] [WHERE <筛选择条件表达式>] [GROUP BY <分组表达式> [HAVING<分组条件表达式>]] [ORDER BY <字段>[ASC | DESC]] 语句说明: []方括号为可选项 [GROUP BY <分组表达式&g

【数据库】Mysql中主键的几种表设计组合的实际应用效果

写在前面 前前后后忙忙碌碌,度过了新工作的三个月.博客许久未新,似乎对忙碌没有一点点防备.总结下来三个月不断的磨砺自己,努力从独乐乐转变到众乐乐,体会到不一样的是,连办公室的新玩意都能引起莫名的兴趣了,作为一只忙碌的 “猿” 倒不知正常与否. 咳咳, 正题, 今天要写一篇关于mysql的主键.索引的文章,mysql的研究博主进行还不够深入,今天讨论的主题主要是,主键对增删改查的具体影响是什么? 博主将用具体的实验说明. 如果你不了解主键,你可以先看看下面的小节,否则你可以直接跳转到实验步骤 了解

MySQL表关联的几种常用方式

工作中我们经常会使用表与表关联来查询数据,如果对join 不熟悉,可能会得到我们不想要的节过,这里就来介绍下join的几种常用方法:建表及插入数据,CREATE TABLE school (sch_id int(11) NOT NULL AUTO_INCREMENT,sch_name varchar(50) NOT NULL,sch_addr varchar(100) DEFAULT NULL,PRIMARY KEY (sch_id)) ENGINE=InnoDB AUTO_INCREMENT=

数据库MySQL中关于“多表关联更新”的那些事

在常见的sql中,我们经常在查询中进行多表关联查询,用的比较熟练.今天在开发中遇到一个实际业务场景是多表关联更新,一时不知所措.本着多学习的态度,没有直接写java代码去实现,终于把多表关联更新的sql弄清楚了.下面将实际业务场景进行简化,分别有person表和information表,最终目的是将 information表中的年龄更新到person表中的每个人的年龄.分别写了几个sql demo来把多表更新的知识理解透彻. 首先,在更新前,person表和information表分别如下: i

Oracle数据库,join多表关联方式、union结果集合并

join on :   多表关联 内连接 :与其他表连接 from 表1 t join 表2 s on t.字段1 =s.字段2 join 表3 n on n.字段3=t.字段1 或 from 表1 a ,表2 b,表3c where a.字段=b.字段 自连接: 与自身连接 from 表1 t join 表1 s on t.字段1 =s.字段1 s.字段1=t.字段1 外连接:左/右连接 left join on 左连接 保证左边表的数据全部显示 right join on 右连接 保证右边表

oracle数据库【表复制】insert into select from跟create table as select * from 两种表复制语句区别

create table  as select * from和insert into select from两种表复制语句区别 [sql] view plain copy create table targer_table as select * from source_table insert into target_table(column1,column2) select column1,column2 from source_table 以上两句都是将源表source_table的记录插