Melihat komentar Anda di @Rafael Belliard, mungkin lebih baik Anda menanyakan apa yang sebenarnya ingin Anda lakukan. Apakah Anda ingin mengembalikan beberapa string jika ada nilai untuk tabel tertentu misalnya?
Jim L
Ya, sebenarnya itulah yang saya inginkan. Saya tahu bahwa saya bisa melakukannya, saya lebih bertanya-tanya apakah saya membutuhkan FROM NULLantara SELECTdan WHERE. Ungkapan yang tidak jelas terutama karena ini pekerjaan rumah dan saya tidak ingin seseorang datang dan memberi tahu saya jawabannya jika firasat saya salah.
Ritwik Bose
Jawaban:
141
Ini tidak konsisten di semua vendor - Oracle, MySQL, dan DB2 mendukung dual:
SELECT'Hello world'FROM DUAL
... sementara SQL Server, PostgreSQL, dan SQLite tidak memerlukan FROM DUAL:
Saya selalu bertanya-tanya. Mengapa pilihan istilah dual untuk phantom table?
Alex Blakemore
5
@Alex: "Tabel DUAL asli memiliki dua baris di dalamnya (karena itu namanya), tetapi kemudian hanya memiliki satu baris."
rebelliard
7
Pada DB2 ganda disebut 'sysibm.sysdummy1'
Danubian Sailor
1
Di Postgresql, dimungkinkan untuk membuat tabel dummy yang disebut DUALdan melakukan kueri dari tabel mirip-hantu.
Stephan
1
@AlexBlakemore "Saya membuat tabel DUAL sebagai objek dasar dalam Oracle Data Dictionary. Itu tidak pernah dimaksudkan untuk dilihat sendiri, tetapi digunakan di dalam tampilan yang diharapkan akan ditanyakan. Idenya adalah Anda dapat melakukan GABUNG untuk tabel DUAL dan buat dua baris dalam hasil untuk setiap baris dalam tabel Anda. Kemudian, dengan menggunakan GROUP BY, gabungan yang dihasilkan dapat diringkas untuk menunjukkan jumlah penyimpanan untuk tingkat DATA dan untuk tingkat INDEX. Nama, DUAL, sepertinya tepat untuk proses membuat sepasang baris dari hanya satu "( en.wikipedia.org/wiki/DUAL_table )
Di banyak RDBMS lainnya, tidak diperlukan tabel dummy, karena Anda dapat mengeluarkan pernyataan seperti ini:
SELECT1;
SELECT1 + 1;
SELECTSQRT(2);
Ini adalah RDBMS, di mana hal di atas secara umum dimungkinkan:
H2
MySQL
Ingres
Postgres
SQLite
SQL Server
Sybase ASE
Di RDBMS lainnya, tabel dummy diperlukan, seperti di Oracle. Karenanya, Anda perlu menulis hal-hal seperti ini:
SELECT1FROM DUAL;
SELECT1 + 1FROM DUAL;
SELECTSQRT(2) FROM DUAL;
Ini adalah RDBMS dan tabel dummy masing-masing:
DB2: SYSIBM.DUAL
Derby: SYSIBM.SYSDUMMY1
H2: Secara opsional mendukung DUAL
HSQLDB: INFORMATION_SCHEMA.SYSTEM_USERS
MySQL: Secara opsional mendukung DUAL
Oracle: DUAL
Sybase SQL Di Mana Saja: SYS.DUMMY
Ingres tidak memiliki DUAL, tetapi sebenarnya membutuhkannya karena di Ingres Anda tidak dapat memiliki klausa WHERE, GROUP BY atau HAVING tanpa klausa FROM.
SELECT
(SELECTCOUNT(*) FROM VotesOnPosts WHERE VoteTypeName = 'UpMod'AND UserId = @UserID AND PostTypeId = 2) AS TotalUpVotes,
(SELECTCOUNT(*) FROM Answers WHERE UserId = @UserID) AS TotalAnswers
Pertukaran Data menggunakan Transact-SQL (ekstensi kepemilikan SQL Server ke SQL).
Anda dapat mencobanya sendiri dengan menjalankan kueri seperti:
Yang pertama dapat dilihat sebagai penurunan horizontal yang bertentangan dengan klausa where yang dapat dilihat sebagai penurunan vertikal. Di sisi lain, gabungan dapat menambah himpunan secara horizontal di mana gabungan dapat menambah himpunan secara vertikal.
Yang kedua adalah pemetaan. Pemetaan, lebih merupakan konverter. Dalam SQL dibutuhkan beberapa bidang dan mengembalikan nol atau lebih bidang. Dalam memilih, Anda dapat menggunakan beberapa fungsi agregat seperti, sum, avg, dll. Atau mengambil semua nilai kolom dan mengubahnya menjadi string. Di C # linq, kita katakan bahwa sebuah select menerima objek bertipe T dan mengembalikan objek bertipe U.
Saya pikir kebingungan datang oleh fakta bahwa Anda dapat melakukan: select 'howdy' from <table_name>. Fitur ini adalah pemetaan, bagian konverter pilih. Anda tidak mencetak sesuatu, tetapi mengubah! Dalam contoh Anda:
SELECT"
WHERE 1 = 1
Anda mengubah nothing / null menjadi "Hello world"dan Anda mempersempit kumpulan tabel nothing / no menjadi satu baris, yang, saya tidak masuk akal sama sekali.
Anda mungkin memperhatikan bahwa, jika Anda tidak membatasi jumlah kolom, "Hello world"dicetak untuk setiap baris yang tersedia dalam tabel. Saya harap, Anda mengerti mengapa sekarang. Anda pilih mengambil apa-apa dari kolom yang tersedia dan menciptakan satu kolom dengan teks: "Hello world".
Jadi, jawaban saya TIDAK. Anda tidak bisa begitu saja meninggalkan klausa dari karena pemilihan selalu membutuhkan kolom tabel untuk dijalankan.
EROR: kolom "hello world" tidak ada di my_table Kueri gagal PostgreSQL berkata: kolom "hello world" tidak ada di my_table
Pål Brattberg
@ PålBrattberg: seharusnya berupa tanda kutip tunggal, sekarang sudah diperbaiki.
onedaywhen
Apakah penting tabel mana yang digunakan dalam hal waktu pemrosesan? Atau apakah fakta bahwa SELECT tidak mereferensikan salah satu kolom membuat tabel sebenarnya tidak relevan?
Allen Gould
@AllenGould: itu akan menjadi 'tergantung vendor' tetapi ada hubungan pendek yang jelas yang dapat dieksploitasi misalnya satu kasus di mana pengoptimal mengenali SELECTklausa hanya terdiri dari konstanta dan itu AnyTableWithOneOrMoreRowsadalah tabel yang disimpan, oleh karena itu hanya menggunakan statistik untuk memverifikasi apakah tabel memiliki nol baris.
onedaywhen
2
Ada kemungkinan lain - mandiri VALUES():
VALUES ('Hello World');
Keluaran:
column1
Hello World
Ini berguna saat Anda perlu menentukan beberapa nilai dengan cara yang ringkas:
Saya tahu ini adalah pertanyaan lama tetapi solusi terbaik untuk pertanyaan Anda adalah menggunakan subkueri tiruan:
SELECT'Hello World'FROM (SELECTname='Nothing') n
WHERE1=1
Dengan cara ini Anda dapat memiliki WHERE dan klausa apa pun (seperti Joins atau Apply, dll.) Setelah pernyataan pemilihan karena subkueri dummy memaksa penggunaan klausa FROM tanpa mengubah hasilnya.
Anda masih memiliki SELECTtanpa a FROMdi subquery Anda, jadi masih akan gagal di Oracle, dll.
Pere
Di Oracle bahkan lebih sederhana karena Anda dapat SELECT 'Hello' FROM dual WHERE 1=1melewatkan subquery.
DomingoR
OP menanyakan apakah mungkin memiliki pernyataan (yaitu, a SELECT) tanpa FROMklausul. Apakah Anda belum membaca pertanyaannya?
Pere
Saya memang membaca pertanyaan itu tetapi kecuali Anda sama sekali tidak berpengalaman dalam SQL (atau belum membaca jawaban lain), Anda tahu bahwa Anda tidak dapat melakukannya WHEREtanpa FROM. Mengingat hal itu, saya membalas pernyataan pertama dari pertanyaan OP.
DomingoR
Yah, saya memiliki lebih dari 15 tahun pengalaman dalam SQL, gelar Komputasi dan tidak ingat apakah sekarang memiliki WHERESQL standar. Saya juga membaca jawaban lain. By the way: hal yang tepat adalah bahwa Anda tidak dapat memiliki SELECTtanpa aFROM , bukan " WHEREtanpa FROM" (?). Di mana kueri Anda bekerja, @DomingoR? Ini masih memiliki SELECTtanpa a FROM(di subquery), sehingga gagal pada DBMS yang tidak mengizinkan memiliki kueri tanpa a FROMdan hanya bekerja pada yang menyimpang dari SQL standar dan memungkinkan tidak memiliki FROMdi SELECT. Jadi jawaban Anda tidak berguna.
Pere
0
Saya menggunakan firebird Pertama-tama, buat tabel satu kolom bernama "NoTable" seperti ini
CREATETABLE NOTABLE
(
NOCOLUMN INTEGER
);
INSERTINTO NOTABLE VALUES (0); -- You can put any value
sekarang kamu bisa menulis ini
select'hello world'asname
dari terkenal
Anda dapat menambahkan kolom apa pun yang ingin Anda tampilkan
FROM NULL
antaraSELECT
danWHERE
. Ungkapan yang tidak jelas terutama karena ini pekerjaan rumah dan saya tidak ingin seseorang datang dan memberi tahu saya jawabannya jika firasat saya salah.Jawaban:
Ini tidak konsisten di semua vendor - Oracle, MySQL, dan DB2 mendukung dual:
SELECT 'Hello world' FROM DUAL
... sementara SQL Server, PostgreSQL, dan SQLite tidak memerlukan
FROM DUAL
:SELECT 'Hello world'
MySQL mendukung kedua cara tersebut.
sumber
DUAL
dan melakukan kueri dari tabel mirip-hantu.Di Oracle :
SELECT 'Hello world' FROM dual
Persamaan ganda di SQL Server :
SELECT 'Hello world'
sumber
WHERE (SELECT ... )
itu?Coba ini.
Tunggal:
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
lebih detail di sini: http://modern-sql.com/use-case/select-without-from
sumber
WHERE 1 = 1
? Di PostgreSQL bekerja tanpa itu. Atau itu menyangkut DMBS lain?SELECT * FROM (VALUES ("Hello world")) t1 (col1)
masih baik-baik saja.Where
jawab saja untuk pertanyaan ini.SELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
Berikut adalah daftar database support dual terlengkap dari https://blog.jooq.org/tag/dual-table/ :
sumber
Dalam tipe SQL Server:
Select 'Your Text'
Tidak perlu klausa
FROM
atauWHERE
.sumber
Kamu bisa. Saya menggunakan baris berikut dalam kueri 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
Pertukaran Data menggunakan Transact-SQL (ekstensi kepemilikan SQL Server ke SQL).
Anda dapat mencobanya sendiri dengan menjalankan kueri seperti:
SELECT 'Hello world'
sumber
Saya kira itu tidak mungkin. Secara teoritis: pilih melakukan dua macam hal:
mempersempit / memperluas himpunan (teori-himpunan);
memetakan hasilnya.
Yang pertama dapat dilihat sebagai penurunan horizontal yang bertentangan dengan klausa where yang dapat dilihat sebagai penurunan vertikal. Di sisi lain, gabungan dapat menambah himpunan secara horizontal di mana gabungan dapat menambah himpunan secara vertikal.
augmentation diminishing horizontal join/select select vertical union where/inner-join
Yang kedua adalah pemetaan. Pemetaan, lebih merupakan konverter. Dalam SQL dibutuhkan beberapa bidang dan mengembalikan nol atau lebih bidang. Dalam memilih, Anda dapat menggunakan beberapa fungsi agregat seperti, sum, avg, dll. Atau mengambil semua nilai kolom dan mengubahnya menjadi string. Di C # linq, kita katakan bahwa sebuah select menerima objek bertipe T dan mengembalikan objek bertipe U.
Saya pikir kebingungan datang oleh fakta bahwa Anda dapat melakukan:
select 'howdy' from <table_name>
. Fitur ini adalah pemetaan, bagian konverter pilih. Anda tidak mencetak sesuatu, tetapi mengubah! Dalam contoh Anda:SELECT " WHERE 1 = 1
Anda mengubah nothing / null menjadi
"Hello world"
dan Anda mempersempit kumpulan tabel nothing / no menjadi satu baris, yang, saya tidak masuk akal sama sekali.Anda mungkin memperhatikan bahwa, jika Anda tidak membatasi jumlah kolom,
"Hello world"
dicetak untuk setiap baris yang tersedia dalam tabel. Saya harap, Anda mengerti mengapa sekarang. Anda pilih mengambil apa-apa dari kolom yang tersedia dan menciptakan satu kolom dengan teks:"Hello world"
.Jadi, jawaban saya TIDAK. Anda tidak bisa begitu saja meninggalkan klausa dari karena pemilihan selalu membutuhkan kolom tabel untuk dijalankan.
sumber
Dalam SQL Standar, tidak. Sebuah
WHERE
klausul menyiratkan ekspresi meja.Dari spesifikasi SQL-92:
Gantinya:
Cara standar untuk melakukannya (yaitu harus bekerja pada produk SQL apa pun):
SELECT DISTINCT 'Hello world' AS new_value FROM AnyTableWithOneOrMoreRows WHERE 1 = 1;
... dengan asumsi Anda ingin mengubah
WHERE
klausa menjadi sesuatu yang lebih bermakna, jika tidak maka klausa tersebut dapat dihilangkan.sumber
SELECT
klausa hanya terdiri dari konstanta dan ituAnyTableWithOneOrMoreRows
adalah tabel yang disimpan, oleh karena itu hanya menggunakan statistik untuk memverifikasi apakah tabel memiliki nol baris.Ada kemungkinan lain - mandiri
VALUES()
:VALUES ('Hello World');
Keluaran:
Ini berguna saat Anda perlu menentukan beberapa nilai dengan cara yang ringkas:
VALUES (1, 'a'), (2, 'b'), (3, 'c');
Keluaran:
Demo DBFiddle
Sintaks ini didukung oleh SQLite / PostgreSQL / DB LUW / MariaDB 10.3.
sumber
Untuk ClickHouse, tidak ada apa-apa
system.one
SELECT 1 FROM system.one
sumber
Di Firebird, Anda dapat melakukan ini:
select "Hello world" from RDB$DATABASE;
RDB $ DATABASE adalah tabel khusus yang selalu memiliki satu baris.
sumber
Saya tahu ini adalah pertanyaan lama tetapi solusi terbaik untuk pertanyaan Anda adalah menggunakan subkueri tiruan:
SELECT 'Hello World' FROM (SELECT name='Nothing') n WHERE 1=1
Dengan cara ini Anda dapat memiliki WHERE dan klausa apa pun (seperti Joins atau Apply, dll.) Setelah pernyataan pemilihan karena subkueri dummy memaksa penggunaan klausa FROM tanpa mengubah hasilnya.
sumber
SELECT
tanpa aFROM
di subquery Anda, jadi masih akan gagal di Oracle, dll.SELECT 'Hello' FROM dual WHERE 1=1
melewatkan subquery.SELECT
) tanpaFROM
klausul. Apakah Anda belum membaca pertanyaannya?WHERE
tanpaFROM
. Mengingat hal itu, saya membalas pernyataan pertama dari pertanyaan OP.WHERE
SQL standar. Saya juga membaca jawaban lain. By the way: hal yang tepat adalah bahwa Anda tidak dapat memilikiSELECT
tanpa aFROM
, bukan "WHERE
tanpaFROM
" (?). Di mana kueri Anda bekerja, @DomingoR? Ini masih memilikiSELECT
tanpa aFROM
(di subquery), sehingga gagal pada DBMS yang tidak mengizinkan memiliki kueri tanpa aFROM
dan hanya bekerja pada yang menyimpang dari SQL standar dan memungkinkan tidak memilikiFROM
diSELECT
. Jadi jawaban Anda tidak berguna.Saya menggunakan firebird Pertama-tama, buat tabel satu kolom bernama "NoTable" seperti ini
CREATE TABLE NOTABLE ( NOCOLUMN INTEGER ); INSERT INTO NOTABLE VALUES (0); -- You can put any value
sekarang kamu bisa menulis ini
select 'hello world' as name
dari terkenal
Anda dapat menambahkan kolom apa pun yang ingin Anda tampilkan
sumber
Untuk DB2:
`VALUES('Hello world')`
Anda juga dapat melakukan beberapa "baris":
`VALUES('Hello world'),('Goodbye world');`
Anda bahkan dapat menggunakannya dalam gabungan selama jenisnya cocok:
VALUES(1,'Hello world') UNION ALL VALUES(2,'Goodbye world');
sumber