SELECT czyta wiersze z tabeli
Każde pytanie, które zadajesz bazie SQLite, zaczyna się od SELECT. Oznacza ono: daj mi te kolumny z tej tabeli, dla wierszy spełniających te warunki. Dziś skupiamy się na dwóch pierwszych elementach: kolumnach i tabeli. Filtrowanie pojawi się na następnej stronie.
Najprostsze możliwe zapytanie:
SELECT * oznacza "każda kolumna". FROM products wskazuje tabelę. Wynik to jeden wiersz na rekord ze wszystkimi czterema kolumnami. Średnik kończy instrukcję.
To cały kształt: SELECT <columns> FROM <table>;.
Wybór konkretnych kolumn
* jest wygodna, gdy eksplorujesz dane. W prawdziwym kodzie prawie zawsze chcesz wymienić kolumny, na których ci zależy:
Dostajesz dwie kolumny w kolejności, o którą prosisz. Kolejność na liście SELECT decyduje o kolejności w wyniku i nie musi odpowiadać kolejności kolumn w tabeli.
Dlaczego to lepsze niż SELECT *? Z dwóch powodów. Po pierwsze, mniej danych przechodzi przez sieć (albo jest czytanych z pliku), co ma znaczenie przy szerokich tabelach. Po drugie, zapytanie pozostaje stabilne, gdy ktoś w przyszłym miesiącu doda kolumnę do tabeli. SELECT * po cichu zacznie zwracać więcej, co może zepsuć kod aplikacji rozpakowujący wiersze według pozycji.
SELECT może liczyć, a nie tylko pobierać
Kolumny na liście SELECT nie muszą być surowymi nazwami kolumn. Mogą być dowolnym wyrażeniem: arytmetyką, wywołaniami funkcji, łączeniem tekstów, stałymi. SQLite oblicza wyrażenie dla każdego wiersza.
Czwartej kolumny nie ma w tabeli: SQLite obliczył ją wiersz po wierszu. To samo możesz zrobić z funkcjami tekstowymi, datami, wyrażeniami warunkowymi, czymkolwiek. Lista SELECT to miejsce na kształtowanie danych, a nie tylko ich pobieranie.
Możesz nawet użyć SELECT bez klauzuli FROM i traktować SQLite jak kalkulator:
Jeden wiersz, trzy kolumny. Przydaje się do sprawdzenia, co robi wyrażenie, zanim wstawisz je do prawdziwego zapytania.
Aliasy kolumn z AS
Gdy obliczasz kolumnę, SQLite wybiera dla niej domyślną nazwę, często samo wyrażenie, na przykład price * stock. To brzydkie i niestabilne. Nadaj kolumnie prawdziwą nazwę przez AS:
Alias to nazwa kolumny w wyniku. Ma to znaczenie dla czytelności, gdy czytasz wynik, i ogromne znaczenie dla kodu aplikacji, który pobiera wartości po nazwie kolumny (row["inventory_value"] zamiast row[1]).
Słowo kluczowe AS jest opcjonalne (price * stock inventory_value działa tak samo), ale pisz je jawnie. Intencja jest wtedy jaśniejsza i nie zmylisz czytelników, którzy mogliby wziąć brakujący przecinek za alias.
Alias także dla tabeli
Możesz też nadać krótki alias samej tabeli. Przy jednej tabeli niewiele to daje, ale nawyk opłaca się od chwili, gdy zaczynasz robić złączenia:
p zastępuje teraz products. Zapis z kropką p.name jasno mówi, z której tabeli pochodzi kolumna. Przy jednej tabeli to tylko szum, ale przy trzech złączonych tabelach to jedyne, co utrzymuje zapytanie czytelnym.
Literały i stałe w wyniku
Możesz mieszać prawdziwe kolumny ze stałymi wartościami. Przydaje się to, gdy chcesz oznaczyć wiersze albo wstawić wartość zastępczą:
Każdy wiersz dostaje te same 'USD' i 1. Ten wzorzec pojawia się, gdy łączysz wyniki kilku zapytań przez UNION i potrzebujesz kolumny znacznika, by odróżnić źródła.
Słowo o NULL
Niektóre kolumny są puste: nie wstawiono do nich wartości albo kolumna nie ma wartości domyślnej. SQLite reprezentuje "brak wartości" jako NULL, a NULL pojawia się w wynikach SELECT jako puste pole lub dosłowne słowo NULL, zależnie od narzędzia.
Spójrz na drugi wiersz. price to NULL, a price * 2 to też NULL: każda arytmetyka z udziałem NULL daje NULL. To jedno z najczęstszych źródeł zagadkowych wyników w SQL i ma swoją osobną stronę, która pojawi się dalej. Na razie zauważ tylko, że NULL zaraża wyrażenia.
Co warto zapamiętać
SELECT <columns> FROM <table>;to kształt każdego zapytania.- W prawdziwym kodzie wypisuj kolumny jawnie, a
SELECT *zostaw do eksploracji. - Lista
SELECTmoże zawierać dowolne wyrażenie, nie tylko nazwy kolumn. - Używaj
AS, by nadawać porządne nazwy obliczanym kolumnom i tabelom z aliasem. NULLprzenosi się przez arytmetykę: pamiętaj o tym, gdy wyniki wyglądają dziwnie.
Dalej: filtrowanie z WHERE
Jak dotąd każde zapytanie zwraca każdy wiersz tabeli. Klauzula WHERE pozwala to zawęzić: wybierać wiersze po cenie, nazwie, dacie albo dowolnym wyrażeniu, które daje prawdę lub fałsz. O tym jest następna strona.
Najczęściej zadawane pytania
Jaka jest podstawowa składnia SELECT w SQLite?
SELECT <columns> FROM <table>;. Kolumny mogą być listą rozdzieloną przecinkami (SELECT name, email FROM users), gwiazdką * oznaczającą wszystkie kolumny albo dowolnym wyrażeniem, takim jak price * quantity. Klauzula FROM wskazuje tabelę, z której czytasz, a średnik kończy instrukcję.
Czy używać SELECT * w SQLite?
Nie ma problemu, gdy przeglądasz w CLI, co jest w tabeli. W kodzie aplikacji wypisuj kolumny, których naprawdę potrzebujesz. SELECT * wiąże twój kod z bieżącym schematem: dodaj jutro kolumnę, a każde zapytanie po cichu zacznie zwracać więcej danych, co może zepsuć kod rozpakowujący wiersze według pozycji.
Jak zmienić nazwę kolumny w wynikach SELECT?
Użyj AS, by nadać kolumnie lub wyrażeniu alias: SELECT price * quantity AS total FROM orders. Alias staje się nazwą kolumny w wyniku, co ma znaczenie dla czytelności i dla kodu, który odczytuje wyniki po nazwie kolumny. Słowo kluczowe AS jest opcjonalne, ale warto je zostawić dla jasności.