Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
MySQL. Almanach
Autor: Russell J. T. Dyer
Tumaczenie: Rafa Joca
ISBN: 83-246-0130-9
Tytu oryginau: MySQL in a Nutshell
Format: B5, stron: 294
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Spis treci
Przedmowa ...................................................................................................................19
1. Wprowadzenie do MySQL .......................................................................................... 23
Warto MySQL
Pakiet MySQL
Licencje
Listy mailingowe
Ksiki i inne publikacje
23
24
25
25
26
27
28
30
31
32
32
33
35
37
38
40
41
41
43
44
45
47
48
48
50
51
5
Spis treci
53
54
55
55
59
59
60
60
61
62
63
63
64
64
65
70
71
72
73
73
73
74
74
75
75
75
76
78
80
83
85
85
86
87
87
88
89
89
89
90
91
92
92
RESET SLAVE
RESTORE TABLE
REVOKE
ROLLBACK
ROLLBACK TO SAVEPOINT
SAVEPOINT
SELECT
SET
SET PASSWORD
SET SQL_LOG_BIN
SET TRANSACTION
SHOW BINLOG EVENTS
SHOW CHARACTER SET
SHOW COLLATION
SHOW COLUMNS
SHOW CREATE DATABASE
SHOW CREATE TABLE
SHOW CREATE VIEW
SHOW DATABASES
SHOW ENGINES
SHOW ERRORS
SHOW GRANTS
SHOW INDEX
SHOW INNODB STATUS
SHOW LOGS
SHOW MASTER LOGS
SHOW MASTER STATUS
SHOW PRIVILEGES
SHOW PROCESSLIST
SHOW SLAVE HOSTS
SHOW SLAVE STATUS
SHOW STATUS
SHOW TABLE STATUS
SHOW TABLES
SHOW VARIABLES
SHOW WARNINGS
START SLAVE
START TRANSACTION
STOP SLAVE
TRUNCATE TABLE
UNION
UNLOCK TABLES
USE
92
93
93
94
94
94
95
101
102
102
102
103
104
104
105
105
106
106
106
107
107
107
108
108
109
109
109
109
109
110
110
111
111
112
112
113
113
114
114
114
115
115
115
Spis treci
Spis treci
117
118
118
118
118
119
119
120
120
120
121
121
121
121
122
122
123
123
123
124
124
124
125
125
125
126
126
126
127
127
127
127
128
128
129
129
129
129
130
130
131
131
131
OLD_PASSWORD()
ORD()
PASSWORD()
POSITION()
QUOTE()
REPEAT()
REPLACE()
REVERSE()
RIGHT()
RPAD()
RTRIM()
SHA()
SHA1()
SOUNDEX()
SPACE()
STRCMP()
SUBSTRING()
SUBSTRING_INDEX()
TRIM()
UCASE()
UNCOMPRESS()
UNCOMPRESSED_LENGTH()
UNHEX()
UPPER()
131
132
132
132
133
133
133
133
134
134
134
135
135
135
135
136
136
137
137
137
138
138
138
138
140
140
140
141
141
142
142
142
142
143
143
144
144
146
146
146
147
147
Spis treci
DAYOFWEEK()
DAYOFYEAR()
EXTRACT()
FROM_DAYS()
FROM_UNIXTIME()
GET_FORMAT()
HOUR()
LAST_DAY()
LOCALTIME()
LOCALTIMESTAMP()
MAKEDATE()
MAKETIME()
MICROSECOND()
MINUTE()
MONTH()
MONTHNAME()
NOW()
PERIOD_ADD()
PERIOD_DIFF()
QUARTER()
SEC_TO_TIME()
SECOND()
STR_TO_DATE()
SUBDATE()
SUBTIME()
SYSDATE()
TIME()
TIMEDIFF()
TIMESTAMP()
TIMESTAMPDIFF()
TIMESTAMPADD()
TIME_FORMAT()
TIME_TO_SEC()
TO_DAYS()
UNIX_TIMESTAMP()
UTC_DATE()
UTC_TIME()
UTC_TIMESTAMP()
WEEK()
WEEKDAY()
WEEKOFYEAR()
YEAR()
YEARWEEK()
10
Spis treci
147
148
148
148
149
149
150
151
151
151
152
152
152
153
153
153
154
154
154
155
156
156
157
157
157
158
158
159
159
159
160
160
160
161
161
161
162
162
163
163
163
164
164
165
165
165
166
166
166
167
167
167
167
167
168
168
168
168
169
169
169
169
170
170
170
171
171
172
172
172
172
172
173
173
173
174
174
174
174
175
175
175
175
176
176
176
Spis treci
11
TRUNCATE()
VARIANCE()
176
177
179
179
180
181
181
183
183
184
184
185
185
185
185
186
186
186
186
187
187
187
188
188
188
189
189
189
190
190
190
190
191
191
12
Spis treci
193
195
201
202
205
206
206
206
206
207
210
211
212
214
217
218
218
220
224
225
226
229
230
231
235
235
236
236
236
236
237
237
237
237
238
238
238
238
238
239
239
239
240
240
240
Spis treci
13
execute_array()
execute_for_fetch()
fetch()
fetchall_arrayref()
fetchall_hashref()
fetchrow_array()
fetchrow_arrayref()
fetchrow_hashref()
finish()
foreign_key_info()
func()
get_info()
installed_versions()
last_insert_id()
looks_like_number()
neat()
neat_list()
parse_dsn()
parse_trace_flag()
parse_trace_flags()
ping()
prepare()
prepare_cached()
primary_key()
primary_key_info()
quote()
quote_identifier()
rollback()
rows()
selectall_arrayref()
selectall_hashref()
selectcol_arrayref()
selectrow_array()
selectrow_arrayref()
selectrow_hashref()
set_err()
state()
table_info()
table_info_all()
tables()
trace()
trace_msg()
type_info()
type_info_all()
Atrybuty uchwytw
14
Spis treci
241
241
241
241
241
242
242
242
243
243
243
243
243
244
244
244
244
245
245
245
245
245
246
246
246
246
247
247
247
247
248
248
249
249
249
250
250
250
250
250
250
251
251
251
251
251
253
254
254
255
257
257
258
258
258
259
260
260
261
261
262
262
262
262
263
263
264
265
265
266
266
267
267
268
268
269
269
270
270
270
270
271
271
271
272
272
272
273
Spis treci
15
mysql_num_rows()
mysql_pconnect()
mysql_ping()
mysql_query()
mysql_real_escape_string()
mysql_result()
mysql_select_db()
mysql_stat()
mysql_tablename()
mysql_thread_id()
mysql_unbuffered_query()
273
274
274
274
275
275
275
276
276
276
276
Spis treci
279
282
282
282
282
283
283
284
284
284
285
285
285
286
286
286
287
287
288
288
288
289
289
290
290
291
291
291
292
292
292
293
mysql_get_server_version()
mysql_info()
mysql_init()
mysql_insert_id()
mysql_kill()
mysql_list_dbs()
mysql_list_fields()
mysql_list_processes()
mysql_list_tables()
mysql_more_results()
mysql_next_result()
mysql_num_fields()
mysql_num_rows()
mysql_options()
mysql_ping()
mysql_query()
mysql_real_connect()
mysql_real_escape_string()
mysql_real_query()
mysql_reload()
mysql_rollback()
mysql_row_seek()
mysql_row_tell()
mysql_select_db()
mysql_set_server_option()
mysql_shutdown()
mysql_sqlstate()
mysql_stat()
mysql_store_result()
mysql_thread_id()
mysql_thread_safe()
mysql_use_result()
mysql_warning_count()
Typy danych interfejsu programistycznego MySQL dla jzyka C
293
293
294
294
294
295
295
296
296
296
297
297
297
297
298
299
299
300
301
302
302
302
303
303
303
303
304
304
304
305
305
305
306
306
Spis treci
17
ROZDZIA 3.
Podstawy MySQL
Cho niniejsza ksika zawiera materia podrcznikowy, ktry mona czyta maymi fragmentami w razie potrzeby, w niniejszym rozdziale znajduje si proste wiczenie uczce podstaw
MySQL. Informuje, w jaki sposb zalogowa si do serwera, utworzy baz danych, a take
wpisa i dokona edycji znajdujcych si w niej danych. Trzeba jednak zdawa sobie spraw
z tego, i wiczenie nie obejmuje wszystkich zagadnie. Stanowi raczej wskazwk, w jaki
sposb naley wykonywa pewne rodzaje zada w MySQL.
Klient mysql
Istnieje wiele sposobw interakcji z serwerem MySQL, a tym samym tworzenia i uywania
bazy danych. Najprostszym interfejsem jest klient mysql. Dziki niemu moliwa jest interakcja
przy uyciu wiersza polece. Program czsto nazywany jest monitorem MySQL.
Jeli serwer MySQL zosta poprawnie zainstalowany i uruchomiony, mysql powinien wczy
si bez przeszkd. Jeeli tak si nie stanie, naley przeprowadzi instalacj zgodnie z krokami opisanymi w rozdziale 2. Jeeli instalacja zostaa przeprowadzona w sposb domylny,
program mysql znajduje si w katalogu /usr/local/mysql/bin/. Aby upewni si, i znajdzie si
on w ciece wyszukiwania, wystarczy wykona ponisze wiersze:
PATH=$PATH:/usr/local/mysql/bin
export PATH
Zakadajc, i wszystko dziaa poprawnie, potrzebna jest jeszcze nazwa uytkownika i haso.
Jeli nie jest si administratorem, naley uzyska obie informacje od osoby zarzdzajcej serwerem. Jeeli serwer MySQL zosta zainstalowany dopiero przed chwil, uytkownik root
posiada puste haso. Sposb ustawiania hase i tworzenia uytkownikw z rnymi prawami
zosta opisany w rozdziale 2.
Logowanie si do serwera MySQL z poziomu powoki wyglda nastpujco.
mysql -h host -u uytkownik -p
Jeli dokonuje si logowania do lokalnego serwera (mieszczcego si na tym samym komputerze fizycznie lub logicznie, na przykad dziki poczeniu Telnet lub SSH), mona pomin
argument -h host. Klient domylnie przyjmuje, i logowanie dotyczy hosta localhost, ktry
odnosi si do aktualnego systemu. W przypadku chci doczenia do serwera istniejcego na
innym komputerze, trzeba poda jego nazw, ktr mona przeoy na adres IP, lub bezporednio wpisa adres IP.
37
Argument uytkownik naley zastpi waciw nazw uytkownika. Opcja -p instruuje mysql,
aby poprosi o podanie hasa. Moliwe jest przekazanie hasa na kocu opcji -p (wpisz
-prower, jeli hasem jest rower); midzy opcj a hasem nie wystpuje znak spacji. Wpisywanie hasa w wierszu polece nie jest dobrym rozwizaniem ze wzgldw bezpieczestwa,
poniewa jest wwczas przesyane przez sie jako niezakodowany tekst, a w dodatku kto moe
podejrze list procesw uruchomionych na danym komputerze.
Aby zakoczy prac z mysql, wpisz quit lub exit i nacinij klawisz Enter.
To krtkie polecenie tworzy baz danych o nazwie ksiegarnia. W niniejszej ksice polecenia
i zarezerwowane sowa bd pisane wielkimi literami. Nie jest to jednak wymagane MySQL
nie rozrnia wielkoci liter w sowach kluczowych i klauzulach. Nazwy baz danych i tabel
s czue na wielko liter w systemach operacyjnych czuych na wielko liter, na przykad
systemach uniksowych, ale nie s czue w systemach, ktre nie zwracaj uwagi na wielko
liter, na przykad systemach Windows. Przyjo si jednak, by sowa kluczowe w dokumentacjach SQL pisa wielkimi literami, a nazwy tabel, baz danych i kolumn maymi literami.
Polecenia SQL s zakoczone znakiem rednika. Polecenie SQL moe rozciga si na wicej ni
jeden wiersz. Jego wysanie do serwera i przetworzenie rozpoczyna si dopiero po wykryciu
znaku rednika. Aby zatrzyma uruchomione polecenie SQL, zamiast rednika naley wpisa \c.
Skoro baza danych jest ju zaoona, warto w aktualnej sesji okreli domyln baz danych,
stosujc ponisze polecenie:
USE ksiegarnia;
Kolejny krok to utworzenie pierwszej tabeli, w ktrej pniej znajd si dane. Pierwsza tabela
bdzie przechowywaa podstawowe informacje o ksice, poniewa jest to najwaniejszy
element ksikowego biznesu.
CREATE TABLE ksiazki (
id_rek INT,
tytul VARCHAR(50),
autor VARCHAR(50)
);
Polecenie tworzy tabel o nazwie ksiazki z trzema kolumnami. Pierwsza kolumna to po prostu numer identyfikacyjny kadego z rekordw. Jest typu cakowitoliczbowego. Warto pamita, i w MySQL pola nazywane s kolumnami, a rekordy wierszami. Typem danych dla
drugiej i trzeciej kolumny s pola tekstowe o zmiennej dugoci mog pomieci maksymalnie 50 znakw. Lista kolumn znajduje si w nawiasach.
Aby pozna opis wanie utworzonej tabeli, wpisz instrukcj DESCRIBE, ktra wywietli ponisz tabel:
38
DESCRIBE ksiazki;
+--------+-------------+------+-----+---------+-------+
| Field | Type
| Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id_rek | int(11)
| YES |
| NULL
|
|
| tytul | varchar(50) | YES |
| NULL
|
|
| autor | varchar(50) | YES |
| NULL
|
|
+--------+-------------+------+-----+---------+-------+
39
Ta tabela nie wymaga znaczcej liczby kolumn, cho w rzeczywistej ksigarni zapewne zostayby zastosowane dodatkowe kolumny opisowe. W przyszoci dojdzie do zczenia tabel
ksiazki i autorzy za pomoc wartoci z kolumny id_autora tabeli ksiazki i kolumny id_rek powyszej tabeli. Osobicie zawsze w ten sam sposb nazywam kolumn klucza gwnego
kadej tabeli (id_rek), aby przy wpisywaniu zapyta nie zastanawia si nad nazw i nie musie sprawdza jej poleceniem DESCRIBE.
W powyszej tabeli imi i nazwisko autora zostao rozbite na dwie kolumny, aby uatwi
sortowanie i wyszukiwanie po nazwisku. Dodatkowo pojawia si kolumna kraju pochodzenia
autora, co umoliwi wyszukiwanie ksiek napisanych przez autorw pochodzcych z kraju
podanego przez uytkownika.
Poka mi
Warto zatrzyma si na chwil i popodziwia wykonan do tej pory prac. Aby uzyska list
baz danych, naley wykona polecenie SHOW DATABASES.
SHOW DATABASES;
+------------+
| Database
|
+------------+
| ksiegarnia |
| mysql
|
| test
|
+------------+
Wynik wykonania polecenia ujawnia istnienie dwch dodatkowych baz danych poza wanie
wykonan baz. Jedn z tych dodatkowych baz jest mysql, ktra zawiera dane dotyczce
przywilejw uytkownikw. Zostaa ona pokrtce omwiona w poprzednim rozdziale. Trzecia wymieniona baza danych (test) jest tworzona automatycznie w trakcie instalacji MySQL.
Tradycyjnie uywa si jej do dodawania tabel, dla ktrych chce si przeprowadzi testowanie
polece SQL.
Aby wywietli list tabel bazy danych ksiegarnia (po wczeniejszym wybraniu tej bazy danych
poleceniem USE), wpisz ponisze polecenie:
SHOW TABLES;
+----------------------+
| Tables_in_ksiegarnia |
+----------------------+
| autorzy
|
| ksiazki
|
+----------------------+
40
Wynik dziaania polecenia SHOW TABLES przedstawia list zawierajc, zgodnie z oczekiwaniami, dwie tabele. Jeli chce si wywietli list tabel innej bazy danych, korzystajc nadal
z aktywnej bazy danych ksiegarnia, naley do wczeniejszego polecenia doda klauzul FROM.
USE ksiegarnia;
SHOW TABLES FROM mysql;
Spowoduje to wywietlenie tabel bazy danych mysql, cho klient nadal bdzie cile zwizany
z baz danych ksiegarnia.
Wstawianie danych
Po wykonaniu dwch pierwszych tabel warto wstawi do nich dane. Najprostszy sposb
wykonania tego zadania to uycie polecenia INSERT. Dziki temu poleceniu mona za jednym
podejciem doda jeden lub wicej rekordw. Przed dodaniem informacji o ksice do tabeli
ksiazki trzeba wypeni pole tabeli autorzy, aby mc odnie si od identyfikatora autora. Wykonaj ponisze polecenie, korzystajc z klienta mysql:
INSERT INTO autorzy
(nazwisko, imie, kraj)
VALUES('Grochola','Katarzyna','Polska');
Pierwsze polecenie spowodowao dodanie rekordu dla Katarzyny Grocholi, autorki ksiki
Nigdy w yciu. Standardowa skadnia polecenia INSERT najpierw okrela kolumny, w ktrych
maj zosta umieszczone dane. Jeli chce si wstawia dane do wszystkich kolumn w kolejnoci okrelonej w bazie danych, nie trzeba podawa nazw kolumn. W drugim poleceniu SQL
lista kolumn ma inn kolejno ni oryginalna lista kolumn w tabeli. Takie rozwizanie jest
w peni akceptowane przez MySQL trzeba jednak zapewni tak sam kolejno przekazywanych danych. Identyfikator autora dla kolumny id_autora pobieramy z poprzedniego polecenia, korzystajc z funkcji LAST_INSERT_ID().
Pobieranie danych
Skoro w obu tabelach znajduj si dane, warto wykona pewne zapytania. Do pobrania danych suy polecenie SELECT. Aby pobra wszystkie kolumny i wiersze tabeli ksiazki, wpisz
ponisze polecenie:
SELECT * FROM ksiazki;
Pobieranie danych
41
Polecenie SQL wywietla jedynie numer identyfikacyjny, tytu i opis wszystkich ksiek z tabeli ksiazki, ktre nale do gatunku nowela. Oczywicie wyniki byyby bardziej imponujce,
gdyby w tabeli znajdowao si wicej ksiek. Zamy, i wpisalimy do bazy danych kilkadziesit ksiek i kontynuujmy prac.
Aby z bazy danych pobra wszystkie ksiki napisane przez wybranego autora, trzeba dokona poczenia tabeli ksiazki z tabel autorzy. Poniej zosta przedstawiony przykad takiego
poczenia.
SELECT ksiazki.id_rek, tytul, rok_pub,
CONCAT(imie, ' ' , nazwisko) AS autor
FROM ksiazki, autorzy
WHERE nazwisko = 'Grochola' AND id_autora = autorzy.id_rek;
Obie tabele posiadaj kolumn o nazwie id_rek, wic poza nazw kolumny trzeba okreli
nazw tabeli, by poprawnie dokona zczenia. W tym celu przed nazw kolumny umieszcza
si nazw tabeli oraz znak kropki jako separator. Przykad takiego rozwizania znajduje si
w pierwszym wierszu, w ktrym dochodzi do pobrania numeru identyfikacyjnego rekordu.
Drugi wiersz korzysta z funkcji tekstw o nazwie CONCAT(). Dziki tej funkcji mona poczy ze sob kilka fragmentw danych w jeden tekst, aby uzyska lepiej wygldajcy wynik.
W tym przypadku funkcja czy imi, znak spacji (w apostrofach) oraz nazwisko autora.
Wynik poczenia bdzie widoczny jako jedna kolumna o nazwie autor, poniewa taka nazwa zostaa podana jako alias dziki sowu kluczowemu AS. Klauzula FROM wymienia obie
tabele oddzielone przecinkiem. Jeli istniaoby wicej tabel, wystarczyoby je poda w tej
klauzuli w dowolnej kolejnoci, oddzielajc je przecinkami. W klauzuli WHERE informujemy
serwer, i jestemy zainteresowani ksikami napisanymi przez autora o nazwisku Grochola. Dodatkowo klauzula ta zawiera warunek zczenia obu tabel (ostatni wiersz). Zczenie dotyczy kolumny id_autora tabeli ksiazki i kolumny id_rek tabeli autorzy. Jeli w tabeli nie
znajduje si adna ksika napisana przez takiego autora, nie zostan zwrcone adne wiersze.
Jeeli ksika takiego autora zostaa wpisana, ale jego dane nie znajduj si w tabeli autorzy,
rwnie nie zostan wywietlone adne wiersze. Oto przykadowy wynik wykonania poprzedniego polecenia SQL.
+--------+-------------------+---------+--------------------+
| id_rek | tytul
| rok_pub | autor
|
+--------+-------------------+---------+--------------------+
|
1 | Nigdy w yciu
| 2001
| Katarzyna Grochola |
|
2 | Podanie o mio | 2002
| Katarzyna Grochola |
+--------+-------------------+---------+--------------------+
Nietrudno zauway, i zostay odnalezione dwie ksiki Katarzyny Grocholi. Tytu ostatniej
kolumny zosta okrelony w zapytaniu za pomoc sowa kluczowego AS. Podobne zmiany
mona wymusi dla innych kolumn, korzystajc z tego samego sowa kluczowego. Alias autor
moe zosta uyty w innym miejscu polecenia SELECT, ale niestety nie w klauzuli WHERE.
Wicej informacji na temat AS znajduje si w rozdziale 4.
42
Dodatkowa klauzula ograniczy liczb zwrconych wierszy do pierwszych 20. Liczenie rozpoczyna si od pierwszego wiersza zbioru wynikw zaraz po posortowaniu danych zgodnie
z wymaganiami zawartymi w klauzuli ORDER BY. Jeli chce si pobra kolejnych 10 pozycji,
trzeba w klauzuli LIMIT najpierw poda liczb wierszy do pominicia, a nastpnie po przecinku liczb wierszy do pobrania. Jeeli zechcemy pomin pierwszych 20 wynikw i wywietli jedynie kolejnych 10, trzeba zastpi wczeniejsz klauzul LIMIT nastpujc wersj:
...
LIMIT 20, 10;
43
Wynikiem dziaania powyszego polecenia SQL jest lista wszystkich tytuw sztuk Shakespearea istniejcych w bazie danych. Numer identyfikacyjny bdzie dotyczy pierwszego
znalezionego wiersza dla kadego tytuu. Co ciekawe, GROUP BY zwrci te same dane co ORDER BY
zastosowane dla tej samej kolumny.
Zamy, e po ustawieniu i uruchomieniu bazy danych zawiera ona tabel zamowienia z informacjami na temat zamwie uytkownikw. Moemy wykorzysta t tabel, aby sprawdzi sprzeda wybranej ksiki. Aby sprawdzi kwot uzyskan ze sprzeday ksiki Armadillo
autorstwa Williama Boyda, wystarczy wpisa ponisze polecenie SQL w kliencie mysql:
SELECT SUM(kwota_sprzedazy) AS 'Sprzeda Armadillo'
FROM zamowienia, ksiazki, autorzy
WHERE tytul = 'Armadillo'
AND nazwisko = 'Boyd'
AND id_ksiazki = ksiazki.id_rek;
AND id_autora = autorzy.id_rek;
+--------------------+
| Sprzeda Armadillo |
+--------------------+
|
250.25 |
+--------------------+
Aby uzyska odpowiednie informacje, czymy trzy tabele. MySQL pobiera warto kolumny
kwota_sprzedazy dla kadego wiersza tabeli zamowienia speniajcego kryteria zawarte w klauzuli WHERE. Nastpnie sumuje znajdujce si tam wartoci i wywietla je w kolumnie o podanej nazwie. Wikszo nazw kolumn wystpuje tylko w jednej tabeli, wic MySQL nie ma
problemw ze stwierdzeniem, czego dotycz. Niemniej dla kilku kolumn trzeba zastosowa
wersj tabela.kolumna.
Korzystajc z wielu rnorodnych funkcji, mona sterowa sposobem formatowania kolumn
zawierajcych dat lub czas. Zamy, i chcemy wydoby z tabeli zamowienia dat zoenia
zamwienia na podstawie posiadanego numeru rachunku (na przykad 1250), ktry tak naprawd jest numerem identyfikujcym rekord (id_rek). Zastosowanie poniszego polecenia
SQL spowoduje zwrcenie daty w domylnym formacie.
44
Zastosowany format (rok-miesic-dzie) jest w peni zrozumiay. Jeeli jednak chce si wywietli nazw miesica jako tekst, a nie liczb, mona skorzysta z odpowiednich funkcji daty.
SELECT CONCAT(DAYOFMONTH(data_zakupu), ' ',
MONTHNAME(data_zakupu), ' ',
YEAR(data_zakupu)) AS 'Data zakupu'
FROM orders
WHERE rec_id = '1250';
+---------------+
| Data zakupu
|
+---------------+
| 1 March 2004 |
+---------------+
Aby przedstawi dat w formacie czsto stosowanym w Polsce, korzystamy z funkcji CONCAT()
i kilku funkcji daty. Pocztkowo zastosowany kod moe wydawa si niezrozumiay z powodu wstawiania dodatkowych znakw spacji midzy poszczeglne elementy daty. Pierwsza
z funkcji pobiera z daty liczb reprezentujc dzie i po prostu j wywietla. Kolejna funkcja
wydobywa z kolumny data_zakupu miesic i zwraca go jako nazw w jzyku angielskim.
Trzecia funkcja, znajdujca si w trzecim wierszu, wydobywa rok. Przygldajc si wynikowi, atwo stwierdzi, i ten zoony kod dziaa prawidowo. Nie jest to jednak najbardziej
wygodny sposb formatowania daty. Lepsze rozwizanie polega na zastosowaniu funkcji
DATE_FORMAT().
SELECT DATE_FORMAT(data_zakupu, "%d %M %Y")
AS 'Data zakupu'
FROM orders
WHERE rec_id = '1250';
Modyfikacja danych
Do modyfikacji danych w bazie danych suy kilka rnych polece. Najbardziej podstawow i chyba najpopularniejsz instrukcj jest UPDATE. Dziki niej mona zmieni dane we
wskazanych kolumnach wszystkich wierszy speniajcych klauzul WHERE. Przygldajc si
wynikom jednego z wczeniejszych zapyta mona zauway, i data wydania dla ksiki
Katarzyny Grocholi Podanie o mio to rok 2002. Nie jest to poprawna warto, gdy ksika
zostaa wydana w roku 2001. Aby uaktualni t informacj, wpisz ponisze polecenie SQL:
Modyfikacja danych
45
UPDATE ksiazki
SET rok_pub = 2001
WHERE id_rek = '2';
Query OK, 1 rows affected (0.22 sec)
Rows matched: 1 Changed: 1 Warnings: 0
Najpierw podaje si nazw aktualizowanej tabeli. Nastpnie po sowie kluczowym SET pojawiaj si nazwy kolumn i przypisywane im nowe wartoci. Jeeli zmienia si warto wicej
ni jednej kolumny, poszczeglne przypisania naley rozdzieli przecinkami. Sowo kluczowe
SET stosuje si tylko raz.
Powysze polecenie posiada klauzul WHERE, co powoduje ograniczenie liczby modyfikowanych wierszy wycznie do wierszy speniajcych podane warunki. W przedstawionym przykadzie warunek dotyczy kolumny z unikatowymi wartociami, wic zmieniony zostanie tylko
jeden wiersz. Wynik wykonania polecenia wskazuje na wpynicie na jeden z wierszy, dopasowanie si do jednego wiersza, zmienienie jednego z wierszy. W trakcie wykonywania nie
pojawiy si adne bdy powodujce zgoszenie ostrzee.
Czasem wstawienie danych do tabeli spowoduje powstanie duplikatu wiersza, gdy dane
wiersza istniay ju wczeniej. Przypumy, i wykonalimy polecenie SQL wstawiajce do
tabeli kilka ksiek, ale jedna z tych ksiek ju bya zawarta w bazie danych. Jeeli zastosuje
si polecenie INSERT, powstanie duplikat. Aby temu zapobiec, mona uy polecenia REPLACE,
ktre wstawia nowy wiersz lub zastpuje istniejcy wiersz nowymi danymi. Z perspektywy
MySQL duplikacja wystpuje tylko wtedy, gdy unikatowe kolumny miayby zawiera t sam warto. Poniewa warto kolumny id_rek jest przypisywana automatycznie, jej duplikacja
jest mao prawdopodobna na etapie dodawania nowych rekordw. Unikatowym elementem
kadej ksiki jest numer ISBN dziki niemu mona jednoznacznie okreli ksik. Aby
zapewni, i nie pojawi si wiersze z tym samym numerem ISBN, warto ponownie zmodyfikowa tabel ksiazki i wymusi unikatowo wartoci znajdujcych si w kolumnie isbn. W ten
sposb zapobiegnie si dwukrotnemu wpisaniu danych zwizanych z t sam ksik.
ALTER TABLE ksiazki
CHANGE COLUMN isbn isbn VARCHAR(20) UNIQUE;
Od teraz mona wstawia dane kolejnych ksiek nie martwic si o zduplikowane wiersze
o tym samym numerze ISBN. Poniej znajduje si przykadowy kod prbujcy doda dwie
ksiki autorstwa Katarzyny Grocholi, z ktrych jedna ju znajduje si w tabeli:
REPLACE INTO ksiazki
(tytul, id_autora, isbn, gatunek, rok_pub)
VALUES('Nigdy w yciu', '1000', '83-88221-55-8','powie','2001'),
('Ja wam poka', '1000', '83-89291-84-3','powie','2004'),
Skadnia polecenie REPLACE jest taka sama jak polecenia INSERT. Warto zauway dodanie
dwch wierszy w jednym poleceniu. Dokadnie t sam skadni stosuje si, aby doda wiele
wierszy poleceniem INSERT. Dane kadego wiersza umieszcza si w nawiasach, a poszczeglne grupy nawiasw oddziela przecinkami. Poniewa w przedstawionym przykadzie w bazie danych istnieje wiersz dla ksiki o numerze ISBN 83-88221-55-8 (Nigdy w yciu), zostanie
on zastpiony, a nie dodany. Poniewa drugiej ksiki nie ma jeszcze w tabeli, zostanie do
niej dodana.
46
Usuwanie danych
Do usuwania konkretnych wierszy danych suy polecenie DELETE. Jeli na przykad chce si
usun z tabeli ksiazki wszystkie wiersze dotyczce ksiek autorki J. K. Rowling, poniewa
podjo si decyzj o niesprzedawaniu ksiek Harry Potter (nie chce si prowadzi tego rodzaju biznesu), mona uy poniszego polecenia:
DELETE FROM ksiazki
WHERE id_autora =
(SELECT autorzy.id_rek FROM autorzy
WHERE nazwisko = 'Rowling'
AND imie = 'J.K.');
DELETE FROM autorzy
WHERE nazwisko = 'Rowling'
AND imie = 'J.K.';
Powyszy kod usuwa z tabeli ksiazki wszystkie ksiki, ktrych identyfikator autora zawiera
warto zwrcon przez podzapytanie. Zapytanie zwraca identyfikator z tabeli autorzy dotyczcy autora o wskazanym imieniu i nazwisku. Innymi sowy, kolumna id_autora musi zawiera warto zwrcon przez polecenie SELECT (podzapytanie w nawiasie). Poniewa kod
korzysta z podzapyta, do poprawnego dziaania wymaga MySQL w wersji 4.1 lub nowszej.
Aby wykona to samo zadanie w jednej z wczeniejszych wersji MySQL, trzeba by wykona
polecenie SELECT, zapamita zwrcony identyfikator autora, a nastpnie wykona polecenie
DELETE, rcznie wpisujc numer identyfikacyjny.
Alternatywne rozwizanie dla poprzedniej konstrukcji polega na zastosowaniu zmiennych
zdefiniowanych przez uytkownika. Oto przykad korzystajcy ze zmiennych:
SET @potter =
(SELECT id_rek FROM autorzy
WHERE nazwisko = 'Rowling'
AND imie = 'J.K.');
DELETE FROM ksiazki
WHERE id_autora = @potter;
DELETE FROM autorzy
WHERE id_rek = @potter;
Usuwanie danych
47
Wyszukiwanie danych
Gdy baza danych zawiera ogromn liczb informacji, znajdowanie danych przy uyciu rcznego przeszukiwania wynikw polecenia SELECT jest nie do zaakceptowania. Co wicej, czasem nie zna si dokadnego lub penego tekstu, ktry miaby istnie w wybranej kolumnie.
W takich sytuacjach korzysta si z operatora LIKE. Zamy, i tabela ksiazki zawiera tysice
wpisw. Klient chce odnale ksik, ale nie pamita jej autora. Wie jedynie, i w tytule
ksiki wystpoway wyrazy zimow i podrny. Mona uy tego strzpka informacji do
przeszukania zawartoci bazy danych, uywajc poniszego polecenia:
SELECT ksiazki.id_rek, tytul,
CONCAT(imie, ' ', nazwisko) AS autor
FROM ksiazki, autorzy
WHERE tytul LIKE '%podrny%'
AND tytul LIKE '%zimow%'
AND id_autora = autorzy.id_rek;
+--------+-------------------------------+---------------+
| id_rek | tytul
| autor
|
+--------+-------------------------------+---------------+
|
1400 | Jeli zimow noc podrny
| Italo Calvino |
+--------+-------------------------------+---------------+
Poza operatorem LIKE dwukrotnie zosta uyty znak wieloznaczny procenta, aby wskaza, i
poszukuje si wszystkich wierszy, w ktrych kolumna tytul zaczyna si od zera lub wicej
znakw przed wzorcem podrny, a po wzorcu moe si pojawi 0 lub wicej innych znakw. Innymi sowy, wyraz podrny musi si znale w dowolnym miejscu w danych wybranej kolumny. Podobna sytuacja dotyczy wyrazu zimow. Warto pamita, i sowo LIKE
to operator. Wicej informacji na temat operatorw znajduje si w dodatku B.
Jeeli inny klient poprosi o wyszukanie w bazie danych tytuu ksiki zawierajcej wyraz
Ford lub Chevrolet, naley zastosowa w klauzuli WHERE operator OR.
SELECT ksiazki.id_rek, tytul,
CONCAT(imie, ' ', nazwisko) AS autor
FROM ksiazki, autorzy
WHERE tytul LIKE '%Ford%' AND id_autora = autorzy.id_rek
OR tytul LIKE '%Chevrolet%' AND id_autora = autorzy.id_rek;
Oczywicie rzeczywisty plik od wydawcy zawieraby znacznie wicej pl i rekordw ni zostao tutaj przedstawione, ale tutaj ograniczymy si jedynie do przykadu. Pierwszy wiersz
zawiera opis pl rekordw. Nie naley pobiera pierwszego wiersza. Zawiera on po prostu
instrukcje dla osoby edytujcej plik. Poinformujemy MySQL, by zignorowa pierwszy wiersz.
Jeli chodzi o dane, trzeba zaj si kilkoma problemami. Pola nie znajduj si w takiej samej
kolejnoci, w jakiej s zapisane w bazie danych. Trzeba poinformowa MySQL o zmianie kolejnoci przy zapisie. Inny problem polega na tym, i plik tekstowy zawiera dane dla tabel
ksiazki i autorzy. Obejcie tego problemu nie jest atwe, ale wykonalne. W pierwszym podejciu wydobdziemy jedynie informacje o autorze. Osobne polecenie SQL posuy do wydobycia informacji na temat ksiki. Na pocztek naley przenie plik od wydawcy (ksiazki.txt)
do katalogu /tmp, a nastpnie wykona polecenie LOAD DATA INFILE w kliencie mysql.
LOAD DATA INFILE '/tmp/ksiazki.txt' REPLACE INTO TABLE autorzy
FIELDS TERMINATED BY '|' LINES TERMINATED BY '\r\n'
TEXT_FIELDS(kol1, kol2, kol3, kol4, kol5)
SET nazwisko = kol3, imie = kol4
IGNORE kol1, kol2, kol5, 1 LINES;
Klauzule TEXT_FIELDS i IGNORE dla kolumn nie s dostpne w wersjach MySQL starszych ni
4.1. Klauzula IGNORE n LINES jest dostpna w MySQL ju od duszego czasu. Tre IGNORE
1 LINES spowoduje pominicie pierwszego wiersza. Wracajc do pierwszego wiersza polecenia, wystpuje w nim nazwa wczytywanego pliku i tabela, w ktrej maj zosta umieszczone dane. Znacznik REPLACE daje taki sam efekt jak opisywane wczeniej polecenie REPLACE.
Drugi wiersz informuje o tym, i pola oddzielane s znakiem pionowej kreski, a wiersze oddzielane znakami powrotu karetki (\r) i przejcia do nowego wiersza (\n). Jest to format typowego pliku MS-DOS. Pliki systemu Unix korzystaj jedynie ze znaku przejcia do nowego
wiersza. Trzeci wiersz tworzy aliasy dla poszczeglnych kolumn. Czwarty wiersz zawiera
nazwy kolumn tabeli i przypisuje im odpowiednie dane, korzystajc z aliasw okrelonych
w poprzednim wierszu. Ostatni wiersz informuje MySQL, aby zignorowa niechciane kolumny,
a take pomin pierwszy wiersz pliku tekstowego, gdy nie zawiera on danych.
Jeli korzysta si ze starszej wersji serwera MySQL, ktry nie zawiera nowej funkcji pozwalajcej zignorowa niechciane kolumny, trzeba wykona kilka dodatkowych krokw. Istnieje
kilka moliwych sposobw na wykonanie tego zadania. Jednym z prostszych sposobw (jeli
wczytywanych danych nie jest zbyt duo) jest dodanie tymczasowych kolumn do tabeli autorzy. Kolumny te pomieszcz nadmiarowe dane z pliku tekstowego. Pniej bdzie mona je
usun. Oto skrypt wykonujcy cae zadanie:
ALTER TABLE autorzy
ADD COLUMN kol1 VARCHAR(50),
ADD COLUMN kol2 VARCHAR(50),
ADD COLUMN kol5 VARCHAR(50);
LOAD DATA INFILE '/tmp/ksiazki.txt' REPLACE INTO TABLE autorzy
FIELDS TERMINATED BY '|' LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(kol1, kol2, nazwisko, imie, kol5);
ALTER TABLE
DROP COLUMN
DROP COLUMN
DROP COLUMN
autorzy
kol1,
kol2,
kol5;
49
Przedstawione rozwizanie dziaa poprawnie, cho nie jest tak przyjemne i proste jak wczeniejsze polecenie. Zauwa, i w drugim poleceniu SQL klauzula IGNORE wymusza pominicie jednego wiersza. Ostatni wiersz tego polecenia wymienia kolumny tabeli autorzy, w ktrych
maj zosta umieszczone importowane dane. Trzecie polecenie usuwa kolumny tymczasowe
po zakoczeniu wczytywania danych z pliku tekstowego. W tym celu stosuje instrukcj DROP.
Na og nie mona cofn wynikw dziaania tej instrukcji, wic warto uwaa.
Po umieszczeniu danych autorw z pliku tekstowego w tabeli autorzy, mona przystpi do
wczytania danych ksiek i odszukania poprawnych wartoci kolumny id_autora dla kadej
ksiki. Zadanie to wykona ponisze polecenie SQL:
LOAD DATA INFILE '/tmp/ksiazki.txt' IGNORE INTO TABLE ksiazki
FIELDS TERMINATED BY '|' LINES TERMINATED BY '\r\n'
TEXT_FIELDS(kol1, kol2, kol3, kol4, kol5)
SET isbn = kol1, tytul = kol2,
rok_pub = RIGHT(kol5, 4),
id_autora =
(SELECT autorzy.id_rek
WHERE nazwisko = kol3
AND imie = kol4)
IGNORE kol3, kol4, 1 LINES;
Narzdzie mysql zostaje wywoane, ale nie wchodzi w tryb monitora. Pierwsze argumenty
przekazuj nazw uytkownika i haso. Pierwszy wiersz koczy si znakiem lewego ukonika,
aby poinformowa powok, i bd jeszcze nastpne argumenty. W przeciwnym przypadku
trzeba by wszystko umieci w jednym wierszu. Drugi wiersz zawiera argument -e wskazujcy, i tekst umieszczony za nim w cudzysowach powinien zosta wykonany przez klienta
mysql. Zawarte w cudzysowach polecenie SQL ma dokadnie tak sam posta, jaka byaby
uyta w trybie monitora. Na kocu pojawia si nazwa bazy danych.
50
Istniej inne opcje i narzdzia wiersza polece. Niektre z nich su da tworzenia kopii
bezpieczestwa lub wykonywania konserwacji serwera. Ich pene omwienie znajduje si
w rozdziale 11.
Podsumowanie
Oczywicie to nie wszystkie zadania, ktre mona wykonywa przy uyciu serwera MySQL.
Niniejsze wiczenie miao jedynie na celu przyblienie podstaw tworzenia i zarzdzania baz
danych. Kolejne rozdziay ksiki zawieraj szczegowe omwienia wszystkich instrukcji,
klauzul, argumentw, opcji i funkcji serwera MySQL. Jeli dopiero rozpoczyna si swoj przygod z MySQL, warto zacz od instrukcji i klauzul wymienionych w niniejszym rozdziale,
a nastpnie skorzysta z kolejnych rozdziaw, by rozszerzy sw wiedz o dostpnych opcjach
i funkcjach.
Podsumowanie
51