⑴ 在sql-SERVER2000中对同一个数据库多张表进行查询时怎样避免笛卡儿乘积
在写join类型的语句的时候,最好使用join来代替直接用“,”分隔多个表。这样必须提供on条件才能进行查询。当然,join的条件一定要设置好,否则也会出现笛卡尔积的。
比如tableA和TableB向关联的是ID字段
如果用“,“分隔两个表的话语据应该如下
select count(*)
from tableA ,TableB
where TableA.id=TableB.id
如果把where 语句漏掉就出现笛卡尔积了
select count(*)
from tableA ,TableB
同样,写成join的话,如果不指定on里的条件的话,语法是错的
select count(*)
from TableA join TableB
on TableA.id=TableB.id
但是如果再on里指定了一个错误的关联条件的话,也是会出现笛卡尔积的,比如:
select count(*)
from TableA join TableB
on 1=1
当然一般人不会闲得去把on条件设置成1=1,不过这是举个例子,就是为了说明on的筛选条件一定要设置好。
⑵ SQL sum函数一对多场景,消除笛卡尔积
贷款表
还款表
其中还款表使用load_id作为外键与贷款表关联。
贷款表数据
还款表数据
结果为 110.00
结果为 65.00
结果为 270.00
关联情况下,贷款表查询出的实际数据如下,可以看出这种情况下出现了笛卡尔积。
load_id为5的贷款对应3条还款,load_id为8的贷款对应2条还款。所以sum(lc.load_amt)的结果270 = 50 * 3 + 60*2。
解决方案,使用 DISTINCT 关键字。
结果 110.00
结果为 270.00 , 65.00。
跟场景三一样,贷款金额出现了笛卡尔积
这种情况可以分两步走
这种方式可能不是很好理解,换成子查询方式。
结果
结果
⑶ sql join on 多个表 怎么防止卡迪尔乘积
join 肯定就是笛卡尔积,所以你on 后面跟的条件就非常关键,如果没有on连接条件,就是完全的笛卡尔积,100条学生数据和100条成绩数据笛卡尔积就是10000条数据。
所以两个表join,需要按on后面的条件去连接就没啥事了,100条学生数据和100条成绩数据,on 学生表.学号=成绩表.学号,按这个条件join,就只会去连接满足连接条件的值
⑷ 写sql语句 一般什么时候出现笛卡尔积如何避免
楼主这个问题,表达的不是很准确。事实上你所说的什么时候出现笛卡尔积,应该是指一对多关系的时候,如果避免重复,而不是如何避免笛卡尔积。笛卡尔积在SQL中是有特殊的关联来求笛卡尔积的,求笛卡尔积的指令是crossjoin。那么回到如何避免重复的问题上,一般对于SQL开发来说,这是让很多人头疼的问题。一般呢,我个人把重复定义为如下三种情况:x0dx0a第一种,原数据重复,指的是对应关系表中的数据本身就存在重复。但这种情况并不多,开发的时候会设定主键,一般情况较少。这种情况通常把需要使用的粒度数据distinct后,再关联就可以了。x0dx0a第二种,就是维度重复。比如有区域表,分别是省市县三列,而你要统计的是到省的数据,这样你直接写join的时液茄候会直接关联出很多条,这样通常闹皮察使用子查询去除维度重复后,再关联即可x0dx0a第三种,就是在一对多关系关联出来后的数据维度重复。有些东西是存放很多关系表握轮的,在关系表关联后出现重复数据是个很正常的事情,但是可能由于需求比较特别,这样我们通常对这些数据进行排序组合,汇总后取数的原则,来选出我们需要的数据。x0dx0a当然,说了这么多,其实怎么写一段SQL,还是要看需求和数据结构。具体的数据结构和具体的需求,定位了一段SQL该怎么写。多实践,你就会感悟到了
⑸ 为什么在实际中要避免构造广义笛卡尔积的SQL语句
两个表相连,每个表10000条数据。如果不加连接条件,就会造成广义笛卡儿积10000*10000=1亿条数据,这样的数据量你的计算机就受不了。所以在两个表连接时一定要加链接条件,并且要想好逻辑
⑹ 为什么在实际中要避免构造广义笛卡尔积的sql语句
两个表相连,每个表10000条数据。如果不加连接条件,就会手枝造成广义笛喊让卡儿积10000*10000=1亿条数据,这样的数据量你的计算机就受不了。所郑薯局以在两个表连接时一定要加链接条件,并且要想好逻辑
⑺ 什么就是为查询数据而定制的准则
这个书上应该都有的啊1.需求分析阶段
准确了解与分析用户需求(包括数据与版处理)
是整个设计过程的基础,权是最困难、最耗费时间的一步
2.概念结构设计阶段
是整个数据库设计的关键
通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型
3.逻辑结构设计阶段
将概念结构转换为某个DBMS所支持的数据模型
对其进行优化
4.数据库物理设计阶段
为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)
5.数据库实施阶段
运用DBMS提供的数据语言、工具及宿主语言,根据逻辑设计和物理设计的结果
建立弊铅数据库,编制与调试应用程序,组织数据入库,带卜世并进行试运行
6.数据库运行和维护阶段
数据库应用系统经过试运行后即可投入正式运行。
查询检索的优化首先想到你检索条件中的字段是不是索引字段,不是的话版,建立索引
然后是权sql语句的优化,select其实就是循环,循环的次数越多,检索效率越慢,子查询可以有,但是不要超过三层,超过三层,估计就是检索sql有问题,要重新梳理逻辑
避免笛卡尔积,几个表关联的时候,要用主键或者逻辑主键去关联
聚蠢肢合函数的用法,要注意重复数据的过滤
where条件尽量写详细,条件越多,就能过滤掉更多的数据,这样就会提高效率
对于百万级别或者千万级别的数据量的检索,就不是sql优化那么简单了,要用到数据库本身的一些优化机制,有些数据库带有临时表,这是很好的优化方法
存储过程也是可以优化sql的,一些循环或者条件判断都可以用存储过程来实现
⑻ sql关联出现笛卡尔积现象怎样避免
d与s没有产生关联,按照道理d与s会产生笛卡尔积但是你的查询结果并没有,这是因为完全用where条件来限制除了本身在实现你这个sql的时候,sql引擎有很多算法1种是产生3个表的笛卡尔积,按照where来过滤。产生结果2、按照e和d来连接,产生结果,在于s来3、按照d和s产生笛卡尔积,在按照e和s来过滤等等本身你看到的只是一个运算结果。运算过程你并没有看到,也就是sql引擎实际选择使用哪种方法。所以不是说它没有产生笛卡尔积,而是说它有可能产生,也有可能没有产生,根据它的算法自己决定。如果你想看到它到底有没有选择笛卡尔积的算法,那么就看看这个sql的实际执行计划就知道了。
⑼ SQL实战新手入门:交叉联接(CROSS JOIN)
交叉联接(CROSS JOIN)
最后 将介绍另外一种不同类型的联接 实际上 它的语法不允许定义行匹配的条件
SELECT
loc_bookcase
loc_shelf
loc_position_left
bk_title
FROM location CROSS JOIN books
( row(s) affected)
这怎么可能呢?查询结果产生了 行记录?在每一个表中仅有 条记录啊!这是什么类型的联接呢?它就是交叉联接 又称为笛卡尔积 请回顾一下笛卡尔坐标系统 它由两根互为直角的轴构成 两轴交叉点的坐标为 并从 开始沿轴逐渐增加数值 笛卡尔坐标系统的一个常见的例子就是国际象棋的棋盘 它沿着轴用字母取代了数字 除此之外 两者是类似的
如果对棋盘上陪册的每一个方格进行命名 可以使用棋盘上的坐标 A A E E 等 换句话说 即将一个轴上的每一个值都与另外一个轴上的每一个值进行匹配 这就是笛卡尔积(这非常类似于将轴上的值 相乘 :A× A× 等)
CROSS JOIN对于两个表执行类似的操作 它将一个表中的每一行与另外一个表中的每一行进行配对 可以想象 CROSS JOIN的结果集通常都源携相当大 在上面的例子中 仅仅交叉联接两个表(每个表只有 行数据)就返回了 行结果 如果在查询中加入更多的表 那么结果集将芦裂宏变得更加庞大
如何建立CROSS JOIN呢?实际上无需太多的语法 使用旧式SQL语法来创建CROSS JOIN非常简单 只需要在FROM子句中列出要选取的表 无需任何JOIN条件
SELECT
loc_bookcase
loc_shelf
loc_position_left
bk_title
FROM location books
也就是说 无须使用任何JOIN关键字 只需要在FROM子句中列出要交叉联接的表即可 但是这会产生一个困境 忽略WHERE子句将创建一个笛卡尔积的查询 并且编写这样的SQL查询非常简单 然而 结果集可能会超出希望查询的数据范围 表 显示了将LIBRARY数据库中的表逐步增加到CROSS JOIN查询中时结果集数量的增长过程
表 LIBRARY数据库中的笛卡尔积
LIBRARY数据库非常小 只包含 个表 其中没有一个表超过 条记录 但使用CROSSJOIN时却产生了极大的结果集 设想一下 如果对于一个包含了几十个甚至上百个表的产品级的数据库(其中可能包含了上百万的记录)使用CROSS JOIN将会产生什么样的后果?毫无疑问 这会将数据库折磨到挂掉 并让DBA恼火不已
可以在CROSS JOIN中使用一个WHERE子句来减少返回记录的数量 例如 使用下面的查询产生一个笛卡尔积
SELECT loc_bookcase loc_shelf loc_position_left bk_title
FROM location CROSS JOIN books
WHERE bk_id =
该查询仅返回 条记录 而不是前面例子中的 条记录
幸运的是 新的SQL语法要求首先显式地声明联接的类型 这可以避免查询意外地产生不必要的笛卡尔积 新SQL语法要求必须使用CROSS JOIN关键字或者应用联接条件 对于DBA请注意以下的警告 使用旧的联接语法对数据库是有害的 很多RDBMS在它们各自的数据库中已经停止了对旧语法的支持 除非需要处理遗留的代码 否则在查询中最好不要再使用旧式语法
读者可能会感到疑惑 如果CROSS JOIN是不良的 应该避免使用的联接 那为什么还要自寻烦恼地提供CROSS JOIN关键字呢?实际上 CROSS JOIN也有合理的用途 例如 它提供了一个快速又简单的办法来产生巨量的数据集 可用于测试用途 另外一种应用场景是通过CROSS JOIN产生的数据集来选取行 这些行既无法通过INNER JOIN也无法通过OUTER JOIN来产生 例如 选取对于指定产品的销售总量为 的客户(或者在LIBRARY数据库的情形下查询在一年内没有借阅一本特定图书的客户)
CROSS JOIN是一个极为强大的工具 因此也必须谨慎地加以使用 处理巨大的数据集将消耗系统资源 在SQL中 最佳实践之一就是在查询中尽可能地对记录进行筛选 并最小化须访问的数据的数量
一个SQL查询对于可以包含多少个JOIN操作是否存在限制呢?对于预备执行计划的复杂性都存在实际的限制 更不用说执行这些复杂的计划可能会使服务器崩溃 实际的数量取决于RDBMS以及运行RDBMS的硬件环境 如果你发现联接太多的表 那么应该重新考虑你的查询方案
返回目录 SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
lishixin/Article/program/SQL/201311/16467
⑽ SQL语句查询出现笛卡尔怎么办
两表连接如果要避免返回笛卡尔积,必须确保至少一方表是唯一的,否则在能查到记录的情况下,不论哪一种连接方式一定会返回笛卡尔积记录集的。
我们可以利用主键、唯一索引、distinct关键字和分组等手段来确保连接是一对多或一对一的,这样就可以防止笛卡尔积发生。具体的实现方法要根据数据结构和查询要求才能给出,可以说是千变万化的,需要具体问题具体分析解决。