MySQL bazy danych dla witryny Technologie internetowe Wykład 7 MySQL bazy danych dla witryny
Serwer MySQL – język zapytań Firma Oracle wersje – od 3 przez 5.1 aż do 7.1 (MySQLCluster) też wersje dla Windows
Konsola MySQL (lokalnie lub zdalnie) Metody zarządzania bazą: proces mysqld.exe lub mysql_nt.exe(menedżer zadań Windows). PhpMyAdmin (przeglądarka) Konsola MySQL (lokalnie lub zdalnie) Uruchomienie wiersza polecenia (START - Uruchom… cmd – lub Programy –Akcesoria - Wiersz polecenia). Przechodzimy do foldera c:\usr\mysql\bin Z poziomu plików PHP Pliki baz danych tworzone są zwykle w folderze .......mysql/data
Wyświetlenie listy baz: c:\usr\mysql\bin>mysqlshow mysql i inne Baza mysql jest bazą administracyjną – dostęp do niej ma tylko ROOT (bądź inny użytkownik o przydzielonych przez administratora prawach dostępu). Jej podstawowa rola to umożliwienie administratorowania prawami dostępu do baz, tabel
Uruchomienie konsoli MySQL c:\usr\mysql\bin>mysql –u root –p Password:.............. Zgłasza się konsola MySQL – gotowość do wpisywania poleceń: mysql> polecenie help
Baza danych składa się z tabel (zapis encji) Tabele to zestaw rekordów danych elementarnych (pola rekordu) Model relacyjny Normalizacja tabel i związki między nimi (złączenia) - ERD pole id nazwa adres 1 ABC Rzeszów... 2 ... rekord rekord
OPERACJE SQL NA BAZIE (kwerendy) tworzenie bazy i tabeli selekcja rekordów wstawianie rekordów modyfikacja treści rekordów modyfikacja struktury usuwanie rekordów, tabeli, bazy Poznanie języka SQL będzie nam potrzebne do wykonania opreacji na bazie w skryptach PHP
SHOW DATABASES; USE nazwa_bazy TWORZENIE BAZY DANYCH: CREATE DATABASE nazwa_bazy; Np.. CREATE DATABASE firma; Lista baz: SHOW DATABASES; Otwarcie bazy (w konsoli): USE nazwa_bazy
CREATE TABLE nazwa_tabeli ( TWORZENIE TABELI CREATE TABLE nazwa_tabeli ( nazwapola1 typ parametry, nazwapola2 typ parametry, ........itd); parametry: NOT NULL - niepuste PRIMARY KEY – klucz główny AUTO_INCREMENT - autonumerowanie DEFAULT wartosc_domyślna Np. CREATE TABLE dostawcy (Id INT(10) AUTO_INCREMENT PRIMARY KEY, Nazwa VARCHAR(10), Adres VARCHAR(30));
TYPY DANYCH Standard ISO SQL (1992) przewiduje około piętnastu typów danych, podzielonych na grupy:
Typy tekstowe - alfanumeryczne (String) CHAR(N) definiuje pole napisowe o stałej długości (ew. uzupełniane spacjami), VARCHAR(N) jest polem o zmiennej długości nie przekraczającej N TEXT Także BLOB (binarne), SET (zbiór).
Typy liczbowe (Numeric) INT, BIGINT, FLOAT, DECIMAL Na ogół dostępnych jest wiele różnych typów liczbowych, różniących się możliwym zakresem wartości (INT, BIGINT, SMALLINT, ...) i precyzją (FLOAT, DOUBLE PRECISION, ...). Typ DECIMAL(M,D) to liczba (ułamek) dziesiętny o ustalonej liczbie cyfr dziesiętnych w części całkowitej i ułamkowej.
Typy daty i godziny (Datetime): TIMESTAMP
USUWANIE REKORDÓW DELETE FROM nazwa_tabeli WHERE warunki; np.: DELETE FROM dostawcy; usuwa wszystkie rekordy !!! DELETE FROM dostawcy WHERE nazwa LIKE 'ABC'; usuwa wszystkie rekordy w których polu Nazwa jest wartość 'ABC'
ZMIANA NAZWY TABELI ALTER TABLE old_name RENAME new_name;
ZMIANA NAZWY I TYPU POLA ALTER TABLE tabela CHANGE nazwa_stara nazwa_nowa typ; Np.: ALTER TABLE dostawcy CHANGE id id_nowe INT(5);
ALTER TABLE nazwa_tabeli DROP nazwa_pola; USUWANIE PÓL (KOLUMN TABELI) ALTER TABLE nazwa_tabeli DROP nazwa_pola; np.: ALTER TABLE dostawcy DROP idnowe;
DODANIE POLA W TABELI np.: ALTER TABLE nazwa_tabeli ADD id int(5) default 10; np.: ALTER TABLE dostawcy ADD id int(5) default 10;
ZMIANA TREŚCI PÓL REKORDÓW W TABELI UPDATE tabela SET nazwa_pola1=nowa_wartość WHERE warunek; Przykładowo: UPDATE dostawcy SET nazwa="INTERRES" where id=1; jeśli id jest primary key to zmieni tylko w 1 rekordzie UPDATE dostawcy SET cena=cena*0.9; we wszystkich rekordach
USUWANIE TABELI DROP TABLE nazwa_tabeli;
USUWANIE BAZY DROP DATABASE nazwa_bazy;
POBIERANIE WIELU POLECEŃ SQL Z PLIKU: SOURCE nazwa_pliku; Uwaga: plik powinien być w folderze MYSQL\BIN, w przeciwnym przypadku trzeba podać całą ścieżkę dostępu w apostrofach
PRZYKŁAD: C:\usr\mysql\bin> mysql -u root -p Enter password: * USE mysql (tylko konsola) SHOW DATABASES CREATE DATABASE ksiegarnia;
SHOW DATABASES; Database abc firma mysql test baza administracyjna
CREATE DATABASE ksiegarnia; USE ksiegarnia; CREATE TABLE ksiazki (id_ks int unsigned not null auto_increment primary key, autor char(30) not null, tytul char(40) not null); EXPLAIN ksiazki; INSERT INTO ksiazki VALUES (Null, "Mickiewicz Adam", "Pan Tadeusz");
SELECT * FROM ksiazki; INSERT INTO ksiazki VALUES (Null, "Mickiewicz Adam", "Konrad Wallenrod"); INSERT INTO ksiazki VALUES -Null, "Mickiewicz Adam", „Ballady i romanse"); itd...
SELECT * FROM ksiazki; DELETE FROM ksiazki WHERE tytul LIKE "pan Wołodyjowski"; mysql> SELECT * FROM ksiazki;
SQL selekcja rekordów klauzule operatory, metaznaki złączenie tabel
SELECT [tabela.]{* | [lista_pól]} FROM lista_nazw_tabel WYŚWIETLENIE (WYBÓR - SELEKCJA) REKORDÓW TABELI z wykorzystaniem klauzul SELECT [tabela.]{* | [lista_pól]} FROM lista_nazw_tabel [WHERE warunek] [ORDER BY .... ] /sortowanie [GROUP BY ...]; /agregacja – sumowanie lub zliczanie z grupowaniem wg wybranego pola [ opcja] { do wyboru albo | albo}
Można też używać kwerendę SELECT do obliczeń: mysql> SELECT 4*5; Można też wykonywać operacje na polach: mysql> SELECT nazwa, cena*5 from towary; mysql> SELECT 4*5; mysql> SELECT kat, count(id_t) from towary group by kat; Porada: wypróbowywać poprawność kwerend w MyPHPAdmin
% - zastępuje dowolny ciąg znaków Metaznaki % - zastępuje dowolny ciąg znaków _ (podkreślnik) – zastępuje 1 dowolny znak Przykłady: select * from dostawcy where nazwa like "a%"; nazwa rozpoczyna sie od "a" select * from dostawcy where nazwa like "%al%"; nazwa zawiera frazę "al" select * from dostawcy where nazwa like "_a%"; litera "a" na drugim miejscu nazwy
WSTAWIENIE REKORDU Z DANYMI DO WYBRANYCH PÓL INSERT INTO tabela VALUES (NULL, wartość1, wartość2...); INSERT INTO tabela SET p_key=NULL, pole1=wartość1, pole2=wartość2...; Pozostałe pola pozostaną puste, jeśli nie mają cechy WYMAGANIE – not null
Operatory logiczne w klauzuli WHERE NOT: logiczna negacja. MySQL dopuszcza jako alternatywną notację wykrzyknik (!). OR: logiczna alternatywa. MySQL dopuszcza alternatywną notację || AND: logiczna koniunkcja. Tu również MySQL dopuszcza notację &&.
Wyrażenia logiczne Każda wartość różna od zera i NULL odpowiada w wyrażeniu logicznym prawdzie; NULL i zero reprezentują wartość fałsz Złożone wyrażenia logiczne, zbudowane za pomocą operatorów logicznych, zwracają: 1 jako reprezentację wartości prawdziwej, 0 jako reprezentację fałszu.
W teorii relacyjnych baz danych wartość NULL Specjalna wartość reprezentująca wartość nieokreśloną, brakującą lub nieznaną. Jest różna od wszelkich konkretnych wartości, w szczególności — od ciągu pustego (" ") i zera (0). Dowolne wyrażenie, w którym wystąpi ta wartość, również przybierze wartość Null Nie możemy sprawdzać, jaka jest wartości Null — jedynie czy jakaś wartość jest nieokreślona. za pomocą funkcji ISNULL(x)
Parametr pola - NOT NULL | NULL: określa, czy NULL jest dopuszczalną wartością w tej kolumnie. Domyślnie wartość NULL jest dopuszczalna, za wyjątkiem kluczy (kolumn indeksowanych) ISNULL(A) zwraca jedynkę, jeżeli wartością A jest NULL, w przeciwnym wypadku zwraca zero.
W wypadku porównań wartości które nie są obie tekstowe ani całkowitoliczbowe, MySQL dokonuje automatycznych konwersji typów, co na ogół prowadzi do porównania wyrażeń jako wartości zmiennoprzecinkowych. Jeżeli wartością któregokolwiek z argumentów porównania jest NULL, porównanie zwraca jako wynik NULL (za wyjątkiem funkcji ISNULL.) select id , nazwa, isnull(nazwa) from dostawcy ; | id | nazwa | isnull(nazwa) | 1 | ABC | 0 | 2 | Exbud | 0 | 3 | Bako | 0 | 4 | NULL | 1 | 5 | | 0 select id , nazwa, isnull(nazwa) from dostawcy where !nazwa; | id | nazwa |isnull(nazwa) | | 1 | ABC | 0 | | 2 | Exbud | 0 | | 3 | Bako | 0 | | 5 | | 0 |
Porównania w warunkach kwerend Operatory porównania można stosować do wyrażeń liczbowych i tekstowych Wynik porównania wyrażeń tekstowych : wartości zadeklarowane jako BINARY - znosi utożsamienie małych i wielkich liter. jeśli VARCHAR(dlugosc) to utożsamianie małych i wielkich liter
Operatory porównania Równość: = Nierówność: <> lub != Mniejszy lub równy <= Większy lub równy >= Większy niż > Mniejszy niż < Porównanie do wzorca LIKE A BETWEEN B AND C: wyrażenie takie jest równoważne A>=B AND A<=C o ile porównywane wyrażenia są tego samego typu.
Przykłady klauzuli WHERE WHERE nazwa_pola1=wartość WHERE n_p1=war1 AND n_p2=war2 WHERE n_p1=war1 OR n_p2=war2 WHERE n_p between war1 AND war2 WHERE cena<100 WHERE n_p LIKE war1 (dla tekstów) WHERE n_p LIKE '%fraza%' WHERE n_p1=wartosc1 OR n_p2=wartosc2
Przykłady SELECT id, nazwa FROM dostawcy; SELECT * FROM magazyn; SELECT id_t, nazwa from magazyn WHERE cena_n>50; SELECT id_t, nazwa from magazyn WHERE cena_n between 50 and 80; SELECT id_t, nazwa from magazyn WHERE cena_n>50 and cena_n<80 ; SELECT id_t, nazwa from magazyn WHERE cena_n>50 and cena_n<80 ORDER BY cena_n ; SELECT id_t, nazwa from magazyn WHERE cena_n>50 and cena_n<80 ORDER BY cena_n desc;//desc oznacza kolejność malejącą lub użycie operatora between
WHERE Szczególne znaczenie ma klauzula WHERE w postaci: tab1.pole_klucz_glowny=tab2.pole_key_kl_obcy Posiada ważną rolę przy konieczności wyboru danych z dwóch tabel o typie złączenia 1:N
Wybór danych z kilku tabel SELECT tabela1.P1, tabela2.K1,... FROM tabela1,tabela2 WHERE tabela1.key_t1=tabela2.f_key_t2 Key_t1 P1 P2 P3 P4 Key_t2 K1 K2 K3 f_key_t2 tabela1 tabela2
SELECT typ.nazwa_t, marka. nazwa_p FROM marka, typ id_m producent nazwa_p 1 Niemcy AUDI 2 Polska Fiat 3 Francja Citroen 4 USA Ford id_t marka_id nazwa_t 1 A6 2 A8 3 100 4 126p 5 Cinquecento 6 Panda 7 Berlingo 8 Xara 9 C3 1:N SELECT typ.nazwa_t, marka. nazwa_p FROM marka, typ WHERE marka.id_m=typ.marka_id Uwaga – wymaganie NOT NULL dla pola marka_id
dostawcy magazyn Id_dostawcy Nazwa 1 ABC 2 Exbud 3 Bako Id_towaru Nazwa Id_dostawcy 1 Narty 2 Sanki klucz obcy SELECT id, nazwa FROM dostawcy WHERE id<3; SELECT id, nazwa FROM dostawcy WHERE nazwa LIKE 'E%'; SELECT id, nazwa FROM dostawcy ORDER BY nazwa; Proste złączenie przez warunek: SELECT dostawcy.nazwa, magazyn.nazwa FROM dostawcy, magazyn WHERE dostawcy.id_dostawcy= magazyn.id_dostawcy; Inny sposób: SELECT dostawcy.nazwa, magazyn.nazwa_towaru FROM dostawcy INNER JOIN magazyn ON (magazyn.id_dostawcy=dostawcy.id_dostawcy) where id_dostawcy=1;
ZŁĄCZENIA JOIN towary kategorie id nazwa id_k 1 masło 1 id_k nazwa 2 kiełbasa 1 3 szynka 1 4 rower 2 5 komputer id_k nazwa 1 spożywcze 2 przemysłowe 3 zabawki kategorie klucz obcy klucz główny
SELECT towary.nazwa, kategorie.nazwa_k nazwa nazwa_k masło spożywcze kiełbasa spożywcze szynka spożywcze rower przemysłowe NULL zabawki SELECT towary.nazwa, kategorie.nazwa_k FROM towary RIGHT JOIN kategorie ON kategorie.id_k = towary.id_k; nazwa nazwa _k masło spożywcze kiełbasa spożywcze szynka spożywcze rower przemysłowe komputer NULL SELECT towary.nazwa, kategorie.nazwa_k FROM towary LEFT JOIN kategorie ON kategorie.id_k = towary.id_k; SELECT towary.nazwa, kategorie.nazwa_k FROM towary INNER JOIN kategorie ON kategorie.id_k = towary.id_k; nazwa nazwa _k masło spożywcze kiełbasa spożywcze szynka spożywcze rower przemysłowe RIGHT i LEFT to tzw. złączenia zewnętrzne można pisać LEFT OUTER i RIGHT OUTER
Jeśli korzystamy z 3 złączonych tabel: sprzedaz SPRZEDAZ_SZCZEGOLY magazyn SELECT SPRZEDAZ.Klient , SPRZEDAZ.data_sp FROM MAGAZYN INNER JOIN SPRZEDAZ_SZCZEGOLY ON (MAGAZYN.ID_towaru=SPRZEDAZ_SZCZEGOLY.Id_produktu) INNER JOIN SPRZEDAZ ON (SPRZEDAZ.ID_sprzedazy= SPRZEDAZ_SZCZEGOLY.Id_sprzedazy) WHERE MAGAZYN.ID_towaru<5;
unikalność aliasów sprzedaz magazyn kategorie SPRZEDAZ_SZCZEGOLY ----< sprzedaz SPRZEDAZ_SZCZEGOLY magazyn >----- kategorie unikalność aliasów SELECT SPRZEDAZ.Klient , SPRZEDAZ.data_sp, KATEGORIE.opis FROM MAGAZYN as mag INNER JOIN SPRZEDAZ_SZCZEGOLY ON (mag.ID_towaru=SPRZEDAZ_SZCZEGOLY.Id_produktu) INNER JOIN SPRZEDAZ ON (SPRZEDAZ.ID_sprzedazy=SPRZEDAZ_SZCZEGOLY.Id_sprzedazy), KATEGORIE INNER JOIN MAGAZYN as mag ON KATEGORIE.Id_kat = mag1.Kod_towaru WHERE mag.ID_towaru<5;