1. mysql中的dual表
在Mysql和SQL Server中可以直接select 1不需要加from 表名就可以执行 ,而在Oracle中要满足select from的结构:
select 1不能实现满足上述结构,于是Oracle引入dual虚拟表来满足结构。 Oracle这样表示:select 1 from dual
现在一般线上使用的MySQL都是5.5以上的,在mysql里也存在和oracle里类似的dual虚拟表:官方声明纯粹是为了满足select … from…这一习惯问题,mysql会忽略对该表的引用。在mysql中Dual表的使用示例如下:
2. mysql/oracel中Dual区别
select * from dual;
mysql会出错——1096:没有使用到表;而oracle 会返回列:“du”,其值为“X”——行为和只有一行记录的普通表是一样的!
select express [from dual];
mysql总是作为返回该表达式值的普通select语句执行,返回一行记录的结果集,from dual 对mysql来说根本就是摆设!而oracle里该句必须有from dual;否则报错!
select express from dual where 0=2;
mysq 和 oracle的行为一致:该句就如同你认为的正常表那样——会先计算where的条件,再行计算express;这里的where条件会决定expres是否会返回!
综上:oracle的dual具有代码美感,风格统一,约定成俗!
3. mysql无则插入实现
用户希望在插入数据库表以前,先判断数据是否已存在,不存在插入,存在不插入,如何实现:
create table `Test` (
`Id` int(11) not null comment '默认ID',
`Name` varchar(20) not null comment '默认名字',
primary key (`Id`)
) engine=innoDB default charset=utf8 comment='test';
insert into `Test`(`Id`, `Name`) select 1 , 'jack';
insert into `Test` select 1 ,'cao';
insert into `Test` select 1 , 'cao' where not exists(select 1 from Test where id=1);
insert into `Test` select 1 , 'cao' from dual where not exists(select 1 from Test where id=1);