通过具体的SQL实例,通俗易懂的搞清楚笛卡尔积、内连接、外连接、自然连接的区别

13 篇文章 0 订阅
订阅专栏
10 篇文章 0 订阅
订阅专栏
6 篇文章 0 订阅
订阅专栏

前言

通过具体的SQL实例,通俗易懂的搞清楚内连接、外连接、自然连接的区别,本例采用的mysql5.7版本,依次来验证软考中的自然连接考题的正确性!

×是笛卡尔积的符号,π是投影的符号,σ是选择的符号,是自然连接

建表及填数据

CREATE TABLE `r` (
  `a` bigint(255) DEFAULT NULL,
  `b` bigint(255) DEFAULT NULL,
  `c` bigint(255) DEFAULT NULL,
  `d` bigint(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `test`.`r`(`a`, `b`, `c`, `d`) VALUES (6, 3, 1,5);
INSERT INTO `test`.`r`(`a`, `b`, `c`, `d`) VALUES (6, 1, 5,1);
INSERT INTO `test`.`r`(`a`, `b`, `c`, `d`) VALUES (6, 5, 7,4);
INSERT INTO `test`.`r`(`a`, `b`, `c`, `d`) VALUES (6, 3, 7,4);


CREATE TABLE `s` (
  `c` bigint(255) DEFAULT NULL,
  `d` bigint(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `test`.`s`(`c`, `d`) VALUES (1,5);
INSERT INTO `test`.`s`(`c`, `d`) VALUES (7,4);

笛卡尔积

产生的结果最多,排列出所有可能组合,无null,连接属性ID出现2次。

select * from `test`.`r`,`test`.`s`

内连接

内连接:查询出来的结果肯定会满足所有的条件
select  columns from table1 [inner] join table2 on table1.column = table2.cloumn;

如具体的SQL实例:

select  * from `test`.`r` inner join `test`.`s` on `test`.`r`.`c` = `test`.`s`.`c`;

外连接

左/右外连接

左/右外连接:查询出来的结果,存在满足条件的可能

(左连接)(右连接)
select columns from table1 left/right join table2 on table1.col = table2.col;

如具体的左外连接SQL实例:

select * from `test`.`r` left join `test`.`s` on `test`.`r`.`c` = `test`.`s`.`c`;

全外链接

全外链接:MySQL不支持,Oracle支持
select columns from table1 full join table2 on table1.col = table2.col;

自然连接

自然连接:两张表中的名称和类型完全一致的列进行内连接

通俗来讲:根据数量最少的为准!
select columns from table1 natural join table2;

select * from `test`.`r` natural join `test`.`s`;

软考案例

若关系R、S如下图所示,则关系R与S进行自然连接运算后的元组个数和属性列数分别为(7);关系代数表达式π1,43=6(R×S))与关系代数表达式(8)等价。

2015年(7)

A.66           

B.46

C.36

D.3和4

2015年(8)

A.πA,DC=D(R×S))                   

B.πA,R,D(σS.C=R.D(R×S))

C.πA,R,D(σR.C=S.D(R×S))         

D.πA,R,D(σS.C=S.D(R×S))

解析

“自然连接”和“内连接”的区别,在于对“重合的相同的部分”处理方式不同

  • natrual join 自然连接"的处理方式:既然重复了,就丢掉一份,好比distinct(优胜劣汰,自然法则
  • inner join 内连接”的处理方式:虽然重复,但两份都保留

关于连接的几何表示图:

 

SQL练习-select连接查询与嵌套查询
12-14
【例3.49】 查询学生的选修课程情况 首先引入知识点:连接查询其实就是对于多个表进行笛卡尔积。 select Student.*,Sc.* from TEST.Student,TEST.SC where Student.Sno=Sc.Sno 上面的例子是等值查询,where的条件是‘=’ ,也可以是非等值查询将条件改为‘!=’即可。 【例3.50】 用自然连接完成上述的【3.49】 首先引入 自然连接自然连接:类似于关系代数的自然连接,不在赘述 select Student.Sno ,Sname ,Ssex,Sage,Cno,Grade from TEST.Student ,TEst
sql 自然连接内连接外连接、交叉连接
TangLinCSDN的专栏
05-30 1万+
一、自然连接(natural join)     自然连接(Natural join)是一种特殊的等值连接,要求两个关系表中进行比较的属性组必须是名称相同的属性组,并且在结果中把重复的属性列去掉(即:留下名称相同的属性组中的其中一组)。 表A Aname Bid salary Getz 1 3000
oracle执行计划九
csx64326的博客
06-17 254
内存中时,这种查找方法更为有用。这种连接方法也有NL连接中所谓的驱动表的概念,被构建为hash table与bitmap的表为驱动表,当被构建的hash table与bitmap能被容纳在内存中时,这种连接方式的效率极高。 ...
数据库考点
weixin_41683726的博客
08-26 508
中级软件设计师考试---数据库
sql笛卡尔积自然连接
最新发布
Golemon的博客
06-25 1690
特殊的等值连接,要求多个表有相同的属性字段,条件为相同的属性字段值相等,且再将表中重复的属性字段去掉,称为自然连接SQL中的笛卡尔积可以与SQL内连接相互转化。笛卡尔积加查询条件等价于内连接查询。结果集的行是表1的行数乘表2的行数(2x3)结果集的列是表1的列加表2的列(3+4)可以简单理解为两个集合的乘积。
区分笛卡儿积,自然连接,等值连接内连接外连接—左,右
qq_45974279的博客
05-26 5460
1.笛卡尔积 笛卡儿积,不用多,介绍象征着返回所有的情况。 2.自然连接 自然连接是在广义笛卡尔积R×S中选出同名属性上符合相等条件元组,再进行投影,去掉重复的同名属性,组成新的关系。自然连接是一种特殊的等值链接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。 比如这个通俗来说: 看R和S,两者第一行,都有个B,那么第一行可以很自然地接上,根据定义,把重复的B留一个就行;再第二行,两者共有一个1,也同理衔接;再看第三行,R与S二者无相同项,无法自然连接。最后连接在一起就
超级通俗易懂自然连接
热门推荐
LinXiaoTaoZi的博客
09-10 4万+
突然遇到了就记录下来 原题:求两个关系RA和RB的自然连接,书本上的原题是这样的(有点歪,将就一下) 解题思路: 1、首先找到RA 和RB 中相同的列,是不是只有A和C两列是他们都有的; 2、我们就只看两个关系式中的A列和C列所在的行; 3、从RA开始看,RA的A,C两列所在第一行值是 ac。于是我们去RB中找到A,C两列同样值为ac的行; 4、我们发现RB中的第一行A,C列的值和RA中第一行ac的值一样。所以需要将他们连接起来就是: a b c a c d。但是,需要做去重...
内连接外连接自然连接 简单的SQL语句总结
zaoanmiao的博客
03-27 1万+
内连接:查询出来的结果肯定会满足所有的条件    select  columns from table1 [inner] join table2 on table1.column = table2.cloumn;左/右外连接:查询出来的结果存在不满足条件的可能    select columns from table1 left/right join table2 on table1.col = ...
9.3.2 自然连接(NATURAL JOIN)
我的博客
06-01 4942
9.3.2  自然连接(NATURAL JOIN) 自然连接(NATURAL JOIN)是一种特殊的等价连接,它将表中具有相同名称的列自动进行记录匹配。自然连接不必指定任何同等连接条件。9.9给出了典型的自然连接示意。    9.9  自然连接 自然连接自动判断相同名称的列,而后形成匹配。缺点是,虽然可以指定查询结果
mysql学习笔记6)查询结果的去重、连接查询(笛卡尔积现象)
qq_43791665的博客
04-17 846
1、关于查询结果的去重 select distinct job from emp;//distinct 关键字去除重复记录 select ename,distinct job from emp;//error distinct 只能出现在所有字段的最前面 统计岗位的数量 select count(distinct job) from emp; 2、连接查询 什么是连接查询 在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果 在实际开发中,一
数据库:笛卡尔积内连接、左连接、右连接
12-14
笛卡尔积SQL中的实现方式既是交叉连接(Cross Join)。所有连接方式都会先生成临时笛卡尔积表,笛卡尔积是关系代数里的一个概念,表示两个表中的每一行数据任意组合,下中两个表连接即为笛卡尔积(交叉连接) 内连接...
Mysql中的内连接,外连接实例详解
01-19
 交叉连接: 生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配  举个例子吧。 表A id name 1 张 2 李 3 王 表B id address A_id 1
SQL语句的并集UNION 交集JOIN(内连接外连接)等介绍
01-19
1. a. 并集UNION SELECT column1, column2 FROM table1 UNION SELECT column1, column2 FROM table2 b. 交集JOIN SELECT * FROM table1 AS a ... 笛卡尔积 SELECT * FROM table1 CROSS JOIN table2 与 SELECT * FROM ta
SQL 四种连接-左外连接、右外连接内连接全连接详解
09-09
主要介绍了SQL 四种连接-左外连接、右外连接内连接全连接详解的相关资料,需要的朋友可以参考下
二、MySQL连接查询学习笔记(多表连接查询:内连接外连接,交叉连接详解
12-14
MySQL连接查询(多表连接查询:内连接外连接,交叉连接详解) 6:多表连接查询 笛卡尔乘积:如果连接条件省略或无效则会出现 解决办法:添加上连接条件 连接查询的分类: 1.按年代分类: 1)sql 92标准:仅仅...
mysql,及postgresqlSQL语句优化和大表优化解决方案
阿啄debugIT
02-04 4539
前言 当单表记录数过大时,增删改查性能都会急剧下降,可能原因:没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 、I/O吞吐量小,形成了瓶颈效应、没有创建计算列导致查询不优化、内存不足、网络速度慢 、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 、sp_lock,sp_who,活动的用户查看,原因是...
后台报com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failu问题的解决方案
阿啄debugIT
06-19 4281
问题: 今早,发现昨天部署的JAVA-WEB服务,不正常启动了,于是查看后台日志,发现 11:07:05.358 [Druid-ConnectionPool-Create-1102883776] ERROR com.alibaba.druid.pool.DruidDataSource - create connection holder error com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link f
JAVA程序实现mysql定时导出和导入库程序
阿啄debugIT
02-06 1851
前言 首先,用的环境是MYSQL5和JDK1.6。通过JDK所带的TIME类来进行定时定点的定时器,在通过JAVA链接数据库导出数据库的脚本。 BeiFen.java (数据库导入导出程序) public class BeiFen extends TimerTask { public voidrun() { BeiFen.main("数据库"); } ...
SQL连接中的笛卡尔积
06-10
SQL连接中,如果不加限制条件,可能会出现笛卡尔积的情况。笛卡尔积是指两个表中的每一行都与另一个表中的每一行匹配,最终结果会返回所有可能的匹配行。如果没有合适的限制条件,笛卡尔积会导致查询结果数量急剧增加,甚至造成数据库崩溃。 例如,我们有一个员工表,其中包含员工ID、姓名、部门ID等字段,我们使用自连接查询每个员工所在的部门以及该部门的所有员工: ``` SELECT e.姓名, d.部门名称 FROM 员工表 e, 员工表 d WHERE e.部门ID = d.部门ID; ``` 这条SQL语句中,我们使用了员工表的两个别名e和d,通过e.部门ID=d.部门ID来实现自连接。但是,由于没有限制条件,查询结果会返回所有员工和所有部门之间的匹配关系,导致结果数量大大增加,甚至可能造成数据库崩溃。 为了避免出现笛卡尔积,在自连接中需要加入合适的限制条件,例如加入员工ID不相等的限制条件,避免与自己匹配: ``` SELECT e.姓名, d.部门名称 FROM 员工表 e, 员工表 d WHERE e.部门ID = d.部门ID AND e.员工ID != d.员工ID; ``` 这样,就可以避免出现笛卡尔积,保证查询结果的正确性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • springboot利用ThreadPoolTaskExecutor多线程批量插入百万级数据 25041
  • 采用KubeSphere的kk,部署安装多节点服务的kubernetes-v1.18.6和kubesphere-v3.0.0的踩坑过程记录,及反思 9136
  • 详细比较StringRedisTemplate和RedisTemplate的区别及使用方法,及解决融合使用方法 6893
  • Tomcat 服务器没有启用 httpHeaderSecurity 功能的解决方案 6761
  • ssh-keygen产生公钥与私钥对,及密钥分发,ssh远程执行常用命令方法,和如何防止SSH登录入侵或被破解 6380

分类专栏

  • 研读 51篇
  • 算法 6篇
  • 解决方案 80篇
  • 考试 6篇
  • 笔记 11篇
  • liunx 45篇
  • 安装配置 31篇
  • 调优 18篇
  • 解决openssl 2篇
  • 离线部署 2篇
  • 搭建 21篇
  • Java 107篇
  • api接口 2篇
  • java自动生成 4篇
  • spring 15篇
  • 爬虫jsoup 3篇
  • springboot 29篇
  • jdk及调优 5篇
  • java代码工具类 6篇
  • mq 5篇
  • RabbitMQ 2篇
  • 脚本 12篇
  • shell 19篇
  • perl5 1篇
  • 工具 27篇
  • ftp 3篇
  • nginx 9篇
  • openstack 5篇
  • k8s 8篇
  • docker 21篇
  • Dockerfile 3篇
  • 权限 5篇
  • shiro 6篇
  • jwt认证 2篇
  • 数据库 5篇
  • oracle 6篇
  • Postgres 11篇
  • 跨域 2篇
  • sql综合解决方案 10篇
  • mysql 13篇
  • 微服务 4篇
  • Spring Cloud 5篇
  • MyBatis 4篇
  • python 14篇
  • git 9篇
  • maven 4篇
  • CICD持续集成 3篇
  • 大数据 13篇
  • hive 1篇
  • HBASE 2篇
  • cdh 8篇
  • mapreduce 3篇
  • hdfs 3篇
  • spark 17篇
  • hadoop 12篇
  • impala 2篇
  • Spark sql HiveContext 1篇
  • rdd 1篇
  • window 1篇
  • 合规修复 2篇
  • redis 14篇
  • 机器学习 3篇
  • 源码解读 11篇
  • 视频 1篇
  • 分布式集群 6篇
  • 网格计算 1篇
  • 前端框架js及8类动作请求 3篇
  • 事务控制 2篇
  • npm 1篇
  • DFA算法 1篇
  • 代码测试工具如jmeter 2篇
  • netty 1篇
  • tomcat 4篇
  • word execl及编程语言对其操作 5篇
  • tmux与screen多个会话的界面终端 2篇
  • tcpudp 3篇
  • KPI 1篇
  • RTMP流媒体 1篇
  • go 1篇
  • pyspark 1篇
  • ElasticSearch 1篇
  • Rancher 2篇
  • ETL工具 4篇
  • kafka flume 14篇
  • Kettle 5篇
  • TIG监控 1篇
  • Ehcache 1篇
  • Velocity 1篇
  • pgwatch2 1篇
  • Neuxs 1篇
  • IntelliJ 6篇
  • 代码风格 7篇
  • kryo 1篇
  • vsftpd 1篇
  • WebService 1篇
  • WSDL 1篇
  • Spark streaming 1篇
  • flink sql 窗口函数 1篇
  • REST API编程标准 2篇
  • 网络攻防(xss,CSRF/XSRF)安全策略 7篇

最新评论

  • springboot利用ThreadPoolTaskExecutor多线程批量插入百万级数据

    java_代码搬运工: 一眼AI回答

  • springboot利用ThreadPoolTaskExecutor多线程批量插入百万级数据

    阿啄debugIT: 多线程环境下的事务处理确实是一个复杂而关键的问题,因为它涉及到数据的一致性和完整性。以下是几种常见的解决多线程事务问题的方法: 使用数据库的事务隔离级别: 大多数关系型数据库都支持事务,并提供了不同的事务隔离级别(如读未提交、读已提交、可重复读、串行化)。选择合适的隔离级别可以在一定程度上减少多线程导致的数据不一致问题。 乐观锁和悲观锁: 悲观锁:在操作数据时总是假设最坏的情况,即数据会被其他线程修改,因此它会在数据处理开始时锁定数据,直到处理完成。这可以防止其他线程同时修改数据,但可能会降低并发性能。 乐观锁:假设数据在大部分情况下不会被其他线程修改,因此在数据处理时不会锁定数据。但在数据提交更新时,会检查数据是否被其他线程修改过(通常通过版本号或时间戳来判断)。如果被修改过,则回滚事务;否则,提交事务。 分布式锁: 当事务跨越多个服务或资源时,可能需要使用分布式锁来确保数据的一致性。分布式锁可以确保同一时间只有一个线程或进程能够访问特定的资源或执行特定的操作。 消息队列: 使用消息队列(如Kafka、RabbitMQ等)可以解耦数据的生产和消费,从而在一定程度上减少多线程之间的直接竞争。生产者将数据发送到队列,消费者从队列中拉取数据并处理。这种方式可以确保数据的有序性和一致性。 重试机制: 在多线程环境中,可能会出现由于并发冲突导致事务失败的情况。此时,可以引入重试机制,在事务失败后等待一段时间再重新尝试执行事务。 事务管理器: 使用专门的事务管理器(如JTA/JTS)可以简化多线程环境下的事务管理。这些管理器提供了高级的并发控制和错误恢复机制,确保事务的原子性、一致性、隔离性和持久性。 避免长时间持有锁: 尽量减少锁的持有时间,避免在持有锁时进行耗时操作或等待其他资源。这可以减少死锁和性能下降的风险。 监控和告警: 实施有效的监控和告警机制,以便及时发现并解决多线程事务中可能出现的问题。 具体选择哪种方法取决于应用的业务逻辑、性能要求以及所使用的技术栈。在实际应用中,可能还需要结合多种解决方案

  • springboot利用ThreadPoolTaskExecutor多线程批量插入百万级数据

    java_代码搬运工: 多线程事物怎么解决的?

  • 通过@伪列,计算在同一个mysql表中同一个用户,第一行时间与第二行时间比较,第二行时间与第三行时间比较……的sql语句,及补充mysql伪列和时间处理函数知识

    CSDN-Ada助手: 多亏了你这篇博客, 解决了问题: https://ask.csdn.net/questions/8040477, 请多输出高质量博客, 帮助更多的人

  • springboot利用ThreadPoolTaskExecutor多线程批量插入百万级数据

    weixin_45850807: 这个是自己封装的。你可以使用hutool中的 ListUtil.split(logOutputResults, 100);可以达到一样的效果

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 理解springboot那些过滤器与调用链、包装或封装、设计模式相关等命名规范,就可以读懂80%的springboot源代码,和其他Java框架代码
  • While中的if条件需要check一下?java二分模板彻底突破“二分法”的使用
  • 理解springboot那些注册与回调、监控与统计等命名规范,就可以读懂70%的springboot源代码
2023年11篇
2022年4篇
2021年52篇
2020年222篇
2019年12篇
2014年3篇

目录

目录

分类专栏

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿啄debugIT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司黄南网页设计公司泰安网站推广方案推荐思茅seo哪家好秦皇岛网站建设设计价格驻马店关键词按天计费多少钱文山网站优化按天计费报价宁波百度网站优化衢州网站seo优化推荐达州百度网站优化报价铜仁设计网站推荐吉安百姓网标王推广推荐垦利百搜标王多少钱丹东网站设计多少钱昌吉网站优化推广湖州外贸网站建设吉祥网站推广工具价格坂田网站设计模板多少钱延边SEO按天收费价格鞍山如何制作网站价格伊春seo网站推广报价蚌埠网站优化按天扣费哪家好天门网络推广多少钱商丘外贸网站设计公司塔城网站推广工具多少钱包头网络推广推荐松原关键词按天扣费报价金华百度关键词包年推广推荐巢湖网站推广报价宝安网站优化排名多少钱潮州百度竞价包年推广多少钱歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化