create table t_user(
name varchar(16),
age int
);
insert into t_user values
('alice', 16), ('bob', 16), ('charles', 16), ('charles', 11);
select * from t_user where NOT EXISTS (
SELECT 1 FROM DUAL WHERE name = 'bob'
);
不太明白上面这个sql的子查询dual用法具体等效于临时表嘛,第一次见mysql中的这种用法
结果上和下面这个sql应该是没有任何区别,这种写法会更高效嘛?什么情况下需要使用这种写法?
select * from t_user where name <> 'bob'
淇铭
2024 年12 月 6 日 15:48
#6
dual语句可以有一些特殊用法 这个只是其中的一个用法 是的没啥区别
我空闲时间研究了一下,发现这种dual的写法和下面这个sql完全等效,连执行计划都一样。
select * from t_user t where exists (
select 1 from (SELECT 'bob' as name from dual) d where t.name = d.name
);
想问一下类似的关于dual的特殊用法在哪里可以学习到,我在百度上搜索到的全部都是一些dual的基本知识,oceanbase的官方文档上我也没找到介绍这一块的,如果可以的话麻烦指个路,感谢!
淇铭
2024 年12 月 6 日 17:06
#8
DUAL 是 OceanBase 数据库与数据字典一起自动创建的表。DUAL 表位于用户 SYS 的 Schema 中,但所有用户都可以通过名称 DUAL 访问该表。
DUAL
表有一个列 DUMMY
,定义为 VARCHAR2(1)
,并包含一个值为 X
的行。在使用 SELECT
语句计算常量表达式时,可以从 DUAL
表中选择数据,这种方式更好用。因为 DUAL
只有一行,所以常量只返回一次。 或者,您可以从任何表中选择常量、伪列或表达式,但该值将根据表中的行数返回对应的值。