Pobieranie danych z bazy

Aby wejść w interakcję z bazą należy posiąść umiejętność zadawania precyzyjnych pytań. Pytania zadane w sposób nie precyzyjny nie dostarczą oczekiwanej odpowiedzi. W pewnym sensie pracując z bazą danych znamy w przybliżeniu odpowiedzi na nurtujące nas pytania. Taka wiedza pozwala nam weryfikować czy zadane przez nas pytanie było precyzyjne.

Zadawanie pytań w celu pobrania informacji z bazy odbywa się za pomocą dedykowanych programów
dla bazy Oracle mamy narzędzie SQL Plus lub SQL developer dla MSSQL jest SQL menegament studio, dla bazy mysql istnieje PHPMyadmin dla Postgressa istnieje podobny skrypt w języku PHP. Dla każdej bazy istnieje wiele narzędzi do komunikacji i ogólnie z odrobiną wyobraźni można stworzyć własne narzędzia.

Jeśli dysponujemy odpowiednimi narzędziami możemy zacząć zadawać pytania.

Podstawowe pytanie ma następujący format:

Pobierz + co + skąd czyli mówiąc zrozumiale dla bazy Select … from ,,,,
gdzie w miejsce kropek wstawiamy kolumny po przecinku a w miejsce przecinków nazwę tabeli bądź tabel.

Gdy nie znamy listy kolumn, zamiast kropek możemy wstawić gwiazdkę, w ten sposób pobierzemy wszystkie kolumny zadeklarowane w tabeli:

select * from tabela

Jeśli nie mamy rozpoznanej bazy, i mamy świadomość iż pracujemy na dużej bazie, warto nauczyć się od samego początku oszczędności. Wyniki zapytań można filtrować tak by dostać tylko to co nas interesuje. Używamy do tego klauzuli where.

select * from tabela where kolumna1=1

cofając się do rozpoznawania kolumn w tabeli zalecam używanie konstrukcji:

select * from tabela where 0=1

Powyższe zapytanie zwróci błyskawicznie listę kolumn. Jeśli chcemy zobaczyć tylko jakiś wycinek danych nie mając zbytnio idei po czym filtrować mamy pewien problem. Norma ISO i ANSII dla języka SQL nie definiuje takiego konstruktu i jest to zależne od producenta RDBMS.

W bazie MySQL można zrobić tak: select * from tabela limit 10
W MSSQL: select top 10 * from tabela
w Oracle: select * from tabela where rownum < 10 W innych systemach bazodanowych może się to odbywać na inne sposoby. We wstępie napisałem iż jedno zapytanie zwraca jeden widok danych w formie tabelarycznej. Tabele mają kilka właściwości których należy być świadomym. W każdej kolumnie znajdują się dane tego samego rodzaju. Wiersze w tabeli powinny być unikatowe. Mówiąc o rodzajach danych by nie wchodzić w informatyczne szczegóły trzeba umieć rozróżnić kilka podstawowych rodzajów: liczby,daty,napisy Dla każdego z tych typów są przewidziane pewne dozwolone operacje. Schodząc do poziomu pierwszej klasy szkoły podstawowej i działań na zbiorach: Do gruszek nie dodamy jabłek. I tak należy rozumieć rozróżnienie rodzajów danych. Każdy z wspomnianych typów ma wiele podtypów z różnymi właściwościami dla różnych RDBMS. Wszystkie typy natomiast kilka cech wspólnych. Każdy z typów może przyjąć wartość specjalną null - co oznacza wartość nie określoną. Czyli mówiąc kolokwialnie - PUSTO. Wstawienie wartości do kolumny odpowiedniego typu musi być zgodne z jej typem. Tak więc jeśli mamy zdefiniowaną kolumnę liczbową do zapewne znajdziemy tam tylko liczby. Chcąc sprawdzić jakiego typu są kolumny można sobie to wyklikać w większości programów do obsługi RDBMS, klikając w drzewku prawym przyciskiem na tabele (należy szukać pod Design albo Desc, Describe). Mówiąc o unikalności wierszy należało by wspomnieć iż większość tabel posiada jakiś identyfikator który określa konkretny wiersz. Takie pola najczęściej nazywają się : id, gid,gidnumer Wielu producentów oprogramowania stosuje sensowne nazewnictwo kolumn. Spotkałem się w sumie z dwoma systemami sensownego nazewnictwa: każda tabela posiada w nazwach kolumn stały przedrostek np: tabela klienci to pola nazywają się kli_id,kli_nazwa etc. Lub pola nazywane są po prostu id,nazwa itd. Ale w tabelach w których istnieją odwołania do takich wartości umieszcza się nazwy typu klienci_id. do dalszych przykładów załóżmy że mamy tabele przyjaciele która posiada następujące pola: id int, -- unikalny id - pole numeryczne imie varchar2(255), -- pole tekstowe plec int, -- 0 dziewczyna 1 facet -- wartosc numeryczna wiek int, -- wiek w latach -- wartosc liczbowa zarobki int, -- zarobki w tysiacach -- wartosc liczbowa kolor int); -- kolor skory 0 jasny 10 ciemny - skala -- wartosc liczbowa jeśli chcemy pobrać informacje o naszych znajomych
select * from przyjaciele

jeśli interesuje nas tylko info płci i imieniu to:

select plec,imie from przyjaciele

jesli chcemy zobaczyć tylko facetów to
select plec,imie from przyjaciele where plec=1

możemy tez filtrować po nie wybranych kolumnach

select imie from przyjaciele where plec=1

zapytanie musi pobierać co najmniej jedną kolumnę i nie koniecznie z tabeli

możemy też np dostawiać własne kolumny w ‘locie’

select 'jakis tekst',imie from przyjaciele

pojawią nam się imiona w 2 kolumnie a w pierwszej napis jakis tekst

Do kolumn możemy przypisywać aliasy czyli nadawać im nagłówki. Teraz warto zwrócić uwagę na problem rozróżniania wielkości liter (case sensitive). Jeśli chodzi o nazwy tabel i kolumn to bazą nie robi różnicy wielkość liter.

select IMIE,Imie,iMIE from PrZyjAciele

zwróci nam 3 razy imie kazdego z przyjaciol. Jednak ma to pewną nie miłą konsekwencję
w bazach MSSQL nazwy kolumn są zwracane albo tak jak je zapisano w selekcie, albo tak jak są w bazie. Z rozróżnieniem liter(co jest dość śmieszne dla bazy która ogólnie nie rozróżnia wielkości liter, ale o tym później).
Ma to znaczenie jeśli programujemy. Zwracając wyniki do tablic asocjacyjnych możemy się nie miło zdziwić.

W przypadku Oracle sprawa jest jasna i fajna. Nie ważne jak wpiszemy zwrotka przyjdzie zapisana dużymi literami.
Chyba że użyjemy aliasów

select imie nazwa from przyjaciele

to to samo co:
select imie as nazwa from przyjaciele

nazwa kolumny imie zostanie podmieniona na nazwa

na oraclu możemy zrobić jeszcze tak:

select imie "nazwa" from przyjaciele

wtedy nazwa zostanie zwrócona małymi literami.
Zabawa z aliasami ma pewien sens o którym później się rozwinę.

bardzo ważna uwaga:

select imie nazwa from przyjaciele where nazwa='janek'

nie zadziała!!! JEST TO BŁĄD. Aliasy nie są widzialne na poziomie danego zapytania.

Zapytania można agregować czyli robić zapytanie z zapytania, nie jest to zbyt optymalne ale czasem inaczej się nie da.

select * from (
select imie nazwa from przyjaciele
) c

w nawiasie zamiast tabeli podajemy zapytanie, które jakby w locie stanie się tabelą do dalszego zapytania.
Interesujące jest iż w takim wypadku aliasy z podzapytania staną się normalna nazwą kolumny dla zapytania zewnętrznego. Należy wspomnieć też o literce c która dodałem za nawiasem. Aliasy możemy przypisywać także tabelą( i powinniśmy je przypisywać podczas pisania dużych zapytań). Więc c jest aliasem na podzapytania. Niektóre RDBMS wymagają takiego zapisu w innych jest on nie wymagany jednakże poprawny.

select * from (
select imie nazwa from przyjaciele
) c where nazwa = 'janek'

jest poprawne.
Tylko jeśli korzystamy z MSSQL i w bazie mamy Janek to baza i tak zwróci nam wynik. W przypadku Oracle janka nam nie znajdzie.

Rozszerzeniem możliwości pobierania danych jest możliwość manipulacji na nich w locie.
Takim przykładem są funkcje. Jest ich dużo i w każdym systemie bazodanowym mogą być realizowane inaczej i inaczej się nazywać. Funkcje możemy podzielić. Najpopularniejsze to skalarne i agregujące. Te drugie zostały opisane w podstawach grupowania. Te pierwsze dla każdej podanej wartości zwracają jakąś konkretną wartość.
Każda funkcja przyjmuje określony rodzaj argumentów ( rodzaj danych).

select funkcja(kolumna) from tabela

dla obslugi ciągów tekstowych najpopularniejsze funkcje to substring,lower,upper,concat
substring -> wycina kawałek napisu
substring(nazwa_kolumny,start,długość) -> gdzie start to numer znaku od którego ma się zacząc wycinek licząc od lewej (od 1 znaku )
pod substring można podstawić też napis
substring(‘moj napis’,1,3) zwróci nam ‘moj’

dla kolumn liczbowych mamy: round,ceil,floor
czyli zaokrąglanie

na kolumnach liczbowych możemy wykonywać operacje arytmetyczne w zapytaniach

select plec+zarobki from przyjaciele

zapytanie jest bez sensu ale pokazuje iż można dodać do siebie wartość kolumn tego samego typu

select (plec+zarobki)/3 from przyjaciele

do pierwiastkowania i potęgowania istnieją odpowiednie funkcje. Praktycznie wszystkie funkcje znane z excela mają swoje odpowiedniki w SQL.

Możemy także wybiórczo coś pobierać z bazy:

select
case when plec=1 then 'facet' when plec=0 then 'kobieta' else 'obojniaczek' end plec
from przyjaciele

jest to instrukcja warunkowa która zamiast wartości liczbowych zwróci nam napisy
jej ogólna konstrukcja to
case when warunek logiczny then gdy prawda else gdy powyższe fałsz end
sekcji when then moze byc wiele jak w przykładzie. W przypadku skomplikowanych case należy pamiętać iż zostanie zwrócony pierwszy prawdziwy wynik i case jest wykonywane w kolejności definicji.

2 Replies to “Pobieranie danych z bazy”

  1. Dobra robota, bardzo fajnie się czyta. I co najważniejsze, zastosowane przykłady są na tyle charakterystyczne, że pozostają na długo w głowie – a jest to ważne dla osoby zaczynającej zabawę z SQL.

    Best regards

Leave a Reply

Your email address will not be published. Required fields are marked *

nineteen − 7 =