Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00058 009754 11018350 na godz. na dobę w sumie
Head First SQL. Edycja polska (Rusz głową!) - książka
Head First SQL. Edycja polska (Rusz głową!) - książka
Autor: Liczba stron: 592
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-1445-5 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> bazy danych >> sql - programowanie
Porównaj ceny (książka, ebook, audiobook).

Czy jesteś w stanie szybko powiedzieć, ile posiadasz książek? Jaki autor jest najbardziej popularny na Twojej półce? Jeżeli miałbyś bazę danych swoich książek, a baza ta obsługiwałaby język zapytań SQL, mógłbyś błyskawicznie udzielić odpowiedzi na te pytania. W przeciwnym razie... no cóż, zabierze Ci to o wiele więcej czasu. I czy będziesz pewien poprawności odpowiedzi?

Czym jest język SQL? To potężne narzędzie, którego opanowanie pozwoli Ci na sprawne poruszanie się po bazie danych. A za pomocą odpowiednio sformułowanych instrukcji będziesz mógł manipulować danymi, zarządzać kontami użytkowników i generować praktyczne raporty.

Oto innowacyjny podręcznik 'Head First SQL. Edycja polska', w którym autorzy - wykorzystujący najnowsze, skuteczne techniki nauki - szybko przekażą ci całą niezbędną wiedzę o tym przydatnym języku. Nauczysz się tworzyć tabele, dodawać do nich dane oraz pobierać je. Dowiesz się, w jaki sposób ograniczać zbiór wybieranych danych za pomocą odpowiednich warunków. Po przeczytaniu tej książki bez trudu przedstawisz dane w odpowiedniej kolejności i zakresie oraz zaczniesz swobodnie używać podzapytań, łączyć dane z różnych tabel, a także zapewniać im bezpieczeństwo.

Bezboleśnie naucz się wykorzystywać możliwości relacyjnych baz danych!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Head First SQL. Edycja polska Autor: Lynn Beighley T³umaczenie: Piotr Rajca ISBN: 978-83-246-1445-5 Tytu³ orygina³u: Head First SQL: Your Brain on SQL — A Learner Format: 200x230, stron: 592 Czy jesteœ w stanie szybko powiedzieæ, ile posiadasz ksi¹¿ek? Jaki autor jest najbardziej popularny na Twojej pó³ce? Je¿eli mia³byœ bazê danych swoich ksi¹¿ek, a baza ta obs³ugiwa³aby jêzyk zapytañ SQL, móg³byœ b³yskawicznie udzieliæ odpowiedzi na te pytania. W przeciwnym razie... no có¿, zabierze Ci to o wiele wiêcej czasu. I czy bêdziesz pewien poprawnoœci odpowiedzi? Czym jest jêzyk SQL? To potê¿ne narzêdzie, którego opanowanie pozwoli Ci na sprawne poruszanie siê po bazie danych. A za pomoc¹ odpowiednio sformu³owanych instrukcji bêdziesz móg³ manipulowaæ danymi, zarz¹dzaæ kontami u¿ytkowników i generowaæ praktyczne raporty. Oto innowacyjny podrêcznik „Head First SQL. Edycja polska”, w którym autorzy – wykorzystuj¹cy najnowsze, skuteczne techniki nauki – szybko przeka¿¹ ci ca³¹ niezbêdn¹ wiedzê o tym przydatnym jêzyku. Nauczysz siê tworzyæ tabele, dodawaæ do nich dane oraz pobieraæ je. Dowiesz siê, w jaki sposób ograniczaæ zbiór wybieranych danych za pomoc¹ odpowiednich warunków. Po przeczytaniu tej ksi¹¿ki bez trudu przedstawisz dane w odpowiedniej kolejnoœci i zakresie oraz zaczniesz swobodnie u¿ywaæ podzapytañ, ³¹czyæ dane z ró¿nych tabel, a tak¿e zapewniaæ im bezpieczeñstwo. • Tworzenie bazy danych i tabel (CREATE) • Pobieranie danych (SELECT) • Usuwanie (DELETE) i aktualizowanie danych (UPDATE) • Wykorzystywanie kluczy i indeksów • Sortowanie danych • Operacje na danych – sumy, œrednie, elementy maksymalne i minimalne • Pobieranie unikalnych danych • Sposób pobierania okreœlonej liczby wierszy • Stosowanie podzapytañ • Zapewnianie spójnoœci danych • Ograniczanie dostêpu do zgromadzonych danych • Zapewnianie bezpieczeñstwa bazie danych Bezboleœnie naucz siê wykorzystywaæ mo¿liwoœci relacyjnych baz danych! Spis treści (skrócony) 1 2 3 4 5 6 Wprowadzenie Dane i tabele: Na wszystko znajdzie się odpowiednie miejsce Polecenie SELECT: Pobieranie podarowanych danych DELETE i UPDATE: Są szanse, że wszystko będzie w porządku Projektowanie dobrych tabel: Po co być normalnym? Polecenie ALTER: Korygowanie przeszłości Zaawansowane zastosowanie polecenia SELECT: Nowy sposób spojrzenia na dane 7 Projektowanie baz danych składających się z wielu tabel: Wyrastamy z naszych starych tabel 8 9 10 Złączenia i operacje na wielu tabelach: Czy nie możemy się wszyscy dogadać? Podzapytania: Zapytania w zapytaniach Złączenia zewnętrzne, złączenia zwrotne oraz unie: Nowe manewry 11 Ograniczenia, widoki i transakcje: Zbyt wielu kucharzy psuje bazę danych 12 Bezpieczeństwo: Zabezpieczanie swych dóbr Dodatek A Pozostałości Dodatek B Instalacja MySQL-a Dodatek C Przypomnienie narzędzi Skorowidz Spis treści 25 37 87 153 193 231 267 311 373 409 447 483 521 551 569 575 583 Spis treści (z prawdziwego zdarzenia) Wprowadzenie Twój mózg myśli o SQL-u. Czytając książkę, Ty starasz się czegoś nauczyć, natomiast Twój mózg wyświadcza Ci przysługę, dbając o to, by te informacje nie zostały zbyt długo w Twej głowie. Twój mózg myśli sobie: „Lepiej zostawić miejsce na jakieś ważne rzeczy, takie jak: których dzikich zwierząt należy unikać albo czy jeżdżenie nago na snowboardzie jest dobrym pomysłem, czy nie”. Zatem w jaki sposób możesz przekonać swój mózg, by uznał, że poznanie SQL-a to dla Ciebie kwestia życia lub śmierci? Dla kogo jest ta książka Wiemy, co sobie myślisz Metapoznanie: myslenie o myśleniu Oto co możesz zrobić, aby zmusić swój mózg do posłuszeństwa Przeczytaj to Nasi wspaniali recenzenci Podziękowania 26 27 29 31 32 34 35 9 4. Projektowanie dobrych tabel Po co być normalnym? … i wtedy mamusia zadzwoniła do swojego tajemniczego pomocnika! W porządku, to nie jest normalne. Dotychczas tworzyłeś tabele bez zwracania na nie szczególnej uwagi. I wszystko było w porządku, tabele działały bez problemów. Mogłeś w nich zapisywać, modyfikować, usuwać i pobierać dane. Jednak w miarę zwiększania się ilości danych w tabelach zaczniesz zauważać, że są rzeczy, które mogłeś zrobić wcześniej, by ułatwić sobie w przyszłości tworzenie klauzul WHERE. Innymi słowy, musisz znormalizować swoje tabele. to jest nowy rozdział (cid:23) 193193 Poławianie danych Dwie wędkarskie tabele Dwóch znajomych wędkarzy, Jacek i Marek, stworzyło tabele do gromadzenia danych o rekordowych połowach. Tabela Marka zawiera kolumny pozwalające na zapisanie łacińskiej nazwy gatunku ryby, nazwy polskiej, wagi złowionej ryby oraz miejsca dokonania połowu. Nie zawiera jednak kolumn pozwalających na zapianie imienia i nazwiska osoby, która ustanowiła rekord. Ta tabela ma jedynie cztery kolumny. Porównaj ją z tabelą rekordowe_polowy przedstawioną na następnej stronie. polowy_informacje nazwa nazwa_gatunkowa miejsce bass sandacz pstrąg okoń płotka łuskot węgorz szczupak złota rybka łosoś M. salmoides S. vitreus O. Clarki P. Flavescens R. rutilus L. Osseus A. anguilla E. americanus C. auratus O. Tshawytscha Wigry, PD Dziubiele, WM Mrzygłód, PK Pisz, WM Charzykowy, PM Czaplinek, ZP Swornegacie, PM Karwica, WM Warszawa, MZ Toruń, KP waga 1,23 kg 2,75 kg 1,20 kg 0,85 kg 0,65 kg 1,10 kg 1,45 kg 3,34 kg 0,35 kg 3,10 kg Jestem ichtiologiem. Chcę szukać w tabeli wyłącznie łacińskich nazw gatunkowych i nazw używanych potocznie, by określić wagę rekordowej ryby oraz gdzie ją złowiono. Marek 194 Rozdział 4. Projektowanie dobrych tabel Tabela Jacka także zawiera polską nazwę złowionej ryby oraz jej wagę; jednak oprócz tego Jacek umieścił w niej kolumny pozwalające na zapisanie imienia i nazwiska szczęśliwego wędkarza oraz nazwy województwa, w którym dokonano połowu. Także ta tabela służy do rejestrowania rekordowych połowów wędkarskich, jednak zawiera niemal dwukrotnie więcej kolumn. imie nazwisko nazwa miejsce wojewodztwo rekordowe_polowy bass sandacz pstrąg okoń płotka łuskot węgorz szczupak złota rybka łosoś Wigry Dziubiele Mrzygłód Pisz Charzykowy Czaplinek Swornegacie Karwica Warszawa Toruń PD WM PK WM PM ZP PM WM MZ KP waga 1,23 kg 2,75 kg 1,20 kg 0,85 kg 0,65 kg 1,10 kg 1,45 kg 3,34 kg 0,35 kg 3,10 kg data 5.9.1947 16.8.1960 23.6.1978 18.5.1934 1.8.1965 31.9.1988 12.8.1973 11.6.1995 25.9.2003 17.8.1991 Jan Adrian Zenon Maria Piotr Ignacy Krzysztof Paweł Andrzej Roman Kowalski Bródka Krawczyk Popiela Drymza Wikorczyk Dubała Wronek Książewicz Wiertek Zaostrz ołówek Dla obu tabel napisz zapytanie, które pobierze wszystkie rekordowe połowy dokonane w województwie podkarpackim. Piszę artykuły dla magazynu „Weekend z wędką”. Muszę znać imiona i nazwiska wędkarzy, którzy ustanowili rekordowe połowy, daty tych połowów oraz ich miejsca. Jacek jesteś tutaj (cid:23) 195 Rozwiązanie ćwiczenia Zaostrz ołówek Rozwiązanie Dla każdej z tabel napisz zapytanie, które pobierze informacje o rekordowych połowach dokonanych na terenie województwa podkarpackiego. Niemal nigdy nie muszę wyszukiwać informacji na podstawie województwa. Dlatego informacje o województwie zapisuję w tabeli w tej samej kolumnie, w której umieszczam nazwę miejsca, gdzie dokonano rekordowego połowu. Musimy zastosować operator LIKE i odszukać interesujące nas rekordy na podstawie pola zawierającego połączoną nazwę miejscowości i oznaczenie województwa. SELECT * FROM polowy_informacje WHERE miejsce LIKE PK ; nazwa pstrąg nazwa_gatunkowa O. Clarki miejsce Mrzygłód, PK waga 1,20 kg Często muszę przeszukiwać informacje na podstawie województwa, dlatego też utworzyłem w tabeli odrębną kolumnę określającą województwo, w którym dokonano rekordowego połowu. To zapytanie odwołuje się bezpośrednio do kolumny „wojewodztwo”. SELECT * FROM rekordowe_polowy WHERE województwo = PK ; imie Zenon nazwisko Krawczyk nazwa pstrąg miejsce Mrzygłód wojewodztwo PK waga 1,20 kg data 23.6.1978 196 Rozdział 4. Nie ma niemądrych pytań P.: Dlaczego krótsze zapytania są lepsze do długich? O.: Im prostsze jest zapytanie, tym lepiej. Zapytania będą się stawać coraz bardziej skomplikowane wraz z powiększaniem się bazy danych i ilości umieszczonych w niej tabel. Jeśli na samym początku zaczniesz od możliwie jak najprostszych zapytań, to w przyszłości na pewno tego nie pożałujesz. P.: Chcesz przez to powiedzieć, że zawsze powinienem przechowywać w kolumnach bardzo małe fragmenty informacji? O.: Niekoniecznie. Analizując tabele Jacka i Marka, mogłeś już zauważyć, że wszystko zależy od tego, w jaki sposób chcesz korzystać z tabel. Na przykład wyobraź sobie tabele dotyczące samochodów — jedną, z której korzysta warsztat mechaniczny, i drugą, używaną przez właściciela komisu samochodowego. Mechanicy mogą potrzebować szczegółowych informacji o każdym samochodzie; z kolei właścicielowi komisu wystarczy marka, model, rok produkcji oraz numer nadwozia. Projektowanie dobrych tabel P.: A wyobraźmy sobie adres pocztowy. Czy nie moglibyśmy utworzyć jednej kolumny, w której byłby zapisany cały adres, oraz kilku innych, w których umieścilibyśmy jego poszczególne elementy? O.: Choć takie powielanie danych może Ci się obecnie wydawać całkiem dobrym pomysłem, to jednak pomyśl, o ile więcej miejsca na dysku zajmie taka baza, gdy rozrośnie się do potężnych rozmiarów. Poza tym w przypadku powielania danych w poleceniach INSERT i UPDATE pojawią się dodatkowe kolumny, o których będziesz musiał pamiętać. Przyjrzyjmy się dokładniej, jak należy projektować tabele, by optymalnie pasowały do sposobów, w jakie będziemy z nich korzystać. Sposób, w jaki masz zamiar korzystać z danych, będzie determinował postać tworzonych tabel. P.: A zatem tabela Jacka jest lepsza od tabeli Marka? O.: Nie. To dwie różne tabele, stworzone w innych celach. W praktyce Marek rzadko kiedy będzie musiał poszukiwać w swojej tabeli informacji na podstawie województwa, gdyż tak naprawdę interesują go jedynie nazwy gatunkowe i potoczne złowionych ryb oraz, oczywiście, ich waga. Z drugiej strony, Jacek będzie musiał korzystać z informacji o województwie podczas poszuki- wania danych w swojej tabeli. To właśnie z tego powodu w jego tabeli informacje o województwie, w jakim dokonano rekor- dowych połowów, znalazły się w osobnej kolumnie. To mu ułatwi poszukiwanie danych na podstawie województwa. P.: Czy podczas przeszukiwania tabel powinniśmy unikać stosowania operatora LIKE? O.: Nic nie przemawia za tym, by nie stosować operatora LIKE, niemniej jednak może to przysporzyć pewnych problemów oraz prowadzić do otrzymywania niepożądanych wyników. Jeśli w kolumnach są zapisywane złożone informacje, to operator LIKE nie będzie dostatecznie precyzyjny, by je pobierać. WYTĘŻ UMYSŁ SQL jest językiem używanym w relacyjnych bazach danych. Jak uważasz, czym są te „relacje” w świecie baz danych? jesteś tutaj (cid:23) 197 Wytyczne tworzenia tabel Tabele dotyczą związków Bazy danych obsługiwane przy użyciu języka SQL są nazywane systemami zarządzania relacyjnymi bazami danych (ang. Relational Database Management System, w skrócie RDBMS). Ale nie zaprzątaj sobie głowy zapamiętywaniem tych nazw. Dla nas najważniejsze jest tylko jedno słowo: RELACYJNE*. Dla Ciebie oznacza ono mniej więcej tyle, że aby zaprojektować odlotową tabelę, musisz zastanowić się i określić, jak poszczególne kolumny są ze sobą powiązane i wspólnie opisują zagadnienie, jakiego dotyczy tabela. Całe wyzwanie i sztuka polega na tym, by opisać zagadnienie, wykorzystując do tego celu kolumny, które zagwarantują łatwość pobierania danych z tabeli. A to oczywiście zależy od tego, jakie informacje chcemy pobierać z tabeli. Można wyróżnić kilka bardzo ogólnych kroków, jakie należy wykonać, projektując tabele. 1. Wybierz jedno zagadnienie, które ma opisywać tabela. Czego mają dotyczyć informacje zapisywane w tabeli? 2. Utwórz listę informacji o danym zagadnieniu, których będziesz potrzebował podczas korzystania z tabeli. Jak będziesz korzystał z tabeli? 3. Na podstawie tej listy podziel informacje o zagadnieniu na elementy, których następnie będziesz mógł użyć, określając organizację tabeli. Jak będzie Ci najłatwiej przeszukiwać i pobierać dane z tabeli? 198 Rozdział 4. * Niektórzy uważają, że słowo „relacyjny” odnosi się do wielu tabel powiązanych ze sobą. Jednak jest to błędna opinia. Projektowanie dobrych tabel Ćwiczenie Ć Czy na podstawie przedstawionego poniżej zdania, określającego, w jaki sposób ichtiolog Marek chce przeszukiwać i pobierać dane z tabeli, potrafisz określić, jakie powinny być jej kolumny? Wpisz nazwy kolumn w pustych prostokątach na poniższym rysunku. Przeszukując tabelę na podstawie nazwy lub nazwy gatunkowej , chcę uzyskać informacje o miejscu dokonania połowu oraz wadze złowionej ryby. Twoja kolej. Napisz analogiczne zdanie dotyczące Jacka — autora artykułów dla magazynu „Weekend z wędką”, który korzysta z bazy, by notować w niej szczegółowe informacje na potrzeby swoich artykułów. Następnie narysuj strzałki prowadzące od nazw kolumn do miejsca w zdaniu, w którym Jacek nawiązuje do danej kolumny. wojewodztwo nazwisko imie nazwa miejsce waga data jesteś tutaj (cid:23) 199 Ćwiczenie — Rozwiązanie Czy na podstawie przedstawionego poniżej zdania określającego, w jaki sposób ichtiolog Marek chce przeszukiwać i pobierać dane z tabeli, potrafisz określić, jakie powinny być jej kolumny? Wpisz nazwy kolumn w pustych prostokątach na poniższym rysunku. Rozwiązanie ćwiczenia nazwa nazwa_gatunkowa Przeszukując tabelę na podstawie nazwy lub nazwy gatunkowej , chcę uzyskać informacje o miejscu dokonania połowu oraz wadze złowionej ryby. waga miejsce Twoja kolej. Napisz analogiczne zdanie dotyczące Jacka — autora artykułów dla magazynu „Weekend z wędką”, który korzysta z bazy, by notować w niej szczegółowe informacje na potrzeby swoich artykułów. Następnie narysuj strzałki prowadzące od nazw kolumn do miejsca w zdaniu, w którym Jacek nawiązuje do danej kolumny. wojewodztwo nazwisko imie nazwa Przeszukując tabelę według nazwy ryby, chciałbym uzyskać imię oraz nazwisko wędkarza, jak również miejsce połowu, województwo, wagę złowionej ryby oraz datę połowu . miejsce waga data 200 Rozdział 4. Projektowanie dobrych tabel Ale dlaczego Jacek ma poprzestawać na tym? Dlaczego nie podzieli daty na kolumny dni, z nazwą ulicy i numerem domu. miesięcy i lat? Nawet kolumnę określającą miejsce można by dalej podzielić na osobne kolumny Oczywiście, że można by tak zrobić. Jednak nasze dane nie muszą być podzielone aż tak dokładnie. Przynajmniej nie w tym przypadku. Gdyby jednak Jacek miał zamiar napisać artykuł o tym, gdzie pojechać na wakacje, by złapać dużą rybę, to w takim przypadku mógłby podzielić kolumnę „miejsce” na nazwę ulicy i numer, tak by czytelnicy mogli znaleźć nocleg jak najbliżej rekordowego łowiska. Jednak Jacek potrzebuje wyłącznie informacji o miejscu i województwie, dlatego utworzył tylko tyle kolumn, ile jest koniecznych, by niepotrzebnie nie powiększać rozmiaru bazy danych. Uznał, że w jego sytuacji nie ma sensu bardziej dzielić danych; innymi słowy, uznał, że jego informacje są danymi atomowymi. WYTĘŻ UMYSŁ Jak myślisz, co oznacza termin „dane atomowe” w kontekście informacji zapisywanych w relacyjnych bazach danych? jesteś tutaj (cid:23) 201 Dane atomowe Dane atomowe Czym jest atom? To niewielki fragment materii, którego nie można lub nie należy dalej dzielić. To samo dotyczy danych. Kiedy zostaną one uznane za dane ATOMOWE, oznacza to, że zostały one już podzielone na najmniejsze elementy, których nie należy dalej dzielić. Dostawa w 30 minut lub gratis Przyjrzyjmy się na przykład dostarczycielowi pizzy. Aby dostarczyć zamówienie w odpowiednie miejsce, wystarczy, że w jednej kolumnie zapiszemy nazwę ulicy i numer domu. Na jego potrzeby są to dane atomowe. Dostawca nigdy nie będzie poszukiwał samego numeru domu. W rzeczywistości, jeśli miejsce dostawy zostałoby podzielone na nazwę ulicy i numer domu, to zapytania, które musiałby zadawać dostawca, byłyby dłuższe i bardziej złożone, a to spowodowałoby wydłużenie czasu dostarczania pizzy do klienta. N a p o t r z e b y d o s t aw c y p i z z y a d r e s z a p i s a n y w j e d n e j k o l um n i e j e s t w y s t a r c z a j ą c o a t om ow ą i n f o rm a c j ą . 202 Rozdział 4. Projektowanie dobrych tabel Lokalizacja, lokalizacja, lokalizacja A teraz przeanalizujmy przykład pośrednika handlu nieruchomościami. Taki pośrednik mógłby chcieć, by nazwa ulicy została zapisana w osobnej kolumnie. Mógłby bowiem chcieć podać w zapytaniu nazwę ulicy, by uzyskać informacje o wszystkich domach na sprzedaż położonych przy niej. A zatem w przypadku pośrednika handlu nieruchomościami informacjami atomowymi są nazwa ulicy oraz numer domu. Z kolei w przypadku pośrednika handlu nieruchomościami rozdzielenie nazwy ulicy od numeru domu i zapisanie ich w osobnych kolumnach pozwoli mu odnajdywać wszystkie domy na sprzedaż położone przy konkretnej ulicy za pomocą jednego, prostego zapytania. jesteś tutaj (cid:23) 203 Tworzenie danych atomowych Dane atomowe a Twoje tabele Poniżej przedstawiliśmy kilka pytań, które możesz sobie zadać, aby ułatwić sobie określenie danych, jakie należy umieścić w tworzonych tabelach. 1. Co jest podstawowym zagadnieniem opisywanym przez tabelę? Czy tabela opisuje klownów, krowy, pączki, czy też polityków? 2. W jaki sposób będziesz korzystał z tabeli, by uzyskiwać informacje o tym zagadnieniu? 3. Czy kolumny tabeli zawierają dane atomowe, dzięki czemu używane zapytania mogą być krótkie i precyzyjne? Projektuj tabele w taki sposób, aby przeszukiwanie ich było jak najprostsze. Nie ma niemądrych pytań P.: Czyż atomy nie są bardzo małe? Czy nie powinienem zatem dzielić swoich informacji na naprawdę bardzo małe elementy? O.: Nie. Tworzenie danych atomowych oznacza podzielenie ich na najmniejsze elementy konieczne do stworzenia wydajnych tabel, a nie na podzielenie ich na najmniejsze możliwe elementy. Nie należy dzielić danych bardziej niż to konieczne. Jeśli nie potrzebujesz dodatkowych kolumn, to nie twórz ich tylko i wyłącznie dlatego, że mógłbyś to zrobić. P.: W czym może mi pomóc stosowanie danych atomowych? O.: Może Ci pomóc w zapewnieniu, że informacje przechowywane w tabeli będą precyzyjne. Jeśli na przykład utworzysz osobną kolumnę przeznaczoną do przechowywania numeru domu, to będziesz mógł upewnić się, że będą w niej zapisywane wyłącznie liczby. Stosowanie danych atomowych pozwala także poprawić efektywność wykonywanych zapytań, gdyż same zapytania są łatwiejsze do napisania, a czas ich wykonania jest krótszy. Korzyści, jakie zapewnia nam stosowanie danych atomowych, są tym wyraźniejsze, im więcej jest danych przechowywanych w tabeli. 204 Rozdział 4. Zaostrz ołówek Poniżej przedstawiliśmy dwie oficjalne reguły dotyczące danych atomowych. Dla każdej z nich narysuj dwie hipotetyczne tabele, które nie będą spełniać wytycznych reguły. Projektowanie dobrych tabel Reguła 1.: W kolumnie z danymi atomowymi w jednym wierszu tabeli nie może się znajdować kilka wartości tego samego typu. Tej reguły nie spełnia tabela Grześka — moje_kontakty, a konkretnie jej pole „zainteresowania”. Reguła 2.: W tabeli zawierającej dane atomowe nie może być kilku kolumn zawierających dane tego samego typu. Tej reguły nie spełnia tabela proste_drinki. jesteś tutaj (cid:23) 205 Zaostrz ołówek — Rozwiązanie Zaostrz ołówek Rozwiązanie Poniżej przedstawiliśmy dwie oficjalne reguły dotyczące danych atomowych. Dla każdej z nich narysuj dwie hipotetyczne tabele, które nie będą spełniać wytycznych reguły. Reguła 1.: W kolumnie z danymi atomowymi w jednym wierszu tabeli nie może się znajdować kilka wartości tego samego typu. Oczywiście Twoja odpowiedź na pewno będzie inna, ale oto jeden z możliwych przykładów: pożywienie składniki chleb sałatka drożdże, mleko, jajka, mąka pomidor, ogórek, sałata Czy pamiętasz tabelę Grześka? Zawierała ona kolumnę zainteresowania, w której Grzesiek zapisywał niejednokrotnie kilka różnych zainteresowań danej osoby, przez co przeszukiwanie tabeli było prawdziwym koszmarem. Ta sama sytuacja występuje w tej tabeli. Wyobraź sobie odszukanie pomidorów wśród tych wszystkich pozostałych składników. Reguła 2.: W tabeli zawierającej dane atomowe nie może być kilku kolumn zawierających dane tego samego typu. Zbyt wiele kolumn do podawania studentów! nauczyciel Pani Martini Pan Grog student1 student2 student3 Janek Sonia Romek Tymon Kasia Julia 206 Rozdział 4. Projektowanie dobrych tabel Ćwiczenie Skoro już znasz oficjalne reguły oraz trzy kroki pozwalające na stosowanie danych atomowych, przeanalizuj wszystkie tabele przedstawione do tej pory w książce i wyjaśnij, dlaczego zawierają one dane atomowe, albo co sprawia, że zapisywane w nich informacje nie są danymi atomowymi. Tabela Grześka, ze strony 83 Tabela z ocenami pączków, ze strony 112 Tabela z informacjami o klownach, strona 155 Tabela drinków, ze strony 93 Tabela połowów wędkarskich, strona 194 jesteś tutaj (cid:23) 207 Normalizacja tabel Dlaczego warto być normalnym? Kiedy wyczerpie się Twój limit godzin na konsultacje ze specjalistą do spraw baz danych i będziesz musiał zatrudnić projektantów baz SQL, fajnie by było, gdybyś nie musiał tracić cennych godzin na tłumaczenie im, jak działają Twoje tabele. Cóż, tworzenie tabel ZNORMALIZOWANYCH oznacza, że są one zgodne z pewnymi standardami, które projektanci baz danych będą rozumieć. Co więcej, na pewno ucieszy Cię fakt, iż nasze tabele zawierające dane atomowe są już w połowie drogi do owej „normalności”. Zapisywanie w tabeli danych atomowych jest pierwszym krokiem na drodze do tworzenia tabel ZNORMALIZOWANYCH. Rozwiązanie ćwiczenia Skoro już znasz oficjalne reguły oraz trzy kroki pozwalające na stosowanie danych atomowych, przeanalizuj wszystkie tabele przedstawione do tej pory w książce i wyjaśnij, dlaczego zawierają one dane atomowe, albo co sprawia, że zapisywane w nich informacje nie są danymi atomowymi. Tabela Grześka, ze strony 83 Nie jest atomowa. Kolumny „zainteresowania” i „szuka” nie są zgodne z regułą 1. Tabela z ocenami pączków, ze strony 112 Tabela jest atomowa. W odróżnieniu od kolumn tabeli proste_drinki każda kolumna tej tabeli przechowuje informacje różnego typu. Oprócz tego, w odróżnieniu od kolumny „aktywnosci” tabeli klownów w każdej z kolumn tej tabeli przechowywany jest tylko jeden element informacji. Tabela z informacjami o klownach, strona 155 Tabela nie jest atomowa. W niektórych rekordach w kolumnie „aktywnosci” zapisywanych jest więcej czynności niż jedna, co jest sprzeczne z regułą 1. Tabela drinków, ze strony 93 Tabela nie jest atomowa. Zawiera ona więcej niż jedną kolumnę „składnik”, co jest sprzeczne z regułą 2. Tabela połowów wędkarskich, strona 194 Tabela jest atomowa. W każdej kolumnie są zapisywane informacje innego typu. Każda kolumna zawiera także tylko jedną informację. 208 Rozdział 4. Zalety normalizacji tabel Projektowanie dobrych tabel 1. W tabelach znormalizowanych dane się nie powielają, co pozwala ograniczyć wielkość bazy. Unikanie powielania danych pozwoli Ci zaoszczędzić miejsce na dysku. 2. Dzięki mniejszej ilości informacji w bazie wszelkie zapytania będą wykonywane szybciej. Moje tabele nie są aż tak duże. Dlaczego zatem mam sobie zawracać głowę jakąś normalizacją? Ponieważ nawet w przypadku małych tabel można na tym zyskać. Poza tym w miarę upływu czasu tabele stają się coraz większe. Jeśli od samego początku Twoje tabele będą znormalizowane, to w przyszłości, gdy zapytania zaczną być wykonywane zbyt wolno, nie będziesz musiał ich modyfikować. jesteś tutaj (cid:23) 209 Normalizacja i 1NF Klowni nie są normalni Czy pamiętasz tabelę z informacjami o publicznych wystąpieniach klownów? Śledzenie poczynań klownów stało się ogólnokrajowym szaleństwem i nasza stara tabela może nie sprostać zwiększonym wymaganiom, ponieważ kolumny wyglad i aktywnosci zawierają tak wiele danych. Na nasze potrzeby ta tabela nie jest atomowa. Wyszukiwanie danych w tych dwóch kolumnach jest naprawdę trudne, gdyż zawierają one tak wiele informacji! klowni_informacje wyglad aktywnosci balony, mały samochodzik K, czerwone włosy, zielona sukienka, ogromne stopy M, pomarańczowe włosy, niebieski garnitur, ogromne stopy mim K, żółta koszula, workowate czerwone spodnie M, cygaro, czarne włosy, niewielki kapelusz K, różowe włosy, ogromny kwiat, niebieska sukienka M, niebieskie włosy, czerwony garnitur, ogromny nos K, pomarańczowy garnitur, workowate spodnie K, cała na pomarańczowo i w cekinach M, w przebraniu kobiety, kostium w plamki M, zielono-fioletowy kostium, szpiczasty nos trąbka, parasolka skrzypce krzyk, taniec balony taniec utrzymywanie równowagi, mały samochodzik śpiew, taniec wchodzenie do malutkiego samochodu imie Eklerka Pan Pimpuś Pani Smyk Pan Hobo Klarabela Skuter Zippo Balbina Gonzo Pan Smyk ostatnio_widziano Dom opieki „Spokojna Ostoja” Urodziny u Jacka Zielińskiego MegaStragan Cyrk Koloseum Dom opieki „Wesoła Wdówka” Szpital Miejski Centrum Handlowe Skarbiec Auta Edwarda Zabawex Zaostrz ołówek Spróbujmy tak zmodyfikować tabelę klowni_informacje, by stała się ona tabelą atomową. Spróbuj zaproponować inną strukturę tabeli, zakładając przy tym, że chcemy wyszukiwać w niej informacje na podstawie kolumn wyglad, aktywnosci oraz ostatnio_widziano. 9 2 2 e i n o r t s a n z s e i z d j a n z i z d e i w o p d O 210 Rozdział 4. Projektowanie dobrych tabel W połowie drogi do 1NF Pamiętasz zapewne, że umieszczenie w tabeli danych atomowych to jedynie połowa drogi do znormalizowania tabeli. Kiedy tabela będzie całkowicie znormalizowana, przyjmie ona PIERWSZĄ POSTAĆ NORMALNĄ (ang. first normal form, w skrócie 1NF). Aby tabela miała pierwszą postać normalną, musi spełniać dwa warunki: Już wiem, jak zaspokoić ten wymóg. Każdy wiersz danych musi zawierać wartości atomowe Aby całkowicie znormalizować tabelę, do każdego z jej rekordów musimy dodać klucz główny. Każdy wiersz danych musi mieć unikalny identyfikator, nazywany kluczem głównym (ang. primary key). WYTĘŻ UMYSŁ Jak sądzisz, jakiego typu kolumny będą się nadawały do tworzenia klucza głównego? jesteś tutaj (cid:23) 211 Reguły klucza głównego Reguły KLUCZA GŁÓWNEGO Kolumnę, która ma pełnić rolę klucza głównego tabeli, należy utworzyć specjalnie w tym celu od razu podczas projektowania tabeli. Na kilku kolejnych stronach utworzymy tabelę i wskażemy kolumnę, która będzie jej kluczem głównym. Jednak zanim to zrobimy, przyjrzymy się, czym ten klucz główny jest. Klucz główny służy do zapewniania unikalności wszystkich rekordów tabeli. A to oznacza, że wartości w kolumnie klucza głównego nie mogą się powtarzać. Przeanalizujmy przykład tabeli przedstawionej poniżej. Jak myślisz, czy któraś z jej kolumn nadawałaby się na klucz główny? Kluczem głównym tabeli nazywamy kolumnę, która sprawia, że każdy wiersz tabeli jest unikalny. PESEL nazwisko numer telefon Numery PESEL mają unikalne wartości i są przypisywane konkretnym osobom. Może zatem ta kolumna nadawałaby się na klucz główny? W tych trzech kolumnach wartości mogą się powtarzać; na przykład z dużą dozą prawdopodobieństwa możemy założyć, że w tabeli znajdzie się więcej niż jedna osoba o imieniu Jan; podobnie może się zdarzyć, że kilka osób będzie mieszkać razem i używać tego samego numeru telefonu. Dlatego te trzy kolumny raczej nie będą się nadawały na pełnienie roli klucza głównego tabeli. Obejr zyj to! Zadbaj o swoje rekordy, używając kolumny PESEL jako klucza głównego tabeli. Przy coraz częstszych kradzieżach tożsamości coraz mniej osób zgodzi się na podanie swojego numeru PESEL, co jest zresztą całkowicie zrozumiałe. Jest to zbyt ważna informacja, by ryzykować jej kradzież. Czy możesz z całkowitą pewnością stwierdzić, że Twoja baza jest bezpieczna? Jeśli nie, to wszystkie te numery PESEL mogą zostać skradzione wraz z tożsamością ich właścicieli. 212 Rozdział 4. Projektowanie dobrych tabel W kolumnie klucza głównego nie mogą się pojawiać wartości NULL. Gdyby w kolumnie klucza głównego można było zapisywać wartości NULL, to rekordy nie byłyby unikalne, gdyż wartość NULL mogłaby się pojawić w kilku z nich. Wartość kolumny klucza głównego musi zostać określona w momencie dodawania rekordu do tabeli. Jeśli wartość kolumny klucza głównego nie zostanie określona w momencie dodawania rekordu, to ryzykujemy, że pojawi się w niej wartość NULL, co może doprowadzić do powtórzenia się tego samego rekordu w tabeli i naruszenia zasad pierwszej postaci normalnej. Klucz główny musi być krótki. Klucz główny musi zawierać tylko te informacje, które są niezbędne dla zapewnienia jego unikalności, i nic więcej. Wartości w kolumnie klucza głównego nie mogą się zmieniać. Gdyby można było zmieniać wartości zapisane w kolumnie klucza głównego, to przypadkowo można by podać wartość, która została już użyta. Pamiętaj, wszystkie wartości w kolumnie klucza głównego zawsze muszą być unikalne. WYTĘŻ UMYSŁ Czy na podstawie tych wszystkich informacji możesz podać przykład dobrego klucza głównego? Przejrzyj przykładowe tabele, które przedstawiliśmy we wcześniejszej części książki. Czy w którejś z nich jest kolumna zawierająca naprawdę unikalne wartości? jesteś tutaj (cid:23) 213 Kolejne informacje o kluczach głównych Chwila, a zatem, skoro nie mogę użyć numeru PESEL jako klucza głównego, a jednocześnie wartości w tej kolumnie wciąż muszą być unikalne, krótkie i niezmienne, to co to może być? Najlepszym kluczem głównym może być nowy klucz główny. W przypadku tworzenia kluczy głównych najlepszym i najprostszym rozwiązaniem jest utworzenie kolumny, która będzie zawierać unikalne liczby. Wyobraź sobie tabelę zawierającą informacje o osobach, w której umieścisz dodatkową kolumnę liczbową. W przykładzie przedstawionym poniżej jest to kolumna id. Gdyby nie kolumna id, to dwa rekordy Janka Kowalskiego byłyby identyczne. Jednak ponieważ istnieje klucz główny, oba te rekordy reprezentują różne osoby. A zatem klucz główny zapewnia unikalność tych dwóch rekordów. Poniższa tabela jest w pierwszej postaci normalnej. id 1 2 3 4 5 nazwisko Kowalski Paciorek Kowalski Ślusarczyk Paprocki imie Janek Krystyna Janek Anna Krzysztof pseudonim Pierun Krycha Pierun Ania Krzych Rekord Janka Kowalskiego. Ten rekord także zawiera dane Janka Kowalskiego, jednak wartość w kolumnie klucza głównego pokazuje, że jest to unikalny rekord i dotyczy całkowicie innej osoby niż pierwszy Janek Kowalski. Dla maniaków W świecie SQL-a trwa niekończąca się debata na temat tego, czy należy używać syntetycznych kluczy głównych, czyli specjalnie utworzonych (takich jak nasza kolumna id), czy też kluczy naturalnych — tworzonych na podstawie informacji, które już są zapisane w tabeli (takich jak numer nadwozia lub PESEL). Nie preferujemy żadnego z tych rozwiązań, a zagadnieniami związanymi z kluczami głównymi zajmiemy się bardziej szczegółowo w rozdziale 7. 214 Rozdział 4. Projektowanie dobrych tabel Nie ma niemądrych pytań P.: Cały czas mówicie o „pierwszej” postaci normalnej. Czy to oznacza, że istnieje też druga postać normalna? A może i trzecia? O.: Owszem, faktycznie istnieją także druga i trzecia postać normalna, a każda z nich narzuca coraz to bardziej wymagające warunki na strukturę i zawartość tabel. Zajmiemy się nimi dokładniej w rozdziale 7. P.: No dobrze, zatem zmieniliśmy nasze tabele w taki sposób, by zawierały dane atomowe. Czy któraś z nich znajduje się już w pierwszej postaci normalnej? O.: Nie. Jak na razie żadna ze stworzonych przez nas tabel nie zawiera ani klucza głównego, ani wartości unikalnych. P.: Wydaje mi się, że kolumna „komentarze” w tabeli o pączkach nie zawiera wartości atomowych. Chodzi mi o to, że nie ma żadnego prostego sposobu przeszukiwania jej zawartości. O.: Masz całkowitą rację. Ta kolumna raczej nie jest szczególnie atomowa. Choć z drugiej strony, projekt naszej tabeli nie narzucał takiej konieczności. Gdybyśmy jednak zdecydowali się na ograniczenie zawartości opinii do ściśle określonej grupy słów, to to pole mogłoby być atomowe. Jednak w takim przypadku zapisywane w bazie opinie nie byłyby spontaniczne. Dążenie do pierwszej postaci NORMALNEJ Nadszedł czas, by nieco się cofnąć i zająć się normalizacją naszych tabel. Musimy postarać się, by zapisane w nich informacje były atomowe, i dodać do nich klucze główne. Klucz główny tabeli jest zazwyczaj określany podczas tworzenia tabeli, czyli pisania polecenia CREATE TABLE. WYTĘŻ UMYSŁ Czy pamiętasz, jak można dodawać kolumny do istniejących tabel? jesteś tutaj (cid:23) 215 Poprawianie tabeli Grześka Poprawianie tabeli Grześka W jaki sposób — bazując na zdobytych już informacjach — powinieneś poprawić tabelę Grześka: Poprawa tabeli Grześka — krok 1.: Pobierz wszystkie informacje zapisane w tabeli, używając w tym celu polecenia SELECT, i zapisz je gdzieś. Poprawa tabeli Grześka — krok 2.: Utwórz nową, znormalizowaną tabelę. Poprawa tabeli Grześka — krok 3.: Zapisz wszystkie stare dane w nowej tabeli, modyfikując dane w każdym z wierszy w taki sposób, by odpowiadały one nowej strukturze tabeli. Teraz możesz usunąć starą wersję tabeli poleceniem DROP. Chwileczkę, ale ja już mam tabelę z całą masą informacji. Chyba nie jesteście poważni, jeśli oczekujecie, że usunę tabelę jak w pierwszym rozdziale i będę ponownie wpisywał całą jej zawartość tylko i wyłącznie po to, żeby utworzyć kolumnę klucza głównego. Mamy pewność, że tabela Grześka nie jest doskonała. Tabela Grześka nie jest atomowa i nie ma klucza głównego. Jednak, na szczęście dla Grześka, nie jesteśmy skazani na starą tabelę ani nie musimy kopiować i ponownie wpisywać jej zawartości. Możemy dodać do tabeli Grześka klucz główny i zapewnić atomowość danych przy użyciu jednego, nowego polecenia SQL. Jednak zanim to zrobimy, cofnijmy się nieco w przeszłość… 216 Rozdział 4. Projektowanie dobrych tabel Oryginalna postać polecenia CREATE TABLE Grzesiek musi dodać do swojej tabeli klucz główny; oprócz tego zdaje sobie sprawę, że jest kilka rzeczy, które może zrobić, by poprawić atomowość informacji zapisywanych w tabeli. Zanim przekonamy się, w jaki sposób można poprawić istniejącą tabelę, przypomnij sobie, jak ją utworzyliśmy. Oto postać polecenia CREATE TABLE, którego użyliśmy do utworzenia tabeli Grześka dawno temu, w rozdziale 1.: CREATE TABLE moje_kontakty ( nazwisko VARCHAR(30), imie VARCHAR(20), email VARCHAR(50), plec CHAR(1), data_urodzenia DATE, zawod VARCHAR(50), lokalizacja VARCHAR(50), stan VARCHAR(20), zainteresowania VARCHAR(100), szuka VARCHAR(100) ); W tej tabeli nie ma kolumny klucza głównego. Czy tworząc tabelę, możemy poprawić atomowość tych kolumn? WYTĘŻ UMYSŁ A co zrobić, gdybyśmy nie mieli nigdzie zanotowanego oryginalnego polecenia CREATE TABLE użytego do utworzenia tabeli? Czy istnieje jakiś sposób dotarcia do jego kodu? jesteś tutaj (cid:23) 217 Wyświetlanie kodu polecenia CREATE tabelę Pokażcie mi moją kasę A co by się stało, gdybyś zastosował polecenie DESCRIBE moje_kontakty, by podejrzeć kod użyty do utworzenia tej tabeli? Otóż gdybyś to zrobił, w oknie konsoli ujrzałbyś następujące wyniki: Ale nam zależy na dotarciu do kodu polecenia CREATE, a nie do informacji o polach tabeli. W ten sposób będziemy bowiem mogli uniknąć konieczności ponownego wpisywania polecenia i określić, co powinniśmy zrobić już podczas tworzenia tabeli. Polecenie SQL SHOW CREATE TABLE wyświetli kod polecenia CREATE TABLE, które pozwoli odtworzyć tabelę, oczywiście bez żadnych danych. Dzięki niemu w dowolnej chwili możemy się przekonać, w jaki sposób należy odtworzyć daną tabelę. Spróbuj wykonać następujące polecenie: SHOW CREATE TABLE moje_kontakty; 218 Rozdział 4. Projektowanie dobrych tabel Polecenie oszczędzające czas Rzuć okiem na kod polecenia, którego użyliśmy do utworzenia tabeli, przedstawiony na stronie 217. Następnie porównaj go z zamieszczonym poniżej kodem zwróconym przez polecenie SHOW CREATE TABLE moje_kontakty. Nie są one identyczne, jednak gdybyś wykonał poniższe polecenie CREATE TABLE, to uzyskane wyniki byłyby takie same, jak w przypadku użycia oryginalnego polecenia. Nie musisz usuwać znaków lewego apostrofu ani ustawień dotyczących wartości domyślnych, jeśli jednak to zrobisz, to polecenie będzie bardziej przejrzyste i schludne. Pomiędzy takimi znakami, określanymi jako lewy apostrof, są zapisywane nazwy kolumn oraz nazwa tabeli. Znaki lewego apostrofu są używane w wynikach generowanych przez polecenie SHOW CREATE TABLE. Jeśli jawnie nie zażądamy inaczej, to system zarządzania bazą danych przyjmuje, że wartości wszystkich kolumn przyjmują domyślnie wartość NULL. Podczas tworzenia tabeli warto określić, czy w jej poszczególnych kolumnach mogą być zapisywane wartości NULL, czy też nie. CREATE TABLE `moje_kontakty` ( `nazwisko` varchar(30) default NULL, `imie` varchar(20) default NULL, `email` varchar(50) default NULL, `plec` char(1) default NULL, `data_urodzenia` date default NULL, `zawod` varchar(50) default NULL , `lokalizacja` varchar(50) default NULL , `stan` varchar(20) default NULL , `zainteresowania` varchar(100) default NULL , `szuka` varchar(100) default NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 Nie musisz zwracać uwagi na ostatni wiersz kodu, umieszczony za nawiasem zamykającym. Określa on sposób przechowywania danych oraz używany zbiór znaków. Jak na razie w zupełności wystarczą nam ustawienia domyślne. Aby wykonać to polecenie, będziesz musiał zmienić nazwę tabeli; no chyba że wcześniej usuniesz oryginalną tabelę. Choć można by poprawić przejrzystość kodu (usuwając jego ostatni wiersz oraz wszystkie znaki lewego apostrofu), to jednak by utworzyć tabelę, nie trzeba wprowadzać w nim żadnych modyfikacji — wystarczy go skopiować i wkleić w przedstawionej postaci. jesteś tutaj (cid:23) 219 Polecenie CREATE TABLE i klucze główne Tworzenie tabeli z KLUCZEM GŁÓWNYM Poniżej przedstawiliśmy kod, który zwróciło polecenie SHOW CREATE TABLE moje_kontakty. Usunęliśmy z niego znaki lewego apostrofu oraz fragment ostatniego wiersza. Na samym początku listy kolumn dodaliśmy kolumnę id_kontaktu, której wartości, dzięki zastosowaniu wyrażenia NOT NULL, nie będą mogły przybierać wartości NULL. Z kolei na samym końcu listy dodaliśmy wyrażenie PRIMARY KEY, które określa, że kluczem głównym tabeli ma być nasza nowa kolumna id_kontaktu. Pamiętaj, że zawartość kolumny klucza głównego musi być różna od NULL — NOT NULL! Gdyby w kolumnie klucza głównego pojawiła się wartość NULL lub gdyby można było pominąć wartość zapisywaną w tej kolumnie, to nie moglibyśmy zagwarantować, że wszystkie wiersze tabeli będą identyfikowane w jednoznaczny, unikalny sposób. CREATE TABLE moje_kontakty ( id_kontaktu INT NOT NULL, nazwisko varchar(30) default NULL, imie varchar(20) default NULL, email varchar(50) default NULL, plec char(1) default NULL, data_urodzenia default NULL, zawod varchar(50) default NULL, lokalizacja varchar(50) default NULL, stan varchar(20) default NULL, zainteresowania varchar(100) default NULL, szuka varchar(100) default NULL, PRIMARY KEY (id_kontaktu) ) To właśnie w tym miejscu określamy klucz główny tabeli. Składnia używana do tego celu jest naprawdę prosta — wystarczy zapisać słowa PRIMARY KEY, a następnie podać w nawiasach nazwę kolumny klucza głównego. W naszym przypadku kluczem głównym będzie kolumna id_kontaktu. Utworzyliśmy nową kolumnę o nazwie id_kontaktu, w której będą zapisywane wartości liczbowe. Kolumna ta będzie pełnić funkcję klucza głównego naszej tabeli. Każda wartość w tej kolumnie będzie unikalna, dzięki czemu cała tabela stanie się tabelą atomową. 220 Rozdział 4. Projektowanie dobrych tabel Nie ma niemądrych pytań P.: Zatem mówicie, że KLUCZ GŁÓWNY nie może przybierać wartości NULL. Co jeszcze zapewnia jego unikalność? O.: Najprościej rzecz ujmując — jedynie Ty. Zapisując w tabeli każdy nowy wiersz, w kolumnie id_kontaktu będziesz umieszczał nową, unikalną wartość. Na przykład w pierwszym wydawanym poleceniu INSERT w kolumnie id_kontaktu zapiszesz wartość 1, w kolejnym wierszu wartość 2 i tak dalej. P.: Wyobrażam sobie, że takie określanie unikalnych wartości KLUCZA GŁÓWNEGO w każdym nowym rekordzie musi być naprawdę kłopotliwe. Czy nie ma żadnego prostszego rozwiązania? O.: Owszem, są prostsze rozwiązania; i to nawet dwa. Pierwszym z nich jest zastosowanie jako klucza głównego jakiejś istniejącej kolumny danych, o której wiemy, że ma unikalne wartości. Wspominaliśmy jednak, że takie rozwiązanie może przysparzać pewnych problemów (na przykład w przypadku stosowania numerów PESEL użytkownicy mogą się obawiać przejęcia swoich poufnych informacji przez niepożądane osoby). Prostym rozwiązaniem jest utworzenie zupełnie nowej kolumny, przeznaczonej do przechowywania unikalnych wartości klucza głównego, takiej jak kolumna id_kontaktu na poprzedniej stronie. W takim przypadku można nakazać systemowi obsługi baz danych, by automatycznie wypełniał wartość takiej kolumny w każdym rekordzie dodawanym do tabeli. Do tego celu służy specjalne słowo kluczowe. Zajrzyj na następną stronę — tam znajdziesz więcej informacji na ten temat. P.: Czy polecenia SHOW mogę używać także do wyświetlania innych informacji, czy tylko do odtworzenia polecenia CREATE TABLE? O.: Polecenia SHOW można także używać do wyświetlania informacji o konkretnych kolumnach: SHOW COLUMNS FROM nazwa_tabeli; To polecenie wyświetli nazwy wszystkich kolumn podanej tabeli wraz ze wszystkimi informacjami na ich temat. SHOW CREATE DATABASE nazwa_bazy_danych; Powyższe polecenie, podobnie jak polecenie SHOW CREATE TABLE nazwa_tabeli;, zwraca kod polecenia CREATE, z tym że w tym przypadku będzie to polecenie służące do utworzenia całej bazy danych. SHOW INDEX FROM nazwa_tabeli; Z kolei to polecenie wyświetli wszystkie kolumny, dla których zdefiniowano indeksy, wraz z informacjami na temat typów tych indeksów. Jak na razie jedynym typem indeksów, z jakim się zetknęliśmy, był klucz główny, jednak w dalszej części książki to polecenie stanie się znacznie bardziej przydatne. Istnieje jeszcze jedna wersja polecenia SHOW, i to wersja BARDZO użyteczna: SHOW WARNINGS; Jeśli w oknie konsoli pojawi się informacja, że podczas wykonywania polecenia SQL pojawiły się jakieś ostrzeżenia, to użyj tego polecenia, by wyświetlić ich treść. Dostępne są jeszcze inne wersje polecenia SHOW, jednak te przedstawione powyżej dotyczą zagadnień, którymi się już zajmowaliśmy. P.: No a co ze znakami lewego apostrofu, które zostały użyte w kodzie zwróconym przez polecenie SHOW CREATE TABLE? Czy jesteście pewni, że nie są potrzebne? O.: Są one używane dlatego, że w niektórych przypadkach system zarządzania bazami danych może nie być w stanie określić, że nazwa ma być nazwą kolumny. Jeśli jednak zapiszesz nazwy kolumn pomiędzy znakami lewego apostrofu, to istnieje możliwość stosowania słów kluczowych języka SQL jako nazw kolumn; choć absolutnie nie polecamy takiego rozwiązania. Na przykład wyobraźmy sobie, że z jakichś niewytłumaczalnych powodów chcielibyśmy nadać kolumnie nazwę select. Poniższa deklaracja kolumny jest jednak nieprawidłowa: select varchar(50) Zamiast niej musielibyśmy użyć następującej deklaracji: `select` varchar(50) P.: A niby czemu stosowanie słów kluczowych języka SQL jako nazw kolumn jest złym rozwiązaniem? O.: Oczywiście wolno to robić, jednak nie jest to dobry pomysł. Pomyśl tylko, jak mylące i trudne do zrozumienia mogą się stać zapytania oraz jak męczące będzie wpisywanie tych wszystkich znaków lewego apostrofu. Poza tym select nie jest dobrą nazwą dla kolumny, gdyż nie mówi nic o danych, jakie są w niej zapisywane. jesteś tutaj (cid:23) 221 Słowo kluczowe AUTO_INCREMENT 1, 2, 3… automatycznie inkrementowane Dodanie do naszej kolumny id_kontaktu słowa kluczowego AUTO_INCREMENT nakaże, by w pierwszym wierszu tabeli przyjęła ona wartość 1, a w każdym kolejnym była powiększana o 1. CREATE TABLE moje_kontakty ( id_kontaktu INT NOT NULL AUTO_INCREMENT , nazwisko varchar(30) default NULL, imie varchar(20) default NULL, email varchar(50) default NULL, plec char(1) default NULL, data_urodzenia default NULL, zawod varchar(50) default NULL, lokalizacja varchar(50) default NULL, stan varchar(20) default NULL, zainteresowania varchar(100) default NULL, szuka varchar(100) default NULL, PRIMARY KEY (id_kontaktu) ) To jest to! W większości systemów zarządzania bazami danych wystarczy do deklaracji kolumny dodać słowo kluczowe AUTO_INCREMENT. (Użytkownicy MS SQL pamiętajcie: w Waszym przypadku będzie to słowo kluczowe INDEX, po którym należy podać wartość początkową oraz liczbę, o którą będą powiększane wartości w poszczególnych kolumnach. Bardziej szczegółowe informacje na ten temat można znaleźć w dokumentacji serwera MS SQL). To słowo kluczowe robi dokładnie to, czego można by się spodziewać: sprawia, że w pierwszym wierszu tabeli, w danej kolumnie zostanie automatycznie zapisana wartość 1, która w kolejnych wierszach będzie automatycznie powiększana o 1. No dobrze, to chyba faktycznie jest proste. Ale w jaki sposób zapisać w tabeli wiersz, w którym wartość takiej kolumny będzie już określona? Poza tym, czy można zmienić wartość zapisaną w takiej kolumnie? A jak myślisz, co się w takich przypadkach stanie? Najlepiej będzie, jeśli sam spróbujesz wykonać takie operacje, i przekonasz się, jakie będą ich skutki. 222 Rozdział 4. Projektowanie dobrych tabel Ćwiczenie 1. Poniżej, w pustych wierszach, zapisz kod polecenia CREATE TABLE, które pozwoli utworzyć tabelę służącą do przechowywania imion i nazwisk osób. Powinna ona zawierać kolumnę klucza głównego, której wartości będą automatycznie inkrementowane, oraz dwie kolumny atomowe. 2. Wykonaj powyższe polecenie w oknie konsoli bazy danych lub innym programie do zarządzania bazą. 3. Spróbuj wykonać każde z poniższych poleceń INSERT. Zakreśl te, które działają prawidłowo. INSERT INTO twoja_tabela (id, imie, nazwisko) VALUES (NULL, Marysia , Krawczyk ); INSERT INTO twoja_tabela (id, imie, nazwisko) VALUES (1, Janka , Krawczyk ); INSERT INTO twoja_tabela VALUES ( , Bartek , Krawczyk ); INSERT INTO twoja_tabela (imie, nazwisko) VALUES ( Cecylia , Krawczyk ); INSERT INTO twoja_tabela (id, imie, nazwisko) VALUES (99, Piotr , Krawczyk ); 4. Czy udało się zapisać w tabeli informacje o wszystkich członkach rodziny Krawczyków? Zapisz poniżej zawartość tabeli po wykonaniu wszystkich poniższych poleceń. twoja_tabela id imie nazwisko jesteś tutaj (cid:23) 223 Rozwiązanie ćwiczenia Rozwiązanie ćwiczenia 1. Poniżej, w pustych wierszach, zapisz kod polecenia CREATE TABLE, które pozwoli utworzyć tabelę służącą do przechowywania imion i nazwisk osób. Powinna ona zawierać kolumnę klucza głównego, której wartości będą automatycznie inkrementowane, oraz dwie kolumny atomowe. CREATE TABLE twoja_tabela ( id INT NOT NULL AUTO_INCREMENT, imie VARCHAR(20), nazwisko VARCHAR(30), PRIMARY KEY (id) ); 2. Wykonaj powyższe polecenie w oknie konsoli bazy danych lub innym programie do zarządzania bazą. 3. Spróbuj wykonać każde z poniższych poleceń INSERT. Zakreśl te, które działają prawidłowo. INSERT INTO twoja_tabela (id, imie, nazwisko) VALUES (NULL, Marysia , Krawczyk ); INSERT INTO twoja_tabela (id, imie, nazwisko) VALUES (1, Janka , Krawczyk ); INSERT INTO twoja_tabela VALUES ( , Bartek , Krawczyk ); INSERT INTO twoja_tabela (imie, nazwisko) VALUES ( Cecylia , Krawczyk ); INSERT INTO twoja_tabela (id, imie, nazwisko) VALUES (99, Piotr , Krawczyk ); 4. Czy udało się zapisać w tabeli informacje o wszystkich członkach rodziny Krawczyków? Zapisz poniżej zawartość tabeli po wykonaniu wszystkich poniższych poleceń. To ostatnie polecenie „zadziała”,jednak zmodyfikuje wartość kolumny AUTO_INCREMENT. twoja_tabela imie Marysia Bartek Cecylia Piotr nazwisko Krawczyk Krawczyk Krawczyk d Krawczyk id 1 2 3 99 Wygląda na to, że zgubiliśmy Jankę; zapewne dlatego, że próbowaliśmy jej przypisać indeks, który został już użyty w rekordzie Marysi. Marysia, Marysia, Marysia! 224 Rozdział 4. Projektowanie dobrych tabel Nie ma niemądrych pytań P.: Dlaczego pierwsze polecenie, to z wartością NULL w kolumnie id, zadziałało? Przecież ta kolumna została zadeklarowana jako NOT NULL. O.: Faktycznie wygląda to tak, jakby to polecenie zadziałało, choć nie powinno. Okazuje się jednak, że w przypadku użycia AUTO_INCREMENT wartości NULL są ignorowane. Oczywiście, gdybyśmy nie umieścili w deklaracji kolumny słowa kluczowego AUTO_INCREMENT, to próba wykonania takiego polecenia spowodowałaby zgłoszenie błędu, a rekord nie zostałby zapisany. Spróbuj sam, a się przekonasz. żebyście mnie przekonali. Jak widać, posługując się poleceniem SHOW CREATE TABLE, mogę uzyskać i wykonać kod, który utworzy tabelę; jednak cały czas mam wrażenie, że będę musiał usunąć swoją oryginalną tabelę i ponownie, od nowa, wpisać całą jej zawartość tylko i wyłącznie po to, Słuchajcie, nie mogę powiedzieć, by dodać kolumnę klucza głównego. Nie będziesz musiał wpisywać wszystkiego od nowa. Wystarczy, że użyjesz polecenia ALTER. Nie trzeba kopiować danych zapisanych w istniejącej tabeli, a następnie jej usuwać i tworzyć od nowa. Można bowiem modyfikować strukturę istniejących tabel. Jednak żeby to zrobić, musimy sięgnąć po polecenie ALTER i kilka używanych przez niego słów kluczowych, które opisaliśmy w rozdziale 5. jesteś tutaj (cid:23) 225 Dodawanie klucza głównego Dodawanie KLUCZA GŁÓWNEGO do istniejącej tabeli Poniżej przedstawiliśmy kod, który pozwoli dodać do tabeli moje_kontakty kolumnę klucza głównego, której wartości będą automatycznie inkrementowane. (Polecenie jest naprawdę długie, więc będziesz musiał obrócić książkę, żeby je przeczytać). e r ó t k , o w o ł s o t T S R I F a w o n y b , e j u z a k a n a n a d o d a ł a t s o z a n m u l o k a n m u l o k a z s w r e i p o k a j o t a m e i n ć o h C . i l e b a t , a i n e z c a n z o g e z s k ę i w e i n a z c z s e i m u k a n d e j o t o k a j o g e n w ó ł g a z c u l k i l e b a t y n m u l o k j e z s w r e i p . m e ł s y m o p m y r b o d t s e j . ę n m u l o k ą w o n i l a d o d y r ó t k , d o k o t A a d ą l g y w e i n y z C ? o m o j a n z e b a t o d e i n e c e l o p e w o n e z s a n o t O . R E T L A — L Q S 226 Rozdział 4. , T S R I F T N E M E R C N I _ O T U A L L U N T O N T N I u t k a t n o k _ d i N M U L O C D D A ; ) u t k a t n o k _ d i ( Y E K Y R A M I R P D D A y t k a t n o k _ e j o m E L B A T R E T L A . o g e n w ó ł g a z c u l k ę l a r ó t k , ę n m u d o k n e t ć a n z o p z o r ż u l o k n o e j j ś e n e i n i w o P u z a k s w — o r ć i n ł e p e i z d ę b a n m u l o k u k d a p y z r p m y z s a n W . ę n m u l o k ą w o n i l e b a t o d ą j a d o d — m i k s l e i g n a . u t k a t n o k _ d i ę w z a n ć i s o n e i z d ę b a t t s e j N M U L O C D D A w ó ł s e i n a ł a i z D u k y z ę j w m e i n e z c a n z h c i z e n d o g z h c a d r o k e r h c y c ą e n t s j i i ż u j w u t k a t n o k _ d i y n m u o k o d l i l i c ś o t r a w a d o d e n e c e o p e z s ż y w o p e ż , z s z d ą s i y z C i ? ć z d w a r p s o t z s e ż o m k a J ? e n a w y s p a z j i i i e n w ą d ę b o r e p o d e r ó t k , h c a d r o k e r w o k y t l y z c i l e b a t Ż Ę T Y W Ł S Y M U Modyfikacja tabeli i dodanie KLUCZA GŁÓWNEGO Sprawdź wyniki działania polecenia ALTER przedstawionego na poprzedniej stronie. Wybierz bazę danych lista_grzesia poleceniem USE i wykonaj polecenie: Projektowanie dobrych tabel Ten komunikat informuje nas, że polecenie dodało nową kolumnę do 37 rekordów, które już były zapisane w bazie. Ty zapewne nie będziesz ich mieć aż tak wielu. Kolumna id_kontaktu została dodana jako pierwsza — przed wszystkimi pozostałymi kolumnami. Ponieważ użyliśmy słowa kluczowego AUTO_INCREMENT, zawartość tej kolumny była uzupełniana podczas modyfikowania poszczególnych, istniejących już wierszy tabeli. Zajefajnie… Teraz już mam kolumnę klucza głównego wraz z odpowiednimi wartościami. Czy mogę użyć polecenia ALTER także do dodania kolumny do zapisywania numeru telefonu? Aby sprawdzić, co się zmieniło w tabeli Grześka, wykonaj polecenie SELECT * FROM moje_kontakty;. Kiedy w przyszłości będziemy dodawali nowy rekord, to w jego kolumnie id_kontaktu zostanie zapisana wartość o jeden większa od największej wartości zapisanej w całej tabeli w kolumnie id_kontaktu. A zatem, jeśli w ostatnim dodawanym rekordzie w kolumnie kontakt_id znajduje się wartość 23, to w kolejnym rekordzie znajdzie się wartość 24. Pamiętaj, to nie jest koniec tabeli Grześka; tak naprawdę znajduje się w niej jeszcze wiele innych kontaktów. Czy Grześkowi uda się dodać kolumnę do zapisywania numeru telefonu? Zajrzyj do rozdziału 5., żeby sprawdzić, czy to możliwe. jesteś tutaj (cid:23) 227 4 Ł A I Z D Z O R Przegląd SQL-a Przybornik SQL A zatem opanowałeś materiał z czwartego rozdziału książki. Przyjrzyj się jeszcze raz wszystkim nowym narzędziom, jakie dodałeś do swojego SQL-owego przybornika. Kompletną listę porad znajdziesz w dodatku C, zamieszczonym na końcu książki. DANE ATOMOWE Dane w tabeli są atomowe, jeśli z jeśli zostały już podzielone na najmn najmniejsze elementy, które są Ci pot Ci potrzebne. SHOW CREATE TABLE Skorzystaj z tego polecenia, by poznać składnię polecenia SQL, które pozwoli Ci odtworzyć istniejącą tabelę. PIERWSZA POSTAĆ NORMALNA PIER (1NF) (1NF) Każdy Każdy wiersz danych musi zawie zawierać dane atomowe oraz unikal unikalny identyfikator. D A N E AT O M O W E — R E G U Ł A 1 . J e ś l i d a n e m a j ą b y ć a t o m o w e , t o w t e j s a m e j k o l u m n i e n i e m o ż e s i ę z n a j d o w a ć k i l k a e l e m e n t ó w d a n y c h t e g o s a m e g o t y p u . D A N E AT O M O W E — R E G U Ł A 2 . A b y d a n e w t a b e l i b y ł y a t o m o w e , n i e m o ż e s i ę w n i e j z n a j d o w a ć k i l k a k o l u m n z a w i e r a j ą c y c h k i l k a k o l u m n z i n f o r m a c j e t e g o s a m e g o t yy p u . i n f o r m a c j e t e g o s a m e g o t y p u . K L U C Z G Ł Ó W N Y K o l u m n a l u b z b i ó r k o l u m n , k t ó r e w u n i k a l n y s p o s ó b i d e n t y f i k u j ą w i e r s z e t a b e l i . h y p u . AUTO_INCREMENT Zastosowanie tego słowa kluczowego w deklaracji tabeli sprawi, że w momencie wykonywania poleceń INSERT w danej kolumnie będą się automatycznie i magicznie pojawiały unikalne liczby całkowite. 228 Rozdział 4. Zaostrz ołówek Rozwiązanie Spróbujmy tak zmodyfikować tabelę klowni_informacje, by stała się ona tabelą atomową. Spróbuj zaproponować inną strukturę tabeli, zakładając przy tym, że chcemy wyszukiwać w niej informacje na podstawie kolumn wyglad, aktywnosci oraz ostatnio_widziano. Projektowanie dobrych tabel W tym przypadku nie ma jednego, właściwego rozwiązania. Najlepszą rzeczą, jaką możesz zrobić, jest wydzielenie takich informacji jak płeć, kolor koszuli, kolor spodni, typ kapelusza, instrument muzyczny, środek lokomocji, balony (pole logiczne — tak lub nie), śpiew (także pole logiczne z wartościami tak lub nie), taniec (także pole logiczne). Aby zapewnić atomowość tabeli, musiałbyś wydzielić te wszystkie aktywności i umieścić je w osobnych kolumnach, i podobnie zrobić z informacjami o wyglądzie. Dodatkowe punkty możesz sobie przyznać, jeśli chciałeś rozbić adres i umieścić te informacje w takich kolumnach jak adres, miejscowość i województwo. jesteś tutaj (cid:23) 229
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Head First SQL. Edycja polska (Rusz głową!)
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: