Czy SQL potrzebuje podkwerend?
Wyobraź sobie wystarczająco uogólnioną implementację ustrukturyzowanego języka zapytań dla baz danych relacji. Ponieważ struktura kanonicznej SELECT
instrukcji SQL jest naprawdę bardzo ważna, aby miało to sens, nie odwołuję się bezpośrednio do algebry relacyjnej, ale można to sformułować w tych kategoriach, wprowadzając odpowiednie ograniczenia dotyczące formy wyrażeń.
Instrukcja SQL SELECT
zapytanie na ogół składa się z występu (stanowiącego SELECT
część) pewnej liczby JOIN
operacji (w jego JOIN
części), pewnej liczby SELECTION
operacji (w SQL, WHERE
warunków), a następnie nastawiono mądry operacji ( UNION
, EXCEPT
, INTERSECT
, itd.), A następnie kolejny SELECT
Zapytanie SQL .
Łączone tabele mogą być obliczonymi wynikami wyrażeń; innymi słowy, możemy mieć takie oświadczenie, jak:
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;
Będziemy odnosić się do użycia tabeli obliczeniowej jako części zapytania SQL jako podzapytania. W powyższym przykładzie drugi (wcięty) SELECT
jest podzapytaniem.
Czy wszystkie zapytania SQL mogą być napisane w taki sposób, aby nie używać podkwerend? Powyższy przykład może:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN table2 AS t2
ON t1.id = t2.id
WHERE t1.salary > 50,000;
Ten przykład jest nieco fałszywy lub trywialny, ale można sobie wyobrazić przypadki, w których odzyskanie równoważnego wyrażenia wymagałoby znacznie więcej wysiłku. Innymi słowy, czy jest tak, że dla każdego zapytania SQL z podzapytaniami istnieje zapytanie q ′ bez podzapytań, dzięki czemu q i q ′ mają zagwarantowane takie same wyniki dla tych samych bazowych tabel? Ograniczmy zapytania SQL do następującej formy:
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 ...
I tak dalej. Myślę, że lewe i prawe zewnętrzne sprzężenia nie dodają wiele, ale jeśli się mylę, proszę zauważyć, że ... w każdym razie, są one również uczciwą grą. Jeśli chodzi o ustawione operacje, wydaje mi się, że każda z nich jest w porządku ... połączenie, różnica, różnica symetryczna, przecięcie itp. ... wszystko, co jest pomocne. Czy są jakieś znane formy, do których można ograniczyć wszystkie zapytania SQL? Czy któryś z nich eliminuje podzapytania? A może istnieją przypadki, w których nie istnieje równoważne zapytanie bez zapytania? Referencje są doceniane ... lub demonstracja (na dowód), że są lub nie są wymagane, byłaby fantastyczna. Dzięki i przepraszam, jeśli jest to słynny (lub trywialny) rezultat, którego boleśnie ignoruję.
select count(*) from (select id from sometable group by id having count(*)>1) d
. Ponieważ zawiera group by
, nie podałem tego jako odpowiedzi.
ON
klauzula jest wymagana dla JOIN
s, chociaż iloczyn krzyżowy jest uzyskiwany tylko przecinkiem.