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.
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.
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.
Antworten:
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.
DUALund Abfragen aus einer phantomähnlichen Tabelle auszuführen.
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
WHERE 1 = 1? Auf PostgreSQL funktioniert ohne. Oder handelt es sich um ein anderes DMBS?
SELECT * FROM (VALUES ("Hello world")) t1 (col1)noch gut. WhereBeantworten Sie einfach diese Frage.
SELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
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'
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.
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.
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.
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.
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
Diese Syntax wird von SQLite / PostgreSQL / DB LUW / MariaDB 10.3 unterstützt.
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.
SELECTohne FROMin Ihrer Unterabfrage, so dass es in Oracle usw. immer noch fehlschlägt.
SELECT 'Hello' FROM dual WHERE 1=1die Unterabfrage einfach überspringen können.
SELECT) ohne FROMKlausel abzugeben . Hast du die Frage nicht gelesen?
WHEREkönnen FROM. Vor diesem Hintergrund antwortete ich auf die erste Erklärung der OP-Frage.
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.
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