
Jednym z częstych zadań w bazach danych jest losowanie rekordów. Czy to do prezentowania losowych artykułów, wyboru użytkownika w konkursie czy testowania baz danych. W SQL losowość osiągamy dzięki funkcji RANDOM (lub jej odpowiednikom w różnych systemach bazodanowych). Dzisiaj przyjrzymy się, jak działa RANDOM w języku SQL i zaprezentujemy kilka praktycznych zastosowań.
Funkcja RANDOM w SQL – jak działa?
Funkcja RANDOM()
zwraca liczbę, która jest losowa. W zależności od bazy danych jej implementacja może się różnić:
- W PostgreSQL funkcja
RANDOM()
zwraca liczbę zmiennoprzecinkową z zakresu0 <= x < 1
. - W SQLite funkcja
RANDOM()
zwraca losową liczbę całkowitą w zakresie od-9223372036854775808
do9223372036854775807
. - W MySQL i MariaDB odpowiednikiem jest funkcja
RAND()
, która działa podobnie do PostgreSQL. - W SQL Server losowość generuje się za pomocą
NEWID()
lubRAND()
(ale uwaga na różnice w działaniu).
Losowanie rekordów z tabeli
A więc jak w praktyce możemy losować rekordy? Spójrzmy na najczęstszy przypadek – wybór losowego wiersza:
SELECT * FROM produkty ORDER BY RANDOM() LIMIT 1;
Ta składnia świetnie sprawdza się w PostgreSQL czy SQLite. W innych bazach możesz użyć:
- MySQL / MariaDB:
ORDER BY RAND()
- SQL Server:
NEWID()
SELECT TOP 1 * FROM produkty ORDER BY NEWID();
Losowanie wielu rekordów
Załóżmy, że chcemy wylosować pięć różnych produktów:
SELECT * FROM produkty ORDER BY RANDOM() LIMIT 5;
Lub w MySQL:
SELECT * FROM produkty ORDER BY RAND() LIMIT 5;
Losowanie liczby w określonym zakresie
SQL umożliwia również losowanie liczb w zadanym zakresie:
SELECT FLOOR(RANDOM() * 100) AS liczba;
Powyższe zapytanie w PostgreSQL zwróci losową liczbę całkowitą od 0 do 99.
W MySQL używamy:
SELECT FLOOR(RAND() * 100) AS liczba;
Wydajność losowego sortowania
Użycie ORDER BY RANDOM()
na dużych tabelach może być kosztowne, ponieważ wymusza ono przetasowanie całej tabeli przed zwróceniem wyników. Istnieją bardziej wydajne sposoby losowania, np. poprzez:
- Losowanie na podstawie unikalnego ID.
- Losowanie na podstawie liczby rekordów w tabeli.
Przykłady alternatywnych metod losowania
Jeśli tabela posiada kolumnę id
(np. klucz główny, który jest liczbą całkowitą i rośnie sekwencyjnie), możemy użyć:
SELECT * FROM produkty WHERE id = (SELECT FLOOR(RANDOM() * (SELECT MAX(id) FROM produkty) + 1));
W MySQL:
SELECT * FROM produkty WHERE id = (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM produkty) + 1));
Podsumowanie
Funkcja RANDOM (lub jej odpowiedniki, jak RAND czy NEWID) to potężne narzędzie do losowania danych w SQL. Kluczowe wnioski:
- W PostgreSQL i SQLite używamy
RANDOM()
, a w MySQL –RAND()
. - Losowanie pojedynczego rekordu wymaga użycia
ORDER BY RANDOM()
, ale można to zoptymalizować. - Skalowanie losowania na dużych zbiorach danych może wymagać alternatywnych metod – opartych na ID lub podzapytań.
Tabela podsumowująca różnice w RANDOM w różnych bazach danych:
Baza danych | Losowa funkcja | Zakres wartości |
---|---|---|
PostgreSQL | RANDOM() | 0 ≤ x < 1 |
MySQL | RAND() | 0 ≤ x < 1 |
SQLite | RANDOM() | -9223372036854775808 do 9223372036854775807 |
SQL Server | NEWID() | Unikalne identyfikatory |
Inny ciekawy artykuł:
Jak działa EXP w języku SQL? Przykłady zastosowania
Opanuj SQL z moim kursem!
Poznasz zarówno podstawy, jak i zaawansowane zapytania analityczne (CTE, subqueries, window functions). Nauczysz się pracować na różnych silnikach – na kursie pracujemy zarówno na MySQL, jak i na Postgres. Wszystko zainstalujemy na Twoim komputerze, plus dostaniesz mnóstwo zestawów danych do ćwiczeń.
Zostań analitykiem danych – dołącz do KajoDataSpace!
Najlepsza ścieżka do zawodu analityka danych. Dostęp do pełnych wersji kursów online z Excela, SQLa, Tableau i Pythona z certyfikatami + specjalistycznych webinarów z PowerBI.
Ekskluzywana ale pomagająca sobie społeczność.
Ponad 61 godzin materiałów video.
Spotkania LIVE co miesiąc.
Mój osobisty mentoring.