Wstęp 5 Rozdział 1. Instalacja i konfiguracja 9 Rozdział 2
Transkrypt
Wstęp 5 Rozdział 1. Instalacja i konfiguracja 9 Rozdział 2
Wstęp Rozdział 1. Instalacja i konfiguracja Instalacja w systemie Linux Instalacja w systemie Windows Wstępna konfiguracja w systemie Windows Uruchamianie i zatrzymywanie serwera w systemie Linux Wstępna konfiguracja w systemie Linux Uruchamianie i zatrzymywanie serwera w systemie Windows Rozdział 2. Zarządzanie serwerem Łączenie z serwerem Tworzenie i usuwanie baz danych Wybór bazy danych Obsługa kont użytkowników Systemy kodowania znaków Wczytywanie poleceń z plików zewnętrznych Lista dostępnych baz danych Rozdział 3. Koncepcja relacyjnych baz danych Tabele Klucze Relacje Podstawowe zasady projektowania tabel 5 9 9 17 21 26 31 32 37 37 39 40 41 54 60 62 65 65 66 68 73 4 MySQL. Darmowa baza danych • Ćwiczenia praktyczne Rozdział 4. Tworzenie struktury bazy danych Ogólna postać instrukcji CREATE Typy danych Atrybuty kolumn Kodowanie znaków dla tabel i kolumn Pobieranie struktury tabel Modyfikacja tabel Usuwanie tabel Kilka tabel w praktyce Rozdział 5. Elementy SQL (DML) Wprowadzanie danych Pobieranie danych Modyfikacja danych Usuwanie danych Rozdział 6. Złożone instrukcje SQL Pobieranie danych z kilku tabel Typy złączeń Grupowanie danych 81 81 85 98 104 106 108 115 116 125 125 134 150 153 157 157 160 165 Dane w bazie przechowywane są w tabelach. Pojęcie tabeli poznaliśmy w rozdziale 3., „Koncepcja relacyjnych baz danych”. Czas więc dowiedzieć się, w jaki sposób można tworzyć tabele. Służy do tego instrukcja CREATE TABLE o schematycznej postaci: CREATE TABLE nazwa_tabeli ( nazwa_kolumny_1 typ_kolumny_1 [atrybuty], nazwa_kolumny_2 typ_kolumny_2 [atrybuty], ... nazwa_kolumny_n typ_kolumny_n [atrybuty], ) Nazwa tabeli może zawierać dowolne znaki, jakie może zawierać nazwa pliku w systemie operacyjnym, na którym działa serwer MySQL, z wyjątkiem /, \ i . Maksymalna długość nazwy to 64 bajty. Począwszy od wersji 3.23.6, nazwa tabeli może być nazwą słowa zastrzeżonego dla konstrukcji języka (np. SELECT, CREATE), w takim wypadku musi być jednak zawsze ujęta w znaki ‘, np. ‘SELECT‘. Nie 82 MySQL. Darmowa baza danych • Ćwiczenia praktyczne może również zawierać znaków o kodach 0 i 255 w standardzie ASCII, a na jej końcu nie powinny się znajdować tzw. białe znaki (czyli spacje, tabulatory itp.). Nazwa kolumny może zawierać dowolne znaki, jednak jej długość jest również ograniczona do 64 bajtów i także nie powinna być zakończona białym znakiem. Typ kolumny określa rodzaj danych, które dana kolumna będzie mogła przechowywać, np. łańcuch znaków, liczby, itp. Występujące w MySQL typy danych zostaną omówione w następnej sekcji. W nazwach tabel (oraz baz danych) mogą występować zarówno małe, jak i duże litery, jednak to, czy będą rozróżniane, zależy od systemu plików systemu operacyjnego, na którym został zainstalowany MySQL. I tak w większości odmian Uniksa wielkie i małe litery są rozróżniane, natomiast w systemach Windows — nie. W systemach Mac OS rozróżnianie wielkości liter zależy od tego, czy wykorzystywany jest system plików HFS (nie są rozróżniane), czy USF (są rozróżniane). W związku z tym, o ile to możliwe, najwygodniej przyjąć po prostu zasadę, że nazwy baz i tabel zawsze są pisane małymi literami (najlepiej alfabetu łacińskiego). Nazwy kolumn również mogą zawierać małe i duże litery, jednak w tym wypadku nie są one rozróżniane, niezależnie od wersji systemu operacyjnego czy systemu plików. Począwszy od wersji 4.1, wszystkie identyfikatory i nazwy odnoszące się do definicji zawartości tabel są zapisywane w standardzie Unicode. Należy również pamiętać, że jeśli identyfikator (np. nazwa kolumny) zawiera znaki spoza standardowego zestawu ASCII (np. polskie litery), należy go ująć w lewe apostrofy (podobnie jak w sytuacji, kiedy identyfikator jest nazwą zastrzeżoną dla konstrukcji języka SQL). Dla treningu spróbujmy teraz utworzyć prostą tabelę klient, która będzie zawierała dwie kolumny. Pierwsza — o nazwie Indeks — będzie przechowywała liczby całkowite (typ danych INTEGER), druga — o nazwie Nazwa — będzie przechowywała ciągi maksymalnie 20 znaków (typ VARCHAR(20)). Rozdział 4. • Tworzenie struktury bazy danych 83 Ć W I C Z E N I E 4.1 Utworzenie prostej tabeli Utwórz tabelę o nazwie klient zawierającą dwie kolumny — pierwszą o nazwie Indeks typu INTEGER, drugą o nazwie Nazwa typu VARCHAR(20). Utworzenie takiej tabeli osiągniemy po wydaniu polecenia w postaci: CREATE TABLE klient ( Indeks INTEGER, Nazwa VARCHAR(20) ); Oczywiście najpierw należy uruchomić klienta mysql, zalogować się do serwera i wybrać bazę danych (np. test), tak jak było to opisywane we wcześniejszych rozdziałach. Po wykonaniu opisanych czynności w oknie konsoli zobaczymy widok zaprezentowany na rysunku 4.1. Rysunek 4.1. Zalogowanie do serwera i utworzenie tabeli klient w bazie test Co się jednak stanie, jeśli spróbujemy utworzyć tabelę o nazwie, która już istnieje w bazie? W takiej sytuacji zostanie zgłoszony błąd widoczny na rysunku 4.2. Jest to całkiem zrozumiałe zachowanie systemu. Czasem jednak chcielibyśmy utworzyć tabelę o zadanej nazwie tylko wtedy, gdy nie istnieje ona w bazie, a gdyby istniała — nie podejmować żadnego działania. W takiej sytuacji powinniśmy skorzystać z dodatkowej konstrukcji II NOT EXISTS w ogólnej postaci: CREATE TABLE IF NOT EXISTS nazwa_tabeli ( definicje kolumn ) którą możemy przetłumaczyć jako: utwórz tabelę nazwa_tabeli, o ile nie istnieje ona jeszcze w bazie. 84 MySQL. Darmowa baza danych • Ćwiczenia praktyczne Rysunek 4.2. Próba utworzenia już istniejącej tabeli Ć W I C Z E N I E 4.2 Utworzenie tabeli, o ile nie istnieje ona już w bazie Napisz instrukcję tworzącą tabelę klient (taką jak w ćwiczeniu 4.1), która nie spowoduje wystąpienia błędu w sytuacji, jeśli tabela o takiej nazwie będzie już istniała w bazie. CREATE TABLE IF NOT EXISTS klient ( Indeks INTEGER, Nazwa VARCHAR(20) ); Tworzona tabela może być również tymczasową, czyli taką, która zostanie automatycznie usunięta po zakończeniu połączenia. Co więcej, taka tabela jest powiązana wyłącznie z połączeniem, w którym została utworzona, tak więc dwóch użytkowników może w jednym czasie w jednej bazie utworzyć różne tabele o takiej samej nazwie. Tymczasowość tabeli zapewnia słowo TEMPORARY umieszczone za CREATE, czyli instrukcja w ogólnej postaci: CREATE TEMPORARY TABLE nazwa_tabeli ( definicje kolumn ) Ć W I C Z E N I E 4.3 Tabela tymczasowa Utwórz tymczasową tabelę o dwóch dowolnych kolumnach. CREATE TEMPORARY TABLE test ( id INTEGER, wartosc INTEGER ); Rozdział 4. • Tworzenie struktury bazy danych 85 Istnieje także możliwość utworzenia nowej tabeli na bazie już istniejącej. Stosujemy w tym celu instrukcję CREATE w postaci: CREATE TABLE nowa_tabela LIKE istniejąca_tabela; która oznacza: utwórz tabelę o nazwie nowa_tabela o strukturze takiej jak istniejąca_tabela. Ć W I C Z E N I E 4.4 Tworzenie jednej tabeli na bazie innej Utwórz tabelę klient2 o strukturze pobranej z tabeli klient. CREATE TABLE klient2 LIKE klient; Każda kolumna tabeli w bazie danych ma przypisany typ, który określa rodzaj danych, jakie mogą być w niej przechowywane. Występujące w MySQL typy danych można podzielić na trzy grupy: q liczbowe, q daty i czasu, q łańcuchowe. Typy liczbowe Typy liczbowe możemy podzielić na dwa rodzaje — typy całkowitoliczbowe oraz typy zmiennoprzecinkowe. Zgodnie z nazwami służą one do reprezentacji wartości całkowitych oraz zmiennoprzecinkowych (zmiennopozycyjnych, rzeczywistych). Typy całkowitoliczbowe zostały przedstawione w tabeli 4.1. Jeden z wymienionych w niej typów — INTEGER — wykorzystywaliśmy już przy tworzeniu przykładowej tabeli klient. W każdym z wymienionych przypadków z wyjątkiem BOOL i BOOLEAN można zastosować dodatkowy modyfikator określający maksymalną szerokość wyświetlania w sytuacji, kiedy liczba znaków wartości jest mniejsza niż maksymalna. Definicja typu ma wtedy postać: nazwa_typu(ile) 86 MySQL. Darmowa baza danych • Ćwiczenia praktyczne Dozwolone są także modyfikatory UNSIGNED oraz ZEROIILL. Pierwszy z nich oznacza, że wartość ma być traktowana jako liczba bez znaku (czyli niedopuszczalne są wartości ujemne). Drugi powoduje, że jeżeli liczba cyfr w danej wartości jest mniejsza od maksymalnej liczby wyświetlanych znaków, wolne miejsca zostaną dopełnione zerami. Zastosowanie atrybutu ZEROIILL powoduje, że automatycznie zostanie również zastosowany atrybut UNSIGNED. Przykładowo, jeżeli zostanie zastosowany typ TINYINT UNSIGNED, w poszczególnych wierszach kolumny będzie można zapisywać wartości od 0 do 255. Jeżeli natomiast zostanie zastosowany typ TINYINT(4) ZEROIILL, w poszczególnych wierszach kolumny również będzie można zapisywać jedynie wartości od 0 do 255, ale będą one wyświetlane zawsze w postaci czteroznakowej, w której wolne miejsca z prawej strony zostały wypełnione zerami. Oznacza to, że wartość 2 będzie wyświetlana jako 0002, wartość 64 jako 0064, a 128 jako 0128. Tabela 4.1. Typy całkowitoliczbowe Typ Zakres wartości Liczba zajmowanych Opis bajtów BIT - zmienna W wersjach od 5.0.3 reprezentuje pola bitowe od 1 do 64 bitów, w wersjach wcześniejszych synonim dla TINYINT(1). BOOL - 1 Synonim dla TINYINT(1). Wartość 0 jest interpretowana jako false, wartość różna od 0 jako true. W przyszłości ma zostać wprowadzona pełna obsługa typu BOOLEAN. Rozdział 4. • Tworzenie struktury bazy danych 87 Tabela 4.1. Typy całkowitoliczbowe (ciąg dalszy) Typ Zakres wartości Liczba zajmowanych Opis bajtów BOOLEAN - 1 Synonim dla TINYINT(1). Wartość 0 jest interpretowana jako false, wartość różna od 0 jako true. Wprowadzony w wersji 4.1.0. W przyszłości ma zostać wprowadzona pełna obsługa typu BOOLEAN. TINYINT Od –128 do 127 dla liczb ze znakiem i od 0 do 255 dla liczb bez znaku. 1 Reprezentacja bardzo małych wartości całkowitoliczbowych. SMALLINT Od –327–8 (–215) do 327–7 (215–1) dla liczb ze znakiem i od 0 do –5535 (216–1) dla liczb bez znaku. 2 Reprezentacja małych wartości całkowitoliczbowych. MEDIUMINT Od –8388–08 (–223) do 8388–07 (223–1) dla liczb ze znakiem i od 0 do 1–777215 (224–1) dla liczb bez znaku. 3 Reprezentacja średnich wartości całkowitoliczbowych. INT Od –2147483–48 (–231) do 2147483–47 (231–1) dla liczb ze znakiem i od 0 do 42949–7295 (232–1) dla liczb bez znaku. 4 Reprezentacja zwykłych wartości całkowitoliczbowych. 88 MySQL. Darmowa baza danych • Ćwiczenia praktyczne Tabela 4.1. Typy całkowitoliczbowe (ciąg dalszy) Liczba zajmowanych Opis bajtów Typ Zakres wartości INTEGER Od –2147483–48 (–231) do 2147483–47 (231–1) dla liczb ze znakiem i od 0 do 42949–7295 (232– 1) dla liczb bez znaku. 4 Synonim dla INT. BIGINT Od –922337203–854775808 (–263) do 922337203–854 775807 (263 –1) dla liczb ze znakiem i od 0 do 1844–744073709551–15 (264–1) dla liczb bez znaku. 8 Reprezentacja dużych wartości całkowitoliczbowych. Ć W I C Z E N I E 4.5 Tabela z kolumnami typu INTEGER Utwórz tabelę, która będzie zawierała dwie kolumny typu INTEGER, pierwszą o nazwie id i drugą o nazwie znacznik. CREATE TABLE test ( id INTEGER, znacznik INTEGER ); Ć W I C Z E N I E 4.6 Tabela z kolumnami typu INTEGER z dodatkowymi atrybutami Utwórz tabelę, która będzie zawierała kolumnę typu INTEGER przechowującą wyłącznie dodatnie wartości z przedziału 0 – 65535, w której liczba wyświetlanych znaków będzie zawsze równa 5, a wolne miejsca wartości krótszych niż 5 znaków będą wypełniane zerami. CREATE TABLE test ( id SMALLINT(5) ZEROFILL ); Rozdział 4. • Tworzenie struktury bazy danych 89 Typy zmiennoprzecinkowe zostały przedstawione w tabeli 4.2. Podobnie jak w przypadku typów całkowitoliczbowych, istnieje możliwość zastosowania modyfikatora określającego szerokość wyświetlania. W przypadku typów ILOAT, DOUBLE i DOUBLE PRECISION występuje on zawsze jednocześnie z modyfikatorem określającym liczbę miejsc po przecinku, ogólnie: nazwa_typu(mod1, mod2) gdzie mod1 określa szerokość wyświetlania (całkowitą liczbę cyfr znaczących), a mod2 liczbę uwzględnianych miejsc po przecinku. Tabela 4.2. Typy zmiennoprzecinkowe Typ Zakres wartości Liczba zajmowanych bajtów FLOAT (precyzja) zmienny 4 lub 8 Parametr precyzja określa precyzję, z jaką będzie reprezentowana dana wartość rzeczywista. W przypadku wartości od 0 do 24 mamy do czynienia z liczbami o pojedynczej precyzji, a w przypadku wartość od 25 do –3 z liczbami o podwójnej precyzji, co odpowiada opisanym niżej typom FLOAT i DOUBLE. FLOAT od –3.4028234––E+38 do 3.4028234––E+38 4 Liczby zmiennoprzecinkowe pojedynczej precyzji. DOUBLE od –1.797–931348 –23157E+308 do 1.797–931348 –23157E+308 8 Liczby zmiennoprzecinkowe podwójnej precyzji. DOUBLE PRECISION jw. jw. Synonim dla DOUBLE. REAL jw. jw. Synonim dla DOUBLE. Opis 90 MySQL. Darmowa baza danych • Ćwiczenia praktyczne Tabela 4.2. Typy zmiennoprzecinkowe (ciąg dalszy) Typ Zakres wartości Liczba zajmowanych bajtów DECIMAL zmienny zmienna Wartości z separatorem dziesiętnym. W wersjach przed 5.0.3 przechowywana jako łańcuch znaków. Całkowita maksymalna liczba znaków i liczba znaków po separatorze dziesiętnym może być określana przez dodatkowe parametry. DEC jw. jw. Synonim dla DECIMAL. NUMERIC jw. jw. Synonim dla DECIMAL. FIXED jw. jw. Synonim dla DECIMAL, dodany w wersji 4.1.0. Opis W przypadku typu DECIMAL i jego synonimów możliwe jest zastosowanie modyfikatora określającego szerokość wyświetlania bez modyfikatora określającego liczbę miejsc po przecinku, czyli prawidłowa jest zarówno konstrukcja: DECIMAL(mod1) jak i: DECIMAL(mod1, mod2) W stosunku do typów zmiennoprzecinkowych można również stosować modyfikatory ZEROIILL oraz UNSIGNED. Znaczenie pierwszego z nich jest takie samo jak w przypadku typów całkowitoliczbowych. Zastosowanie modyfikatora UNSIGNED powoduje natomiast, że dozwolone będą jedynie wartości nieujemne, nie zmieni się natomiast zakres wartości możliwych do reprezentowania.