|
Mysql |
|
|
|
|
Czego się
nauczysz w tej części kursu
W tej części kursu nauczysz się budować bardziej rozbudowane warunki w
swoich zapytaniach oraz sortować wyniki zapytań. Na koniec pokażę jak radzić
sobie z błędami powstałymi w wyniku wykonania zapytania.
Rozszerzanie zapytania - wyszukiwanie rekordów
Podczas poprzedniej lekcji nauczyłeś się wydawać proste zapytania do bazy
danych, spróbujmy poznać nowe operatory i rozszerzyć nasze zapytania.
Przypomnijmy sobie podstawowe użycie polecenia SELECT:
SELECT nazwa_pola FROM nazwa_tabeli WHERE warunek
Jeśli rozszerzymy warunek o operator LIKE uzyskamy prostą wyszukiwarkę. Wzór
zastosowania operatora like:
SELECT nazwa_pola FROM nazwa_tabeli WHERE nazwa_pola LIKE "wzór_dopasowania"
W praktyce wybrane zostaną wszystkie wiersze z tabeli, w których pole
nazwa_pola pasuje do wzór_dopasowania. No tak - to nam za dużo nie mówi na
początku. Spójrzmy na przykład praktyczny bardziej:
SELECT `id`, `nazwisko` FROM `nba` WHERE `nazwisko` LIKE "%pip%"
Wedle zadanego wzoru wybrane zostaną wszystkie wiersze z tabeli, w których
nazwisko zawiera ciąg znaków "pip". Znak procenta (%) w języku SQL oznacza
dowolną ilość (również zero!) dowolnych znaków. Jeśli chcielibyśmy wybrać
wszystkie nazwiska zaczynające się na "pip" nasze zapytanie wyglądałoby
następująco:
SELECT `id`, `nazwisko` FROM `nba` WHERE `nazwisko` LIKE "pip%"
Również możemy wybrać wszystkie nazwiska kończące się na "pip":
SELECT `id`, `nazwisko` FROM `nba` WHERE `nazwisko` LIKE "pip%"
Lub zaczynające się na literę "p" a kończące literą "n":
SELECT `id`, `nazwisko` FROM `nba` WHERE `nazwisko` LIKE "p%n"
W ten sposób możemy zbudować np. prostą wyszukiwarkę na stronie. Bardziej
rozbudowaną wyszukiwarkę można zbudować za pomocą wyrażeń regularnych ale to
temat o osobny artykuł.
Rozszerzanie zapytania - operatory porównań
Gdy porównujemy wartości określamy, że wartość danego pola musi być np.
mniejsza niż jakaś tam wartość etc. Do opisania takich warunków musimy użyć
operatorów porównań:
= operator równości
< i > operatory mniejszy od oraz większy od
<= i >= operatory mniejszy lub równy oraz większy lub równy
<> zaprzeczenie operatora =, sprawdza czy dwa elementy nie są identyczne
Rozszerzanie zapytania - operatory logiczne
Jak na razie nasze zapytania opierały się na pojedynczym warunku. Co jednak
zrobić w przypadku gdy chcemy dokładniej określić zakres działania naszego
zapytania i jeden warunek jest niewystarczający? W tym momencie przychodzą
nam z pomocą operatory, oto kilka z nich:
AND - operator logiczny łączący warunki, przykład działania:
SELECT `id`, `nazwisko` FROM `nba` WHERE `punkty` > 100 AND `mistrzostwa` >
50
W powyższym przykładzie wybrane zostaną wszystkie rekordy, w których wartość
pola punkty będzie większa od 100 i wartość pola mistrzostwa będzie większa
od 50 - obydwa warunki muszą być spełnione.
OR - operator logiczny "lub" wymagający spełnienia przynajmniej jednego z
warunków. Przykład:
SELECT `id`, `nazwisko` FROM `nba` WHERE `punkty` >= 100 OR `mistrzostwa` >=
50
Wybrane zostaną tylko te rekordy, w których wartość pola punky jest większa
lub równa 100 lub wartość pola mistrzostwa jest większa lub równa 50 - jeden
z dwóch warunków musi być spełniony.
IN - operator sprawdzający przynależność elementu do zadanego zbioru.
Elementy zbioru podaje się w nawiasach okrągłych i wymienia po przecinkach.
Przykład:
SELECT `id`, `nazwisko` FROM `nba` WHERE `id` IN (1,2,3)
Wybrane zostaną wszystkie rekordy, których pole id będzie równie 1, 2 lub 3.
Czyli faktycznie wybrane zostaną trzy rekordy o z polami id o wartościach
podanych w nawiasach okrągłych. W przypadku gdy mamy do czynienia ze zbiorem
ciągłym lepiej będzie wykorzystać operator:
BETWEEN - operator sprawdzający przynależność elementu do danego przedziału.
Przykład:
SELECT `id`, `nazwisko` FROM `nba` WHERE `id` BETWEEN 1 AND 5
Wybrane zostaną wszystkie rekordy, których pole id będzie z przedziału 1 do
5.
NOT - operator zaprzeczenia. Możemy go łączyć z innymi operatorami np "NOT
BETWEEN" czy "NOT IN". Przykład:
SELECT `id`, `nazwisko` FROM `nba` WHERE `id` NOT BETWEEN 1 AND 5
Wybrane zostaną wszystkie rekordy, których pole id będzie z poza przedziału
1 do 5.
Łącząc powyższe operatory moglibyśmy np. wyszukać wszystkich zawodników z
naszej tabeli, którzy grają co najmniej 10 do maksymalnie 15 lat i w tych
mistrzostwach zdobyli już co najmniej 20 punków. Konstrukcja taka
wyglądałaby następująco:
SELECT `id`, `nazwisko` FROM `nba` WHERE `lata` BETWEEN 10 AND 15 AND `punkty`
> 20
Rozszerzanie zapytania - sortowanie wyników
Gdy wybieramy jakieś dane z tabeli ważna sprawą jest sposób prezentacji
danych. Wszystkie wydobyte za pomocą języka zapytań SQL możemy posortować w
dowolny sposób. Do sortowanie służy klauzula ORDER BY. Wzór stosowania:
SELECT nazwa_pola FROM nazwa_tabeli ORDER BY nazwa_pola [rodzaj_sortowania]
Rodzaj sortowania nie jest obowiązkowy. Dostępne są dwa rodzaje sortowania:
ASC - sortowanie rosnąco, domyślny sposób sortowania
DESC - sortowanie malejąco
Przykład zastosowania:
SELECT `id`, `nazwisko` FROM `nba` ORDER BY `punkty` DESC
Powyższy przykład wyświetli wszystkie wiersze tabeli nba posortowane według
pola punky od największej wartość do najmniejszej. Możemy również sortować
po kilku polach, np:
SELECT `id`, `nazwisko` FROM `nba` ORDER BY `punkty`, `nazwisko` DESC
Przykład ten posortuje najpierw według ilości punktów. Gdy trafimy na dwa
rekordy, w których wartości pola punkty będą identyczne kolejnym kryterium
będzie pole nazwisko. Ten przykład nie jest zbyt życiowy ponieważ kto
sortuje nazwiska malejąco? ;) Możemy również mieszać sposoby sortowania np.:
SELECT `id`, `nazwisko` FROM `nba` ORDER BY `punkty` DESC, `nazwisko` ASC
W tym przykładzie posortujemy najpierw malejąco według ilości punktów,
następnie gdy wystąpią dwa rekordy, w których ilość punktów będzie taka sama
zostaną one wyświetlone w kolejności rosnącej według nazwiska.
Analiza błędów
Często nasz kod zawiera błędy, jednak jeśli nawet jakaś operacja się nie
powiedzie my nie zostaniemy o tym poinformowani. Co zrobić aby uniknąć
takich sytuacji lub chociaż odpowiednio je przeanalizować? Podczas pierwszej
lekcji zwróciłem uwagę, że jeśli wykonanie zapytania, jakie wysłaliśmy do
serwera nie powiedzie się funkcja mysql_query() zwróci wartość FALSE, w
takim wypadku należałoby odpowiednio wykorzystać fakt, że o ty wiemy.
Funkcja mysql_error() zawiera treść błędu baz danych MySQL, jeśli takowy
istnieje. Teraz w połączeniu z elementarną instrukcją If otrzymujemy bardzo
potężne narzędzie służące analizie błędów. Poniższy kawałek kodu przedstawia
jak zatrzymywać program i wyświetlać komunikat błędu:
$sql = mysql_connect('mojserwer.pl', 'foo', 'off')
or die('Nie mogę połączyć się z bazą danych: '.mysql_error());
mysql_select_db('nazwa_bazy')
or die('Nie mogę wybrać bazy: '.mysql_error());
if (!$zaptanie=@mysql_query("tresc zapytania")) /* Sprawdza czy wykonanie
powiodło się */
echo 'Bład zapytania MySQL, odpowiedź serwera: '.mysql_error(); /* Drukuje
błąd na stronie */
else /* Jeśli błąd nie wystąpił kontynuuje działanie programu */
{
/* dalsze dzialanie skryptu */
}
|
|
|
|