Czy można mieć takie oświadczenie
SELECT "Hello world"
WHERE 1 = 1
w SQL?
Najważniejsze, co chcę wiedzieć, to czy mogę WYBIERAĆ z niczego, tj. Nie mam klauzuli FROM.
Czy można mieć takie oświadczenie
SELECT "Hello world"
WHERE 1 = 1
w SQL?
Najważniejsze, co chcę wiedzieć, to czy mogę WYBIERAĆ z niczego, tj. Nie mam klauzuli FROM.
FROM NULL
między SELECT
a WHERE
. Niejasne sformułowania, głównie dlatego, że to praca domowa i nie chciałem, aby ktoś przyszedł i powiedział mi odpowiedź, jeśli moje przeczucia były złe.
Odpowiedzi:
To nie jest spójne u różnych dostawców - Oracle, MySQL i DB2 obsługują podwójnie:
SELECT 'Hello world'
FROM DUAL
... podczas gdy SQL Server, PostgreSQL i SQLite nie wymagają FROM DUAL
:
SELECT 'Hello world'
MySQL obsługuje oba sposoby.
DUAL
i wykonywać zapytania z tabeli podobnej do fantomu.
Spróbuj tego.
Pojedynczy:
SELECT * FROM (VALUES ('Hello world')) t1 (col1) WHERE 1 = 1
Wielo:
SELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
więcej szczegółów tutaj: http://modern-sql.com/use-case/select-without-from
WHERE 1 = 1
? Na PostgreSQL działa bez niego. A może dotyczy innego DMBS?
SELECT * FROM (VALUES ("Hello world")) t1 (col1)
nadal dobrze. Where
odpowiedz tylko na to pytanie.
SELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
Oto najpełniejsza lista obsługi bazy danych dual z https://blog.jooq.org/tag/dual-table/ :
W wielu innych RDBMS nie ma potrzeby stosowania fikcyjnych tabel, ponieważ można wydawać takie instrukcje:
SELECT 1; SELECT 1 + 1; SELECT SQRT(2);
Są to RDBMS, w których powyższe jest ogólnie możliwe:
- H2
- MySQL
- Ingres
- Postgres
- SQLite
- SQL Server
- Sybase ASE
W innych RDBMS wymagane są fikcyjne tabele, tak jak w Oracle. Dlatego musisz napisać takie rzeczy:
SELECT 1 FROM DUAL; SELECT 1 + 1 FROM DUAL; SELECT SQRT(2) FROM DUAL;
Oto RDBMS i odpowiadające im fikcyjne tabele:
- DB2: SYSIBM.DUAL
- Derby: SYSIBM.SYSDUMMY1
- H2: Opcjonalnie obsługuje DUAL
- HSQLDB: INFORMATION_SCHEMA.SYSTEM_USERS
- MySQL: Opcjonalnie obsługuje DUAL
- Wyrocznia: DUAL
- Sybase SQL Anywhere: SYS.DUMMY
Ingres nie ma DUAL, ale w rzeczywistości by go potrzebował, ponieważ w Ingres nie możesz mieć klauzuli WHERE, GROUP BY lub HAVING bez klauzuli FROM.
Możesz. Używam następujących wierszy w kwerendzie 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
Wymiana danych używa języka Transact-SQL (zastrzeżone rozszerzenia SQL Server do SQL).
Możesz spróbować samemu, uruchamiając zapytanie takie jak:
SELECT 'Hello world'
Myślę, że to niemożliwe. Teoretycznie: funkcja select wykonuje dwa rodzaje rzeczy:
zawęzić / poszerzyć zbiór (teoria mnogości);
mapowanie wyniku.
Pierwsza może być postrzegana jako poziome zmniejszanie, w przeciwieństwie do klauzuli gdzie, które można postrzegać jako pionowe zmniejszanie. Z drugiej strony złączenie może zwiększyć zestaw w poziomie, podczas gdy połączenie może zwiększyć zestaw w pionie.
augmentation diminishing
horizontal join/select select
vertical union where/inner-join
Drugi to mapowanie. Mapowanie jest bardziej konwerterem. W SQL zajmuje kilka pól i zwraca zero lub więcej pól. W polu wyboru możesz użyć niektórych funkcji agregujących, takich jak suma, średnia itp. Lub wziąć wszystkie wartości kolumn i przekonwertować je na ciąg. W C # linq mówimy, że selekcja akceptuje obiekt typu T i zwraca obiekt typu U.
Myślę, że zamieszanie chodzi o fakt, że można zrobić: select 'howdy' from <table_name>
. Ta funkcja to mapowanie, część konwertera zaznaczania. Nie drukujesz czegoś, tylko konwertujesz! W twoim przykładzie:
SELECT "
WHERE 1 = 1
konwertujesz nic / wartość null na "Hello world"
i zawężasz zbiór nic / brak tabeli do jednego wiersza, co nie ma żadnego sensu.
Możesz zauważyć, że jeśli nie ograniczysz liczby kolumn, "Hello world"
zostanie wydrukowany dla każdego dostępnego wiersza w tabeli. Mam nadzieję, że już teraz rozumiesz, dlaczego. Twój wybór nie pobiera nic z dostępnych kolumn i tworzy jedną kolumnę z tekstem:"Hello world"
.
Więc moja odpowiedź brzmi NIE. Nie można po prostu pominąć klauzuli from, ponieważ funkcja select zawsze wymaga kolumn tabeli.
W standardowym SQL nie. WHERE
Klauzula oznacza wyrażenie stołowego.
Ze specyfikacji SQL-92:
7.6 "klauzula gdzie"
Funkcjonować
Określ tabelę utworzoną przez zastosowanie „warunku wyszukiwania” do wyniku poprzedniej klauzuli „from”.
Z kolei:
7.4 „z klauzuli”
Funkcjonować
Określ tabelę pochodzącą z jednej lub więcej nazwanych tabel.
Standardowy sposób na zrobienie tego (tzn. Powinien działać na każdym produkcie SQL):
SELECT DISTINCT 'Hello world' AS new_value
FROM AnyTableWithOneOrMoreRows
WHERE 1 = 1;
... zakładając, że chcesz zmienić WHERE
klauzulę na coś bardziej znaczącego, w przeciwnym razie można ją pominąć.
SELECT
klauzulę zawierającą tylko stałe i AnyTableWithOneOrMoreRows
jest to tabela przechowywana, dlatego wykorzystuje tylko statystyki do sprawdzenia, czy tabela ma zero wierszy.
Jest jeszcze jedna możliwość - samodzielna VALUES()
:
VALUES ('Hello World');
Wynik:
column1
Hello World
Jest to przydatne, gdy musisz określić wiele wartości w zwięzły sposób:
VALUES (1, 'a'), (2, 'b'), (3, 'c');
Wynik:
column1 column2
1 a
2 b
3 c
Ta składnia jest obsługiwana przez SQLite / PostgreSQL / DB LUW / MariaDB 10.3.
Wiem, że to stare pytanie, ale najlepszym sposobem obejścia tego pytania jest użycie fikcyjnego podzapytania:
SELECT 'Hello World'
FROM (SELECT name='Nothing') n
WHERE 1=1
W ten sposób możesz mieć WHERE i dowolną klauzulę (taką jak Joins lub Apply itp.) Po instrukcji select, ponieważ fikcyjne podzapytanie wymusza użycie klauzuli FROM bez zmiany wyniku.
SELECT
bez a FROM
, więc w Oracle nadal nie powiedzie się itd.
SELECT 'Hello' FROM dual WHERE 1=1
pominąć podzapytanie.
SELECT
) bez FROM
klauzuli. Nie przeczytałeś pytania?
WHERE
bez FROM
. Mając to na uwadze, odpowiedziałem na pierwsze stwierdzenie pytania PO.
WHERE
standardowy SQL. Czytałem też inne odpowiedzi. Swoją drogą: właściwe jest to, że nie możesz mieć a SELECT
bez aFROM
, a nie „ WHERE
bez FROM
” (?). Gdzie działa Twoje zapytanie, @DomingoR? Nadal ma a SELECT
bez a FROM
(w podzapytaniu), więc zawodzi na tych DBMS, które nie pozwalają na tworzenie zapytań bez a FROM
i działają tylko na tych, które odbiegają od standardowego SQL i pozwalają nie mieć FROM
w SELECT
. Więc twoja odpowiedź nic nie da.
Używam firebird. Przede wszystkim utwórz tabelę z jedną kolumną o nazwie „NoTable” w ten sposób
CREATE TABLE NOTABLE
(
NOCOLUMN INTEGER
);
INSERT INTO NOTABLE VALUES (0); -- You can put any value
teraz możesz to napisać
select 'hello world' as name
od godnych uwagi
możesz dodać dowolną kolumnę, która ma być wyświetlana