Zaznacz to jako odpowiedź, jeśli rozwiało to Twoje wątpliwości, o czym wspomniałeś w komentarzach.
Mubashar
Odpowiedzi:
270
Te dwie formy składni są trochę mylące, ponieważ odwracają liczby:
LIMIT <skip>,<count>
Jest równa:
LIMIT <count> OFFSET <skip>
Jest kompatybilny ze składnią MySQL i PostgreSQL. MySQL obsługuje obie formy składni, a jego dokumentacja twierdzi, że druga składnia z funkcją OFFSET miała zapewnić zgodność z PostgreSQL. PostgreSQL docs wskazują, że obsługuje tylko drugi składni i docs SQLite jest pokazać, że obsługuje zarówno polecając drugi składni, aby uniknąć nieporozumień.
Nawiasem mówiąc, użycie LIMIT bez wcześniejszego użycia ORDER BY może nie zawsze przynieść zamierzone rezultaty. W praktyce SQLite zwróci wiersze w jakiejś kolejności, prawdopodobnie określanej przez to, jak są fizycznie przechowywane w pliku. Ale to niekoniecznie oznacza, że jest w żądanej kolejności. Jedynym sposobem uzyskania przewidywalnej kolejności jest jawne użycie polecenia ORDER BY.
Ta ostatnia jest alternatywną składnią z jednym zastrzeżeniem :
Jeśli zamiast słowa kluczowego OFFSET zostanie użyty przecinek, to przesunięcie jest pierwszą liczbą, a limitem jest druga liczba. Ta pozorna sprzeczność jest zamierzona - maksymalizuje kompatybilność ze starszymi systemami baz danych SQL.
Zrobiłem kilka testów i nie ma różnicy w wydajności.
Dotyczy to tylko zgodności z innymi językami sql.
Czas działania obu wersji jest taki sam.
Zrobiłem sqlite db z table1 z 100000 wierszami. Przeprowadzam następny test
long timeLimitOffset =0;
long timeLimitComma =0;for(int i =0; i <100000; i++){//first version
timeLimitOffset += SqlDuraction("Select * from table1 order by col1 LIMIT "+(i +1)+" OFFSET "+(1001- i)+"");// second version
timeLimitComma += SqlDuraction("Select * from table1 order by col1 LIMIT "+(1001- i)+" , "+(i +1)+"");}
Odpowiedzi:
Te dwie formy składni są trochę mylące, ponieważ odwracają liczby:
Jest równa:
Jest kompatybilny ze składnią MySQL i PostgreSQL. MySQL obsługuje obie formy składni, a jego dokumentacja twierdzi, że druga składnia z funkcją OFFSET miała zapewnić zgodność z PostgreSQL. PostgreSQL docs wskazują, że obsługuje tylko drugi składni i docs SQLite jest pokazać, że obsługuje zarówno polecając drugi składni, aby uniknąć nieporozumień.
Nawiasem mówiąc, użycie LIMIT bez wcześniejszego użycia ORDER BY może nie zawsze przynieść zamierzone rezultaty. W praktyce SQLite zwróci wiersze w jakiejś kolejności, prawdopodobnie określanej przez to, jak są fizycznie przechowywane w pliku. Ale to niekoniecznie oznacza, że jest w żądanej kolejności. Jedynym sposobem uzyskania przewidywalnej kolejności jest jawne użycie polecenia ORDER BY.
źródło
LIMIT <count> OFFSET <skip>
jest bardziej jasne. Dziękuję Ci.Ta ostatnia jest alternatywną składnią z jednym zastrzeżeniem :
źródło
Zrobiłem kilka testów i nie ma różnicy w wydajności.
Dotyczy to tylko zgodności z innymi językami sql.
Czas działania obu wersji jest taki sam.
Zrobiłem sqlite db z table1 z 100000 wierszami. Przeprowadzam następny test
Czasy zmieniają się dla 0,001 sekundy
źródło