PILIH dari nol?

91

Apakah mungkin memiliki pernyataan seperti

SELECT "Hello world"
WHERE 1 = 1

di SQL?

Hal utama yang ingin saya ketahui, adalah dapatkah saya MEMILIH dari tidak ada, yaitu tidak memiliki klausa FROM.

Ritwik Bose
sumber
3
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:

SELECT 'Hello world'

MySQL mendukung kedua cara tersebut.

OMG Ponies
sumber
2
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 )
Klik Oke
29

Di Oracle :

SELECT 'Hello world' FROM dual

Persamaan ganda di SQL Server :

SELECT 'Hello world' 
pemberontak
sumber
1
Bisakah saya memberi pernyataan seperti WHERE (SELECT ... )itu?
Ritwik Bose
15

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

chuongtv
sumber
1
Satu-satunya jawaban yang sesuai dengan ANSI SQL! (Untuk pertanyaan tanpa dbms yang ditentukan.)
jarlh
Apa tujuan dari WHERE 1 = 1? Di PostgreSQL bekerja tanpa itu. Atau itu menyangkut DMBS lain?
Frankie Drake
Hanya SELECT * FROM (VALUES ("Hello world")) t1 (col1)masih baik-baik saja. Wherejawab saja untuk pertanyaan ini.
chuongtv
@chuongtv Bagaimana Anda memilih beberapa baris?
Hector
@Hector Cukup ikuti penyisipan struct SQL. seperti iniSELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
chuongtv
8

Berikut adalah daftar database support dual terlengkap dari https://blog.jooq.org/tag/dual-table/ :

Di banyak RDBMS lainnya, tidak diperlukan tabel dummy, karena Anda dapat mengeluarkan pernyataan seperti ini:

SELECT 1;
SELECT 1 + 1;
SELECT SQRT(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:

SELECT 1       FROM DUAL;
SELECT 1 + 1   FROM DUAL;
SELECT SQRT(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.

Vadzim
sumber
6

Dalam tipe SQL Server:

Select 'Your Text'

Tidak perlu klausa FROMatau WHERE.

RollTide
sumber
5

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'
palswim
sumber
Pertukaran Data adalah Azure, berdasarkan SQL Server.
OMG Ponies
2

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.

Andries
sumber
2

Dalam SQL Standar, tidak. Sebuah WHEREklausul menyiratkan ekspresi meja.

Dari spesifikasi SQL-92:

7.6 "di mana klausa"

Fungsi

Tentukan tabel yang diturunkan dengan penerapan "kondisi pencarian" ke hasil "dari klausa" sebelumnya.

Gantinya:

7.4 "dari klausa"

Fungsi

Tentukan tabel yang diturunkan dari satu atau beberapa tabel bernama.

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 WHEREklausa menjadi sesuatu yang lebih bermakna, jika tidak maka klausa tersebut dapat dihilangkan.

onedaywhen
sumber
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:

VALUES (1, 'a'), (2, 'b'), (3, 'c');

Keluaran:

column1     column2
      1     a
      2     b
      3     c

Demo DBFiddle

Sintaks ini didukung oleh SQLite / PostgreSQL / DB LUW / MariaDB 10.3.

Lukasz Szozda
sumber
2

Untuk ClickHouse, tidak ada apa-apa system.one

SELECT 1 FROM system.one
simPod
sumber
1

Di Firebird, Anda dapat melakukan ini:

select "Hello world" from RDB$DATABASE;

RDB $ DATABASE adalah tabel khusus yang selalu memiliki satu baris.

Robyn
sumber
0

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.

DomingoR
sumber
1
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

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

Yous Athmane
sumber
0

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');
Brad Mace
sumber