Gibi bir ifadeye sahip olmak mümkün mü
SELECT "Hello world"
WHERE 1 = 1
SQL'de?
Bilmek istediğim en önemli şey, hiçbir şeyden SEÇEBİLİR miyim, yani bir FROM tümcesine sahip olamaz mıyım?
Gibi bir ifadeye sahip olmak mümkün mü
SELECT "Hello world"
WHERE 1 = 1
SQL'de?
Bilmek istediğim en önemli şey, hiçbir şeyden SEÇEBİLİR miyim, yani bir FROM tümcesine sahip olamaz mıyım?
FROM NULLarasındaki SELECTve WHERE. Belirsiz ifadeler çoğunlukla ödev olduğu için ve içgüdülerim yanlışsa birinin gelip bana cevabı söylemesini istemediğim için.
Yanıtlar:
Satıcılar arasında tutarlı değildir - Oracle, MySQL ve DB2, ikiliyi destekler:
SELECT 'Hello world'
FROM DUAL
... SQL Server, PostgreSQL ve SQLite FROM DUALşunları gerektirmez :
SELECT 'Hello world'
MySQL her iki yolu da destekler.
DUALhayalet benzeri bir tablodan adında kukla bir tablo oluşturmak ve sorgular gerçekleştirmek mümkündür .
Bunu dene.
Tek:
SELECT * FROM (VALUES ('Hello world')) t1 (col1) WHERE 1 = 1
Çok:
SELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
daha fazla ayrıntı burada: http://modern-sql.com/use-case/select-without-from
WHERE 1 = 1? PostgreSQL'de onsuz çalışır. Veya başka bir DMBS ile mi ilgili?
SELECT * FROM (VALUES ("Hello world")) t1 (col1)hala ince. Wheresadece bu soruya cevap ver.
SELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
İkili veritabanı desteğinin en eksiksiz listesi https://blog.jooq.org/tag/dual-table/ adresinde :
Diğer birçok RDBMS'de, aşağıdaki gibi ifadeler yayınlayabileceğiniz için kukla tablolara gerek yoktur:
SELECT 1; SELECT 1 + 1; SELECT SQRT(2);Bunlar, yukarıdakilerin genellikle mümkün olduğu RDBMS'dir:
- H2
- MySQL
- Ingres
- Postgres
- SQLite
- SQL Server
- Sybase ASE
Diğer RDBMS'de, Oracle'da olduğu gibi sahte tablolar gereklidir. Bu nedenle, aşağıdakiler gibi şeyler yazmanız gerekecek:
SELECT 1 FROM DUAL; SELECT 1 + 1 FROM DUAL; SELECT SQRT(2) FROM DUAL;Bunlar RDBMS ve bunların ilgili sahte tablolarıdır:
- DB2: SYSIBM.DUAL
- Derbi: SYSIBM.SYSDUMMY1
- H2: İsteğe bağlı olarak DUAL'i destekler
- HSQLDB: INFORMATION_SCHEMA.SYSTEM_USERS
- MySQL: İsteğe bağlı olarak DUAL'i destekler
- Oracle: ÇİFT
- Sybase SQL Anywhere: SYS.DUMMY
Ingres'te DUAL yoktur, ancak aslında Ingres'de olduğu gibi buna ihtiyaç duyacaktır, bir FROM yan tümcesi olmadan bir WHERE, GROUP BY veya HAVING yan tümcesine sahip olamazsınız.
Yapabilirsin. Bir StackExchange Veri Gezgini sorgusunda aşağıdaki satırları kullanıyorum :
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
Veri Değişimi, Transact-SQL'i (SQL Server'a özel SQL uzantıları) kullanır.
Aşağıdaki gibi bir sorgu çalıştırarak kendiniz deneyebilirsiniz:
SELECT 'Hello world'
Bunun mümkün olmadığını düşünüyorum. Teorik olarak: select iki tür şey gerçekleştirir:
seti daraltır / genişletir (küme teorisi);
sonucun eşleştirilmesi.
Birincisi, dikey bir azalma olarak görülebilen where-cümlesinin aksine yatay bir azalma olarak görülebilir. Öte yandan, bir birleşim, kümeyi yatay olarak artırabilir, burada bir birleşim kümeyi dikey olarak büyütebilir.
augmentation diminishing
horizontal join/select select
vertical union where/inner-join
İkincisi bir haritalamadır. Bir eşleme, daha çok bir dönüştürücüdür. SQL'de bazı alanları alır ve sıfır veya daha fazla alan döndürür. Seçimde, sum, avg vb. Gibi bazı toplama işlevlerini kullanabilirsiniz. Veya tüm sütun değerlerini alıp dizgeye dönüştürün. C # linq'de, bir select'in T tipi bir nesneyi kabul ettiğini ve U tipi bir nesne döndürdüğünü söylüyoruz.
Ben karışıklık Yapabileceğiniz gerçeğiyle gelir düşünüyorum: select 'howdy' from <table_name>. Bu özellik, seçimin dönüştürücü kısmı olan eşlemedir. Bir şey yazdırmıyorsun, dönüştürüyorsun! Örneğinizde:
SELECT "
WHERE 1 = 1
hiçbir şeyi / null "Hello world"değerini dönüştürüyorsunuz ve hiçbir şey / tablo yok kümesini tek bir satıra daraltıyorsunuz ki bu hiç mantıklı değil.
Sütun sayısını sınırlamazsanız "Hello world", tablodaki mevcut her satır için yazdırıldığını fark edebilirsiniz . Umarım nedenini şimdiye kadar anlıyorsundur. Sizin seçkin mevcut kolonların hiçbir şey alır ve metin ile bir sütun oluşturur: "Hello world".
Yani cevabım HAYIR. From-cümlesini dışarıda bırakamazsınız çünkü seçim her zaman için tablo sütunlarına ihtiyaç duyar.
Standart SQL'de hayır. Bir WHEREyan tümce, bir tablo ifadesini ifade eder.
SQL-92 spesifikasyonundan:
7.6 "nerede maddesi"
Fonksiyon
Önceki "from cümlesi" nin sonucuna bir "arama koşulu" uygulanarak türetilen bir tablo belirtin.
Sırayla:
7.4 "maddeden"
Fonksiyon
Bir veya daha fazla adlandırılmış tablodan türetilmiş bir tablo belirtin.
Bunu yapmanın standart bir yolu (yani herhangi bir SQL ürünü üzerinde çalışmalıdır):
SELECT DISTINCT 'Hello world' AS new_value
FROM AnyTableWithOneOrMoreRows
WHERE 1 = 1;
... WHEREcümleyi daha anlamlı bir şeye değiştirmek istediğinizi varsayarsak , aksi takdirde atlanabilir.
SELECTcümlenin yalnızca sabitlerden oluştuğunu fark ettiği ve bu AnyTableWithOneOrMoreRowsdepolanmış bir tablodur, bu nedenle yalnızca tablonun sahip olup olmadığını doğrulamak için istatistikleri kullanır. sıfır satır.
Başka bir olasılık daha var - bağımsız VALUES():
VALUES ('Hello World');
Çıktı:
column1
Hello World
Birden çok değeri kompakt bir şekilde belirtmeniz gerektiğinde kullanışlıdır:
VALUES (1, 'a'), (2, 'b'), (3, 'c');
Çıktı:
column1 column2
1 a
2 b
3 c
Bu sözdizimi SQLite / PostgreSQL / DB LUW / MariaDB 10.3 tarafından desteklenmektedir.
Bunun eski bir soru olduğunu biliyorum, ancak sorunuz için en iyi çözüm, sahte bir alt sorgu kullanmaktır:
SELECT 'Hello World'
FROM (SELECT name='Nothing') n
WHERE 1=1
Bu şekilde, kukla alt sorgu sonucu değiştirmeden FROM yan tümcesini kullanmaya zorladığından, select ifadesinden sonra WHERE ve herhangi bir cümle (Joins veya Apply, vb.) Olabilir.
SELECTbir olmadan FROMhala vb Oracle, başarısız olur, böylece alt sorguda
SELECT 'Hello' FROM dual WHERE 1=1alt sorguyu atlayabilir ve atlayabilirsiniz.
SELECTolmadan bir ifade (yani, a ) almanın mümkün olup olmadığını sordu FROM. Soruyu okumadın mı
WHEREonsuz olamayacağınızı biliyorsunuz FROM. Buna göre, OP sorusunun ilk ifadesine cevap verdim.
WHEREstandart SQL'e sahip olup olmadığını hatırlamadım . Diğer cevapları da okudum. Bu arada, doğru olan şey, "a olmadan " (?) Değil, a SELECTolmadan sahipFROM olamayacağınızdır . Sorgunuz nerede çalışıyor, @DomingoR? Hala bir (alt sorguda) vardır, bu nedenle , a olmadan sorgulara izin vermeyen ve yalnızca standart SQL'den sapanlar üzerinde çalışan ve . Yani cevabınız hiçbir işe yaramıyor. WHEREFROMSELECTFROMFROMFROMSELECT
Firebird kullanıyorum Öncelikle bunun gibi "NoTable" adında bir sütun tablosu oluşturun
CREATE TABLE NOTABLE
(
NOCOLUMN INTEGER
);
INSERT INTO NOTABLE VALUES (0); -- You can put any value
şimdi bunu yazabilirsin
select 'hello world' as name
dikkate değer
gösterilmesini istediğiniz herhangi bir sütunu ekleyebilirsiniz