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

Jak mysql definiuje DISTINCT() w dokumentacji referencyjnej?

Ze względu na kompletność odpowiadam na własne i linkuję do innego pytanie moje własne. Wygląda na to, że to zachowanie jest bezpośrednią konsekwencją standardu SQL pozwalającego na odstępy między funkcją a nawiasem.

Ponieważ można (ogólnie) powiedzieć FUNCTION_NAME (x), to gdy ta funkcja zostanie zastosowana do pierwszego warunku wyboru

SELECT FUNCTION_NAME (x)

wtedy parser będzie miał trudności z ustaleniem, czy jest to kontekst nazwy funkcji, czy słowa kluczowego modyfikującego SELECT.

Tak więc w powyższym przypadku FUNCTION_NAME jest w rzeczywistości FUNCTION_NAME_OR_KEYWORD dla parsera.

Ale to idzie dalej:ponieważ spacja między nazwą funkcji a nawiasem JEST dozwolona, ​​parser faktycznie NIE może rozróżnić

SELECT FUNCTION_NAME_OR_KEYWORD (x)

i

SELECT FUNCTION_NAME_OR_KEYWORD(x)

(musi przetestować słowa kluczowe, aby zobaczyć, czy są one funkcjami), a ponieważ (x) zostanie przeanalizowany do x, wynika z tego, że dla FUNCTION_NAME_OR_KEYWORD -> DISTINCT (i wszystkich innych słów kluczowych modyfikujących SELECT) nie ma różnicy między

SELECT DISTINCT x, y, z, ...

i

SELECT DISTINCT(x), y, z, ...

QED, ale bez twardych odniesień (założenie, że standard nie dba o odstępy między nazwami funkcji i nawiasami jest, jak sądzę, uzasadnione, ale nie byłem w stanie przestrzegać gramatyki BNF do tego stopnia, że ​​mógłbym zacytować dokładną zasadę).

UWAGA:mysql ma pewną liczbę funkcji, w których zależy mu na odstępach między funkcjami i nawiasami, ale uważam, że są to wyjątki (stąd opcja serwera, aby to zignorować)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak używać STRCMP() do porównywania 2 ciągów znaków w MySQL?

  2. zapisz var_dump do pliku tekstowego

  3. Czy przechowywanie plików graficznych w bazie danych Mongo to dobry pomysł?

  4. Korzystanie z bazy danych NoSQL przez MySQL

  5. LOAD DATA INFILE łatwo przekonwertować RRRRMMDD na RRRR-MM-DD?