Aus dem Nichts auswählen?

87

Ist es möglich, eine Aussage wie zu haben

SELECT "Hello world"
WHERE 1 = 1

in SQL?

Die Hauptsache, die ich wissen möchte, ist, ob ich aus dem Nichts AUSWÄHLEN kann, dh keine FROM-Klausel habe.

Ritwik Bose
quelle
3
Wenn Sie sich Ihren Kommentar zu @Rafael Belliard ansehen, sollten Sie besser fragen, was Sie tatsächlich tun möchten. Möchten Sie eine Zeichenfolge zurückgeben, wenn beispielsweise Werte für eine bestimmte Tabelle vorhanden sind?
Jim L
Ja, genau das wollte ich. Ich weiß, dass ich es schaffen kann, ich habe mich mehr gefragt, ob ich ein FROM NULLzwischen SELECTund brauche WHERE. Obskure Phrasierung hauptsächlich, weil es Hausaufgaben sind und ich nicht wollte, dass jemand kommt und mir die Antwort sagt, wenn mein Bauchgefühl falsch war.
Ritwik Bose

Antworten:

137

Es ist nicht herstellerübergreifend konsistent - Oracle, MySQL und DB2 unterstützen Dual:

SELECT 'Hello world'
  FROM DUAL

... während SQL Server, PostgreSQL und SQLite nicht Folgendes benötigen FROM DUAL:

SELECT 'Hello world'

MySQL unterstützt beide Möglichkeiten.

OMG Ponys
quelle
2
Ich habe mich immer gefragt. Warum die Wahl des Begriffs Dual für die Phantomtabelle?
Alex Blakemore
5
@Alex: "Die ursprüngliche DUAL-Tabelle enthielt zwei Zeilen (daher der Name), anschließend jedoch nur eine Zeile."
Rebelli
7
Auf DB2 heißt Dual 'sysibm.sysdummy1'
Danubian Sailor
1
In Postgresql ist es möglich, eine aufgerufene Dummy-Tabelle zu erstellen DUALund Abfragen aus einer phantomähnlichen Tabelle auszuführen.
Stephan
1
@AlexBlakemore "Ich habe die DUAL-Tabelle als zugrunde liegendes Objekt im Oracle Data Dictionary erstellt. Sie sollte nie selbst gesehen werden, sondern in einer Ansicht verwendet werden, von der erwartet wurde, dass sie abgefragt wird. Die Idee war, dass Sie einen JOIN-Vorgang ausführen können die DUAL-Tabelle und erstellen Sie zwei Zeilen im Ergebnis für jede einzelne Zeile in Ihrer Tabelle. Mithilfe von GROUP BY kann der resultierende Join dann zusammengefasst werden, um die Speichermenge für die DATA-Erweiterung und die INDEX-Erweiterung (en) anzuzeigen. Der Name DUAL schien für den Prozess des Erstellens eines Zeilenpaars aus nur einer geeignet zu sein "( en.wikipedia.org/wiki/DUAL_table )
Klicken Sie
28

In Oracle :

SELECT 'Hello world' FROM dual

Duales Äquivalent in SQL Server :

SELECT 'Hello world' 
Rebellier
quelle
1
Könnte ich eine Erklärung wie WHERE (SELECT ... )danach abgeben?
Ritwik Bose
12

Versuche dies.

Single:

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

Multi:

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

Weitere Details hier: http://modern-sql.com/use-case/select-without-from

chuongtv
quelle
1
Die einzige ANSI SQL-konforme Antwort! (Auf eine Frage ohne dbms angegeben.)
jarlh
Was ist der Zweck von WHERE 1 = 1? Auf PostgreSQL funktioniert ohne. Oder handelt es sich um ein anderes DMBS?
Frankie Drake
Nur SELECT * FROM (VALUES ("Hello world")) t1 (col1)noch gut. WhereBeantworten Sie einfach diese Frage.
Chuongtv
@chuongtv Wie wählt man mehrere Zeilen aus?
Hector
@Hector Folgen Sie einfach der Struktureinfügung von SQL. soSELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
chuongtv
6

Geben Sie im SQL Server Folgendes ein:

Select 'Your Text'

Die Klausel FROModer ist nicht erforderlich WHERE.

RollTide
quelle
5

Sie können. Ich verwende die folgenden Zeilen in einer StackExchange Data Explorer-Abfrage :

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

Der Datenaustausch verwendet Transact-SQL (die proprietären SQL Server-Erweiterungen für SQL).

Sie können es selbst versuchen, indem Sie eine Abfrage wie folgt ausführen:

SELECT 'Hello world'
palswim
quelle
Der Datenaustausch ist Azure und basiert auf SQL Server.
OMG Ponys
5

Hier ist die vollständigste Liste der Datenbankunterstützung von Dual von https://blog.jooq.org/tag/dual-table/ :

In vielen anderen RDBMS sind keine Dummy-Tabellen erforderlich, da Sie folgende Anweisungen ausgeben können:

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

Dies sind die RDBMS, bei denen Folgendes im Allgemeinen möglich ist:

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

In anderen RDBMS sind Dummy-Tabellen erforderlich, wie in Oracle. Daher müssen Sie folgende Dinge schreiben:

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

Dies sind das RDBMS und ihre jeweiligen Dummy-Tabellen:

  • DB2: SYSIBM.DUAL
  • Derby: SYSIBM.SYSDUMMY1
  • H2: Unterstützt optional DUAL
  • HSQLDB: INFORMATION_SCHEMA.SYSTEM_USERS
  • MySQL: Unterstützt optional DUAL
  • Oracle: DUAL
  • Sybase SQL Anywhere: SYS.DUMMY

Ingres hat kein DUAL, würde es aber tatsächlich benötigen, da Sie in Ingres keine WHERE-, GROUP BY- oder HAVING-Klausel ohne FROM-Klausel haben können.

Vadzim
quelle
2

Ich denke es ist nicht möglich. Theoretisch: select führt zwei Arten von Dingen aus:

  • die Menge einschränken / erweitern (Mengenlehre);

  • Abbildung des Ergebnisses.

Die erste kann als horizontale Abnahme angesehen werden, im Gegensatz zu der where-Klausel, die als vertikale Abnahme angesehen werden kann. Andererseits kann eine Verknüpfung die Menge horizontal erweitern, während eine Vereinigung die Menge vertikal erweitern kann.

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

Der zweite ist ein Mapping. Ein Mapping ist eher ein Konverter. In SQL werden einige Felder verwendet und null oder mehr Felder zurückgegeben. In der Auswahl können Sie einige Aggregatfunktionen wie sum, avg usw. verwenden. Oder Sie können alle Spaltenwerte verwenden und sie in Zeichenfolgen konvertieren. In C # linq sagen wir, dass eine Auswahl ein Objekt vom Typ T akzeptiert und ein Objekt vom Typ U zurückgibt.

Ich denke, die Verwirrung kommt von der Tatsache, dass Sie tun können : select 'howdy' from <table_name>. Diese Funktion ist das Mapping, der Konverterteil der Auswahl. Sie drucken nicht etwas, sondern konvertieren! In Ihrem Beispiel:

SELECT "
WHERE 1 = 1

Sie konvertieren nichts / null in "Hello world"und Sie schränken die Menge von nichts / keine Tabelle in eine Zeile ein, was imho überhaupt keinen Sinn ergibt.

Möglicherweise stellen Sie fest, dass "Hello world"für jede verfügbare Zeile in der Tabelle gedruckt wird , wenn Sie die Anzahl der Spalten nicht einschränken . Ich hoffe, Sie verstehen jetzt warum. Ihre Auswahl nimmt nichts aus den verfügbaren Spalten und erstellt eine Spalte mit dem Text : "Hello world".

Meine Antwort lautet also NEIN. Sie können die from-Klausel nicht einfach weglassen, da für die Auswahl immer Tabellenspalten erforderlich sind.

Andries
quelle
2

In Standard SQL ist Nr. Eine WHEREKlausel impliziert einen Tabellenausdruck.

Aus der SQL-92-Spezifikation:

7.6 "where-Klausel"

Funktion

Geben Sie eine Tabelle an, die durch Anwendung einer "Suchbedingung" auf das Ergebnis der vorhergehenden "from-Klausel" abgeleitet wurde.

Im Gegenzug:

7.4 "aus Klausel"

Funktion

Geben Sie eine Tabelle an, die von einer oder mehreren benannten Tabellen abgeleitet ist.

Eine Standardmethode (dh sollte auf jedem SQL-Produkt funktionieren):

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

... vorausgesetzt, Sie möchten die WHEREKlausel in etwas aussagekräftigeres ändern , andernfalls kann sie weggelassen werden.

eines Tages, wenn
quelle
FEHLER: Spalte "Hallo Welt" existiert nicht in my_table Abfrage fehlgeschlagen PostgreSQL sagte: Spalte "Hallo Welt" existiert nicht in my_table
Pål Brattberg
@ PålBrattberg: sollte in einfachen Anführungszeichen stehen, jetzt behoben.
Tag, wenn der
Ist es wichtig, welche Tabelle in Bezug auf die Verarbeitungszeit verwendet wird? Oder macht die Tatsache, dass SELECT auf keine der Spalten verweist, die eigentliche Tabelle irrelevant?
Allen Gould
@AllenGould: Es wäre "herstellerabhängig", aber es gibt offensichtliche Kurzschlüsse, die ausgenutzt werden könnten, z. B. wenn der Optimierer erkennt, dass die SELECTKlausel nur Konstanten enthält und es sich AnyTableWithOneOrMoreRowsum eine gespeicherte Tabelle handelt, und daher lediglich Statistiken verwendet, um zu überprüfen, ob die Tabelle vorhanden ist Null Zeilen.
Tag, wenn
2

Es gibt noch eine andere Möglichkeit - Standalone VALUES():

VALUES ('Hello World');

Ausgabe:

column1
Hello World

Dies ist nützlich, wenn Sie mehrere Werte auf kompakte Weise angeben müssen:

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

Ausgabe:

column1     column2
      1     a
      2     b
      3     c

DBFiddle Demo

Diese Syntax wird von SQLite / PostgreSQL / DB LUW / MariaDB 10.3 unterstützt.

Lukasz Szozda
quelle
2

Für ClickHouse ist das Nichts system.one

SELECT 1 FROM system.one
simPod
quelle
1

In Firebird können Sie Folgendes tun:

select "Hello world" from RDB$DATABASE;

RDB $ DATABASE ist eine spezielle Tabelle, die immer eine Zeile enthält.

Robyn
quelle
0

Ich weiß, dass dies eine alte Frage ist, aber die beste Problemumgehung für Ihre Frage ist die Verwendung einer Dummy-Unterabfrage:

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

Auf diese Weise können Sie WHERE und eine beliebige Klausel (wie Joins oder Apply usw.) nach der select-Anweisung haben, da die Dummy-Unterabfrage die Verwendung der FROM-Klausel erzwingt, ohne das Ergebnis zu ändern.

DomingoR
quelle
1
Sie haben immer noch ein SELECTohne FROMin Ihrer Unterabfrage, so dass es in Oracle usw. immer noch fehlschlägt.
Pere
In Oracle ist dies sogar noch einfacher, da Sie SELECT 'Hello' FROM dual WHERE 1=1die Unterabfrage einfach überspringen können.
DomingoR
Das OP fragte, ob es möglich sei, eine Erklärung (nämlich a SELECT) ohne FROMKlausel abzugeben . Hast du die Frage nicht gelesen?
Pere
Ich habe die Frage gelesen, aber wenn Sie nicht völlig unerfahren in SQL sind (oder keine anderen Antworten gelesen haben), wissen Sie, dass Sie ohne nicht auskommen WHEREkönnen FROM. Vor diesem Hintergrund antwortete ich auf die erste Erklärung der OP-Frage.
DomingoR
Nun, ich habe mehr als 15 Jahre Erfahrung in SQL, einem Computing-Abschluss, und habe mich nicht daran erinnert, ob es jetzt WHEREStandard-SQL ist. Ich habe auch andere Antworten gelesen. Übrigens: Das Richtige ist, dass man kein SELECTohne haben kannFROM , kein " WHEREohne FROM" (?). Wo funktioniert Ihre Abfrage, @DomingoR? Es hat immer noch ein SELECTohne a FROM(in der Unterabfrage) und schlägt daher bei DBMS fehl, die keine Abfragen ohne a zulassen FROMund nur bei solchen arbeiten, die von Standard-SQL abweichen und kein a FROMin der zulassen SELECT. Ihre Antwort dient also nichts.
Pere
0

Ich verwende Firebird. Erstellen Sie zunächst eine einspaltige Tabelle mit dem Namen "NoTable"

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

Jetzt kannst du das schreiben

select 'hello world' as name

von bemerkenswert

Sie können jede Spalte hinzufügen, die angezeigt werden soll

Yous Athmane
quelle
0

Für DB2:

`VALUES('Hello world')`

Sie können auch mehrere "Zeilen" erstellen:

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

Sie können sie sogar in Joins verwenden, solange die Typen übereinstimmen:

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