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.
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.
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.
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.
DUALdan melakukan kueri dari tabel mirip-hantu.
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
WHERE 1 = 1? Di PostgreSQL bekerja tanpa itu. Atau itu menyangkut DMBS lain?
SELECT * FROM (VALUES ("Hello world")) t1 (col1)masih baik-baik saja. Wherejawab 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/ :
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.
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'
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.
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.
SELECTklausa hanya terdiri dari konstanta dan itu AnyTableWithOneOrMoreRowsadalah 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:
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
Sintaks ini didukung oleh SQLite / PostgreSQL / DB LUW / MariaDB 10.3.
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.
SELECTtanpa a FROMdi subquery Anda, jadi masih akan gagal di Oracle, dll.
SELECT 'Hello' FROM dual WHERE 1=1melewatkan subquery.
SELECT) tanpa FROMklausul. Apakah Anda belum membaca pertanyaannya?
WHEREtanpa FROM. Mengingat hal itu, saya membalas pernyataan pertama dari pertanyaan OP.
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.
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