Niniejszy artykuł kieruję do tych którzy już w podstawowym stopniu poznali PHP i potrafią już w podstawowym stopniu stworzyć bazę danych. Zajmę się w nim głownie wybieraniem rekordów z bazy danych, czyli odczytywaniem zgromadzonych w niej informacji. Ze względu na, moim zdaniem, największą popularność posłużymy się bazą danych MySQL.

Spis treści

  1. Wstęp
  2. Warunki
    1. IN
    2. BETWEEN
    3. NOT
    4. Łączenie warunków
  3. Sortowanie
  4. Porcjowanie
  5. I co dalej?

1. Wstęp

Skoro zrobiliśmy już pierwszy krok i nauczyliśmy się stworzyć własną bazę danych, umiemy także do niej zapisywać, odczytywać, modyfikować i usuwać rekordy, na pewno mamy już w niej tyle informacji, że przydały by nam się jakieś metody wybierania z niej tylko konkretnych rekordów. Tym właśnie tematem zajmiemy się teraz.

Niniejszy artykuł kieruję do tych którzy już w podstawowym stopniu poznali PHP i potrafią już w podstawowym stopniu stworzyć bazę danych. Zajmę się w nim głownie wybieraniem rekordów z bazy danych, czyli odczytywaniem zgromadzonych w niej informacji. Ze względu na, moim zdaniem, największą popularność posłużymy się bazą danych MySQL.

Przedstawione zostaną tu tylko podstawowe metody. Należy mieć świadomość, iż jest to tylko czubek góry lodowej i wiele jeszcze zostanie do nauczenia się.

Metody wybierania możemy dla ułatwienia tego artykułu podzielić sobie na warunki, sortowanie i porcjowanie. Każda z nich zwróci tylko część rekordów zgromadzonych w tabeli bazy danych.

2. Warunki

Warunki to to co podajemy po słowie kluczowym WHERE, a co zawężą na zbiór rekordów którego dotyczy się komenda. Tak, celowo piszę komenda bo warunki dotyczą nie tylko wybierania rekordów poprzez komendę SELECT, ale także możemy, a niekiedy wręcz powinniśmy, stosować je do komend DELETE FROM, UPDATE.

Pisząc w poprzedni artykuł z tego cyklu podkreślałem aby w tych komendach stosować konstrukcję WHERE id=xx, gdzie xx było konkretnym id rekordu. To gwarantowało zawężenie działania komendy tyko do jednego rekordu. Mimo iż jest to w większości bardzo przydatne szczególnie dla DELETE czy UPDATE jednak dla SELECT już nie tak bardzo. Możemy nasze warunki budować tak, aby zbiór rekordów przez nie określany był dużo szerszy. Ma to nie banalne znaczenie, szczególnie przy wybieraniu rekordów. Np.:

SELECT * FROM adresy WHERE wiek=18; 

Takie zapytanie zwróci nam wszystkie rekordy z bazy dla których wiek określiliśmy na 18, ale także konstrukcja:

DELETE FROM adresy WHERE wiek=18; 

Usunie wszystkie rekordy w których wiek określiliśmy na 18.

Do tej pory poznaliśmy ogólny mechanizm działania warunków, oraz jego podstawową formę czyli porównanie. Teraz postaram się przedstawić inne jego formy.

Równość =
Mówi o tym że pole musi zawierać dokładnie to co określimy. Zapisujemy ją przy pomocy znaku równości [ = ].

Nierówność !=
Mówi o tym że pole nie może zawierać dokładnie tego co określimy. Zapisujemy ją przy pomocy symboli mniejszy, większy [ <> ] lub równoznacznie przy pomocy symboli wykrzyknik, równy [ != ].

Mniejsze <
Określa że pole musi mieć mniejszą wartość niż określone w warunku [ < ]. Większe >
Określa że pole musi mieć większą wartość niż określone w warunku [ > ].

Mniejsze lub równe <=
Określa że pole musi mieć mniejszą lub równą wartość niż określone w warunku [ <= ]. Większe lub równe >=
Określa że pole musi mieć większą lub równą wartość niż określone w warunku [ >= ].

SELECT * FROM adresy WHERE wiek=18; 
SELECT * FROM adresy WHERE wiek<>18; 
SELECT * FROM adresy WHERE wiek!=18; 
SELECT * FROM adresy WHERE wiek<18; 
SELECT * FROM adresy WHERE wiek>18; 
SELECT * FROM adresy WHERE wiek<=18; 
SELECT * FROM adresy WHERE wiek>=18; 

Poza tymi typami, nazwijmy je prostymi, możemy warunki budować w oparciu o bardziej złożone konstrukcje takie jak:

1.2. IN

Określa że wartość pola musi być jedną z podanych w liście parametrów wartością. Np.:

SELECT * FROM adresy WHERE wiek IN(18,24); 

Wybierze nam ono rekordy w których wiek jest równy 18 lub 24, ale także w ten sposób możemy wybrać rekordy w których imieniem jest Anna lub Magda lub Iwona:

Skasowane dane to nie zawsze tragedia - ściągnij program i odzyskaj dane
SELECT * FROM adresy WHERE imie IN('Anna','Magda','Iwona'); 

1.3. BETWEEN

Ten typ warunku określa nam że wartość pola powinna znaleźć się w pewnym zakresie.

SELECT * FROM adresy WHERE wiek BETWEEN 18 AND 24; 

Wyrażenie to wybierze nam rekordy, w których pole wiek zawiera wartości od 18 do 24 włącznie.

1.4. NOT

To wyrażenie służy do negowania innych wyrażeń warunków. Na tym etapie nauki uznajmy, że możemy nim negować tylko takie jak IN lub BETWEEN.

1.5. Łączenie warunków

Wszystkie przedstawione wyrażenia możemy łączyć w bardziej skomplikowane formy ujmują pojedyncze warunki w nawiasy i łącząc słowami kluczowymi AND (i) oraz OR (lub), na zasadach zwykłej arytmetyki boolowskiej.

SELECT * FROM adresy WHERE (imie='Anna') AND (wiek BETWEEN 18 AND 24); 

Takie wyrażenie wybierze nam z bazy danych wszystkie rekordy w których pole imie zawiera wyraz Anna, a wiek określony jest w przedziale 18 do 24 włącznie.

3. Sortowanie

Jest to najprostszy temat poruszany w tym artykule. Nie ogranicza on w żaden sposób ilości wybieranych rekordów, ale ponieważ jest często stosowany przy ich wybieraniu, uznałem za stosowne przedstawienie go w tym miejscu.

Sortowanie ogranicza się jedynie do ułożenia rekordów w kolejności rosnącej lub malejącej (domyślnie rosnącej) wartości określonego pola.
Aby otrzymać posortowane wyniki musimy do naszego zapytania dodać słowo kluczowe ORDERED BY i określić według którego pola mają być sortowane rekordy. Czyli określić klucz sortowania. Wygląda to tak.:

SELECT * FROM adresy ORDERED BY wiek; 

lub

SELECT * FROM adresy WHERE imie='Anna' ORDERED BY wiek; 

Oba przykłady zwrócą rekordy posortowane według pola wiek od jego najniższych do najwyższych wartości. Różnica polega na tym, że pierwszy przykład zwróci wszystkie rekordy, a drugi tylko te, w których pole imie zawiera wyraz „Anna”.

Natomiast, jeśli chcielibyśmy uzyskać rekordy w kolejności odwrotnej, czyli od najwyższych do najniższych musimy dodać na końcu słowo kluczowe DESC, i wtedy nasze przykłady przybiorą następującą postać:

SELECT * FROM adresy ORDERED BY wiek DESC; 
SELECT * FROM adresy WHERE imie='Anna' ORDERED BY wiek DESC; 

Z oczywistych względów, ta konstrukcja na naszym poziomie nauki ma zastosowanie tylko do polecenia SELECT, gdyż w pozostałych poznanych przez nas instrukcjach kolejność wykonywania jest zupełnie obojętna.

4. Porcjowanie

Ostatnim elementem który teraz zaprezentuję jest porcjowanie rekordów.

Łatwo sobie wyobrazić sytuację, w której mamy w bazie np. około 1000 rekordów które chcemy przedstawić, ale chcemy wyświetlać je np. po 20 na stronie. Nie ma wtedy sensu odczytywanie ich wszystkich i dopiero wyświetlanie części z nich. Prostszym i dużo szybszym rozwiązaniem jest od razu pobranie odpowiedniej ich ilości.

Aby pobrać tylko część rekordów należy posłużyć się słowem kluczowym LIMIT:

SELECT * FROM adresy LIMIT 20; 

Ten przykład pobierze pierwsze 20 rekordów z naszej bazy danych. Podkreślam: pierwsze! Ale co zrobić jeśli chcemy kolejne? Wystarczy określić od którego miejsca chcemy pobrać nasze 20 rekordów.

SELECT * FROM adresy LIMIT 99,20; 

Teraz zostanie pobrane tylko dwadzieścia rekordów, ale począwszy od 100 rekordu. To już chyba jest jasne. Ale dlaczego aby pobrać daną z setnego rekordu napisaliśmy 99? Dlatego że określamy w tym poleceniu nie to od którego rekordu chcemy pobierać dane, ale od którego numeru rekordu chcemy je pobierać. Rekordy natomiast są numerowane od zera. I tak pierwszy rekord ma numer 0, drugi rekord numer 1 itd.

5. I co dalej?

W tym artykule to już wszystko. Mam nadzieję że ułatwi Wam to pobieranie danych z bazy danych. Pamiętajcie, że są to Wasze początki zabawy z SQL’em i jeszcze dużo pozostaje do nauczenia się. Ale te informacje oraz Wasza inwencja twórcza powinny Wam już na dużo pozwolić.

W następnym artykule, o ile znajdę czas na jego napisanie, odejdę trochę od samego SQL’a i postaram przybliżyć się jego obsługę od strony PHP.