数据库关联关系理解,最形象生动直接
2015-10-22 11:23
330 查看
添加测试表和一些测试数据。
----------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
----------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
相关文章推荐
- MySQL复制的工作流程
- mysql sql语句大全
- centos安装Redis
- Mysql 参数
- 将WPF中listview的数据导入到SQLITE(C#)
- 使用ADO读取数据库中的二进制文件
- ADO 访问sybase数据库
- 使用mongodb shard cluster构建高可用的系统架构
- [MSSQL]MSSQL 基础之善用Char类型
- 复制数据库时,出现表重复出现 2 次,一个表名首字母大写,一个全是小写
- 修改SQL-SERVER数据库表结构的SQL命令附sql命令行修改数据库
- Oracle 监听(Listener) 中 services 说明
- Ubuntu14 安装Oracle 11g
- SQLSERVER中遇到的SQL问题
- 批量删除redis key
- (2)通过脚手架自动生成controller和view ----代码先行/数据库先行
- Redis的复制流程
- Mysql检查列是否存在并新增、修改、删除列
- Mysql检查列是否存在并新增、修改、删除列
- Sqlerver_各类函数