#100 Częć II Pobieranie danych z bazy danych #103 Rozdział 5. Instrukcja SELECT Po zaprojektowaniu, utworzeniu i wypełnieniu bazy danych następny krok polega na uzyskaniu dostępu do danych. Język SQL oferuje instrukcję SELECT, która służy do wyszukiwania danych. Podstawowa składnia instrukcji jest wręcz podejrzanie prosta. Jednak jak, pokażę w dalszej częci tego rozdziału, można przy jej pomocy bardzo precyzyjnie wybierać pożšdane rekordy. Instrukcja SELECT składa się z wielu klauzuli, z których częć jest opcjonalna. Zanim przejdziemy do zaawansowanych technik wyszukiwania danych, pokażę najprostsze wersje instrukcji SELECT. W tym rozdziale zamierzam omówić instrukcję SELECT w jej najprostszej postaci i pokazać, jak przy jej pomocy wyszukujemy potrzebne dane z label bazy danych. W kolejnych rozdziałach pokażę bardziej zaawansowane techniki użycia instrukcji SELECT. Budowa instrukcji SELECT Zanim omówię szczegóły składni, pozwolę sobie zaprezentować typowš instrukcję SELECT. Listing 5.1. zawiera instrukcję SELECT i wynik wykonania tej instrukcji. ------------------------- Listing 5.1. Prosta instrukcja SELECT SELECT raovie_title, studio_id FROM Movies WHERE movie title - 'The Code Warrior' MOVIE_TITLE STUDIO_ID ------------ -------- The Code Warrior 4 ----------------------- Jak widać, w wyniku wykonania tego zapytania zwrócone zostały dwa pola z jednego rekordu. W bazie danych zostało przeszukane pole title (tytuł)z tabeli Movies (Filmy) w poszukiwaniu nazwy "The Code Warrior". Dla znalezionego rekordu wybrano dwa pola movie_title (tytuł filmu) oraz studio id i wywietlono na ekranie razem z nagłówkami pól. #104 A oto prosta składnia instrukcji SELECT: SELECT lista_pól FROM tabela [, tabela, ...] [WHERE warunek] ==================== Uwaga Przedstawiona składnia instrukcji SELECT zawiera tylko najbardziej podstawowe klauzule instrukcji, występujšce niemal w każdym zapytaniu. Istnieje oczywicie wiele dodatkowych klauzuli, które mogš być wykorzystane. Ich omówieniem zajmuje się cała druga częć tej ksišżki. ==================== Element lista_pól umożliwia wypisanie pól, które majš być przez zapytanie pobrane, z kolei element tabela okrela, z jakiej tabeli lub tabel pobierane sš dane. Sekcja WHERE umożliwia filtrowanie wyników poprzez porównanie z zadanym wzorcem. W przypadku, gdy chcemy otrzymać wszystkie wiersze z tabeli nie używamy sekcji WHERE. ===================== Rada Mam nawyk pisania kolejnych członów zapytania od nowej linii. Jak wyjaniłem wczeniej, język SQL jest pod tym względem bardzo tolerancyjny, stšd też zalecam różnicowanie zapisu instrukcji w celu podniesienia ich czytelnoci. Wraz ze wzrostem złożonoci zapytania ronie iloć klauzul w instrukcjach. Umieszczanie ich w osobnych wierszach ułatwia kontrolę poprawnoci i zwiększa czytelnoć. =========================== Okrelanie kolumn do pobrania Instrukcja SELECT listingu 5.1 zawierała opcjonalnš sekcję z WHERE, aby ograniczyć iloć rekordów zwracanych przez zapytanie. Jak widać na listngu 5.2, sekcja WHERE nie występuje. Pojawiajš się tylko nazwy kolumn i nazwa tabeli, z której dane sš pobierane. -------------------------- Listing 5.2. Instrukcja SELECT, która wybiera wszystkie wiersze z tabeli Movies (Filmy) SELECT movie_title FROM Movies ----------------- MOVIE_TITLE Vegetable House Prince Kong The Code Warrlor Bili Durham Codependence Day The Linux Flles SQL Strikes Back The Progranmer Hard Code The Rear Windows 10 rows selected -------------------------- #105 Przeanalizujmy kolejne człony zapytania. Pierwszy element zapytania to instrukcja SELECT, następny to lista kolumn (w naszym wypadku to tylko jedna kolumna), które majš zostać wybrane. Element trzeci, klauzula FROM, oddziela listę kolumn od elementu czwartego, nazwy tabeli, z której dane sš wyszukiwane. Kilka tabel może się znaleć w jednej instrukcji SELECT. Metoda wykonania takiej instrukcji jest opisana w rozdziale 8. Porównujšc wyniki zapytań z listingu 5.3 i 5.4 widzimy, że zmiana kolejnoci kolumn w zapytaniu powoduje zmianę w wywietlanym wyniku zapytania. Jest to jedna z metod, która umożliwia dostosowanie wyglšdu danych w raportach. -------------------------- Listing 5.3. Zapytanie wybierajšce kilka kolumn SELECT movie_title, studio_id FROM Movies MOVIE_TITLE STUDIO_ID ------------- ----------- Vegetable House 1 Prince Kong 2 The Code Warrior 4 Bili Durham 3 Codependence Day 1 The Linux Files 2 SQL Strikes Back 3 The Programmer 3 Hard Code 4 The Rear Windows 1 10 rows selected -------------------------- -------------------------- Listing 5.4. Zapytanie wybierajšce kolumny w innej kolejnoci SELECT studlo_id, movie_title FROM Movies STUDIO_ID MOVIE_TITLE --------- ---------------- 1 Vegetable House 2 Prince Kong 4 The Code Warrior 3 Bili Durham 1 Codependence Day 2 The Linux Files 3 SQL Strikes Back 3 The Programmer 4 Hard Code 1 The Rear Windows 10 rows selected -------------------------- Użycie znaku "*" do wybrania wszystkich kolumn Aby wybrać wszystkie kolumny można użyć symbolu "*", zamiast wypisywać kolejno wszystkie nazwy pól w postaci listy. Zamiast pisać: SELECT nazwa_studio, miasto_studio, stan_studio, studio_d FROM Studia można napisać SELECT * FROM Studia #106 Można by pomyleć, że te dwa zapytania dadzš ten sam wynik. Sprawdmy to na listingach 5.5 i 5.6. -------------------------- Listing 5.5. Zapytanie wybierajšce wszystkie kolumny z tabeli Studios SELECT studio_name, studio_city, studio_state, studio_id FROM Studios STUDIO_NAME STUDIO_CITY ST ------------- ------------- --- Giant Los Angeles CA MPM Burbank CA FKG Apex NC Delighted Artists Austin TX Mataversal Studios Los Angeles CA -------------------------- -------------------------- Listing 5.6. Zapytanie wybierajšce wszystkie kolumny z tabeli Studios z użyciem " * " SELECT * FROM Studios STUDIPO_ID STUDIO_NAME STUDIO_CITY ST ---------------------------------------------- 1 Giant Los Angeles CA 2 MPM Burbank CA 4 FKG Apex NC 3 Delighted Artists Austin TX 5 Mataversal Studios Los Angeles CA -------------------------- Jak widać, w każdym zapytaniu kolumny pojawiajš się w innym porzšdku. Zapytanie, które wykorzystuje symbol "*" do specyfikacji wszystkich kolumn, pokazuje kolumny w kolejnoci, w jakiej były wprowadzane przy użyciu instrukcji CREATE TABLE. Podanie wprost nazw kolumn w zapytaniu umożliwia okrelenie odpowiedniej ich kolejnoci w wyniku zapytania. Z użyciem instrukcji SELECT * wišżš się dwa problemy. Pierwszy polega na utrzymaniu przejrzystoci zapytania. Użycie instrukcji SELECT * nie daje informacji, jakie właciwie kolumny sš wykorzystywane. Problemy pojawiajš się, gdy trzeba zmienić zapytanie w zwišzku ze zmianami w strukturze bazy danych. Z tego powodu wypisywanie nazw kolumn w zapytaniu ułatwia jego analizę i modyfikację. Drugi problem wišże się z wydajnociš. Znacznie szybciej wykonujš się zapytania z listš nazw kolumn niż z użyciem symbolu "*". Zasada ta dotyczy także przypadków, gdy lista obejmuje nazwy wszystkich kolumn z tabeli, tak jak na listingu 5.5. Instrukcja SELECT * jest często wykorzystywana do szybkiego przeglšdu zawartoci bazy danych. Jest również przydatna w przypadku, gdy nie znamy dokładnie struktury tabel lub przeglšdamy zawartoć przed napisaniem odpowiedniego zapytania, innymi słowy, jest wygodnym skrótem. #107 Wykonywanie obliczeń na danych Wykorzystujšc język SQL możemy wykonywać obliczenia na danych i pokazywać wyniki w postaci wykonanych zapytań. Wykonanie obliczeń polega na zastšpieniu pozycji z listy nazw kolumn przez wyrażenie algebraiczne, które zawiera nazwy kolumn i liczby. Użycie wyrażeń w instrukcji SELECT Wyrażenie zawarte w zapytaniu nie musi koniecznie zawierać nazw kolumn. W instrukcji SELECT można używać tylko liczb, albo wyrażeń algebraicznych lub łańcuchów znaków. Wynik będzie zaprezentowany, tak jak wynik normalnego zapytania. Pokazuje to listing 5.7. --------------- Listing 5.7. Zapytanie zawierajšce -wyrażenia algebraiczne SELECT 'Przypadkowy tekst', movie_title, 2+2 FROM Movies 'PRZYPADKOWYTEKST' MOVIE_TITLE 2 + 2 ----------------------------------------- Przypadkowy tekst Vegetable House 4 Przypadkowy tekst Prince Kong 1 Przypadkowy tekst The Code Warrior 4 Przypadkowy tekst Bili Durham 4 Przypadkowy tekst Codependence Day 4 Przypadkowy tekst The Linux Files 4 Przypadkowy tekst SQL Strikes Back 4 Przypadkowy tekst The Programmer 4 Przypadkowy tekst Hard Code 4 Przypadkowy tekst The Rear Windows 4 10 rows selected --------------- Oczywicie zapytanie z listingu 5.7 jest kompletnie bezwartociowe. Łańcuch Przypadkowy tekst i liczba 4 sš wypisane jak kolumny. Łańcuch znaków w odróżnieniu od innych nagłówków kolumn rozpoczyna się od pojedynczego cudzysłowu. Wyrażenie matematyczne jest wyliczane. Gdyby wyrażenie matematyczne zawrzeć wewnštrz pojedynczego cudzysłowu, to zamiast wyniku w postaci liczby 4 pojawiłby się łańcuch 2+2. To samo dotyczy nazw kolumn. Zasadę prezentuje przykład z listingu 5.8. --------------- Listing 5.8. Wyrażenia w cudzysłowach sš traktowane jak zwykłe łańcuchy znaków SELECT 'Przypadowy tekst', 'movie_title', '2 + 2' FROM Filmy 'PRZYPADKOWYTEKST' MOVIE_TITLE 2+2' --------------------------------------------- Przypadkowy tekst movie_title '2+2' Przypadkowy tekst movie_title '2+2' Przypadkowy tekst movie_title '2+2' Przypadkowy tekst movie_title '2+2' Przypadkowy tekst movie_title '2+2' Przypadkowy tekst movie_title '2+2' #108 Przypadkowy tekst movie_title '2+2' Przypadkowy tekst movie_title '2+2' Przypadkowy tekst movie_title '2+2' Przypadkowy tekst movie_title '2+2' 10 rows sele...
sliwak