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:
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 )
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.
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.
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.
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"WHERE1=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.
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:
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
WHERE1=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.
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"
CREATETABLE NOTABLE
(
NOCOLUMN INTEGER
);INSERTINTO 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
FROM NULL
zwischenSELECT
und braucheWHERE
. 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.Antworten:
Es ist nicht herstellerübergreifend konsistent - Oracle, MySQL und DB2 unterstützen Dual:
... während SQL Server, PostgreSQL und SQLite nicht Folgendes benötigen
FROM DUAL
:MySQL unterstützt beide Möglichkeiten.
quelle
DUAL
und Abfragen aus einer phantomähnlichen Tabelle auszuführen.In Oracle :
Duales Äquivalent in SQL Server :
quelle
WHERE (SELECT ... )
danach abgeben?Versuche dies.
Single:
Multi:
Weitere Details hier: http://modern-sql.com/use-case/select-without-from
quelle
WHERE 1 = 1
? Auf PostgreSQL funktioniert ohne. Oder handelt es sich um ein anderes DMBS?SELECT * FROM (VALUES ("Hello world")) t1 (col1)
noch gut.Where
Beantworten Sie einfach diese Frage.SELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
Geben Sie im SQL Server Folgendes ein:
Die Klausel
FROM
oder ist nicht erforderlichWHERE
.quelle
Sie können. Ich verwende die folgenden Zeilen in einer StackExchange Data Explorer-Abfrage :
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:
quelle
Hier ist die vollständigste Liste der Datenbankunterstützung von Dual von https://blog.jooq.org/tag/dual-table/ :
quelle
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.
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: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.
quelle
In Standard SQL ist Nr. Eine
WHERE
Klausel impliziert einen Tabellenausdruck.Aus der SQL-92-Spezifikation:
Im Gegenzug:
Eine Standardmethode (dh sollte auf jedem SQL-Produkt funktionieren):
... vorausgesetzt, Sie möchten die
WHERE
Klausel in etwas aussagekräftigeres ändern , andernfalls kann sie weggelassen werden.quelle
SELECT
Klausel nur Konstanten enthält und es sichAnyTableWithOneOrMoreRows
um eine gespeicherte Tabelle handelt, und daher lediglich Statistiken verwendet, um zu überprüfen, ob die Tabelle vorhanden ist Null Zeilen.Es gibt noch eine andere Möglichkeit - Standalone
VALUES()
:Ausgabe:
Dies ist nützlich, wenn Sie mehrere Werte auf kompakte Weise angeben müssen:
Ausgabe:
DBFiddle Demo
Diese Syntax wird von SQLite / PostgreSQL / DB LUW / MariaDB 10.3 unterstützt.
quelle
Für ClickHouse ist das Nichts
system.one
quelle
In Firebird können Sie Folgendes tun:
RDB $ DATABASE ist eine spezielle Tabelle, die immer eine Zeile enthält.
quelle
Ich weiß, dass dies eine alte Frage ist, aber die beste Problemumgehung für Ihre Frage ist die Verwendung einer Dummy-Unterabfrage:
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.
quelle
SELECT
ohneFROM
in Ihrer Unterabfrage, so dass es in Oracle usw. immer noch fehlschlägt.SELECT 'Hello' FROM dual WHERE 1=1
die Unterabfrage einfach überspringen können.SELECT
) ohneFROM
Klausel abzugeben . Hast du die Frage nicht gelesen?WHERE
könnenFROM
. Vor diesem Hintergrund antwortete ich auf die erste Erklärung der OP-Frage.WHERE
Standard-SQL ist. Ich habe auch andere Antworten gelesen. Übrigens: Das Richtige ist, dass man keinSELECT
ohne haben kannFROM
, kein "WHERE
ohneFROM
" (?). Wo funktioniert Ihre Abfrage, @DomingoR? Es hat immer noch einSELECT
ohne aFROM
(in der Unterabfrage) und schlägt daher bei DBMS fehl, die keine Abfragen ohne a zulassenFROM
und nur bei solchen arbeiten, die von Standard-SQL abweichen und kein aFROM
in der zulassenSELECT
. Ihre Antwort dient also nichts.Ich verwende Firebird. Erstellen Sie zunächst eine einspaltige Tabelle mit dem Namen "NoTable"
Jetzt kannst du das schreiben
von bemerkenswert
Sie können jede Spalte hinzufügen, die angezeigt werden soll
quelle
Für DB2:
Sie können auch mehrere "Zeilen" erstellen:
Sie können sie sogar in Joins verwenden, solange die Typen übereinstimmen:
quelle