เป็นไปได้ไหมที่จะมีคำสั่งเช่น
SELECT "Hello world"
WHERE 1 = 1
ใน SQL?
สิ่งสำคัญที่ฉันอยากรู้คือฉันสามารถเลือกจากอะไรได้ไหมคือไม่มีคำสั่ง FROM
เป็นไปได้ไหมที่จะมีคำสั่งเช่น
SELECT "Hello world"
WHERE 1 = 1
ใน SQL?
สิ่งสำคัญที่ฉันอยากรู้คือฉันสามารถเลือกจากอะไรได้ไหมคือไม่มีคำสั่ง FROM
FROM NULL
ระหว่างและSELECT
WHERE
การใช้ถ้อยคำที่คลุมเครือส่วนใหญ่เป็นเพราะเป็นการบ้านและฉันไม่ต้องการให้ใครมาบอกคำตอบถ้าความรู้สึกของฉันผิด
คำตอบ:
ไม่สอดคล้องกันระหว่างผู้ขาย - Oracle, MySQL และ DB2 รองรับ dual:
SELECT 'Hello world'
FROM DUAL
... ในขณะที่ SQL Server, PostgreSQL และ SQLite ไม่ต้องการFROM DUAL
:
SELECT 'Hello world'
MySQL รองรับทั้งสองวิธี
DUAL
และดำเนินการสืบค้นจากตารางที่เหมือนผีได้
ลองทำตามนี้
โสด:
SELECT * FROM (VALUES ('Hello world')) t1 (col1) WHERE 1 = 1
หลาย:
SELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
รายละเอียดเพิ่มเติมที่นี่: http://modern-sql.com/use-case/select-without-from
WHERE 1 = 1
อะไร? บน PostgreSQL ทำงานได้โดยไม่ต้องใช้มัน หรือเกี่ยวข้องกับ DMBS อื่น?
SELECT * FROM (VALUES ("Hello world")) t1 (col1)
ยังสบายดี Where
เพียงแค่ตอบคำถามนี้
SELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
นี่คือรายการที่สมบูรณ์ที่สุดของการสนับสนุนฐานข้อมูลของ dual จากhttps://blog.jooq.org/tag/dual-table/ :
ใน RDBMS อื่น ๆ อีกมากมายไม่จำเป็นต้องมีตารางจำลองเนื่องจากคุณสามารถออกแถลงการณ์ดังนี้:
SELECT 1; SELECT 1 + 1; SELECT SQRT(2);
นี่คือ RDBMS ซึ่งโดยทั่วไปแล้วข้างต้นเป็นไปได้:
- H2
- MySQL
- Ingres
- Postgres
- SQLite
- เซิร์ฟเวอร์ SQL
- Sybase ASE
ใน RDBMS อื่น ๆ จำเป็นต้องมีตารางดัมมี่เช่นเดียวกับใน Oracle ดังนั้นคุณจะต้องเขียนสิ่งเหล่านี้:
SELECT 1 FROM DUAL; SELECT 1 + 1 FROM DUAL; SELECT SQRT(2) FROM DUAL;
นี่คือ RDBMS และตารางจำลองตามลำดับ:
- DB2: SYSIBM.DUAL
- ดาร์บี้: SYSIBM.SYSDUMMY1
- H2: รองรับ DUAL
- HSQLDB: INFORMATION_SCHEMA.SYSTEM_USERS
- MySQL: รองรับ DUAL
- Oracle: DUAL
- Sybase SQL ทุกที่: SYS.DUMMY
Ingres ไม่มี DUAL แต่จริงๆแล้วต้องการเช่นเดียวกับใน Ingres คุณไม่สามารถมีคำสั่ง WHERE GROUP BY หรือ HAVING ได้โดยไม่ต้องมีคำสั่งจาก FROM
ในประเภทเซิร์ฟเวอร์ SQL:
Select 'Your Text'
ไม่จำเป็นต้องมีFROM
หรือWHERE
อนุประโยค
คุณสามารถ. ฉันใช้บรรทัดต่อไปนี้ในแบบสอบถาม 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
Data Exchange ใช้ Transact-SQL (ส่วนขยายที่เป็นกรรมสิทธิ์ของ SQL Server ไปยัง SQL)
คุณสามารถลองด้วยตัวเองโดยเรียกใช้แบบสอบถามเช่น:
SELECT 'Hello world'
คิดว่าคงไม่ไหว ในทางทฤษฎี: เลือกดำเนินการสองประเภท:
แคบ / ขยายเซต (เซต - ทฤษฎี);
การทำแผนที่ผลลัพธ์
อันแรกสามารถมองเห็นได้ว่าเป็นการลดลงในแนวนอนตรงข้ามกับ where-clause ซึ่งสามารถมองเห็นได้ว่าเป็นแนวตั้งที่ลดลง ในทางกลับกันการรวมสามารถเพิ่มชุดในแนวนอนซึ่งการรวมกันสามารถเพิ่มชุดในแนวตั้งได้
augmentation diminishing
horizontal join/select select
vertical union where/inner-join
อันที่สองคือการทำแผนที่ การทำแผนที่เป็นตัวแปลงมากกว่า ใน SQL ใช้ฟิลด์บางฟิลด์และส่งคืนฟิลด์เป็นศูนย์หรือมากกว่า ในการเลือกคุณสามารถใช้ฟังก์ชันการรวมบางอย่างเช่น sum, avg เป็นต้นหรือนำค่าคอลัมน์ทั้งหมดมาแปลงเป็นสตริง ใน C # linq เราบอกว่าการเลือกยอมรับวัตถุประเภท T และส่งคืนวัตถุประเภท U
select 'howdy' from <table_name>
ผมคิดว่าความสับสนมาจากข้อเท็จจริงที่ว่าคุณสามารถทำได้: คุณลักษณะนี้คือการทำแผนที่ซึ่งเป็นส่วนแปลงของสิ่งที่เลือก คุณไม่ได้พิมพ์บางอย่าง แต่กำลังแปลง! ในตัวอย่างของคุณ:
SELECT "
WHERE 1 = 1
คุณกำลังแปลง nothing / null เข้าไป"Hello world"
และคุณ จำกัด ชุดของ nothing / no table ให้เป็นแถวเดียวซึ่ง imho ไม่สมเหตุสมผลเลย
คุณอาจสังเกตเห็นว่าถ้าคุณไม่ จำกัด จำนวนคอลัมน์"Hello world"
จะถูกพิมพ์สำหรับแต่ละแถวที่มีอยู่ในตาราง ฉันหวังว่าคุณจะเข้าใจว่าทำไมในตอนนี้ "Hello world"
คุณเลือกที่จะใช้เวลาอะไรจากคอลัมน์ที่มีอยู่และสร้างหนึ่งคอลัมน์ที่มีข้อความ:
ดังนั้นคำตอบของฉันคือไม่ คุณไม่สามารถละทิ้ง from-clause ได้เนื่องจากการเลือกจำเป็นต้องมีตารางคอลัมน์เพื่อดำเนินการเสมอ
ใน Standard SQL ไม่มี WHERE
ประโยคหมายถึงการแสดงออกของตาราง
จากข้อมูลจำเพาะ SQL-92:
7.6 "ที่ข้อ"
ฟังก์ชัน
ระบุตารางที่ได้มาจากการประยุกต์ใช้ "เงื่อนไขการค้นหา" กับผลลัพธ์ของ "from clause" ที่นำหน้า
ในทางกลับกัน:
7.4 "จากข้อ"
ฟังก์ชัน
ระบุตารางที่ได้มาจากตารางที่มีชื่ออย่างน้อยหนึ่งตาราง
วิธีมาตรฐานในการทำ (เช่นควรใช้กับผลิตภัณฑ์ SQL ใด ๆ ):
SELECT DISTINCT 'Hello world' AS new_value
FROM AnyTableWithOneOrMoreRows
WHERE 1 = 1;
... สมมติว่าคุณต้องการเปลี่ยนWHERE
อนุประโยคให้มีความหมายมากขึ้นมิฉะนั้นจะสามารถละเว้นได้
SELECT
ประโยคประกอบด้วยค่าคงที่เท่านั้นและนั่นAnyTableWithOneOrMoreRows
คือตารางที่จัดเก็บดังนั้นจึงใช้สถิติเพื่อตรวจสอบว่าตารางมี ศูนย์แถว
มีความเป็นไปได้อื่น - แบบสแตนด์อโลนVALUES()
:
VALUES ('Hello World');
เอาท์พุต:
column1
Hello World
จะมีประโยชน์เมื่อคุณต้องการระบุค่าหลายค่าอย่างกะทัดรัด:
VALUES (1, 'a'), (2, 'b'), (3, 'c');
เอาท์พุต:
column1 column2
1 a
2 b
3 c
ไวยากรณ์นี้รองรับโดย SQLite / PostgreSQL / DB LUW / MariaDB 10.3
สำหรับ ClickHouse ไม่มีอะไรเลย system.one
SELECT 1 FROM system.one
ใน Firebird คุณสามารถทำได้:
select "Hello world" from RDB$DATABASE;
RDB $ DATABASE คือตารางพิเศษที่มีหนึ่งแถวเสมอ
ฉันรู้ว่านี่เป็นคำถามเก่า แต่วิธีแก้ปัญหาที่ดีที่สุดสำหรับคำถามของคุณคือการใช้แบบสอบถามย่อยจำลอง:
SELECT 'Hello World'
FROM (SELECT name='Nothing') n
WHERE 1=1
ด้วยวิธีนี้คุณสามารถมี WHERE และประโยคใดก็ได้ (เช่น Joins หรือ Apply เป็นต้น) หลังคำสั่ง select เนื่องจากแบบสอบถามย่อยแบบจำลองบังคับให้ใช้คำสั่ง FROM โดยไม่เปลี่ยนแปลงผลลัพธ์
SELECT
ไม่มีFROM
ในแบบสอบถามย่อยของคุณดังนั้นจะยังคงล้มเหลวใน Oracle เป็นต้น
SELECT 'Hello' FROM dual WHERE 1=1
ข้ามแบบสอบถามย่อยได้
SELECT
) โดยไม่มีFROM
ประโยค คุณยังไม่ได้อ่านคำถาม?
WHERE
FROM
ด้วยเหตุนี้ฉันจึงตอบกลับข้อความแรกของคำถาม OP
WHERE
SQL มาตรฐานหรือไม่ ฉันอ่านคำตอบอื่น ๆ ด้วย อย่างไรก็ตามสิ่งที่เหมาะสมคือคุณไม่สามารถมีได้SELECT
โดยไม่มีFROM
ไม่ใช่ " WHERE
ไม่มีFROM
" (?) คำถามของคุณทำงานที่ไหน @DomingoR? มันยังคงมีSELECT
โดยไม่มีFROM
(ในแบบสอบถามย่อย) ดังนั้นจึงล้มเหลวใน DBMS ที่ไม่อนุญาตให้มีการสืบค้นโดยไม่มีFROM
และทำงานเฉพาะกับสิ่งที่เบี่ยงเบนจาก SQL มาตรฐานและอนุญาตให้ไม่มีFROM
ในSELECT
. ดังนั้นคำตอบของคุณจึงไม่มีประโยชน์
ฉันใช้ firebird ก่อนอื่นสร้างตารางคอลัมน์เดียวชื่อ "NoTable" แบบนี้
CREATE TABLE NOTABLE
(
NOCOLUMN INTEGER
);
INSERT INTO NOTABLE VALUES (0); -- You can put any value
ตอนนี้คุณสามารถเขียนสิ่งนี้ได้
select 'hello world' as name
จากที่น่าสังเกต
คุณสามารถเพิ่มคอลัมน์ใดก็ได้ที่คุณต้องการให้แสดง
สำหรับ DB2:
`VALUES('Hello world')`
คุณสามารถทำหลาย "แถว" ได้เช่นกัน:
`VALUES('Hello world'),('Goodbye world');`
คุณสามารถใช้ในการรวมได้ตราบเท่าที่ประเภทตรงกัน:
VALUES(1,'Hello world')
UNION ALL
VALUES(2,'Goodbye world');