Wpis z mikrobloga

@msq: GROUP BY jest wykonywane przed SELECT? Paznokcie dałbym sobie poobcinać, że jest odwrotnie - GROUP BY i HAVING operują na kolumnach w zbiorze wynikowym, dzięki czemu pisze się np.:

SELECT YEAR(data) AS RokSprzedazy, COUNT(fakturaID) AS IloscDokumentow FROM faktury GROUP BY RokSprzedazy HAVING RokSprzedazy BETWEEN 2006 AND 2008; -- głupi przykład, ale to tylko przykład
  • Odpowiedz
@msq: I jeszcze o "deklarytawności" SQL-a. ogólna zasada brzmi - ufaj, ale sprawdzaj. Optymalizatory mają swoje narowy. MySQL ma np. paskudny nawyk korelowania nieskorelowanych podzapytań, co potrafi zabić całkiem banalne zapytanie...
  • Odpowiedz
SELECT YEAR(data) AS RokSprzedazy, COUNT(fakturaID) AS IloscDokumentow FROM faktury GROUP BY RokSprzedazy HAVING RokSprzedazy BETWEEN 2006 AND 2008


@singollo: W Mysql tak - dlatego tez....

Note that MySQL, unfortunately, doesn't adhere to this standard, causing nothing but confusion. Don't fall for MySQL's tricks. GROUP BY transforms table references. You can thus only reference columns also referenced in the GROUP BY clause.

W oraclu takie zapytanie

select (salary + 1) as SAL
  • Odpowiedz
I jeszcze o "deklarytawności" SQL-a. ogólna zasada brzmi - ufaj, ale sprawdzaj. Optymalizatory mają swoje narowy


@singollo: Optymalizator to juz implementacja i to drugiego stopnia :) SQL to implementacja (niedoskonala) algebry relacyjnej, a konkretne baza danych to juz implementacja SQLa
  • Odpowiedz
You can thus only reference columns also referenced in the GROUP BY clause.


@msq: To nie jest do końca prawdziwe, nie trzeba pakować wszystkich kolumn które wybierasz do GROUP BY, SELECT a1, a2, max(b1) from a JOIN b ON (....) GROUP BY a1 może być całkowicie poprawne nawet poza MySQL
  • Odpowiedz