转自:https://developer.aliyun.com/article/41952

 虚拟表 dual 其实我是今天第一次听说,虽然以前有过它的应用。说不定你也用过哦,看这条 sql:select sysdate(); 熟悉不!?虽然我不是狠熟悉,但我确定我用过它,其实他是:select sysdate() from dual 的简写。

看一下mysql官方对这个表的解释吧(http://dev.mysql.com/doc/refman/5.0/en/select.html):

DUAL is purely for the convenience of people who require that all SELECT statements should have FROM and possibly other clauses. MySQL may ignore the clauses. MySQL does not require FROM DUAL if no tables are referenced.

官方的解释说:纯粹是为了满足select … from…这一习惯问题,mysql会忽略对该表的引用。

      碰到了新问题就去网上搜集了一下,发现原来 dual 表的应用地方还不少。。。把我发现的三个应用地方都加上:

  1. select express from dual    #这条 sql 就类似上面的查看系统时间一样。把 express 替换成表达式或函数就行;
  2. select express from dual where condition   #这条 sql 只是对上面的一点扩展 加上一个 where 条件。其实这个 where 条件跟我们平时使用的 where 条件没什么区别。执行的时候也是先判断 where 子句是否成立,满足然后再执行 select 中的 express,最后返回 express 执行的值;如果 where 子句不成立,则返回空。比如:select 1+1 from where 1=1,将返回 2 ;
  3. 第三个就是一条比较实用的 SQL 语句了!你否想过:插入数据时先判断一下这条 记录是否已存在这个问题!?也许很多时候为了解决这个问题,你会先 select 一下,根据他的结果再决定是否继续写入数据库。但是用 dual 这个表,可以让你仅一条 SQL 就可以解决这个问题哦!
    SQL 就是这样写的:
    INSERT INTO table (primarykey, field1, field2, ...)
    SELECT key, value1, value2, ...
    FROM dual
    WHERE not exists (select * from table where primarykey = id);

    下面是我测试时的结果图,附上:

    mysql dual表测试图片

      当然,好奇的你肯定想到了,这个 dual 表到底是个什么东西、它里面到底放着什么!是不想是用:select * from `dual`; 和 show create table `dual` 查看一下他的记录。答案我告诉你把,这两条 sql都会返回错误!错误??对,确实都会返回错误,这可能就是为什么叫他虚拟表的原因吧

posted on 2020-09-21 16:53  Sharpest  阅读(1466)  评论(0编辑  收藏  举报