MySQL Aleksander Nowacki Wojciech Nowak Wprowadzenie Język SQL (Structured Query Language) służy do manipulowania danymi umieszczonymi w relacyjnych bazach danych. Jest językiem uniwersalnym, dzięki czemu praca na różnych systemach baz danych sprowadza się do wydawania tych samych lub podobnych komend tzw. zapytań SQL. Język SQL został zaimplementowany w większości relacyjnych systemów baz danych takich jak: DB2, Oracle, InterBase, MySQL, dBase, Paradox. Składnię języka SQL można podzielić na trzy części: język definiowania struktur danych - DDL (Data Definition Language) - jest wykorzystywany do wszelkiego rodzaju operacji na tabelach, takich jak: tworzenie, modyfikacja oraz usuwanie język do wybierania i manipulowania danymi - DML (Data Manipulation Language) - służy do manipulowania danymi umieszczonymi w tabelach, pozwala na wstawienie danych, ich prezentację, modyfikowanie oraz usuwanie język do zapewnienia bezpieczeństwa dostępu do danych - DCL (Data Control Language) - jest używany głównie przez administratorów systemu baz danych do nadawania odpowiednich uprawnień do korzystania z bazy danych. Relacyjny system baz danych Relacyjny system baz danych przechowuje wszystkie dane w tabelach. Każda tabela zawiera dane na konkretny temat, np. dane o klientach, pracownikach, towarach itp. System bazy danych zarządza tymi informacjami, pozwala m.in. na szybsze ich wyszukiwanie i zorganizowanie. Za każdym razem, kiedy potrzebujemy informacji z bazy danych, musimy "zapytać" system bazy danych w zrozumiałym dla niego języku. Tym językiem jest SQL. Co to jest MySQL? MySQL jest najpopularniejszym darmowym systemem obsługi baz danych rozpowszechnianym na zasadach licencji GPL (General Public License). Jego nowatorska budowa pozwoliła na stworzenie niezwykle szybkiego i niezawodnego serwera obsługującego bazy danych. Połączenie z bazą danych MySQL Aby połączyć się z serwerem baz danych potrzebujemy specjalnego programu tzw. klienta lub języka skryptowego (umieszczanego na serwerach WWW), który posiada wbudowaną obsługę baz danych. Bardzo dobrym narzędziem, które może okazać się przydatne podczas nauki SQL, jest panel administracyjny do baz danych - phpMyAdmin. phpMyAdmin Typy danych w MySQL TINYINT 1-bajtowe pole, przechowujące wartości całkowite bez znaku z przedziału od 0 do 255 lub ze znakiem z przedziału od -127 do 127 SMALLINT 2-bajtowa wartość całkowita. Zakres wartości bez znaku od 0 do 65 535 lub ze znakiem od -32 768 do 32 768 MEDIUMINT 3-bajtowa wartość całkowita. Zakres wartości od 0 do 16 777 215 lub ze znakiem od -8 388 608 do 8 388 608 INT 4-bajtowa wartość całkowita. Zakres wartości ze znakiem od -2 147 483 648 do 2 147 483 647 lub bez znaku od 0 do 4 294 967 295 BIGINT 8-bajtowa wartość całkowita. Typ BIGINT jest używany podczas przeprowadzania obliczeń. Stosując pola tego typu we własnej bazie danych należy uważać, aby ich wartości nie były zbyt duże, ponieważ użyte w obliczeniach mogą doprowadzić do błędu przepełnienia FLOAT(dokładno ść) Liczba zmiennoprzecinkowa z precyzją wyrażaną liczbą bajtów. Dwie wartości akceptowane jako precyzja to 4 i 8. Użycie 4 tworzy liczbę zmiennoprzecinkową o pojedynczej precyzji, natomiast 8 liczbę zmiennoprzecinkową o podwójnej precyzji. Szczegóły dotyczące tych dwóch typów danych opisują pola FLOAT i DOUBLE FLOAT 4-bajtowa liczba zmiennoprzecinkowa z zakresu od -1.402823466E+38 do -1.175494351E-38, 0 i 1.175494351E-38 do 3.402823466E+38 DOUBLE 8-bajtowa liczba zmiennoprzecinkowa przechowująca wartości z zakresu od 1.7976931348623157E+308 do -2.2250738585072014E-308, 0, i 2.2250738585072014E-308 do 1.7976931348623157E+308 DATE Data (bez czasu), wyświetlana w formacie RRRR-MM-DD. Akceptuje daty w różnych formatach z zakresu od 1000-01-01 do 9999-12-31 Typy danych w MySQL (2) DATETIME Pole daty z czasem dnia wyświetlane według formatu RRRR-MM-DD GG:MM:SS. Może przechowywać wartości z zakresu od 1000-01-01 00:00:00 do 9999-12-31 23:59:59 TIMESTAMP Data i czas liczony od początku epoki systemu UNIX, 1970-01-01 00:00:00, do momentu kiedy 32bitowe pole przechowujące liczbę sekund, jaka upłynęła od tej daty ulegnie przepełnieniu w roku 2037. Jeśli polu temu nie została nadana wartość przez wyrażenie INSERT lub UPDATE, domyślnie otrzyma ono wartość daty bieżącej TIME Czas mieszczący się w przedziale od -838:59:59 do 838:59:59 YEAR Rok. Dozwolone wartości to przedział od 1901 do 2155 oraz wartość 0000. MySQL wyświetla wartość typu YEAR w formacie RRRR CHAR Pole znakowe o stałej długości z zakresu od 1 do 255 bajtów. Po wstawieniu wartości puste miejsca pola CHAR są uzupełniane z prawej strony spacjami VARCHAR Pole znakowe o zmiennej długości z zakresu od 1 do 255 bajtów. Zajmowany jest jedynie taki obszar pamięci, jakiego wymaga wartość wstawiona w to pole TINYBLOB, TINYTEXT Kolumna binarna lub tekstowa o rozmiarze nie przekraczającym 255 bajtów BLOB, TEXT Kolumna binarna lub tekstowa o rozmiarze nie przekraczającym 65 535 bajtów MEDIUMBLOB, MEDIUMTEXT Kolumna binarna lub tekstowa o rozmiarze nie przekraczającym 16 777 215 bajtów LONGBLOB, LONGTEXT Kolumna binarna lub tekstowa o rozmiarze nie przekraczającym 4 294 967 295 bajtów Tworzenie nowej bazy danych Aby dodać nowa bazę danych, wystarczy posłużyć się następującym poleceniem: CREATE DATABASE `nazwa_bazy`; Struktura MySQL Każda kolumna tabeli posiada nazwę i zawiera inny rodzaj danych. Każdej kolumnie przypisany jest typ danych. Baza danych Tabele Kolumny Każdy wiersz zawiera zbiór pojedynczych wartości odpowiadających kolumnom. Każda z tych wartości musi być tego samego typu, jaki przypisano kolumnie, w której się znajduje. Wiersze Wartości Każdy wiersz tabeli odpowiada innemu klientowi. Format tabelaryczny powoduje, że każdy wiersz ma te same atrybuty. Co to są tabele? Tabele zawierają pola, które określają, jakie dane będzie zawierał pojedynczy rekord (inaczej: wiersz). Jeśli chcemy utworzyć tabelę przechowującą dane o pracownikach, trafią do niej pola typu: imię, nazwisko, data_urodzenia, płaca. Jeden z rekordów będzie wyglądał następująco: 'Jan', 'Kowalski', '2002-0720', '1200.00'. Już na pierwszy rzut oka widać, że podane dane są różnego typu. Imię i nazwisko to dane tekstowe, data_urodzenia to pole zawierające w sobie datę, płaca reprezentuje dane liczbowe. Tworzenie tabel Do utworzenia tabeli służy polecenie SQL CREATE TABLE: CREATE TABLE nazwa_tabeli struktura_tabeli; Tworzenie tabel Każda tabela powinna posiadać swoją nazwę. Definiujemy ją w miejscu nazwa_tabeli. W miejsce struktura_tabeli wstawiamy dokładną specyfikację poszczególnych pól, jakie powinna zawierać tabela. Polecenie SQL dla przykładu podanego wyżej będzie wyglądać następująco: Tworzenie tabel CREATE TABLE pracownicy ( imie VARCHAR(30), nazwisko VARCHAR(30), data_urodzenia DATE DEFAULT '1950-0101', placa DECIMAL(10,2) DEFAULT '1000.00' ); Tworzenie tabel Struktura utworzonej tabeli: Wstawianie danych do tabeli Po utworzeniu tabeli należy wypełnić ją danymi. Służy do tego polecenie INSERT. INSERT INTO nazwa_tabeli [(kolumna1, kolumna2, kolumna3, …)] VALUES (wartosc1,wartosc2, wartosc3,…); Polecenie SQL dla powyższego przykładu będzie wyglądać następująco: INSERT INTO pracownicy VALUES ('Jan', 'Kowalski', '2002-07-20', '1200.00'); INSERT INTO pracownicy VALUES ('Aleksander', 'Borowiecki', '1952-08-06', '1500.34'); INSERT INTO pracownicy VALUES ('Aniela', 'Michalkowska', '1970-05-23', '854.29'); INSERT INTO pracownicy VALUES ('Katarzyna', 'Kowalska', '2002-07-02', '1200.00'); INSERT INTO pracownicy (imie, nazwisko) VALUES ('Izabela', 'Kwiatkowska'); Wstawianie danych do tabeli Modyfikacja danych Poleceniem INSERT można wstawiać nowe dane do istniejącej tabeli. Do modyfikacji danych już wcześniej umieszczonych w tabeli służy polecenie UPDATE. UPDATE nazwa_tabeli SET nazwa_pola='nowa_wartość'; UPDATE pracownicy SET imie='Zofia'; Po słowie kluczowym SET podajemy kolejno (po przecinku) nazwy kolumn wraz z nowymi wartościami, jakie powinny przyjąć. Modyfikacja danych Nie jest to najczęściej pożądana sytuacja. Zazwyczaj chcemy zmienić dane dotyczące tylko jednego lub wybranych rekordów. Do określenia, czego ma dotyczyć zmiana służy klauzula WHERE podawana na końcu polecenia UPDATE. W celu zmiany imienia tylko dla Izabeli Kwiatkowskiej polecenie UPDATE będzie wyglądać następująco: UPDATE pracownicy SET imie='Zofia‘ WHERE nazwisko='Kwiatkowska'; Pobieranie danych z tabeli Aby pobrać dane zapisane w tabeli należy użyć zapytania SELECT. Jego postać ogólna prezentuje się następująco: SELECT co_zaprezentować FROM nazwa_tabeli [WHERE warunki_wyszukiwania] [ORDER BY sortowanie [ASC | DESC], ...] [LIMIT [ofset,] ilość_wierszy]; W miejscu co_zaprezentować należy podać (po przecinku) listę kolumn, które chcemy zawrzeć w zestawieniu. W miejscu nazwa_tabeli podaje się nazwę tabeli, z której pobiera się dane. W celu wybrania trzech kolumn do zestawienia z tabeli pracownicy należy wykonać polecenie np. SELECT imie, nazwisko, placa FROM pracownicy; w celu wybrania wszystkich kolumn: SELECT * FROM pracownicy; Pobieranie danych z tabeli Klauzula where w poleceniu select Dzięki klauzuli WHERE jesteśmy w stanie wpłynąć na zakres prezentowanych danych. Dzięki niej możemy dokładnie definiować, co chcemy uzyskać swoim zapytaniem. Specyfikując dokładne warunki wyszukiwania można z tabeli zawierającej setki tysięcy rekordów wybrać tylko kilka interesujących w danym momencie informacji. Stosując operatory przyrównania można dokładnie określić, jakie informacje chcemy pobrać. Dozwolone w MySQL operatory przyrównania to: = równe > większe >= większe równe < mniejsze <= mniejsze równe <> lub != różne LIKE służy głównie do porównywania danych łańcuchowych Przykłady zastosowania klauzuli where SELECT * FROM pracownicy WHERE placa >= 1000; Przykłady zastosowania klauzuli where SELECT * FROM pracownicy WHERE nazwisko LIKE 'K%'; Dzięki zastosowaniu znaków globalnych (% i _) istnieje możliwość przyrównania do dowolnego ciągu znaków. Znak '%' (procent) zastępuje dowolną ilość znaków. Znak '_' (podkreślenie) zastępuje dokładnie jeden znak. Łączenie warunków w klauzuli where Warunki wyboru podawane za WHERE można łączyć ze sobą stosując operatory AND oraz OR. Dzięki temu istnieje możliwość zbudowania zapytania bardziej złożonego, a co za tym idzie bardziej dokładnego. W momencie zastosowania operatora AND wszystkie połączone tak warunki muszą zostać spełnione, aby w wyniku pojawił się dany rekord. Jeżeli zastosujemy do połączenia warunków operator OR - wówczas może zostać spełniony tylko jeden z warunków wchodzących w skład zapytania. Wydając zapytanie: SELECT * FROM pracownicy WHERE (placa > 500 AND placa < 1000) OR nazwisko = 'Kowalski'; spowodujemy wyświetlenie w wyniku wszystkich pracowników, których płaca mieści się w zakresie 500-1000 oraz pracowników o nazwisku 'Kowalski‘. Sortowanie wyników zapytania Dane w tabeli mogą być przechowywane w dowolnej kolejności. Można jednak spowodować ich pobranie w ściśle określonym porządku. Kolumny, według których MySQL ma posortować dane podaje się po klauzuli ORDER BY oddzielone przecinkami. Chcąc więc uszeregować listę pracowników rosnąco według nazwiska i malejąco według płacy należy wpisać następujące polecenie: SELECT * FROM pracownicy ORDER BY nazwisko ASC, placa DESC; ASC oznacza sortowanie rosnąco według podanego pola, DESC natomiast oznacza sortowanie malejące. Klauzula limit Użycie klauzuli LIMIT powoduje wyświetlenie jedynie części rekordów. Aby pobrać dwa pierwsze rekordy należy napisać: SELECT * FROM pracownicy LIMIT 2; Dodatkowe funkcje w MySQL Nazwa Opis AVG(kolumna) Oblicza wartość średnią we wskazanej kolumnie. COUNT(kolumna) Zwraca liczbę niezerowych wartości w podanej kolumnie. Jeżeli nazwa kolumny jest poprzedzona słowem kluczowym DISTINCT, to funkcja zwróci tylko ilość występujących w niej odrębnych wartości. Jeżeli zamiast nazwy konkretnej kolumny wpisany zostanie symbol *, wówczas funkcja zwróci wartość równą licznie wierszy w tabeli. MIN(kolumna) Podaje najmniejszą wartość w kolumnie. MAX(kolumna) Podaje największą wartość w kolumnie. STD(kolumna) Oblicza odchylenie standardowe wartości w kolumnie. SUM(kolumna) Sumuje wszystkie wartości z kolumny Dodatkowe funkcje w MySQL Przykład zastosowania funkcji AVG: Średnia płaca pracowników wynosi 1150.93 zł. Usuwanie danych z tabeli Do usunięcia danych z tabeli służy polecenie DELETE. Aby usunąć wszystkie dane z tabeli należy wydać polecenie: DELETE FROM nazwa_tabeli; Można użyć także opisywanego już wcześniej warunku wyboru, dzięki któremu specyfikujemy dane przeznaczone do usunięcia. Aby usunąć z przykładowej tabeli pracownicy wszystkie rekordy, w których płaca jest wyższa od 1000 należy wydać następujące polecenie: DELETE FROM pracownicy WHERE placa > 1000; Usuwanie danych z tabeli Do modyfikacji struktury tabeli służy polecenie ALTER TABLE. Zmodyfikowanie struktury tabeli zawierającej już jakieś dane spowoduje próbę podporządkowania istniejących danych nowemu formatowi. Dzięki temu poleceniu można dodawać, modyfikować, usuwać pola oraz manipulować indeksami. Ogólna postać polecenia przedstawia się następująco: ALTER TABLE nazwa_tabeli specyfikacja_struktury; W miejscu specyfikacja_struktury podajemy dokładną operację, jaką chcemy wykonać na danej tabeli. Aby dodać kolejne pole do istniejącej tabeli należy użyć polecenia: ALTER TABLE pracownicy ADD rozmiar_buta VARCHAR(10); Spowoduje to dodanie jednego pola o nazwie rozmiar_buta na końcu struktury tabeli. Usuwanie tabeli Do usunięcia tabeli służy proste polecenie: DROP TABLE nazwa_tabeli; Spowoduje to usunięcie tabeli wraz ze wszystkimi umieszczonymi w niej danymi. Łączenie MySQLa z PHP Funkcja języka PHP, nawiązująca połączenie z serwerem MySQL, wygląda następująco: $db = mysql_connect ("adres", "użytkownik", "hasło"); Po prawidłowym podłączeniu do serwera MySQL należy wybrać bazę, na której będziesz pracować: mysql_select_db ("baza"); Po poprawnym połączeniu się z bazą danych można przystąpić do wydawania poleceń języka SQL. Funkcję PHP wysyłającą zapytanie SQL do serwera wywołuje się następująco: $wynik_zapytania = mysql_query ("zapytanie_SQL"); Po zakończonej pracy z bazą danych należy użyć funkcji: mysql_close ($db); Zadanie Wypisz trzy imiona, nazwiska i płace z zarobkami większymi od 500 i mniejszymi niż 1200, uszeregowanymi po nazwisku. HELP! To już koniec Dziękujemy za uwagę.