Kiedy pobieramy dane z bazy, rzadko interesują nas absolutnie wszystkie kolumny. Na przykład, w tabeli pracowników employees może być 15 kolumn: imię, nazwisko, data urodzenia, stanowisko, pensja, data zatrudnienia i tak dalej. A ty chcesz tylko poznać ich imiona i stanowiska. Logiczne, że pobieranie wszystkich danych — to bez sensu i nieefektywne. I tu właśnie wchodzi sztuka wybierania konkretnych kolumn.
Jeśli porównać to do czegoś, to tak jakbyś z koszyka z pomarańczami, jabłkami i bananami wyciągał tylko jabłka. Fajnie, nie? Tym się właśnie zajmiemy!
Składnia
Przypominamy, SQL został zaprojektowany maksymalnie user-friendly.
Po pierwsze, wielkość liter w zapytaniu nie ma znaczenia. Możesz napisać SELECT, Select albo select i wszystko zadziała. Po drugie, enterowanie i łamanie linii nie ma znaczenia. DBMS i tak zamieni zapytanie na jeden długi string, więc możesz pisać jak ci wygodnie.
Jak już pewnie się domyślasz, na słowach kluczowych SELECT i FROM się nie kończy. Inaczej nie byłoby tyle gadania o SQL. Rozszerzona wersja zapytania SQL wygląda tak:
SELECT kolumny
FROM tabela
WHERE warunek
GROUP BY kolumny
HAVING kolumny
ORDER BY sortowanie
Gdzie:
kolumny— to nazwy kolumn, które chcesz uzyskać.tabela— nazwa tabeli, z której pobierasz dane.warunek— warunek do filtrowania wierszy.sortowanie— wiersze i kolejność sortowania.
Brzmi łatwo? Rozbijmy to na realnym przykładzie. Ale zacznijmy od czegoś prostszego.
Przykład bazowego zapytania
Załóżmy, że mamy tabelę students, gdzie są dane o studentach. Tak może wyglądać struktura tabeli:
| id | first_name | last_name | age | grade |
|---|---|---|---|---|
| 1 | Alex | Lin | 20 | A |
| 2 | Anna | Song | 22 | B |
| 3 | Otto | Art | 19 | A |
Teraz chcemy poznać tylko nazwiska last_name i oceny grade wszystkich studentów.
Zapytanie będzie wyglądać tak:
SELECT last_name, grade
FROM students;
Wynik wykonania:
| last_name | grade |
|---|---|
| Lin | A |
| Song | B |
| Art | A |
Gratulacje, właśnie zaoszczędziłeś zasoby bazy danych i zrobiłeś wynik bardziej czytelnym!
Łączenie stringów
Samo wybieranie danych już umiesz, spróbujmy czegoś ciekawszego. W naszej tabeli imię i nazwisko są w osobnych kolumnach. Napiszmy zapytanie, gdzie będzie kolumna z pełnym imieniem studenta.
Żeby połączyć dwa stringi w PostgreSQL używa się operatora ||. Nasze zapytanie SELECT będzie wyglądać tak:
SELECT first_name || last_name, grade
FROM students;
Wynik wykonania:
| first_name || last_name | grade |
|---|---|
| AlexLin | A |
| AnnaSong | B |
| OttoArt | A |
Hmm. Chyba czegoś tu brakuje. Na przykład spacji między imieniem a nazwiskiem! Naprawmy to.
SELECT first_name || ' ' || last_name, grade
FROM students;
Wynik wykonania:
| first_name || ' ' || last_name | grade |
|---|---|
| Alex Lin | A |
| Anna Song | B |
| Otto Art | A |
Pięknie. Zawartość tabeli-wyniku mi się podoba, ale co z nagłówkiem? Chciałoby się tam widzieć full name, albo po prostu name, a nie first_name || ' ' || last_name. Tak nieładnie i niepraktycznie. Ale i na to jest sposób.
Wybieranie z użyciem aliasów
Zapytania SQL można zrobić bardziej czytelnymi dzięki aliasom. To po prostu sposób, żeby nadać kolumnie nowe imię w ramach zapytania. Aliasów używa się z kluczem AS (chociaż formalnie można go pominąć, ale dla czytelności lepiej nie).
Zobaczmy przykład:
SELECT first_name AS "Imię", last_name AS "Nazwisko", grade AS "Ocena"
FROM students;
Wynik wykonania:
| Imię | Nazwisko | Ocena |
|---|---|---|
| Alex | Lin | A |
| Anna | Song | B |
| Otto | Art | A |
Tutaj:
- Zmieniliśmy nazwy kolumn, żeby były bardziej zrozumiałe po polsku.
- Użyliśmy aliasów w zapytaniu, stosując
AS.
Jeśli twój szef albo klient chce zobaczyć dane o użytkownikach i nie chcesz, żeby osiwiał patrząc na tabelę — aliasy to twój przyjaciel.
Teraz trochę ulepszmy nasze zapytanie o pełne imię.
SELECT first_name || ' ' || last_name AS "Pełne imię", grade AS "Ocena"
FROM students;
Wynik wykonania:
| Pełne imię | Ocena |
|---|---|
| Alex Lin | A |
| Anna Song | B |
| Otto Art | A |
Super. Tak jak chcieliśmy.
Po co wybierać tylko niektóre kolumny?
- Wydajność
Wyobraź sobie, że pracujesz z ogromną tabelą na miliony wierszy i setki kolumn. Pobieranie wszystkiego SELECT * może zająć minuty albo nawet godziny i zjeść mnóstwo zasobów serwera. A tak dostajesz tylko to, co trzeba.
- Czytelność
Kiedy pobierasz tylko potrzebne kolumny, wynik jest dużo łatwiejszy do ogarnięcia. Inaczej twój wynik będzie wyglądał jak próba przeczytania długiego feeda newsów w piątek wieczorem.
- Minimalizacja błędów
Im mniej danych obrabiasz w zapytaniu, tym mniejsze szanse, że coś pójdzie nie tak. Zwłaszcza jeśli potem dalej pracujesz z tymi danymi.
O czym warto pamiętać?
Aliasowanie tabel
Inny sposób na radzenie sobie z długimi nazwami tabel — to używanie aliasów tabel. Powinny przypominać oryginalną nazwę tabeli albo być logicznie związane z jej zawartością.
SELECT sa05.first_name, sa05.course_id
FROM students_archive_2005 AS sa05
Ta metoda jest szczególnie przydatna, jeśli masz długie nazwy tabel jak university_students_enrollments_records — możesz użyć usr albo us
Typowe błędy przy wyborze konkretnych kolumn
Błędy w nazwach kolumn. Jeśli napiszesz nazwę kolumny z błędem, dostaniesz komunikat o błędzie typu:
ERROR: column "lastname" does not exist. Sprawdź poprawność nazw kolumn.Konfliktujące nazwy. Gdy w zapytaniu bierze udział kilka tabel, zawsze podawaj, do której tabeli należy pole. Na przykład,
students.first_name.Używanie
SELECT *— to pułapka dla początkujących. Tak, to działa i jest wygodne, ale w dużych projektach to zła praktyka! Zawsze wybieraj tylko te kolumny, które naprawdę są ci potrzebne.
GO TO FULL VERSION