SQL có cần truy vấn con không?
Hãy tưởng tượng một triển khai đủ khái quát của ngôn ngữ truy vấn có cấu trúc cho các cơ sở dữ liệu quan hệ. Do cấu trúc của câu lệnh SQL chuẩn SELECT
thực sự rất quan trọng đối với điều này có ý nghĩa, nên tôi không kháng cáo trực tiếp với đại số quan hệ, nhưng bạn có thể đóng khung điều này theo các thuật ngữ đó bằng cách đưa ra các hạn chế phù hợp về hình thức biểu thức.
Một SQL SELECT
truy vấn thông thường bao gồm một chiếu (các SELECT
phần) một số số JOIN
hoạt động (các JOIN
phần), một số số SELECTION
hoạt động (trong SQL, các WHERE
điều khoản), và sau đó đặt khôn ngoan hoạt động ( UNION
, EXCEPT
, INTERSECT
, vv), tiếp theo là một SELECT
Truy vấn SQL .
Các bảng được nối có thể là kết quả tính toán của các biểu thức; nói cách khác, chúng ta có thể có một tuyên bố như:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN (SELECT id, address
FROM table2 AS t3
WHERE t3.id = t1.id) AS t2
WHERE t1.salary > 50,000;
Chúng tôi sẽ đề cập đến việc sử dụng bảng được tính toán như một phần của truy vấn SQL dưới dạng truy vấn con. Trong ví dụ trên, thứ hai (thụt lề) SELECT
là một truy vấn con.
Tất cả các truy vấn SQL có thể được viết theo cách không sử dụng các truy vấn con không? Ví dụ trên có thể:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN table2 AS t2
ON t1.id = t2.id
WHERE t1.salary > 50,000;
Ví dụ này có phần giả mạo hoặc tầm thường, nhưng người ta có thể tưởng tượng các trường hợp trong đó cần nhiều nỗ lực hơn để phục hồi một biểu thức tương đương. Nói cách khác, có phải là trường hợp đối với mọi truy vấn SQL với các truy vấn con, tồn tại một truy vấn q ′ không có các truy vấn con sao cho q và được đảm bảo tạo ra kết quả giống nhau cho cùng các bảng bên dưới không? Hãy để chúng tôi giới hạn các truy vấn SQL ở dạng sau:
SELECT <attribute>,
...,
<attribute>
FROM <a table, not a subquery>
JOIN <a table, not a subquery>
...
JOIN <a table, not a subquery>
WHERE <condition>
AND <condition>
...
AND <condition>
UNION
-or-
EXCEPT
-or-
<similar>
SELECT ...
Và như vậy. Tôi nghĩ rằng các kết nối bên trái và bên phải không thêm nhiều, nhưng nếu tôi nhầm, xin vui lòng chỉ ra rằng ... trong bất kỳ sự kiện nào, chúng cũng là trò chơi công bằng. Theo như các hoạt động đã định, tôi đoán bất kỳ trong số chúng đều ổn ... liên kết, khác biệt, khác biệt đối xứng, giao nhau, v.v ... bất cứ điều gì hữu ích. Có bất kỳ biểu mẫu đã biết nào mà tất cả các truy vấn SQL có thể được giảm không? Có bất kỳ trong số các loại bỏ các truy vấn con? Hoặc có một số trường hợp không tồn tại truy vấn tương đương, truy vấn không có truy vấn phụ? Tài liệu tham khảo được đánh giá cao ... hoặc một minh chứng (bằng chứng) rằng chúng là hoặc không bắt buộc sẽ là tuyệt vời. Cảm ơn, và xin lỗi nếu đây là một kết quả nổi tiếng (hoặc tầm thường) mà tôi không biết gì.
select count(*) from (select id from sometable group by id having count(*)>1) d
. Bởi vì nó bao gồm group by
tôi đã không đặt điều này như một câu trả lời.
ON
mệnh đề được yêu cầu cho JOIN
s, mặc dù một sản phẩm chéo có được chỉ bằng dấu phẩy.