有的时候我们需要查询一些不能从人哦实体表中取得的数据,比如将数字1作为结果集,或者计算字符串"abc"的长度。
有的开发人员尝试使用下面的SQL语句来完成类似的功能:
SELECT 1 FROM T_Employee
可是执行以后却得到了下面的执行结果集:
+---+
| 1 |
+---+
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
+---+
结果集中出现了不知一个1,这是因为通过这种方式得到的结果集数量上取决于T_Employee表中的数据条目数的,此时必须借助于DISTINC关键字来将结果集条数限定为一条,SQL语句如下:
SELECT DISTINCT 1 FROM T_Employee
执行完毕我们就能看到下面的执行结果:
+---+
| 1 |
+---+
| 1 |
+---+
这种实现方式非常麻烦,而且如果数据库中一张表都没有的时候这样做就不奏效了。主流数据库系统为这种需求提供了比较好的支持,这一节我们就来讲讲。
MySQL和MS SQL Server允许使用不带FROM 子句的SELECT语句来查询这些不属于任何实体表的数据,比如下面的SQL语句将1作为结果集:
SELECT 1
执行完毕我们就能看到下面的执行结果:
+---+
| 1 |
+---+
| 1 |
+---+
还可以在不带FROM子句的SELECT语句中使用函数,比如下面的SQL语句将字符串'abc'的长度作为结果集。
SELECT LENGTH('abc')
还可以在SELECT语句中同时计算多个表达式,比如下面的SQL语句将1、2、3、'a'、'b'、'c'作为结果集:
SELECT 1,2,3,'a','b','c'
在Oracle 中不允许使用这种不带FROM子句的SELECT 语句,不过我们可以使用Oracle的系统表来作为FROM子句的表明,系统表示Oracle内置的特殊表,最长将的表为DUAL。比如下面的SQL语句将1及字符串'abc'的长度作为结果集:
SELECT 1, LENGTH('abc') FROM DUAL