05. Część II. Pobieranie danych z bazy danych - Instrukcja S.txt

(45 KB) Pobierz
#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...
Zgłoś jeśli naruszono regulamin