Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Które DBMS pozwalają na uporządkowanie według atrybutu, którego nie ma w klauzuli select?

Twoje zapytanie ma całkowicie legalną składnię, możesz uporządkować je według kolumn, których nie ma w zaznaczeniu.

Jeśli potrzebujesz pełnej specyfikacji na temat porządków prawnych, w SQL Standard 2003 znajduje się długa lista oświadczeń o tym, według czego kolejność powinna, a czego nie powinna zawierać (02-Foundation, strona 415, sekcja 7.13 , pod część 28). Potwierdza to, że Twoje zapytanie ma prawidłową składnię.

Myślę, że Twoje zamieszanie może wynikać z wybierania i/lub porządkowania według kolumn, których nie ma w grupie według lub porządkowania według kolumn, których nie ma w zaznaczeniu, gdy używasz odrębnego.

Oba mają ten sam podstawowy problem, a MySQL jest jedynym, o ile wiem, który pozwala na oba.

Problem polega na tym, że podczas korzystania z funkcji grupuj według lub odrębnie wszystkie kolumny, które nie są zawarte w żadnej z nich, nie są potrzebne, więc nie ma znaczenia, czy mają wiele różnych wartości w wierszach, ponieważ nigdy nie są potrzebne. Wyobraź sobie ten prosty zestaw danych:

ID  | Column1 | Column2  |
----|---------+----------|
1   |    A    |    X     |
2   |    A    |    Z     |
3   |    B    |    Y     |

Jeśli piszesz:

SELECT  DISTINCT Column1
FROM    T;

Dostaniesz

 Column1 
---------
     A   
     B   

Jeśli następnie dodasz ORDER BY Column2 , której z dwóch kolumn 2 użyjesz do uporządkowania A według, X lub Z? Wybór wartości dla kolumny 2 nie jest deterministyczny.

To samo dotyczy zaznaczania kolumn spoza grupy wg. Dla uproszczenia wyobraź sobie pierwsze dwa rzędy poprzedniej tabeli:

ID  | Column1 | Column2  |
----|---------+----------|
1   |    A    |    X     |
2   |    A    |    Z     |

W MySQL możesz pisać

SELECT  ID, Column1, Column2
FROM    T
GROUP BY Column1;

To faktycznie łamie standard SQL, ale działa w MySQL, jednak problem polega na tym, że nie jest deterministyczny, wynik:

ID  | Column1 | Column2  |
----|---------+----------|
1   |    A    |    X     |

Jest nie mniej lub bardziej poprawny niż

ID  | Column1 | Column2  |  
----|---------+----------|
2   |    A    |    Y     |

Więc mówisz, że daj mi jeden wiersz dla każdej odrębnej wartości Column1 , które oba zestawy wyników spełniają, więc skąd masz wiedzieć, który otrzymasz? Cóż, nie wiesz, wydaje się, że jest to dość popularne błędne przekonanie, że możesz dodać i ORDER BY klauzula wpływająca na wyniki, więc na przykład następujące zapytanie:

SELECT  ID, Column1, Column2
FROM    T
GROUP BY Column1
ORDER BY ID DESC;

Zapewniłoby to uzyskanie następującego wyniku:

ID  | Column1 | Column2  |  
----|---------+----------|
2   |    A    |    Y     |

ze względu na ORDER BY ID DESC , jednak nie jest to prawdą (jak pokazano tutaj ).

dokumenty MySQL stan:

Więc nawet jeśli masz takie zamówienie, nie ma to zastosowania, dopóki nie zostanie wybrany jeden wiersz na grupę, a ten jeden wiersz nie jest deterministyczny.

SQL-Standard dopuszcza kolumny z listy wyboru, które nie są zawarte w funkcji GROUP BY lub w funkcji agregującej, jednak te kolumny muszą być funkcjonalnie zależne od kolumny w GROUP BY. Ze standardu SQL-2003-Standard (5WD-02-Foundation-2003-09 — strona 346) — http ://www.wiscorp.com/sql_2003_standard.zip

Na przykład ID w przykładowej tabeli to PRIMARY KEY, więc wiemy, że jest on unikalny w tabeli, więc poniższe zapytanie jest zgodne ze standardem SQL i działałoby w MySQL i nie działałoby obecnie w wielu DBMS (w momencie pisania Postgresql jest najbliższym DBMS, jaki znam, aby poprawnie wdrożyć standard - Przykład tutaj ):

SELECT  ID, Column1, Column2
FROM    T
GROUP BY ID;

Ponieważ identyfikator jest unikalny dla każdego wiersza, może być tylko jedna wartość Column1 dla każdego identyfikatora jedna wartość Column2 nie ma dwuznaczności co do tego, co zwrócić dla każdego wiersza.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Różnica w minutach od dwóch pól czasowych w MySQL

  2. Memcache - przechowywanie wyników mysql

  3. MySQL, gdzie NIE W tablicy nazw?

  4. Wyszukiwanie pełnotekstowe MySQL 5.6 InnoDB

  5. JOIN, GROUP BY, ORDER BY