begin 2018年7月14日15:06:29

select 1 from dual

Oracle下的select 1 from dual

今天在看公司代码的时候,发现有这一句SQL:

select 1 from dual

然后觉得有点奇怪,数据库里面都没有创建这个dual表,这个表是从何而来呢?然后Google了一波,理解了一下。

首先,公司用的是Oracle数据库,关于Oracle数据库中的dual表,官方文档说明(The DUAL Table):

DUAL is a small table in the data dictionary that Oracle Database and user-written programs can reference to guarantee a known result. The dual table is useful when a value must be returned only once, for example, the current date and time. All database users have access to DUAL.

The DUAL table has one column called DUMMY and one row containing the value X.

DUAL是一个在数据字典里的很小的表,Oracle数据库和用户写的程序可以引用它来保证一个已知的结果。当一个值(比如当前date和time)有且仅需返回一次的时候,这个dual表还是很管用的。所有数据库用户都可以访问DUAL

DUAL表有一列,名叫DUMMY和有一行,值为X

Selecting from the DUAL Table

DUAL is a table automatically created by Oracle Database along with the data dictionary. DUAL is in the schema of the user SYS but is accessible by the name DUAL to all users. It has one column, DUMMY, defined to be VARCHAR2(1), and contains one row with a value X.

Selecting from the DUAL table is useful for computing a constant expression with the SELECT statement. Because DUAL has only one row, the constant is returned only once. Alternatively, you can select a constant, pseudocolumn, or expression from any table, but the value will be returned as many times as there are rows in the table.

DUAL是一个随着Oracle数据库创建数据字典时自动创建的表。虽然DUAL在用户SYS模式下,但是还是可以被所有用户访问的。它有一列,DUMMY,定义为VARCHAR2(1),和包含一行数据,值为X

对于用SELECT计算一个常量表达式来说,从DUAL选择是比较好用的。因为DUAL只有一行,所以常量只会返回一次。或者,你可以从任意一个表中选择常量、伪列和表达式,但是这个值将返回多次,次数和表的行数一样多。

我们可以在Oracle数据库查询:

SQL> select * from dual;
DUMMY
-----
X

好的,现在我们知道了dual这个表是长什么样了,也知道为什么会用这个表了。划重点:当一个值必须返回,且只返回一次,可以从dual表选择返回。

我看了一下项目代码,这句SQL是传给数据库连接池验证连接的,这样就很合理了:不需要返回太多的值,但是有必须有返回,选择从dual返回再正确不过了。

MySQL下的select 1 from dual

SELECT Syntax

SELECT can also be used to retrieve rows computed without reference to any table.

SELECT也可以在没有引用任何表,用来检索行。

For example:

比如:

mysql> SELECT 1 + 1;
-> 2

You are permitted to specify DUAL as a dummy table name in situations where no tables are referenced:

在没有引用表的情况下,你可以指定DUAL为一个虚拟表名。

mysql> SELECT 1 + 1 FROM DUAL;
-> 2

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.

DUAL单纯是为那些要求所有SELECT语句应该有FROM或者其他子句的人们提供便利。MySQL可能忽略这个子句。即使没有表引用,MySQL也不要求FROM DUAL

在MySQL中使用dual表并不总是对的:

mysql> select 1 from dual;
3013 - Unknown table ****.dual

其实MySQL就直接SELECT就行。

end 2018年7月14日17:36:24

select 1 from dual的更多相关文章

  1. select 1 from dual 中的1表示的含义

    select 1 from dual   在这条sql语句中的1代表什么意思?查出来是个什么结果?   其实: select 1 from table; select anycol(目的表集合中的任意 ...

  2. Oacle 插入多条记录的语法理解;INSERT ALL INTO ....... SELECT 1 FROM dual;

    单表Insert into的语句就不说了,这里主要说插入多条语句的说明 For a multitable insert operation, each expression in the values ...

  3. oracle(sql)基础篇系列(一)——基础select语句、常用sql函数、组函数、分组函数

        花点时间整理下sql基础,温故而知新.文章的demo来自oracle自带的dept,emp,salgrade三张表.解锁scott用户,使用scott用户登录就可以看到自带的表. #使用ora ...

  4. ORACLE的DUAL表及DB2的SYSIBM.SYSDUMMY1

    在ORACLE中,数据库用户通过访问DUAL表获取一些系统信息:DB2中,相应的表为SYSIBM.SYSDUMMY1表 ORACE中举例: SELECT SYSDATE FROM DUAL;获取当前日 ...

  5. oracle中dual的使用

    dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情,如下:1.查看当前用户,可以在 SQL Plus中执行下面语句select ...

  6. ORACLE中伪表 dual 的用法

     dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情,如下: 1.查看当前用户,可以在 SQL Plus中执行下面语句 sel ...

  7. oracle 中的dual表简介与用法

    Dual表是每个数据库创建时默认生成的,该表仅有一列一行. 1)分析dual表执行,如下:

  8. 【转】详解Oracle的dual表

    网址:http://www.adp-gmbh.ch/ora/misc/dual.html dual is a table which is created by oracle along with t ...

  9. oracle中dual表的使用

    dual表是一个虚拟表,用来和select语句一起使用.1.查看当前用户select  user from dual2.用来调用系统函数select to_char(sysdate,'yyyy-mm- ...

随机推荐

  1. javamail模拟邮箱功能获取邮件内容-中级实战篇【内容|附件下载方法】(javamail API电子邮件实例)

    引言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 此篇是紧随上篇文章而封装出来的,阅读本 ...

  2. 判别式模型 vs. 生成式模型

    1. 简介 生成式模型(generative model)会对\(x\)和\(y\)的联合分布\(p(x,y)\)进行建模,然后通过贝叶斯公式来求得\(p(y|x)\), 最后选取使得\(p(y|x) ...

  3. 介绍一个强大的画图类 CImage(转)

    我们知道,Visual C++的CBitmap类和静态图片控件的功能是比较弱的,它只能显示出在资源中的图标.位图.光标以及图元文件的内容,而不像VB中的Image控件可以显示出绝大多数的外部图像文件( ...

  4. oracle02--多表关联查询

    1. 多表(关联)查询 多表查询也称之为关联查询.多表关联查询等,主要是指通过多个表的关联来获取数据的一种方式. 1.1. 多表映射关系 一对多:A表的一行数据,对应B表中的多条.如:一个部门可以对应 ...

  5. margin-bottom无效问题以及div里内容动态居中样式!

    最近调前端样式时候,遇到一个需求,在中间文字不对等的情况下想让下面的操作文字距离底部对齐,如图: , 刚开始觉得使用margin-bottom就可以,后来发现只有margin-top是管用的,查了资料 ...

  6. CentOS时区GMT修改为CST

    GMT:格林尼标准时间 北京时间=GMT时间+8小时 [root@sa~]# date -R 查看目前服务器的时间标准 [root@sa~]# vi /etc/sysconfig/clock 将ZON ...

  7. 使用UDP和TCP协议的各种应用和应用层协议

    IGMP和ICMP是传输层协议

  8. Python基础:获取平台相关信息

    Windows 10家庭中文版,Python 3.6.4, 本文介绍了使用os.platform.sys三个模块获取Python程序的运行平台相关的信息. os模块:提供 各种各样的操作系统接口 os ...

  9. geoserver 启动闪退

    跟JDK版本有关: 比如geoserver2.11需要JDK版本为JDK1.8 windows配置两个jdk环境: 网上有方法,但如果只需要满足geoserver的话,可以只安装jdk(注意jdk和j ...

  10. 从源码层次分析asterisk如何产生呼叫

    老规矩,看别人是怎么搞的 http://blog.chinaunix.net/uid-14723273-id-1739552.html over...