内连接与外连接的区别是什么?_数据库外连接和内连接的区别
有两个表A和表B。表A结构如下:Aid:int;标识种子,主键,自增IDAname:varchar 数据情况,即用select * from A出来的记录情况如下图1所示: 图1:A表数据 表B结构如下:Bid:int;标识种子,主键,自增IDBnameid:int 数据情况,即用select * from B出来的记录情况如下图2所示: 图2:B表数据 为了把Bid和Aid加以区分,不让大家有误解,所以把Bid的起始种子设置为100。有SQL基本知识的人都知道,两个表要做连接,就必须有个连接字段,从上表中的数据可以看出,在A表中的Aid和B表中的Bnameid就是两个连接字段。下图3说明了连接的所有记录集之间的关系: 图3:连接关系图 现在我们对内连接和外连接一一讲解。1.内连接:利用内连接可获取两表的公共部分的记录,即图3的记录集C语句如下:Select * from A JOIN B ON A.Aid=B.Bnameid运行结果如下图4所示: 图4:内连接数据 其实select * from A,B where A.Aid=B.Bnameid与Select * from A JOIN B ON A.Aid=B.Bnameid的运行结果是一样的。2.外连接:外连接分为两种,一种是左连接(Left JOIN)和右连接(Right JOIN) (1)左连接(Left JOIN):即图3公共部分记录集C+表A记录集A1。 语句如下:select * from A Left JOIN B ON A.Aid=B.Bnameid 运行结果如下图5所示: 图5:左连接数据 说明: 在语句中,A在B的左边,并且是Left Join,所以其运算方式为:A左连接B的记录=图3公共部分记录集C+表A记录集A1 在图3中即记录集C中的存在的Aid为:2 3 6 7 8 图1中即表A所有记录集A中存在的Aid为:1 2 3 4 5 6 7 8 9 表A记录集A1中存在的Aid=(图1中即A表中所有Aid)-(图3中即记录集C中存在的Aid),最终得出为:1 4 5 9 由此得出图5中A左连接B的记录=图3公共部分记录集C+表A记录集A1, 最终得出的结果图5中可以看出Bnameid及Bid非NULL的记录都为图3公共部分记录集C中的记录;Bnameid及Bid为NULL的Aid为1 4 5 9的四笔记录就是表A记录集A1中存在的Aid。 (2)右连接(Right JOIN):即图3公共部分记录集C+表B记录集B1。 语句如下:select * from A Right JOIN B ON A.Aid=B.Bnameid 运行结果如下图6所示: 图6:右连接数据 说明: 在语句中,A在B的左边,并且是Right Join,所以其运算方式为:A右连接B的记录=图3公共部分记录集C+表B记录集B1 在图3中即记录集C中的存在的Aid为:2 3 6 7 8 图2中即表B所有记录集B中存在的Bnameid为:2 3 6 7 8 11 表B记录集B1中存在的Bnameid=(图2中即B表中所有Bnameid)-(图3中即记录集C中存在的Aid),最终得出为:11 由此得出图6中A右连接B的记录=图3公共部分记录集C+表B记录集B1, 最终得出的结果图6中可以看出Aid及Aname非NULL的记录都为图3公共部分记录集C中的记录;Aid及Aname为NULL的Aid为11的记录就是表B记录集B1中存在的Bnameid。 总结: 通过上面的运算解说,相信很多人已经想到,上面的情况(包括图3的关系图)说明的都只是A在B的左边的情况,以下语句B在A的右边的又会出现什么情况呢??select * from B Left JOIN A ON A.Aid=B.Bnameidselect * from B Right JOIN A ON A.Aid=B.Bnameid 其实对图3左右翻转一下就可以得出以下结论:select * from B Left JOIN A ON A.Aid=B.Bnameid和select * from A Right JOIN B ON A.Aid=B.Bnameid所得出的记录集是一样的而select * from B Right JOIN A ON A.Aid=B.Bnameid和select * from A Left JOIN B ON A.Aid=B.Bnameid所得出的记录集也是一样的。 |
---|
你是要弄清楚区别在什么地方还是单纯想要文字说明
文字说明的楼上说了一大堆了,不说了。
弄个例题,直观一点。两个表:
—表stu
id name
1, Jack
2, Tom
3, Kity
4, nono
—表exam
id grade
1, 56
2, 76
11, 89
内连接 (显示两表id匹配的)
select stu.id,exam.id,stu.name, exam.grade from stu inner join exam on stu.id=exam.id
stu.id exam.id name grade
——————————–
1 1 Jack 56
2 2 Tom 76
左连接(显示join 左边的表的所有数据,exam只有两条记录,所以stu.id,grade 都用NULL 显示)
select stu.id,exam.id,stu.name, exam.grade from stu left join exam on stu.id=exam.id
1 1 Jack 56
2 2 Tom 76
3 NULL Kity NULL
4 NULL nono NULL
右连接(与作连接相反,显示join右边表的所有数据)
select stu.id,exam.id,stu.name, exam.grade from stu right join exam on stu.id=exam.id
1 1 Jack 56
2 2 Tom 76
NULL 11 NULL 89
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/184264.html原文链接:https://javaforall.cn
相关文章
- JavaEE(Mybatis)—— 环境搭配、数据库连接、程序运行
- dtu连接mysql_Azure SQL 数据库中的DTU和eDTU是什么
- JSP连接DB2数据库详解编程语言
- MySQL Variables slow_query_log_file 数据库 参数变量解释及正确配置使用
- MySQL 连接数据库慢:解决方案探索(mysql连接数据库慢)
- 数据库C语言连接Oracle本地数据库的实践(c连接本地oracle)
- 掌握Oracle数据库连接字符串的秘密(oracle连接字符串)
- 初探Oracle数据库触发器类型(oracle触发器类型)
- 如何正确配置MySQL数据库连接标识?(mysql数据库连接标识)
- Oracle轻松创建监听服务,管理数据库连接(oracle创建监听服务)
- 快速使用JDBC连接SQL Server数据库(jdbc连接sqlserver数据库)
- .1使用MySQL ODBC 5.1构建数据库连接(mysqlodbc5)
- 深入理解SQL Server数据库汉化(汉化sqlserver)
- MSSQL空间管理助力数据库优化(mssql空间管理)
- 利用 mssql 连接数据库的操作步骤(mssql 的连接)
- 如何使用Redis数据库快速启动(怎么打开redis数据库)
- 使用C语言连接Oracle数据库一个实践案例(c语言对接oracle)
- 使用CMD连接Mysql数据库(cmd 链接mysql)
- 使用log4j连接Oracle数据库(log4j连oracle)
- AIX7系统下安装Oracle数据库的指南(aix7安装oracle)
- ef构建与Oracle数据库的无缝连接(ef连接oracle总卡)
- 利用DMP工具快速导入Oracle数据库(dmp oracle导入)
- Cpp实现MySQL数据库连接体验(Cpp连接mysql)
- SSDB用于替代Redis的新一代高性能KV数据库(ssdb替代redis)
- MySQL 上一步是什么25字小百科带你了解 MySQL 数据库的启动和连接过程(mysql 上一步)
- 基于Redis的远程连接数据库技术(redis远程连接数据库)
- Java连接MYSQL数据库的实现步骤