什么都没有选择?

时间:2010-09-17 03:08:49

标签: sql

是否可以有一个像

这样的陈述
SELECT "Hello world"
WHERE 1 = 1
在SQL中

我想知道的主要事情是,我可以从零开始选择,即没有FROM子句。

14 个答案:

答案 0 :(得分:117)

各供应商之间并不一致 - Oracle,MySQL和DB2支持双重:

SELECT 'Hello world'
  FROM DUAL

...而SQL Server,PostgreSQL和SQLite不需要FROM DUAL

SELECT 'Hello world'

MySQL确实支持两种方式。

答案 1 :(得分:24)

Oracle中:

SELECT 'Hello world' FROM dual

Dual equivalent in SQL Server

SELECT 'Hello world' 

答案 2 :(得分:6)

在SQL Server中输入:

Select 'Your Text'

不需要FROMWHERE条款。

答案 3 :(得分:5)

试试这个。

SELECT *  FROM (VALUES ("Hello world")) t1 (col1) WHERE 1 = 1

此处提供更多详细信息:http://modern-sql.com/use-case/select-without-from

答案 4 :(得分:4)

你可以。我在StackExchange Data Explorer query中使用以下行:

SELECT
(SELECT COUNT(*) FROM VotesOnPosts WHERE VoteTypeName = 'UpMod' AND UserId = @UserID AND PostTypeId = 2) AS TotalUpVotes,
(SELECT COUNT(*) FROM Answers WHERE UserId = @UserID) AS TotalAnswers

Data Exchange使用Transact-SQL(SQL Server专有的SQL扩展)。

您可以通过运行以下查询来自行尝试:

SELECT 'Hello world'

答案 5 :(得分:3)

这是https://blog.jooq.org/tag/dual-table/中对dual的数据库支持的最完整列表:

  

在许多其他RDBMS中,您不需要虚拟表   发出这样的声明:

SELECT 1;
SELECT 1 + 1;
SELECT SQRT(2);
     

这些是RDBMS,通常可以在上面实现:

     
      
  • H2
  •   
  • MySQL
  •   
  • Ingres
  •   
  • Postgres
  •   
  • SQLite
  •   
  • SQL Server
  •   
  • Sybase ASE
  •   
     

在其他RDBMS中,需要伪表,例如在Oracle中。因此,   您需要编写以下内容:

SELECT 1       FROM DUAL;
SELECT 1 + 1   FROM DUAL;
SELECT SQRT(2) FROM DUAL;
     

这些是RDBMS及其各自的虚拟表:

     
      
  • DB2:SYSIBM.DUAL
  •   
  • 德比:SYSIBM.SYSDUMMY1
  •   
  • H2:(可选)支持DUAL
  •   
  • HSQLDB:INFORMATION_SCHEMA.SYSTEM_USERS
  •   
  • MySQL:可选地支持DUAL
  •   
  • Oracle:DUAL
  •   
  • Sybase SQL Anywhere:SYS.DUMMY
  •   
     

Ingres没有DUAL,但是实际上需要它,因为Ingres中您不能   具有WHERE,GROUP BY或HAVING子句,而没有FROM子句。

答案 6 :(得分:2)

在标准SQL中,没有。 WHERE子句表示表表达式。

来自SQL-92规范:

  

7.6“where clause”

     

功能

     

指定由。派生的表   应用“搜索条件”   前面的结果“来自   条款”。

反过来:

  

7.4“from clause”

     

功能

     

指定从一个或多个命名表派生的表。

标准的执行方式(即应该适用于任何SQL产品):

SELECT DISTINCT 'Hello world' AS new_value
  FROM AnyTableWithOneOrMoreRows
 WHERE 1 = 1;

...假设您要将WHERE子句更改为更有意义的内容,否则可以省略。

答案 7 :(得分:2)

我认为这是不可能的。理论上:select执行两种操作:

  • 缩小/扩大集合(集合理论);

  • 映射结果。

第一个可以看作是与where子句相对的水平缩小,可以看作是垂直缩小。另一方面,联接可以水平增加集合,其中联合可以垂直增加集合。

               augmentation          diminishing
horizontal     join/select              select   
vertical          union            where/inner-join

第二个是映射。一个映射,更像是一个转换器。在SQL中,它需要一些字段并返回零个或多个字段。在select中,您可以使用一些聚合函数,例如sum,avg等。或者将所有列值转换为字符串。在C#linq中,我们说select接受一个T类型的对象并返回一个U类型的对象。

我认为你可以做的事情是select 'howdy' from <table_name>。此功能是映射,转换器部分的选择。你不打印东西,但转换!在您的示例中:

SELECT "
WHERE 1 = 1

你没有将/ null转换为"Hello world"并且你将没有/没有表的集合缩小成一行,这根本没有任何意义。

您可能会注意到,如果不限制列数,则会为表中的每个可用行打印"Hello world"。我希望,你明白为什么到现在。您的选择不会从可用列中获取任何内容,而是创建一个包含文本的列:"Hello world"

所以,我的答案是否定的。您不能只省略from子句,因为select总是需要表列来执行。

答案 8 :(得分:2)

对于ClickHouse,没有什么是system.one

SELECT 1 FROM system.one

答案 9 :(得分:1)

还有另一种可能性-独立的VALUES()

VALUES ('Hello World');

输出:

column1
Hello World

当您需要以紧凑的方式指定多个值时,它很有用:

VALUES (1, 'a'), (2, 'b'), (3, 'c');

输出:

column1     column2
      1     a
      2     b
      3     c

DBFiddle Demo

SQLite / PostgreSQL / DB LUW / MariaDB 10.3支持此语法。

答案 10 :(得分:0)

我知道这是一个老问题但是你问题的最佳解决方法是使用虚拟子查询:

SELECT 'Hello World'
FROM (SELECT name='Nothing') n
WHERE 1=1

这样,您可以在select语句之后使用WHERE和任何子句(如Joins或Apply等),因为伪子查询强制使用FROM子句而不更改结果。

答案 11 :(得分:0)

我正在使用火鸟 首先,创建一个名为&#34; NoTable&#34;的列表。像这样

CREATE TABLE NOTABLE 
(
  NOCOLUMN              INTEGER
);
INSERT INTO NOTABLE VALUES (0); -- You can put any value

现在你可以写这个

select 'hello world' as name

来自显着的

您可以添加要显示的任何列

答案 12 :(得分:0)

在Firebird中,您可以执行以下操作:

select "Hello world" from RDB$DATABASE;

RDB $ DATABASE是一个特殊表,总是有一行。

答案 13 :(得分:0)

对于DB2:

`VALUES('Hello world')`

您也可以执行多个“行”:

`VALUES('Hello world'),('Goodbye world');`

只要类型匹配,您甚至可以在联接中使用它们:

VALUES(1,'Hello world')
UNION ALL
VALUES(2,'Goodbye world');