看这条 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 表的应用地方还不少。。。把我发现的三个应用地方都加上:
select express from dual #这条 sql 就类似上面的查看系统时间一样。把 express 替换成表达式或函数就行;
select express from dual where condition #这条 sql 只是对上面的一点扩展 加上一个 where 条件。其实这个 where 条件跟我们平时使用的 where 条件没什么区别。执行的时候
也是先判断 where 子句是否成立,满足然后再执行 select 中的 express,最后返回 express 执行的值;如果 where 子句不成立,则返回空。比如:select 1+1 from where
1=1,将返回 2 ;
第三个就是一条比较实用的 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 = key);
来个实际点的例子吧
INSERT INTO clients (client_id, client_name, client_type)
SELECT 10345, ’IBM’, ’advertising’
FROM dual
WHERE not exists (select * from clients where clients.client_id = 10345);
再来一个
insert into cdb_shop (uid,shop)
SELECT '2021','202298'
from dual
where not exists(SELECT * FROM cdb_shop WHERE uid = '2021');
“SELECT '2021','202298' ”就是values语句的变种,格式就这亲样写就对了。注意值的顺序要与inert语句中列的顺序相对应。
关键的地方是where语句,它的结果决定了是否执行insert语句。