무에서 선택 하시겠습니까?


90

다음과 같은 진술을 할 수 있습니까?

SELECT "Hello world"
WHERE 1 = 1

SQL에서?

내가 알고 싶은 가장 중요한 것은 아무것도 선택하지 않아도된다는 것입니다. 즉, FROM 절이 없습니다.


3
@Rafael Belliard에 대한 귀하의 의견을 보면 실제로 무엇을하고 싶은지 묻는 것이 더 나을 수 있습니다. 예를 들어 주어진 테이블에 값이있는 경우 일부 문자열을 반환 하시겠습니까?
Jim L

예, 그것이 실제로 제가 원했던 것입니다. 나는 그것을 할 수 있다는 것을 알고, 나는이 필요한 경우 궁금 많았다 FROM NULL사이 SELECTWHERE. 모호한 표현은 주로 숙제이기 때문에 누군가가 와서 내 직감이 틀렸다면 답을 말해주는 것을 원하지 않았습니다.
Ritwik Bose

답변:


140

공급 업체간에 일관성이 없습니다. Oracle, MySQL 및 DB2는 이중을 지원합니다.

SELECT 'Hello world'
  FROM DUAL

... SQL Server, PostgreSQL 및 SQLite에는 다음이 필요하지 않습니다 FROM DUAL.

SELECT 'Hello world'

MySQL은 두 가지 방법을 모두 지원합니다.


2
나는 항상 궁금했다. 팬텀 테이블에서 듀얼이라는 용어를 선택한 이유는 무엇입니까?
Alex Blakemore

5
@Alex : "원래 DUAL 테이블에는 두 개의 행 (따라서 이름)이 있었지만 이후에는 행이 하나만있었습니다."
rebelliard

7
DB2 이중에 'SYSIBM.SYSDUMMY1'라고
다뉴브 선원에게

1
Postgresql에서는라는 더미 테이블을 만들고 DUAL팬텀과 같은 테이블에서 쿼리를 수행 할 수 있습니다.
Stephan

1
@AlexBlakemore "저는 Oracle Data Dictionary의 기본 개체로 DUAL 테이블을 만들었습니다. 자체 표시되지는 않았지만 쿼리 될 것으로 예상되는 뷰 내에서 사용되었습니다. 아이디어는 JOIN을 수행 할 수 있다는 것입니다. DUAL 테이블을 만들고 테이블의 모든 행에 대해 결과에 두 개의 행을 생성합니다. 그런 다음 GROUP BY를 사용하여 결과 조인을 요약하여 DATA 익스텐트 및 INDEX 익스텐트에 대한 스토리지 양을 표시 할 수 있습니다. DUAL이라는 이름은 단 하나의 행에서 한 쌍의 행을 만드는 프로세스에 적합 해 보였습니다. "( en.wikipedia.org/wiki/DUAL_table )
Ok


14

이 시도.

단일:

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

다중:

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

자세한 내용은 http://modern-sql.com/use-case/select-without-from


1
유일한 ANSI SQL 호환 답변! (dbms가 지정되지 않은 질문에.)
jarlh

의 목적은 WHERE 1 = 1무엇입니까? PostgreSQL에서는 그것없이 작동합니다. 아니면 다른 DMBS와 관련이 있습니까?
Frankie Drake

SELECT * FROM (VALUES ("Hello world")) t1 (col1)여전히 미세. Where이 질문에 답하십시오.
chuongtv

@chuongtv 여러 행을 어떻게 선택합니까?
Hector

@Hector SQL의 구조체 삽입을 따르십시오. 이 같은SELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
chuongtv

8

다음은 https://blog.jooq.org/tag/dual-table/ 에서 이중 데이터베이스 지원의 가장 완전한 목록입니다 .

다른 많은 RDBMS에서는 다음과 같은 명령문을 실행할 수 있으므로 더미 테이블이 필요하지 않습니다.

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

다음은 RDBMS이며 일반적으로 위의 작업이 가능합니다.

  • H2
  • MySQL
  • Ingres
  • Postgres
  • SQLite
  • SQL 서버
  • 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 지원
  • 오라클 : DUAL
  • Sybase SQL Anywhere : SYS.DUMMY

Ingres에는 DUAL이 없지만 실제로 Ingres에서는 FROM 절없이 WHERE, GROUP BY 또는 HAVING 절을 사용할 수 없으므로 실제로 필요합니다.


6

SQL Server에서 다음을 입력합니다.

Select 'Your Text'

FROMor WHERE절이 필요하지 않습니다 .


5

할 수 있습니다. StackExchange Data Explorer 쿼리 에서 다음 줄을 사용하고 있습니다 .

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

데이터 교환은 Transact-SQL (SQL에 대한 SQL Server 독점 확장)을 사용합니다.

다음과 같은 쿼리를 실행하여 직접 시도 할 수 있습니다.

SELECT 'Hello world'

데이터 교환은 SQL Server를 기반으로하는 Azure입니다.
OMG Ponies

2

불가능하다고 생각합니다. 이론적으로 : select는 두 가지 작업을 수행합니다.

  • 세트를 좁히거나 쪼개기 (세트 이론);

  • 결과 매핑.

첫 번째는 수직 감소로 볼 수있는 where 절에 반대되는 수평 감소로 볼 수 있습니다. 반면에 조인은 집합을 가로로 늘릴 수 있으며 유니온은 집합을 세로로 늘릴 수 있습니다.

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

두 번째는 매핑입니다. 매핑은 변환기에 가깝습니다. SQL에서는 일부 필드를 사용하고 0 개 이상의 필드를 반환합니다. select에서 sum, avg 등과 같은 일부 집계 함수를 사용할 수 있습니다. 또는 모든 열 값을 가져 와서 문자열로 변환 할 수 있습니다. C # linq에서는 select가 T 유형의 객체를 받아들이고 U 유형의 객체를 반환한다고 말합니다.

나는 당신이 할 수 있다는 사실 때문에 혼란이 있다고 생각합니다 select 'howdy' from <table_name>. 이 기능은 매핑, 선택의 변환기 부분입니다. 무언가를 인쇄하는 것이 아니라 변환 중입니다! 귀하의 예에서 :

SELECT "
WHERE 1 = 1

당신은 아무것도 / 널로 변환하고 아무것도 / "Hello world"테이블 없음 세트를 하나의 행으로 좁히고, imho는 전혀 의미가 없습니다.

열 수를 제한하지 않으면 "Hello world"테이블에서 사용 가능한 각 행에 대해 인쇄되는 것을 알 수 있습니다. 지금 쯤이면 왜 그런지 이해하길 바랍니다. 선택 항목은 사용 가능한 열에서 아무것도 가져 오지 않고 텍스트가있는 열 하나를 만듭니다 "Hello world"..

그래서 제 대답은 아니오입니다. select는 항상 수행 할 테이블 열이 필요하기 때문에 from 절을 생략 할 수 없습니다.


2

표준 SQL에서는 아니요. WHERE절은 테이블 식을 의미한다.

SQL-92 사양에서 :

7.6 "where 절"

함수

이전 "from 절"의 결과에 "검색 조건"을 적용하여 파생 된 테이블을 지정합니다.

차례로:

7.4 "from 절"

함수

하나 이상의 명명 된 테이블에서 파생 된 테이블을 지정합니다.

이를 수행하는 표준 방법 (즉, 모든 SQL 제품에서 작동해야 함) :

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

... WHERE절을 더 의미있는 것으로 변경하고 싶다고 가정하면 , 그렇지 않으면 생략 할 수 있습니다.


ERROR : 열 "안녕하세요 세계"MY_TABLE에 존재하지 않는 : 열 "안녕하세요 세계"MY_TABLE 쿼리에 존재하지 않는 PostgreSQL을 말했다 실패
친구 Brattberg

@ PålBrattberg : 이제는 고정 된 작은 따옴표 여야합니다.
onedaywhen

처리 시간 측면에서 사용되는 테이블이 중요합니까? 아니면 SELECT가 열을 참조하지 않는다는 사실이 실제 테이블을 무관하게 만들까요?
Allen Gould

@AllenGould : '공급 업체에 따라 달라 지지만'악용 될 수있는 명백한 단락이 있습니다. 예를 들어 옵티마이 저가 SELECT절이 상수로만 구성되고 AnyTableWithOneOrMoreRows저장된 테이블 임을 인식하는 경우가 있으므로 통계를 사용하여 테이블에 0 행.
onedaywhen

2

또 다른 가능성이 있습니다-독립형 VALUES():

VALUES ('Hello World');

산출:

column1
Hello World

여러 값을 간결하게 지정해야 할 때 유용합니다.

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

산출:

column1     column2
      1     a
      2     b
      3     c

DBFiddle 데모

이 구문은 SQLite / PostgreSQL / DB LUW / MariaDB 10.3에서 지원됩니다.


2

ClickHouse의 경우 system.one

SELECT 1 FROM system.one

1

Firebird에서는 다음을 수행 할 수 있습니다.

select "Hello world" from RDB$DATABASE;

RDB $ DATABASE는 항상 하나의 행이있는 특수 테이블입니다.


0

나는 이것이 오래된 질문이라는 것을 알고 있지만 질문에 대한 가장 좋은 해결 방법은 더미 하위 쿼리를 사용하는 것입니다.

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

이렇게하면 더미 하위 쿼리가 결과를 변경하지 않고 FROM 절을 강제로 사용하므로 select 문 뒤에 WHERE 및 모든 절 (예 : Joins 또는 Apply 등)이있을 수 있습니다.


1
여전히 하위 쿼리에 SELECTa FROM가 없으므로 Oracle 등에서는 여전히 실패합니다.
Pere

Oracle에서는 SELECT 'Hello' FROM dual WHERE 1=1하위 쿼리를 건너 뛸 수 있기 때문에 더 간단 합니다.
DomingoR

OP SELECTFROM절 없이 명령문 (즉, a ) 을 가질 수 있는지 물었습니다 . 질문을 읽지 않았습니까?
Pere

나는 질문을 읽었다하지만 당신은 완전히 SQL에 경험이 (또는 다른 답변을 읽지 않은)하지 않는 한 당신은 당신이 할 수없는 것을 알고 WHERE없이 FROM. 이를 감안할 때 나는 OP 질문의 첫 번째 진술에 응답했습니다.
DomingoR

글쎄요, 저는 컴퓨팅 학위 인 SQL 분야에서 15 년 이상의 경험을 가지고 있으며 이제 WHERE표준 SQL이 있는지 기억하지 못했습니다 . 다른 답변도 읽었습니다. 그건 그렇고 : 올바른 것은 당신이SELECTFROM " WHERE없이 FROM"(?)가 아니라 " 없이 가질 수 없다는 것입니다 . @DomingoR, 쿼리는 어디에서 작동합니까? 여전히 a SELECTwithout a FROM(부 쿼리에)가 있으므로 a없이 쿼리를 허용하지 않고 FROM표준 SQL에서 벗어난 쿼리 에서만 작동 하는 DBMS에서 실패 FROM하고 SELECT. 그래서 당신의 대답은 아무 소용이 없습니다.
Pere

0

저는 파이어 버드를 사용하고 있습니다. 먼저 "NoTable"이라는 하나의 열 테이블을 다음과 같이 만듭니다.

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

이제 이것을 쓸 수 있습니다

select 'hello world' as name

주목할만한

표시하려는 열을 추가 할 수 있습니다.


0

DB2의 경우 :

`VALUES('Hello world')`

여러 "행"을 수행 할 수도 있습니다.

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

유형이 일치하는 한 조인에서 사용할 수도 있습니다.

VALUES(1,'Hello world')
UNION ALL
VALUES(2,'Goodbye world');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.