SELECT, aliasy i DISTINCT
Wybierz kolumny, nazwij wynik i usuń powtórzenia. Zobacz różnicę między odczytem danych a ich zmianą.
Część bazodanowa INF.03SELECT odpowiada na pytanie
Chcemy listę imion klientów i miejscowości. Nie potrzebujemy ich adresów e-mail ani danych zamówień. SELECT określa kolumny odpowiedzi, a FROM wskazuje tabelę źródłową. Czytanie danych nie wymaga ich kopiowania do nowej tabeli.
SELECT imie, miasto
FROM klienci
ORDER BY id;| imie | miasto |
|---|---|
| Ala | Gdansk |
| Jan | Krakow |
| O’Neil | Gdansk |
| Ewa | NULL |
| Adam | Torun |
Tak wygląda oczekiwany wynik po resecie danych startowych. ORDER BY id określa kolejność. Bez ORDER BY serwer nie gwarantuje kolejności, nawet jeśli kilka kolejnych uruchomień pokazuje ten sam układ. Nazwy miast w tej małej bazie zapisaliśmy bez polskich znaków, aby oddzielić ćwiczenia składni od różnic kolacji.
Kolumny, gwiazdka i wyrażenia
SELECT * FROM produkty;
SELECT id, nazwa, cena
FROM produkty;
SELECT nazwa, cena * 0.90 AS cena_promocyjna
FROM produkty
ORDER BY id;Gwiazdka oznacza wszystkie kolumny. Jest wygodna do pierwszego obejrzenia danych, ale w raporcie i kodzie aplikacji lepiej wymienić potrzebne kolumny. Dodanie nowej kolumny do tabeli nie powinno przypadkowo ujawniać jej w raporcie.
Wyrażenie cena * 0.90 oblicza cenę obniżoną o 10%. Nie zmienia zapisanej ceny. Dla Klawiatury 120 otrzymasz 108, dla Myszy 60 — 54, Monitora 800 — 720 i Kabla 25 — 22,5. Interfejs może wyświetlić kropkę dziesiętną i inną liczbę zer. W edytorze cena ma typ REAL; precyzję finansową sprawdzaj na rzeczywistym DECIMAL.
Alias nadaje nazwę wynikowi
SELECT imie AS klient, miasto AS miejscowosc
FROM klienci
ORDER BY id;AS tworzy alias nagłówka. Tabela nadal ma kolumnę imie. Alias jest szczególnie ważny dla wyrażeń: nagłówek cena_promocyjna jest czytelniejszy niż cena * 0.90. Stosuj proste aliasy bez spacji, aby ograniczyć różnice cytowania identyfikatorów między silnikami.
SELECT imie miasto FROM klienci; może zostać odczytane jako jedna kolumna imie z aliasem miasto. Jeśli oczekujesz dwóch kolumn, wpisz przecinek: SELECT imie, miasto FROM klienci;.DISTINCT usuwa powtórzenia całych wierszy wyniku
SELECT DISTINCT miasto FROM klienci;
SELECT DISTINCT imie, miasto FROM klienci;Pierwszy wynik ma cztery pozycje: Gdansk, Krakow, Torun i NULL, bez gwarancji kolejności. Dwa wystąpienia Gdansk tworzą jedną pozycję. Drugi wynik nadal ma pięć wierszy, bo pary imię–miasto są różne. DISTINCT nie znaczy „unikalne wartości tylko pierwszej kolumny”.
DISTINCT w SELECT nie usuwa niczego z tabeli. Nie zastępuje ograniczenia UNIQUE, które kontroluje zapis danych. Nie używaj DISTINCT jako sposobu ukrycia błędnie połączonych tabel — najpierw ustal, skąd biorą się powtórzenia.
Wypróbuj zapytanie
SQLite w przeglądarce — ograniczona emulacja składni MySQL / SQL Server. To nie są rzeczywiste serwery. Ścisłe typy, auto-ID i administrację ćwicz w prawdziwym SZBD.
To samo pytanie w czterech środowiskach
Poniższy zapis jest wspólny dla MySQL/MariaDB, SQL Server, Oracle 19c i Access/ACE przy zgodnej tabeli:
SELECT DISTINCT miasto AS miejscowosc
FROM klienci
ORDER BY miasto;Wybór kolumn i alias pozostają takie same. Konkretna kolejność napisów i NULL może być inna z powodu kolacji oraz reguł sortowania. SQL Server pozwala cytować identyfikatory przez [], MySQL zwykle przez backticki, Oracle przez podwójne cudzysłowy, Access przez []. Kursowe nazwy bez spacji nie wymagają tego cytowania.
W Access występuje także DISTINCTROW o innym znaczeniu dotyczącym rekordów źródłowych. Nie zastępuj nim automatycznie DISTINCT. Przy zwykłej liście unikalnych miejscowości użyj DISTINCT.
Ćwiczenia
- Wyświetl id oraz nazwę każdego produktu. Nadaj nazwie alias produkt i uporządkuj po id.
- Wyświetl unikalne statusy zamówień.
- Wyświetl nazwę produktu, cenę oraz cenę podwyższoną o 5% jako nowa_cena. Sprawdź, czy zapisane ceny się zmieniły.
Rozwiązania i kontrola
SELECT id, nazwa AS produkt FROM produkty ORDER BY id;
SELECT DISTINCT status FROM zamowienia ORDER BY status;
SELECT nazwa, cena, cena * 1.05 AS nowa_cena
FROM produkty ORDER BY id;
SELECT id, cena FROM produkty ORDER BY id;1. Cztery wiersze, dwie kolumny. 2. Dwa statusy: nowe, oplacone. 3. Nowe obliczenia: 126, 63, 840, 26,25. Ostatni SELECT nadal odczytuje ceny 120, 60, 800 i 25. SELECT z obliczeniem nie był UPDATE.
Źródła: MySQL SELECT, SQL Server SELECT, Access SELECT. INF.03.4: zapytania pobierające dane. Dalej: WHERE i logika warunków.

