Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dlaczego Mysql's Group By i Oracle's Group by różnią się zachowaniami?

Projektanci MySQL umieścili swoje niestandardowe rozszerzenie w GROUP BY w celu ułatwienia programowania i zwiększenia wydajności niektórych zapytań.

Oto ich uzasadnienie.

https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html

Istnieje tryb serwera o nazwie ONLY_FULL_GROUP_BY co wyłącza niestandardowe rozszerzenia. Możesz ustawić ten tryb za pomocą tego oświadczenia.

 SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY'  

Oto cytat z tej strony, z dodanym podkreśleniem.

Jeśli ONLY_FULL_GROUP_BY jest wyłączone, rozszerzenie MySQL do standardowego użycia SQL GROUP BY zezwala na listę wyboru, HAVING warunek lub ORDER BY lista do odwoływania się do kolumn niezagregowanych, nawet jeśli kolumny nie są funkcjonalnie zależne od GROUP BY kolumny... W tym przypadku serwer może swobodnie wybrać dowolną wartość z każdej grupy , więc jeśli nie są takie same, wybrane wartości są niedeterministyczne , co prawdopodobnie nie jest tym, czego chcesz.

Ważnym słowem jest tutaj niedeterministyczny. Co to znaczy? To znaczy losowe, ale gorzej. Jeśli serwer wybrał losowe wartości, oznacza to, że zwróciłby różne wartości w różnych zapytaniach, więc masz szansę wychwycić problem podczas testowania oprogramowania. Ale niedeterministyczny w tym kontekście oznacza, że ​​serwer za każdym razem wybiera tę samą wartość, aż tego nie robi.

Dlaczego może zmienić wybraną wartość? Jednym z powodów jest aktualizacja serwera. Inną może być zmiana rozmiaru stołu. Chodzi o to, że serwer może zwrócić dowolną wartość.

Chciałbym, aby ludzie, którzy dopiero uczą się SQL, ustawili to ONLY_FULL_GROUP_BY tryb; uzyskaliby znacznie bardziej przewidywalne wyniki ze swoich zapytań, a serwer odrzuciłby zapytania niedeterministyczne.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy możemy mieć wiele WITH AS w jednym sql - Oracle SQL?

  2. Schemat inżynierii odwrotnej (wyrocznia) do ERD

  3. Znajdź zduplikowane wpisy w kolumnie

  4. Czy istnieje najlepszy sposób na uniknięcie wykonywania procesu więcej niż raz w Oracle?

  5. Wpisz podzapytania ORM