数据库中的集合运算

数据库中的集合运算,第1张

集合运算

         这是一种二目运算,一共有四种四种运算符:并,差,交,笛卡尔积;

语法:

         查询语句

                  [UNION | UNIONALL | INTERSECT | MINUS]

         查询语句

UNION(并集)

返回若干个查询结果,但是重复的不显示

Eg:SELECT FROM dept

                  UNION

         SELECTFROM dept WHERE deptno = 10;

注:查询 *** 作编写的过程中尽量使用UNION , UNION ALL代替 OR,提高查询速度;

例:

         查询工作是销售和clerk的;

         SELECT

FROM emp WHEREjob = ‘saleman’ or job = ‘clerk’;

另一种方式:

SELECT FROMemp WHERE job = ‘SALESMAN’

         UNION

SELECT FROMemp WHERE job = ‘CLERK’;

UNION ALL(并集)

返回若干个查询结果,但是重复的也显示

Eg:SELECT FROM dept

                  UNION ALL

         SELECTFROM dept WHERE deptno = 10;

MINUS(差集)

返回若干个结果中不同的部分;

Eg:SELECT FROM dept

                   MINUS

         SELCTFROM dept WHERE deptno = 10;

INTERSECT(交集)

显示查询结果中相同的部分;

Eg:SELECT FROM dept

                   INTERSECT

         SELCTFROM dept WHERE deptno = 10;

————————————————

答案b表示两个集合的并集,但是在数据库中要求参与并集运算的两个集合必须是相同类型的,即集合r和集合s必须有完全相同的字段,而目前r中包含a,b,c三个字段,s中包含b,c,d三个字段,并不完全相同,这样的两个集合是不能做并集、交集和差集运算的。

<php

$a=[

["sbnumber" => "0513-0001-00001", "name" => "心安苑"],

["sbnumber" => "0513-0001-00002", "name" => "中正苑"],

["sbnumber" => "0513-0001-00003", "name" => "务实苑"],

["sbnumber" => "0513-0001-00004", "name" => "服务苑"],

["sbnumber" => "0513-0001-00005", "name" => "张三"]

];

$b=[

["sbnumber" => "0513-0001-00001", "name" => "心安苑"],

["sbnumber" => "0513-0001-00002", "name" => "中正苑"],

["sbnumber" => "0513-0001-00003", "name" => "务实苑"],

["sbnumber" => "0513-0001-00004", "name" => "服务苑"],

["sbnumber" => "0513-0001-00007", "name" => "李四"]

];

$cmp=function($av, $bv){

$r=strcmp($av['sbnumber'],$bv['sbnumber']);

return $r===0  strcmp($av['name'],$bv['name']) : $r;

};

$c=array_values(array_udiff($a, $b, $cmp));

$d=array_udiff($b, $a, $cmp);

foreach($d as &$dv) $c[]=$dv;

unset($d);

var_dump($c);array(2) { 

   [0]=> array(2) { ["sbnumber"]=> string(15) "0513-0001-00005" ["name"]=> string(6) "张三" }

   [1]=> array(2) { ["sbnumber"]=> string(15) "0513-0001-00007" ["name"]=> string(6) "李四" } 

}

需要比两次才能互相比出差集,再合并结果。还有这里的记录间根据各项内容(比如名字)来确定不同,所以用自定义的对内容的比较规则

人人是指属于人类的生物,具有智慧、情感、意识、自我意识等特征。人类是地球上最高智慧的生物,拥有语言、文化、艺术、科学等丰富的文明。人类的生命是有限的,但人类所创造的文明和遗产将永存。当定积分上限小于<下限的几何意义是什么?当定积分上限小于下限时,定积分的值为负数。这意味着积分曲线在x轴下方,即下限到上限这段区间的面积是负数。在几何意义上,这表示积分曲线在x轴上方的面积比在x轴下方的面积大,或者说积分曲线与x轴之间的面积是负的。这可能发生在一些特殊情况下,例如当积分曲线在x轴上方的面积与在x轴下方的面积相等时,上限小于下限的情况会出现。超声波长时间对不锈钢氢碎有影响吗?超声波长时间对不锈钢氢碎可能会产生影响。长时间的超声波作用可能会导致不锈钢表面的氢化物结构发生变化,从而影响其物理和化学性质。此外,长时间的超声波作用还可能会导致不锈钢表面的腐蚀和疲劳损伤数据库关系代数的题目详细一点假设有两个关系表R和S,其中R有属性A和B,S有属性B和C,关系代数的题目可以包括以下类型:1 选择 *** 作:选择满足某个条件的元组。例如,选择R中属性A=1的元组可以表示为:σ(A=1)(R)。2 投影 *** 作:选择关系中的一些属性,去掉其他属性。例如,选择R中属性A和B,去掉属性C可以表示为:π(A,B)(R)。3 自然连接 *** 作:将两个关系中相同属性的元组组合在一起。例如,R和S的自然连接可以表示为:R⋈S。4 笛卡尔积 *** 作:将两个关系中的所有元组组合在一起。例如,R和S的笛卡尔积可以表示为:R×S。5 并集 *** 作:将两个关系中的所有元组合并在一起。例如,R和S的并集可以表示为:R∪S。6 交集 *** 作:选择两个关系中共有的元组。例如,R和S的交集可以表示为:R∩S。7 差集 *** 作:选择在一个关系中但不在另一个关系中的元组。例如,R和S的差集可以表示为:R-S。8 重命名 *** 作:将一个关系中的属性重命名。例如,将R中的属性A重命名为D可以表示为:ρ(D/A)(R)。以上是关系代数的基本 *** 作,可以组合使用来完成更复杂的查询。例如,选择R中属性A=1的元组,然后选择其中属性B>2的元组,可以表示为:σ(A=1)(σ(B>2)(R))。对比一下,不当之处请联系道主删除。

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

意思是 redis 的 string 可以包含任何数据。比如jpg或者序列化的对象,string 类型的值最大能存储 512MB。

Redis hash是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

Redis list是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。

Redis的Set是string类型的无序集合,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

这实际上是求非交集(差集)问题,sql语句求差集相对于求交集的办法要少得多。

求差集方法中,使用not in关键字进行筛选在逻辑上最容易理解,很多人都会想到利用到它,数据量不大时还行,但是它有个重大缺陷,那就是在碰到大数据表的情况下其运行效率极低,有没有可被利用的索引效率都一样极差。我曾在利用大数据表的测试中,发现not in 语句常常要花费数小时才能返回结果,最夸张的例子耗时竟然超过一天!在返回结果前数据查询会处在"假死"状态,让人感觉是返回了空集似的,其实不是那样的,只是数据库引擎尚未完成运算而已。

在有可被利用的索引情况下,我们可以利用非存在not exists子句来筛选出两表之间的差集,其运行效率是非常高的。以题主的语句为例可改写如下:

原来使用not in筛选差集,大数据表效率极差:

SELECT ipdz FROM ipdz_b WHERE ipdz not in(select ipdz_d from zj_b);

而使用not exists筛选差集,大数据表有索引可利用时返回结果酒快多了:

select bipdz from ipdz_b b where not exists(

select 1 from zj_b a where aipdz_d=bipdz);

请留意不要踩not exists的坑!尽管它在有可被利用的索引时运行效率极高,但是如果没可利用的索引它会跟not in一样在遇到大数据表时, 运行运行效率也很糟!

在没有索引可被利用的情况下,建议利用左(右)联接出现的null值来求出差集,但是需要留意并小心处理因两表连接所导致的记录行变多问题。

下面是以题主的表结构为例的sql语句写法,其返回结果集的速度还是很不错的:

left join 筛选差集:

select bipdz from ipdz_b b left join zj_b a on

aipdz_d=bipdz where aipdz_d is null;

这里假设a表的ipdz_d是唯一的,如果非唯一需调整如下

select bipdz from ipdz_b b left join (

select distinct ipzd_d from zj_b) a on

aipdz_d=bipdz where aipdz_d is null;

总结:

小数据量not in随便用,此方法逻辑简单,语句易于编写;

大数据量在有可利用的索引情况下,建议首选 not exists(因为效率最高);

大数据量时,有没有可被利用的索引not in都要避免使用。而not exists 在没索引可利用时也应避免使用,此时建议使用左left join或右连接返回差集会有比较好的表现。

后两种方法在逻辑上不太好理解,还要处理因连接导致的记录行变多问题,语句编写相对麻烦。

以上就是关于数据库中的集合运算全部的内容,包括:数据库中的集合运算、数据库系统 设有关系R(A,B,C)和S(B,C,D),下列关系表达式不成、php 2个二维数组 如何判断差集等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9630243.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存