sql中的笛卡尔乘积问题

简介: sql中的笛卡尔乘积问题

什么是笛卡尔积?笛卡尔积在数学中是一个什么概念?

笛卡尔积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员 而第二个对象是Y的所有可能有序对的其中一个成员。

笛卡尔积又叫笛卡尔乘积,是一个叫笛卡尔的人提出来的。 简单的说就是两个集合相乘的结果。

假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。

笛卡尔积的sql语句(这里只是简单写一条sql举例)

select` `* ``from` `tablea,tableb ``where` `tablea.id=tableb.id ``-- 该条sql语句是:隐式的inner join,显式的inner join为:from tablea inner join tableb on xxx 或 from tablea join tableb on xxx

select * from tablea,tableb 其实可以首先执行这句 sql 就能发现出现的结果是 tablea 的每条记录和 tableb 中的所有记录都生成一条记录。也就是假如 tablea 有10条记录,tableb 有10条记录,最后会产生 100 条记录。

用 where 条件去过滤内容,在数据量不大的时候,问题不大,但是到了比如表 A有1万 数据,表 B有1万 数据,这样的会就会产生 1 亿的数据,然后再用 where 条件去过渡,性能将下降得十分厉害。

如果两张表的数据量比较大,又需要连接查询时,应该使用 FROM tablea JOIN tableb ON xxx 的语法,避免使用 FROM tablea,tableb WHERE xxx 的语法,因为后者会在内存中先生成一张数据量比较大的笛卡尔积表,这同样增加了内存的开销。

如何避免笛卡尔积的sql?

可以使用 join on 避免笛卡尔积问题。select * from tablea join tableb on tablea.id=tableb.id

这条sql语句的执行顺序是 先执行on 中的条件,来连接两条数据,大大的减少了需要排除的数据,然后在 where 条件中再去过滤数据。

尾声

在实际应用过程中通过关联表的最小粒度关联,可以避免产生笛卡尔积。这里的最小粒度可以理解为 表中的唯一性约束的字段。

相关文章
|
SQL 存储 数据库
工作总结之因为笛卡尔积问题写SQL搞了半天[害](附笛卡尔积总结)
在关系数据库中,一个查询往往会涉及多个表,因为很少有数据库只有一个表,而如果大多查询只涉及到一个表的,那么那个表也往往低于第三范式,存在大量冗余和异常。
327 0
工作总结之因为笛卡尔积问题写SQL搞了半天[害](附笛卡尔积总结)
|
SQL Oracle 关系型数据库
MySQL多表查询,SQL,笛卡尔积等值连接自连接外连接,SQL99新特性,完整详细可收藏
MySQL多表查询,SQL,笛卡尔积等值连接自连接外连接,SQL99新特性,完整详细可收藏
445 0
MySQL多表查询,SQL,笛卡尔积等值连接自连接外连接,SQL99新特性,完整详细可收藏
|
SQL 关系型数据库 MySQL
mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化
先附上数据 CREATE TABLE `course` ( `cno` int(11) NOT NULL, `cname` char(30) CHARACTER SET utf8 NOT NULL, `ctime` int(11) NOT NULL, `scount` ...
1484 0
|
4月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
6月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
140 13
|
6月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
6月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
76 6
|
6月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
487 1
|
6月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
421 3
|
5月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
556 0