Est-il possible d'avoir une déclaration comme
SELECT "Hello world"
WHERE 1 = 1
en SQL?
La principale chose que je veux savoir, c'est que je peux SELECT à partir de rien, c'est-à-dire ne pas avoir de clause FROM.
Est-il possible d'avoir une déclaration comme
SELECT "Hello world"
WHERE 1 = 1
en SQL?
La principale chose que je veux savoir, c'est que je peux SELECT à partir de rien, c'est-à-dire ne pas avoir de clause FROM.
FROM NULL
entre SELECT
et WHERE
. Formulation obscure principalement parce que ce sont des devoirs et que je ne voulais pas que quelqu'un vienne me dire la réponse si mon instinct était faux.
Réponses:
Ce n'est pas cohérent entre les fournisseurs - Oracle, MySQL et DB2 prennent en charge le double:
SELECT 'Hello world'
FROM DUAL
... alors que SQL Server, PostgreSQL et SQLite ne nécessitent pas FROM DUAL
:
SELECT 'Hello world'
MySQL prend en charge les deux méthodes.
DUAL
et d'effectuer des requêtes à partir d'une table de type fantôme.
Dans Oracle :
SELECT 'Hello world' FROM dual
Double équivalent dans SQL Server :
SELECT 'Hello world'
WHERE (SELECT ... )
après?
Essaye ça.
Célibataire:
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
plus de détails ici: http://modern-sql.com/use-case/select-without-from
WHERE 1 = 1
? Sur PostgreSQL fonctionne sans cela. Ou cela concerne-t-il un autre DMBS?
SELECT * FROM (VALUES ("Hello world")) t1 (col1)
encore bien. Where
répondez simplement à cette question.
SELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
Voici la liste la plus complète du support de base de données de dual à partir de https://blog.jooq.org/tag/dual-table/ :
Dans de nombreux autres SGBDR, il n'y a pas besoin de tables factices, car vous pouvez émettre des instructions comme celles-ci:
SELECT 1; SELECT 1 + 1; SELECT SQRT(2);
Voici le SGBDR, où ce qui précède est généralement possible:
- H2
- MySQL
- Ingres
- Postgres
- SQLite
- serveur SQL
- Sybase ASE
Dans d'autres SGBDR, des tables factices sont requises, comme dans Oracle. Par conséquent, vous devrez écrire des choses comme celles-ci:
SELECT 1 FROM DUAL; SELECT 1 + 1 FROM DUAL; SELECT SQRT(2) FROM DUAL;
Voici le SGBDR et leurs tables factices respectives:
- DB2: SYSIBM.DUAL
- Derby: SYSIBM.SYSDUMMY1
- H2: prend en charge en option DUAL
- HSQLDB: INFORMATION_SCHEMA.SYSTEM_USERS
- MySQL: prend en charge DUAL en option
- Oracle: DUAL
- Sybase SQL Anywhere: SYS.DUMMY
Ingres n'a pas de DUAL, mais en aurait réellement besoin car dans Ingres vous ne pouvez pas avoir de clause WHERE, GROUP BY ou HAVING sans clause FROM.
Vous pouvez. J'utilise les lignes suivantes dans une requête 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
L'échange de données utilise Transact-SQL (les extensions propriétaires SQL Server de SQL).
Vous pouvez l'essayer vous-même en exécutant une requête comme:
SELECT 'Hello world'
Je pense que ce n’est pas possible. Théoriquement: select effectue deux sortes de choses:
rétrécir / élargir l'ensemble (théorie des ensembles);
cartographie du résultat.
La première peut être vue comme une diminution horizontale opposée à la clause where qui peut être vue comme une diminution verticale. D'un autre côté, une jointure peut augmenter l'ensemble horizontalement alors qu'une union peut augmenter l'ensemble verticalement.
augmentation diminishing
horizontal join/select select
vertical union where/inner-join
Le second est une cartographie. Une cartographie, c'est plus un convertisseur. En SQL, il prend certains champs et renvoie zéro ou plusieurs champs. Dans la sélection, vous pouvez utiliser certaines fonctions d'agrégation comme, sum, avg etc. Ou prendre toutes les valeurs de colonne et les convertir en chaîne. En C # linq, on dit qu'un select accepte un objet de type T et renvoie un objet de type U.
Je pense que la confusion vient du fait que vous pouvez faire: select 'howdy' from <table_name>
. Cette fonctionnalité est le mappage, la partie convertisseur de la sélection. Vous n'imprimez pas quelque chose, mais vous convertissez! Dans votre exemple:
SELECT "
WHERE 1 = 1
vous convertissez rien / null en "Hello world"
et vous réduisez l'ensemble de rien / pas de table en une seule ligne, ce qui, à mon avis, n'a aucun sens.
Vous remarquerez peut-être que, si vous ne contraignez pas le nombre de colonnes, "Hello world"
est imprimé pour chaque ligne disponible dans le tableau. J'espère, vous comprenez pourquoi maintenant. Votre sélection ne prend rien aux colonnes et crée une colonne avec le texte disponible: "Hello world"
.
Donc, ma réponse est NON. Vous ne pouvez pas simplement omettre la clause from car la sélection a toujours besoin de colonnes de table pour fonctionner.
En SQL standard, non. Une WHERE
clause implique une expression de table.
À partir de la spécification SQL-92:
7.6 "clause where"
Fonction
Spécifiez une table dérivée de l'application d'une "condition de recherche" au résultat de la "clause from" précédente.
À son tour:
7.4 "de la clause"
Fonction
Spécifiez une table dérivée d'une ou de plusieurs tables nommées.
Une manière standard de le faire (c'est-à-dire qui devrait fonctionner sur n'importe quel produit SQL):
SELECT DISTINCT 'Hello world' AS new_value
FROM AnyTableWithOneOrMoreRows
WHERE 1 = 1;
... en supposant que vous vouliez changer la WHERE
clause en quelque chose de plus significatif, sinon elle peut être omise.
SELECT
clause comprend uniquement des constantes et c'est AnyTableWithOneOrMoreRows
une table stockée, donc utilise simplement des statistiques pour vérifier si la table a zéro ligne.
Il existe une autre possibilité - autonome VALUES()
:
VALUES ('Hello World');
Production:
column1
Hello World
C'est utile lorsque vous devez spécifier plusieurs valeurs de manière compacte:
VALUES (1, 'a'), (2, 'b'), (3, 'c');
Production:
column1 column2
1 a
2 b
3 c
Cette syntaxe est prise en charge par SQLite / PostgreSQL / DB LUW / MariaDB 10.3.
Je sais que c'est une vieille question, mais la meilleure solution de contournement pour votre question consiste à utiliser une sous-requête factice:
SELECT 'Hello World'
FROM (SELECT name='Nothing') n
WHERE 1=1
De cette façon, vous pouvez avoir WHERE et n'importe quelle clause (comme Joins ou Apply, etc.) après l'instruction select car la sous-requête factice force l'utilisation de la clause FROM sans modifier le résultat.
SELECT
sans a FROM
dans votre sous-requête, il échouera donc toujours dans Oracle, etc.
SELECT 'Hello' FROM dual WHERE 1=1
ignorer la sous-requête.
SELECT
) sans FROM
clause. N'avez-vous pas lu la question?
WHERE
passer FROM
. Compte tenu de cela, j'ai répondu à la première déclaration de la question du PO.
WHERE
SQL standard. J'ai lu d'autres réponses aussi. Au fait: la bonne chose est que vous ne pouvez pas avoir un SELECT
sans unFROM
, pas un WHERE
sans FROM
(?) Où fonctionne votre requête, @DomingoR? Il a toujours un SELECT
sans a FROM
(dans la sous-requête), échouant ainsi sur les SGBD qui ne permettent pas d'avoir des requêtes sans a FROM
et de travailler uniquement sur celles qui s'écartent du SQL standard et permettent de ne pas avoir FROM
de SELECT
. Donc votre réponse ne sert à rien.
J'utilise Firebird Tout d'abord, créez une table à une colonne nommée "NoTable" comme ceci
CREATE TABLE NOTABLE
(
NOCOLUMN INTEGER
);
INSERT INTO NOTABLE VALUES (0); -- You can put any value
maintenant tu peux écrire ça
select 'hello world' as name
de notable
vous pouvez ajouter n'importe quelle colonne que vous souhaitez afficher