sql cookbook实验记录(Fourth)

本文深入探讨Oracle Database 19c中MINUS操作符的使用及如何处理NULL值带来的挑战,通过实例展示MINUS的去重复功能,并比较其与NOT IN的区别,同时提供了解决NULL值问题的有效方法。

环境介绍:

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

目前可以下载到的最新版本啦!

最近csdn在搞什么付费专栏,其实不是很好理解,但是还是参与一下。我的初衷是凑个热闹。技术这个东西门槛本应该就敞开来,大家都学习学习。不会是武侠小说的绝世武功,永远只是男一号的自嗨。要是古代大大侠剑客有现在的开源精神,那么很多“武林悲剧”就可以避免了。好东西就在这里,爱学不学都是自己的事情。甚至屠龙宝刀也可以来个流水线制作,还支持定制化,印上自己的大名——狗剩的屠龙刀之类的。类比苹果的airpods,大家联想下。


接着昨天的话题。在oracle database中,minus是带有去除重复的功能的。

scott@ORCL>select deptno from dept
  minus
   select deptno from emp;  2    3  

    DEPTNO
----------
	40

不过这里的dept是主键列

select dbms_metadata.get_ddl('TABLE','DEPT') from dual;

所以这里看不出来吧

CONSTRAINT “PK_DEPT” PRIMARY KEY (“DEPTNO”)

我们自己造个数据吧:
for example:

create table dept_1 as select * from dept;
desc dept_1;
select * from dept_1;
insert into dept_1 values(40,'hdp','beijing')
commit;

数据如下
在这里插入图片描述

这个时候我们可以测下minus的去重复功能啦。
如下图
在这里插入图片描述
我们也可以自己开发一个

 select deptno from dept_1 where deptno not in (select deptno from emp);

但是这里别忘记了用distinct去重复

select distinct deptno from dept_1 where deptno not in (select deptno from emp);

    DEPTNO
----------
	40

NULL值与not in

首先创造数据

create table new_dept (deptno integer);
insert into new_dept values(10);
insert into new_dept values(50);
insert into new_dept values(null);
commit;
select * from new_dept;

这样我们就包含了一张带有null值得表,new_dept列了。

于是

scott@ORCL>select deptno from emp where deptno not in (select deptno from new_dept);

no rows selected

没有返回任何值,与事实不符合。

先看下 in 吧
改下下:

select deptno from dept where deptno  in (null,10,50);
select deptno from dept where deptno is null or deptno=10 or deptno=50;

这两条语句结果是等价的,in其实就是在做数学上的运算,只要一个条件满足就满足。
但是not in和遇到null返回NULL值的问题怎么解决呢?为什么会产生NULL值呢。
还是涉及到bool运算。

在这里插入图片描述

这样not in遇到null值后,传出来的值只有两种可能行 not ture=False not null==NULL,所以not in遇到null后会没有返回值。这是个经典的问题哦。

Oracle帮我考虑了这个问题。使用关键字exsit,和关联子查询:

SELECT *
  FROM new_dept d
 WHERE NOT EXISTS
           (SELECT NULL
              FROM emp e
             WHERE e.deptno = d.deptno);
SELECT *
  FROM new_dept d
 WHERE EXISTS
           (SELECT NULL
              FROM emp e
             WHERE e.deptno = d.deptno);

需要注意的一点如下:

在这里插入图片描述

假设我想查询部门号不在deptno中的员工

SELECT *
  FROM emp e
 WHERE NOT EXISTS
           (SELECT NULL
              FROM dept d
             WHERE d.deptno = e.deptno); 

这里只要传入NULL值就可以了。

先展示下效果 https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值