Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8 Bazowy skrypt PHP do ćwiczeń z bazą MySQL: Utwórz skrypt o nazwie cw7.php zawierający następującą treść (uzupełniając go o właściwą nazwę uŝytkownika i hasło): <html> <head> </head> <body> <?php $user = "tu_wpisz_twój_login"; $haslo = "tu_wpisz_twoje_haslo"; mysql_connect("localhost",$user,$haslo) or die ("nie moge połaczyć się z serwerem"); $baza = "tu_wpisz_twoją_bazę"; mysql_select_db($baza) or die ("nie moge połaczyć się z bazą"); $blad=false; $pomoc; if (strlen($zapytanie)>0) $pomoc = stripslashes ($zapytanie); $wynik=mysql_query($pomoc) or $blad=true; if ($blad == false) if (is_bool($wynik)!=true) $ilosc_pol = mysql_num_fields($wynik); echo "<hr><center><table BORDER=1>\n<tr>"; for ($i=0; $i < $ilosc_pol; $i++) print "<th>".mysql_field_name($wynik, $i)."</th>"; echo "</tr>\n"; while ($rekord = mysql_fetch_array($wynik)) //Table body echo "<tr>"; for ($f=0; $f < $ilosc_pol; $f++) echo "<td>$rekord[$f]  </td>"; echo "</tr>\n"; echo "</table></center><hr>"; else $ilosc_rek = mysql_affected_rows(); echo "<font color=green>"; echo "<hr><center> w wyniku zapytania:<br> $zapytanie <br>"; echo "zmianie uległo $ilosc_rek rekordów </center><hr>"; echo "<font color=black>"; else echo "<hr><center> <font color=red>"; echo "Podane Zapytanie SQL ($zapytanie) jest niepoprawne!"; echo "</center><hr><font color=black>"; $blad=false; print '<center><form METHOD="POST">Zapytanie:'; print '<INPUT TYPE="hidden" NAME="co" VALUE="wykonaj">'; print '<table><tr><td>'; print '<TEXTAREA NAME="zapytanie" cols=70 rows=10>'.$zapytanie.'</textarea>'; print '</td></tr></table>'; print '<INPUT TYPE="submit" VALUE="Wykonaj"></FORM></center>';?> </body> </html>
Przygotowanie Tabel do zajęć z SQL: Proszę wydać następujące polecenia tworzące struktury tabel wykorzystywanych do zajęć z SQL: a) utworzenie tabeli SPRZEDAWCY: CREATE TABLE IF NOT EXISTS SPRZEDAWCY (NrSprzedawcy BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, Imie TEXT, Nazwisko TEXT, NrSamochodu BIGINT, PRIMARY KEY (NrSprzedawcy)); b) utworzenie tabeli PRACOWNICY CREATE TABLE IF NOT EXISTS PRACOWNICY (NrPracownika BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, Imie TEXT, Nazwisko TEXT, DataUrodzenia DATE, DataZatrudnienia DATE, NrSamochodu BIGINT, PRIMARY KEY (NrPracownika) ); c) utworzenie tabeli SPRZEDAZ CREATE TABLE IF NOT EXISTS SPRZEDAZ (NrSprzedazy BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, NrPracownika BIGINT, Klient TEXT, Towar TEXT, Dostawca TEXT, Wartosc FLOAT, PRIMARY KEY (NrSprzedazy) ); d) utworzenie tabeli SAMOCHODY CREATE TABLE IF NOT EXISTS SAMOCHODY (NrSamochodu BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, Marka TEXT, Model TEXT, PRIMARY KEY (NrSamochodu) ); e) utworzenie tabeli LISTA CREATE TABLE IF NOT EXISTS LISTA (NrPozycji BIGINT UNSIGNED NOT NULL, Nazwa TEXT, PRIMARY KEY(NrPozycji)); Podstawowe polecenia języka SQL: 1. instrukcja INSERT instrukcja słuŝąca do dopisywania nowych rekordów do tabeli: INSERT INTO nazwa_tabeli (lista pól modyfikowanych) VALUES (lista wartości wprowadzanych); W przygotowania stworzonych tabel do dalszej części pracy przećwicz instrukcję INSERT wydając następujący ciąg poleceń.!uwaga! Po kaŝdym Poleceniu sprawdź efekt za pomocą instrukcji SELECT * FROM adekwatna nazwa tabeli. wprowadzenie danych do tabeli SPRZEDAWCY: (1,'Franciszek','Drewniany',1); (2,'Sara','Wiśniewska',4); (3,'Janusz','Kozłowski',6); (4,'Szymon','Pajęczak',''); (5,'Alina','Mróz',''); (6,'Marcin','Bokser',''); (7,'Tomasz','Prawy',7); wprowadzenie danych do tabeli PACOWNICY: INSERT INTO PRACOWNICY (Imie, Nazwisko, DataUrodzenia, DataZatrudnienia, NrSamochodu) VALUES ('Zofia','Czarnecka','1966-04-12','1999-05-01',2);
INSERT INTO PRACOWNICY (Imie, Nazwisko, DataUrodzenia, DataZatrudnienia) VALUES ('Stefan','Czarnecki','1977-03-21','2000-01-01'); INSERT INTO PRACOWNICY (Imie, Nazwisko, DataUrodzenia, DataZatrudnienia, NrSamochodu) VALUES ('Maria','Nowak','1977-05-01','2002-04-01',5); INSERT INTO PRACOWNICY (Imie, Nazwisko, DataUrodzenia, DataZatrudnienia, NrSamochodu) VALUES ('Franciszek','Jankowski','1996-08-03','2004-05-01','3'); wprowadzenie danych do tabeli SRZEDAZ: VALUES(1,1,'Krawczyk','Kanapa','Fab. Mebli',235.67); VALUES(2,1,'Jasiński','Krzesło','Fab. Mebli',453.78); VALUES(3,2,'Kowalski','Taboret','Jan Strug',82.78); VALUES(4,2,'Jankowski','Komplet','Fab. Mebli',3421.00); VALUES(5,3,'Kowalski','Kanapa','Fab. Mebli',235.67); VALUES(6,1,'Krawczyk','Kanapa','Fab. Mebli',235.67); VALUES(7,1,'Jankowski','ŁóŜko','Jan Strug',453.00); wprowadzenie danych do tabeli SAMOCHODY: INSERT INTO SAMOCHODY (NrSamochodu, Marka, Model) VALUES (1,'Fiat','Uno'); INSERT INTO SAMOCHODY (NrSamochodu, Marka, Model) VALUES(2,'Peugeot','206'); INSERT INTO SAMOCHODY (NrSamochodu, Marka, Model) VALUES(3,'Renault','Twingo'); INSERT INTO SAMOCHODY (NrSamochodu, Marka, Model) VALUES(4,'Ford','Mondeo'); INSERT INTO SAMOCHODY (NrSamochodu, Marka, Model) VALUES(5,'Daewoo','Lanos'); INSERT INTO SAMOCHODY (NrSamochodu, Marka, Model) VALUES(6,'Ford','Escort'); INSERT INTO SAMOCHODY (NrSamochodu, Marka, Model) VALUES(7,'Citroen','Xsara'); INSERT INTO SAMOCHODY (NrSamochodu, Marka, Model) VALUES(8,'Volkswagen','Polo'); wprowadzenie danych do tabeli LISTA: INSERT INTO LISTA (NrPozycji, Nazwa) VALUES(1,'Król'); INSERT INTO LISTA (NrPozycji, Nazwa) VALUES(2,'Maciuś'); INSERT INTO LISTA (NrPozycji, Nazwa) VALUES(3,'Koronny'); INSERT INTO LISTA (NrPozycji, Nazwa) VALUES(2,'Wyściełany'); INSERT INTO LISTA (NrPozycji, Nazwa) VALUES(5,'Paź'); INSERT INTO LISTA (NrPozycji, Nazwa) VALUES(2,'Berło'); 2. instrukcja SELECT instrukcja słuŝąca do pobrania serii pól z wybranej tabeli lub tabel: SELECT lista pol FROM nazwa tabel WHERE warunki selekcji ORDER BY lista pól do sortowania SELECT lista pol FROM nazwa tabel GROUP BY warunki grupowania HAVING warunki selekcji grup ORDER BY lista pól do sortowania Wykonaj i sprawdź efekt działań następującego szeregu zapytań testujących poszczególne słowa kluczowe dla instrukcji SELECT: słowo kluczowe FROM słuŝy do określenia nazwy tabeli lub tabel skąd mają być pobierane dane SELECT * SELECT NrSprzedazy, Towar, Wartosc słowo kluczowe AS słuŝy do nadania nowej nazwy prezentacji dla określonych kolumn pobranych danych z tabeli SELECT NrSprzedazy AS Numer_Sprzedazy, Towar AS Nazwa_Towaru, Wartosc AS Cena_Sprzedazy
słowo kluczowe DISTINCT słuŝy do usunięcia z otrzymanego wyniku zapytania powtarzających się rekordów. SELECT Towar AS Nazwa_Towaru, Wartosc AS Cena_Sprzedazy SELECT DISTINCT Towar AS Nazwa_Towaru, Wartosc AS Cena_Sprzedazy słowo kluczowe WHERE słuŝy do określenia warunku wyboru wierszy ujętych w wyniku realizacji zapytania. SELECT Towar AS Nazwa_Towaru, Wartosc AS Cena_Sprzedazy FROM SPRZEDAZ WHERE Towar = 'Kanapa'; SELECT Towar AS Nazwa_Towaru, Wartosc AS Cena_Sprzedazy FROM SPRZEDAZ WHERE NrSprzedazy > 6; SELECT Towar AS Nazwa_Towaru, Wartosc AS Cena_Sprzedazy FROM SPRZEDAZ WHERE Towar = 'Kanapa' AND Klient = 'Kowalski'; SELECT NrPracownika, Imie, Nazwisko, DataUrodzenia, DataZatrudnienia FROM PRACOWNICY WHERE NrPracownika = 2; SELECT Towar AS Nazwa_Towaru, Wartosc AS Cena_Sprzedazy FROM SPRZEDAZ WHERE Towar = 'Kanapa' AND NrSprzedazy > 6; SELECT Towar AS Nazwa_Towaru, Wartosc AS Cena_Sprzedazy FROM SPRZEDAZ WHERE Towar IN ('Kanapa', 'Komplet', 'ŁóŜko'); SELECT Towar AS Nazwa_Towaru, Wartosc AS Cena_Sprzedazy FROM SPRZEDAZ WHERE Towar IN ('Kanapa', 'Komplet', 'ŁóŜko') AND NrSprzedazy > 6; SELECT Towar AS Nazwa_Towaru, Wartosc AS Cena_Sprzedazy FROM SPRZEDAZ WHERE Towar IN ('Kanapa', 'Komplet', 'ŁóŜko') OR NrSprzedazy > 6; słowo kluczowe ORDER BY słuŝy do określenia kolejności pojawiania się rekordów w wyniku realizacji zapytania (sortowanie danych) ASC -> sortowanie rosnąco, DESC -> sortowanie malejąco. SELECT Towar AS Nazwa_Towaru, Wartosc AS Cena_Sprzedazy NrSprzedazy AS Numer_Tranzakcji FROM SPRZEDAZ WHERE Towar = 'Kanapa' ORDER BY NrSprzedazy; SELECT Towar AS Nazwa_Towaru, Wartosc AS Cena_Sprzedazy NrSprzedazy AS Numer_Tranzakcji FROM SPRZEDAZ WHERE NrSprzedazy > 2 ORDER BY Towar ASC; SELECT Towar AS Nazwa_Towaru, Wartosc AS Cena_Sprzedazy NrSprzedazy AS Numer_Tranzakcji FROM SPRZEDAZ WHERE NrSprzedazy > 2 ORDER BY Towar DESC; SELECT Towar AS Nazwa_Towaru, Klient AS Nazwa_Klienta, Wartosc AS Cena_Sprzedazy NrSprzedazy AS Numer_Tranzakcji FROM SPRZEDAZ WHERE NrSprzedazy > 0 ORDER BY Klient ASC, Wartosc DESC; SELECT * FROM SPRZEDAZ WHERE NrSprzedazy > 1 ORDER BY Klient ASC, Wartosc DESC; PODZAPYTANIE słuŝy do wybrania zbioru wartości otrzymanego wyniku innego zapytania selekcyjnego. SELECT Klient AS Nazwa_Klienta FROM SPRZEDAZ WHERE NrPracownika IN (SELECT NrPracownika FROM PRACOWNICY WHERE DataZatrudnienia > '1999-05-05'); FUNKCJE WBUDOWANE język SQL oferuje kilka podstawowych funkcji statystycznych do analizy danych w tabeli. SELECT SUM(Wartosc) AS Suma_Wartosci SELECT Sum(Wartosc) AS Suma_Wartosci, Count(Wartosc) AS Liczba_Wartosci, Avg(Wartosc) AS Srednia_Wartosc, Min(Wartosc) AS Minimalna_Wartosc, Max(Wartosc) AS Maksymalna_Wartosc
SELECT Count(Klient) AS Liczba_Klientow, Avg(Wartosc) AS Srednia_Wartosc FROM SPRZEDAZ; SELECT Avg(Wartosc) AS Srednia_Wartosci FROM SPRZEDAZ WHERE Klient='Krawczyk'; słowo kluczowe GROUP BY słuŝy do wstępnego zgrupowania zbioru rekordów zgodnie z nadanym kryterium (moŝna postrzegać działanie GROUP BY jako tworzenie podtabel) SELECT Klient, Avg(Wartosc) AS Srednia_Wartosci FROM SPRZEDAZ GROUP BY Klient ORDER BY Klient ASC; SELECT Klient FROM SPRZEDAZ GROUP BY Klient ORDER BY Klient ASC; Klient, Dostawca; SELECT Count(*) AS Liczba_Rekordow_w_Grupie, Klient, Dostawca, Avg(Wartosc) AS Srednia_Wartosci FROM SPRZEDAZ GROUP BY Klient, Dostawca; Klient, Dostawca ORDER BY Avg(Wartosc); słowo kluczowe HAVING jest uzupełnieniem do słowa GROUP BY pozwalającym na wybór rekordów spełniających określone kryterium. Klient, Dostawca HAVING Avg(Wartosc)>=250; Klient, Dostawca HAVING Avg(Wartosc)>=250 ORDER BY Avg(Wartosc); PRACA Z WIELOMA TABELAMI pozwala na wykonanie zapytania selekcyjnego obejmującego dane pochodzące z więcej niŝ jednej tabeli. W celu wyróŝnienia tabeli źródłowej stosuje się formatkę: NAZWATABELI.Nazwapola SELECT SPRZEDAZ.Klient, PRACOWNICY.Nazwisko, SPRZEDAZ.NrPracownika, PRACOWNICY.NrPracownika FROM SPRZEDAZ, PRACOWNICY; SELECT T1.Klient, T1.Wartosc, T3.Imie, T3.Nazwisko, T1.NrPracownika, T3.NrPracownika FROM SPRZEDAZ AS T1, PRACOWNICY AS T3; SELECT T1.Klient, T1.Wartosc, T3.Imie, T3.Nazwisko, T1.NrPracownika, T3.NrPracownika FROM SPRZEDAZ AS T1, PRACOWNICY AS T3 WHERE T1.NrPracownika = T3.NrPracownika; SELECT T1.Klient, T1.Wartosc, T3.Imie, T3.Nazwisko FROM SPRZEDAZ AS T1, PRACOWNICY AS T3 WHERE T1.NrPracownika = T3.NrPracownika; SELECT T1.Klient, T3.Imie, T3.Nazwisko, T4.Marka, T4.Model FROM SPRZEDAZ AS T1, PRACOWNICY AS T3, SAMOCHODY AS T4 WHERE T1.NrPracownika = T3.NrPracownika AND T3.NrSamochodu = T4.NrSamochodu; słowo kluczowe JOIN słuŝy do łączenia ze sobą dwóch tabel w celu generacji wyniku zapytania operującego na obu tabelach według określonej zaleŝności równości pomiędzy określonymi polami z obu tabel. SELECT SPRZEDAZ.Klient, PRACOWNICY.Imie, SPRZEDAZ.Wartosc FROM SPRZEDAZ JOIN PRACOWNICY ON SPRZEDAZ.NrPracownika = PRACOWNICY.NrPracwnika; SAMOCHODY JOIN PRACOWNICY ON SAMOCHODY.NrSamochodu = PRACOWNICY.NrSamochodu; SAMOCHODY LEFT JOIN PRACOWNICY ON SAMOCHODY.NrSamochodu = PRACOWNICY.NrSamochodu; SAMOCHODY RIGHT JOIN PRACOWNICY ON SAMOCHODY.NrSamochodu = PRACOWNICY.NrSamochodu;
PRACOWNICY LEFT JOIN SAMOCHODY ON SAMOCHODY.NrSamochodu = PRACOWNICY.NrSamochodu; PRACOWNICY RIGHT JOIN SAMOCHODY ON SAMOCHODY.NrSamochodu = PRACOWNICY.NrSamochodu; słowo kluczowe UNION słuŝy do sumowania ze sobą tabel wynikowych dwóch zapytań selekcyjnych. SAMOCHODY LEFT JOIN PRACOWNICY ON SAMOCHODY.NrSamochodu = PRACOWNICY.NrSamochodu UNION SAMOCHODY RIGHT JOIN PRACOWNICY ON SAMOCHODY.NrSamochodu = PRACOWNICY.NrSamochodu; SELECT Imie, Nazwisko FROM PRACOWNICY UNION SELECT Imie, Nazwisko FROM SPRZEDAWCY WHERE SPRZEDAWCY.NrSamochodu IS NOT NULL; SELECT SPRZEDAWCY.Imie, SPRZEDAWCY.Nazwisko, SAMOCHODY.Marka, SAMOCHODY,Model FROM (SAMOCHODY JOIN SPRZEDAWCY ON SAMOCHODY.NrSamochodu = SPRZEDAWCY.NrSamochodu) UNION SELECT PRACOWNICY.Imie, PRACOWNICY.Nazwisko, SAMOCHODY.Marka, SAMOCHODY,Model FROM (SAMOCHODY JOIN PRACOWNICY ON SAMOCHODY.NrSamochodu = PRACOWNICY.NrSamochodu) 3. instrukcja UPDATE instrukcja słuŝąca do modyfikacji istniejących rekordów do tabeli: UPDATE nazwa_tabeli SET nazwa_pola=wartość WHERE nazwa_pola=wartość;!uwaga! Po kaŝdym Poleceniu sprawdź efekt za pomocą instrukcji SELECT * FROM adekwatna nazwa tabeli. INSERT INTO SRZEDAZ (NrSprzedazy, NrPracownika, Klient) VALUES (8,1,'Jankowski'); UPDATE SPRZEDAZ SET Towar = 'Kanapa', Dostawca = 'Fab. Mebli', Wartosc = 236.67 WHERE NrSprzedazy = 8; przykład 2: CREATE TABLE SPRZEDAZ2 (NrSprzedazy BIGINT UNSIGNED NOT NULL, NrPracownika BIGINT, Klient TEXT, Towar TEXT, Dostawca TEXT, Wartosc FLOAT, PRIMARY_KEY(NrSprzedazy)); INSERT INTO SPRZEDAZ2 VALUES (SELECT * FROM SPRZEDAZ); UPDATE SPRZEDAZ2 SET NrSprzedazy = NrSprzedarzy+199; UPDATE SPRZEDAZ2 SET Klient ='Kowalski' WHERE Klient = 'Krawczyk'; UPDATE SPRZEDAZ2 SET Klient ='Jankowski' WHERE NrSprzedazy < 200; UPDATE SPRZEDAZ2 SET Wartosc = Wartosc * 1.22; 4. instrukcja DELETE instrukcja słuŝąca do usuwania rekordów z tabeli: DELETE nazwy_pol FROM nazwa_tabeli WHERE nazwa_pola=wartość;!uwaga! Po kaŝdym Poleceniu sprawdź efekt za pomocą instrukcji SELECT * FROM adekwatna nazwa tabeli. przykład: DELETE * FROM SPRZEDAZ WHERE NrPracownika = 2; 5. CIEKAWE ZAPYTANIA przykładowe zapytania SQL które mogą się przydać. Przykład poszukiwania i zliczenia powtarzających się wartości pól w tabeli:
SELECT NrPozycji, Count(NrPozycji) AS Liczba_Powtorzen FROM LISTA GROUP BY NrPozycji HAVING Count(NrPozycji)>1; Przykład uzupełnienia tabeli o wybraną serię danych z drugiej tabeli: INSERT INTO SPRZEDAZ VALUES (SELECT * FROM SPRZEDAZ2 WHERE NrSprzedazy >200); Przykład usunięcia z tabeli pracownika, który zawarł mniej niŝ 2 tranzakcje sprzedaŝy: DELETE * FROM PRACOWNICY WHERE NrPracownika IN (SELECT NrPracownika FROM SPRZEDAZ GROUP BY NrPracownika HAVING Count(*) <2); DODATKOWE FUNKCJE oferowane przez MySQL: Operacje na łańcuchach tekstowych typ bazowy pól = TEXT, VARCHAR itp. SELECT NrPracownika, CONCAT(Imie,' ',Nazwisko) AS Imie_Nazwisko FROM PRACOWNICY; SELECT NrSprzedazy, UPPER(Klient), Wartosc FROM SPRZEDAZ ORDER BY NrPracowika; Operacje na liczbach typ bazowy pól = INT, FLOAT itp. SELECT NrSprzedazy, Klient, Towar, CONCAT( FORMAT(Wartosc,2),' zł') ) AS Cena_Zl SELECT NrSprzedazy, Klient, Towar, CONCAT( CEILING(Wartosc),' zł') ) AS Cena_w_Gore SELECT NrSprzedazy, Klient, Towar, CONCAT( FLOOR(Wartosc),' zł') ) AS Cena_w_Dol SELECT NrSprzedazy, Klient, Towar, CONCAT( ROUND(Wartosc,1),' zł') ) AS Cena_Zaokr Operacje na datach i czasie typ bazowy pól = DATE, TIME. Przykład: SELECT CONCAT('Urodzony:',DAYNAME(DataUrodzenia),',',DAYOFMONTH(DataUrodzenia),' ', MONTHNAME(DataUrodzenia),' ',YEAR(DataUrodzenia)) AS Urodzony FROM PRACOWNICY;