Có thể có một tuyên bố như
SELECT "Hello world"
WHERE 1 = 1
trong SQL?
Điều chính tôi muốn biết, là tôi có thể CHỌN từ hư không, tức là không có mệnh đề TỪ.
Có thể có một tuyên bố như
SELECT "Hello world"
WHERE 1 = 1
trong SQL?
Điều chính tôi muốn biết, là tôi có thể CHỌN từ hư không, tức là không có mệnh đề TỪ.
FROM NULL
giữa SELECT
và WHERE
. Các cụm từ bị che khuất chủ yếu vì đó là bài tập về nhà và tôi không muốn ai đó đến và nói cho tôi câu trả lời nếu cảm giác ruột của tôi là sai.
Câu trả lời:
Nó không nhất quán giữa các nhà cung cấp - Oracle, MySQL và DB2 hỗ trợ kép:
SELECT 'Hello world'
FROM DUAL
... trong khi SQL Server, PostgreSQL và SQLite không yêu cầu FROM DUAL
:
SELECT 'Hello world'
MySQL hỗ trợ cả hai cách.
DUAL
và thực hiện các truy vấn từ một bảng giống như ảo.
Trong Oracle :
SELECT 'Hello world' FROM dual
Tương đương kép trong SQL Server :
SELECT 'Hello world'
WHERE (SELECT ... )
sau nó?
Thử đi.
Độc thân:
SELECT * FROM (VALUES ('Hello world')) t1 (col1) WHERE 1 = 1
Đa:
SELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
chi tiết hơn tại đây: http://modern-sql.com/use-case/select-without-from
WHERE 1 = 1
gì? Trên PostgreSQL hoạt động mà không có nó. Hay nó liên quan đến DMBS khác?
SELECT * FROM (VALUES ("Hello world")) t1 (col1)
vẫn ổn. Where
chỉ cần trả lời cho câu hỏi này.
SELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
Đây là danh sách đầy đủ nhất về hỗ trợ cơ sở dữ liệu kép từ https://blog.jooq.org/tag/dual-table/ :
Trong nhiều RDBMS khác, không cần bảng giả, vì bạn có thể đưa ra các câu lệnh như sau:
SELECT 1; SELECT 1 + 1; SELECT SQRT(2);
Đây là các RDBMS, trong đó các điều trên thường có thể thực hiện được:
- H2
- MySQL
- Ingres
- Postgres
- SQLite
- Máy chủ SQL
- Sybase ASE
Trong các RDBMS khác, cần có bảng giả, giống như trong Oracle. Do đó, bạn sẽ cần viết những thứ như sau:
SELECT 1 FROM DUAL; SELECT 1 + 1 FROM DUAL; SELECT SQRT(2) FROM DUAL;
Đây là RDBMS và các bảng giả tương ứng của chúng:
- DB2: SYSIBM.DUAL
- Derby: SYSIBM.SYSDUMMY1
- H2: Tùy chọn hỗ trợ DUAL
- HSQLDB: INFORMATION_SCHEMA.SYSTEM_USERS
- MySQL: Tùy chọn hỗ trợ DUAL
- Oracle: KÉP
- Sybase SQL mọi nơi: SYS.DUMMY
Ingres không có KÉP, nhưng thực sự sẽ cần nó vì trong Ingres bạn không thể có mệnh đề WHERE, GROUP BY hoặc HAVING mà không có mệnh đề FROM.
Bạn có thể. Tôi đang sử dụng các dòng sau trong truy vấn 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 sử dụng Transact-SQL (phần mở rộng độc quyền của SQL Server cho SQL).
Bạn có thể tự mình thử bằng cách chạy một truy vấn như:
SELECT 'Hello world'
Tôi nghĩ rằng điều đó là không thể. Về mặt lý thuyết: select thực hiện hai loại:
thu hẹp / mở rộng tập hợp (lý thuyết tập hợp);
ánh xạ kết quả.
Mệnh đề đầu tiên có thể được coi là giảm dần theo chiều ngang đối lập với mệnh đề where-có thể được coi là giảm dần theo chiều dọc. Mặt khác, một phép nối có thể tăng cường tập hợp theo chiều ngang trong đó một liên kết có thể tăng cường tập hợp theo chiều dọc.
augmentation diminishing
horizontal join/select select
vertical union where/inner-join
Cái thứ hai là một ánh xạ. Một ánh xạ, là một công cụ chuyển đổi. Trong SQL, nó nhận một số trường và trả về không hoặc nhiều trường. Trong vùng chọn, bạn có thể sử dụng một số hàm tổng hợp như, sum, avg, v.v. Hoặc lấy tất cả các giá trị cột để chuyển đổi chúng thành chuỗi. Trong C # linq, chúng ta nói rằng một vùng chọn chấp nhận một đối tượng kiểu T và trả về một đối tượng kiểu U.
Tôi nghĩ rằng sự nhầm lẫn đến bởi thực tế là bạn có thể làm: select 'howdy' from <table_name>
. Tính năng này là ánh xạ, phần chuyển đổi của lựa chọn. Bạn không in thứ gì đó, mà là chuyển đổi! Trong ví dụ của bạn:
SELECT "
WHERE 1 = 1
bạn đang chuyển đổi nothing / null thành "Hello world"
và bạn thu hẹp tập hợp của bảng nothing / no thành một hàng, điều này không có ý nghĩa gì cả.
Bạn có thể nhận thấy rằng, nếu bạn không giới hạn số lượng cột, "Hello world"
sẽ được in cho mỗi hàng có sẵn trong bảng. Tôi hy vọng, bạn hiểu tại sao bây giờ. Chọn của bạn mất gì từ các cột có sẵn và tạo ra một cột với nội dung: "Hello world"
.
Vì vậy, câu trả lời của tôi là KHÔNG. Bạn không thể bỏ qua mệnh đề from vì lựa chọn luôn cần các cột bảng để thực hiện.
Trong SQL tiêu chuẩn, không. Một WHERE
mệnh đề ngụ ý một biểu thức bảng.
Từ thông số SQL-92:
7.6 "mệnh đề where"
Chức năng
Chỉ định một bảng có nguồn gốc từ việc áp dụng "điều kiện tìm kiếm" cho kết quả của mệnh đề "from" trước đó.
Lần lượt:
7.4 "từ mệnh đề"
Chức năng
Chỉ định một bảng dẫn xuất từ một hoặc nhiều bảng được đặt tên.
Một cách tiêu chuẩn để làm điều đó (tức là sẽ hoạt động trên bất kỳ sản phẩm SQL nào):
SELECT DISTINCT 'Hello world' AS new_value
FROM AnyTableWithOneOrMoreRows
WHERE 1 = 1;
... giả sử bạn muốn thay đổi WHERE
mệnh đề thành một điều gì đó có nghĩa hơn, nếu không nó có thể được bỏ qua.
SELECT
mệnh đề chỉ bao gồm các hằng số và đó AnyTableWithOneOrMoreRows
là một bảng được lưu trữ, do đó chỉ sử dụng thống kê để xác minh xem bảng có không hàng.
Có một khả năng khác - độc lập VALUES()
:
VALUES ('Hello World');
Đầu ra:
column1
Hello World
Nó hữu ích khi bạn cần chỉ định nhiều giá trị theo cách nhỏ gọn:
VALUES (1, 'a'), (2, 'b'), (3, 'c');
Đầu ra:
column1 column2
1 a
2 b
3 c
Cú pháp này được hỗ trợ bởi SQLite / PostgreSQL / DB LUW / MariaDB 10.3.
Tôi biết đây là một câu hỏi cũ nhưng cách giải quyết tốt nhất cho câu hỏi của bạn là sử dụng một truy vấn con giả:
SELECT 'Hello World'
FROM (SELECT name='Nothing') n
WHERE 1=1
Bằng cách này, bạn có thể có WHERE và bất kỳ mệnh đề nào (như Tham gia hoặc Áp dụng, v.v.) sau câu lệnh select vì truy vấn con giả buộc sử dụng mệnh đề FROM mà không thay đổi kết quả.
SELECT
mà không có một FROM
trong subquery của bạn, vì vậy nó vẫn sẽ thất bại trong Oracle, vv
SELECT 'Hello' FROM dual WHERE 1=1
và bỏ qua truy vấn con.
SELECT
) mà không có FROM
mệnh đề hay không. Bạn vẫn chưa đọc câu hỏi?
WHERE
thiếu FROM
. Do đó, tôi đã trả lời câu đầu tiên của câu hỏi OP.
WHERE
là SQL chuẩn hay không. Tôi cũng đọc các câu trả lời khác. Nhân tiện: điều thích hợp là bạn không thể có a SELECT
mà không có aFROM
, không phải "a WHERE
without FROM
" (?). Truy vấn của bạn hoạt động ở đâu, @DomingoR? Nó vẫn có a SELECT
mà không có FROM
(trong truy vấn con), do đó không thành công trên những DBMS không cho phép có các truy vấn mà không có a FROM
và chỉ hoạt động trên những truy vấn khác với SQL tiêu chuẩn và cho phép không có FROM
trong SELECT
. Vì vậy, câu trả lời của bạn không phục vụ gì.
Tôi đang sử dụng firebird Trước hết, hãy tạo một bảng một cột có tên "NoTable" như thế này
CREATE TABLE NOTABLE
(
NOCOLUMN INTEGER
);
INSERT INTO NOTABLE VALUES (0); -- You can put any value
bây giờ bạn có thể viết cái này
select 'hello world' as name
từ đáng chú ý
bạn có thể thêm bất kỳ cột nào bạn muốn được hiển thị