永发信息网

oracle中 =all 的疑惑

答案:2  悬赏:60  手机版
解决时间 2021-02-23 08:00
  • 提问者网友:椧運幽默
  • 2021-02-22 19:44
当where 条件中 =all (...)的 (...)为空时,=all() 为什么 恒为true.
实际场景:
DELETe FROM job_history j WHERe (employee_id, job_id) = ALL (SELECt employee_id, job_id
FROM employees e WHERe j.employee_id = e.employee_id and j.job_id = e.job_id )

DELETe FROM job_history j WHERe (employee_id, job_id) = (SELECt employee_id, job_id FROMemployees e WHERe j.employee_id = e.employee_id and j.job_id = e.job_id )
请问下·这两句sql 有什么区别,为什么第1条sql比第二条sql删除的记录要多呢?

当 ALL (SELECt employee_id, job_id
FROM employees e WHERe j.employee_id = e.employee_id and j.job_id = e.job_id )
这个查询结果 是 no row seleced
外层的sql 把 job_history 表的所有记录都delete了·为什么啊
最佳答案
  • 五星知识达人网友:玩家
  • 2021-02-22 20:29
首先, 你的测试很好, 我这里把概念再给你归纳一下:

1. ANY和SOME 是用来和子句返回的"每一个"值进行比较。 如果返回值为空(0行返回值),则为FALSE

2. ALL 是用来和子句返回的“所有”值进行比较。 如果返回值为空(0行返回值),则为TRUE
------------------------------------------------------------------------------------------------------

本来想顺带提一下你例子用的correlated subquery, 但是我想上面说的已经回答了您要的问题。 您的第二个删除用法是正确的。不过能不用尽量不用correlated subquery, 执行效率在实际工作中可能需要考虑, 不过有限的已知条件下,您用的挺好,没问题。
全部回答
  • 1楼网友:老鼠爱大米
  • 2021-02-22 21:15

1.pl/sqldeveloper这个工具主要是用于开发的,便于编程,还有查表。它有些语句是不支持的,我们一般进行管理都是在sqlplus里进行,一般都是两个结合起来用的,单独用某一个也不是很方便,除非专门做开发或者专门做简单的管理

2.你在开启数据库的第一步就是开启实例,在这一步其实是帮你分配sga(系统全局区)和开启后台进程的过程,也就是说内存区和进程组成了实例,第二步就是装载数据库,其实就是数据库的文件与实例进行关联,最后才会打开数据库,监听就是监控服务器,会生成一些日志出问题了可以去查看

3.oracle主要是功能很强大,而且机制很完善,这个要你去学习了体系结构自然就知道,当你知道它是怎么运转,怎么处理故障的时候才能够理解那些的,他和sqlserver完全不同

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯