You are on page 1of 29

IDZ DO

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

ZAMW DRUKOWANY KATALOG

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

Przewodnik po najpopularniejszej dostpnej nieodpatnie bazie danych


Przegld instrukcji jzyka SQL
Polecenia klienta i serwera MySQL
Funkcje interfejsw programistycznych
MySQL to stabilny, wydajny i szybki system zarzdzania bazami danych dostpny
nieodpatnie, na licencji open source. Najczciej stosowany jest jako zaplecze
bazodanowe witryn WWW, ale coraz czciej sigaj po niego twrcy rozbudowanych
aplikacji, ktrzy do niedawna wykorzystywali drogie, komercyjne bazy danych. MySQL
posiada spore moliwoci, a administracja nim nie nastrcza wikszych problemw,
dziki wielu narzdziom tekstowym i graficznym uatwiajcym prac z tym systemem.
Dostpno wielu interfejsw programistycznych (API) bardzo uatwia tworzenie
aplikacji opartych na MySQL.
Ksika MySQL. Almanach to podrcznik dla uytkownikw, administratorw
i programistw korzystajcych z bazy danych MySQL. Zawiera opisy instrukcji
i funkcji MySQL, narzdzi administracyjnych i najpopularniejszych interfejsw
programistycznych. Przedstawia proces instalacji bazy i tworzenia nowych tabel,
sposoby konstruowania efektywnych zapyta oraz skadni i parametry polece
stosowanych w pracy z tekstowymi narzdziami klienckimi i administracyjnymi.
Instalacja MySQL w rnych systemach operacyjnych
Tworzenie baz i tabel
Wprowadzanie danych i import z plikw tekstowych
Wybieranie danych
Instrukcje i funkcje jzyka SQL
Operacje na liczbach, tekstach i datach
Narzdzia dostpne z wiersza polece
Funkcje API dla Perla, PHP i C
Dziki wiadomociom zawartym w tej ksice praca z MySQL stanie si
bardziej wydajna.

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

2. Instalacja MySQL ......................................................................................................... 27


Wybr dystrybucji
Dystrybucje rdowe dla systemw uniksowych
Dystrybucje binarne dla systemw uniksowych
Dystrybucje RPM systemu Linux
Dystrybucje dla systemu Mac OS X
Dystrybucje dla systemu Novell NetWare
Dystrybucje dla systemu Windows
Zadania po instalacji

27
28
30
31
32
32
33
35

3. Podstawy MySQL ........................................................................................................ 37


Klient mysql
Tworzenie bazy danych i tabel
Poka mi
Wstawianie danych
Pobieranie danych
Kolejno, limitowanie wynikw i grupowanie
Analiza i manipulacja danymi
Modyfikacja danych
Usuwanie danych
Wyszukiwanie danych
Hurtowy import danych
Interfejs wiersza polece
Podsumowanie

37
38
40
41
41
43
44
45
47
48
48
50
51
5

4. Instrukcje SQL .............................................................................................................. 53


Polecenia pogrupowane wedug typu
Polecenia i klauzule w kolejnoci alfabetycznej
ALTER DATABASE
ALTER TABLE
ALTER VIEW
ANALYZE TABLE
BACKUP TABLE
CACHE INDEX
CHANGE MASTER TO
CHECK TABLE
CHECKSUM TABLE
COMMIT
CREATE DATABASE
CREATE INDEX
CREATE TABLE
CREATE VIEW
DELETE
DESCRIBE
DO
DROP DATABASE
DROP INDEX
DROP TABLE
DROP USER
DROP VIEW
EXPLAIN
FLUSH
GRANT
HANDLER
INSERT
JOIN
KILL
LOAD DATA FROM MASTER
LOAD DATA INFILE
LOAD INDEX INTO CACHE
LOAD TABLE FROM MASTER
LOCK TABLES
OPTIMIZE TABLE
PURGE MASTER LOGS
RENAME TABLE
REPAIR TABLE
REPLACE
RESET
RESET MASTER
6

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

5. Funkcje tekstw .......................................................................................................... 117


Funkcje tekstw pogrupowane wedug typu
Funkcje tekstw w kolejnoci alfabetycznej
AES_DECRYPT()
AES_ENCRYPT()
ASCII()
BIN()
BINARY
BIT_LENGTH()
CHAR()
CHAR_LENGTH()
CHARACTER_LENGTH()
COMPRESS()
CONCAT()
CONCAT_WS()
CONV()
DECODE()
DES_DECRYPT()
DES_ENCRYPT()
ELT()
ENCODE()
ENCRYPT()
EXPORT_SET()
FIELD()
FIND_IN_SET()
HEX()
INET_ATON()
INET_NTOA()
INSERT()
INSTR()
LCASE()
LEFT()
LENGTH()
LOAD_FILE()
LOCATE()
LOWER()
LPAD()
LTRIM()
MAKE_SET()
MATCH() AGAINST()
MD5()
MID()
OCT()
OCTET_LENGTH()
8

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

6. Funkcje daty i czasu ....................................................................................................139


Funkcje daty i czasu pogrupowane wedug typu
Funkcje daty i czasu w porzdku alfabetycznym
ADDDATE()
ADDTIME()
CONVERT_TZ()
CURDATE()
CURRENT_DATE()
CURRENT_TIME()
CURRENT_TIMESTAMP()
CURTIME()
DATE()
DATE_ADD()
DATE_FORMAT()
DATE_SUB()
DATEDIFF()
DAY()
DAYNAME()
DAYOFMONTH()

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

7. Funkcje matematyczne i agregujce .........................................................................165


Funkcje w kolejnoci alfabetycznej
ABS()
ACOS()
ASIN()
ATAN()
ATAN2()
AVG()
BIT_AND()
BIT_OR()
BIT_XOR()
CEIL()
CEILING()
COS()
COT()
COUNT()
CRC32()
DEGREES()
EXP()
FLOOR()
FORMAT()
GREATEST()
GROUP_CONCAT()
LEAST()
LN()
LOG()
LOG2()
LOG10()
MAX()
MIN()
MOD()
PI()
POW()
POWER()
RADIANS()
RAND()
ROUND()
SIGN()
SIN()
SQRT()
STD()
STDDEV()
STD()
TAN()

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

8. Funkcje sterowania przepywem ..............................................................................179


Funkcje w kolejnoci alfabetycznej
CASE()
IF()
IFNULL()
NULLIF()

179
179
180
181
181

9. Pozostae funkcje ...................................................................................................... 183


Funkcje w kolejnoci alfabetycznej
ANALYSE()
BENCHMARK()
BIT_COUNT()
CAST()
CHARSET()
COALESCE()
COERCIBILITY()
COLLATION()
CONNECTION_ID()
CONVERT()
CURRENT_USER()
DATABASE()
FOUND_ROWS()
GET_LOCK()
INTERVAL()
IS_FREE_LOCK()
IS_USED_LOCK()
ISNULL()
LAST_INSERT_ID()
MASTER_POS_WAIT()
RELEASE_LOCK()
SESSION_USER()
SYSTEM_USER()
USER()
UUID()
VERSION()

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

10. Serwer i klient MySQL ................................................................................................193


mysql
mysqld
mysqld_multi
mysqld_safe

12

Spis treci

193
195
201
202

11. Narzdzia wiersza polece ....................................................................................... 205


comp_err
isamchk
make_binary_distribution
msql2mysql
my_print_defaults
myisamchk
myisamlog
myisampack
mysqlaccess
mysqladmin
mysqlbinlog
mysqlbug
mysqlcheck
mysqldump
mysqldumpslow
mysqlhotcopy
mysqlimport
mysqlshow
perror

205
206
206
206
206
207
210
211
212
214
217
218
218
220
224
225
226
229
230

12. Interfejs programistyczny dla jzyka Perl .................................................................231


Korzystanie z Perl DBI w celu czenia z MySQL
Omwienie metod i funkcji Perl DBI
available_drivers()
begin_work()
bind_col()
bind_columns()
bind_param()
bind_param_array()
bind_param_inout()
can()
clone()
column_info()
commit()
connect()
connect_cached()
data_sources()
disconnect()
do()
dump_results()
err()
errstr()
execute()

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

Atrybuty dotyczce wszystkich uchwytw


Atrybuty dotyczce jedynie uchwytw baz danych
Atrybuty dotyczce jedynie uchwytw polece
Dynamiczne atrybuty DBI

251
253
254
254

13. Interfejs programistyczny dla jzyka PHP ................................................................ 255


Korzystanie z MySQL w PHP
Funkcje PHP zwizane z MySQL w kolejnoci alfabetycznej
mysql_affected_rows()
mysql_change_user()
mysql_client_encoding()
mysql_close()
mysql_connect()
mysql_create_db()
mysql_data_seek()
mysql_db_name()
mysql_db_query()
mysql_drop_db()
mysql_errno()
mysql_error()
mysql_escape_string()
mysql_fetch_array()
mysql_fetch_assoc()
mysql_fetch_field()
mysql_fetch_lengths()
mysql_fetch_object()
mysql_fetch_row()
mysql_field_flags()
mysql_field_len()
mysql_field_name()
mysql_field_seek()
mysql_field_table()
mysql_field_type()
mysql_free_result()
mysql_get_client_info()
mysql_get_host_info()
mysql_get_proto_info()
mysql_get_server_info()
mysql_info()
mysql_insert_id()
mysql_list_dbs()
mysql_list_fields()
mysql_list_processes()
mysql_list_tables()
mysql_num_fields()

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

14. Interfejs programistyczny dla jzyka C .................................................................... 279


Korzystanie z MySQL z poziomu jzyka C
Funkcje w kolejnoci alfabetycznej
mysql_affected_rows()
mysql_autocommit()
mysql_change_user()
mysql_character_set_name()
mysql_close()
mysql_commit()
mysql_connect()
mysql_create_db()
mysql_data_seek()
mysql_debug()
mysql_drop_db()
mysql_dump_debug_info()
mysql_eof()
mysql_errno()
mysql_error()
mysql_escape_string()
mysql_fetch_field()
mysql_fetch_field_direct()
mysql_fetch_fields()
mysql_fetch_lengths()
mysql_fetch_row()
mysql_field_count()
mysql_field_seek()
mysql_field_tell()
mysql_free_result()
mysql_get_client_info()
mysql_get_client_version()
mysql_get_host_info()
mysql_get_proto_info()
mysql_get_server_info()
16

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

A Typy danych ............................................................................................................... 309


B Operatory ...................................................................................................................313
C Zmienne rodowiskowe .............................................................................................317
Skorowidz ...................................................................................................................319

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.

Tworzenie bazy danych i tabel


Zakadajc, i ma si wszystkie prawa wymagane do tworzenia i modyfikowania bazy danych
na serwerze, mona przystpi do tworzenia nowej bazy danych i tabel. W niniejszym rozdziale
wykonamy baz danych dla fikcyjnej ksigarni.
CREATE DATABASE ksiegarnia;

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

Rozdzia 3. Podstawy MySQL

DESCRIBE ksiazki;
+--------+-------------+------+-----+---------+-------+
| Field | Type
| Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id_rek | int(11)
| YES |
| NULL
|
|
| tytul | varchar(50) | YES |
| NULL
|
|
| autor | varchar(50) | YES |
| NULL
|
|
+--------+-------------+------+-----+---------+-------+

Przygldajc si tabeli, nietrudno si domyli, i potrzebne byyby dodatkowe kolumny


z wydawc, rokiem publikacji, numerem ISBN, gatunkiem, opisem ksiki itp. Co wicej,
przydaoby si, by MySQL automatycznie przypisa warto kolumnie id_rek, aby nie trzeba
byo samemu martwi si wymylaniem wartoci i sprawdzaniem, czy si nie powielaj. Dodatkowo, decydujemy si zamieni kolumn autor z wersji zawierajcej nazwisko autora na
numer identyfikacyjny autora, ktry bdzie pochodzi z osobnej tabeli zawierajcej list autorw.
Zredukuje to ilo tekstu do wpisywania, uatwi sortowanie i wyszukiwanie, gdy dane bd
jednorodne. Aby dokona zmian w ju istniejcej tabeli, zastosuj nastpujc instrukcj SQL:
ALTER TABLE ksiazki
CHANGE COLUMN id_rek id_rek INT AUTO_INCREMENT PRIMARY KEY,
CHANGE COLUMN autor id_autora INT,
ADD COLUMN opis BLOB,
ADD COLUMN gatunek ENUM('powie','poezja','dramat'),
ADD COLUMN id_wydawcy INT,
ADD COLUMN rok_pub VARCHAR(4),
ADD COLUMN isbn VARCHAR(20);

Kady wiersz, w ktrym znajduj si informacje o zmienianych lub dodawanych kolumnach,


poza pierwszym, musi by oddzielony przecinkiem. W drugim wierszu nastpuje zmiana kolumny id_rek. Cho nazwa kolumny i jej typ pozostaje bez zmian, trzeba poda je raz jeszcze.
Znacznik AUTO_INCREMENT suy do zapewnienia dziaania opisanego we wczeniejszym akapicie, czyli przypisania kadej nowej ksice unikatowej wartoci. Dodatkowo wiersz zostaje
oznaczony jako PRIMARY KEY, aby przyspieszy pobieranie danych.
Trzeci wiersz dokonuje zmian w kolumnie autor w taki sposb, aby dostosowa jej tytu i typ
do tabeli autorzy, ktra wkrtce powstanie. Tabela autorzy bdzie zawieraa kolumn klucza
gwnego, po ktrej dokona si zczenia tabel. Poniewa kolumna ta bdzie typu cakowitoliczbowego, taki typ trzeba zastosowa w zmienianej kolumnie autora.
Czwarty wiersz dodaje kolumn z opisem ksiki. Zastosowany typ danych to BLOB, co jest
skrtem od binary large object (duy obiekt binarny). Ten typ danych ma zmienn dugo
i potrafi przechowywa do 64 kilobajtw danych. Istniej typy danych potrafice przechowywa jeszcze wicej informacji. Ich pena lista wraz z limitami znajduje si w dodatku A.
W kolumnie gatunek wymienia si moliwe wartoci, aby zapewni jednorodno. Dostpne
s rwnie wartoci: pusta i NULL, cho nie zostay jawnie wymienione w poleceniu.
Przed rozpoczciem dodawania danych do tabeli ksiazki, warto jeszcze utworzy tabel autorzy.
Tabela autorzy bdzie tak zwan tabel referencyjn (nazywan te czasem sownikiem). Trzeba
j ustawi jako pierwsz, poniewa w trakcie wpisywania danych do tabeli ksiazki potrzebny
bdzie numer identyfikacyjny autora.

Tworzenie bazy danych i tabel

39

CREATE TABLE autorzy


(id_rek INT AUTO_INCREMENT PRIMARY KEY,
nazwisko VARCHAR(50),
imie VARCHAR(50),
kraj VARCHAR(50));

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

Rozdzia 3. Podstawy MySQL

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');

Po dodaniu informacji o autorze, mona wstawi napisan przez niego ksik.


INSERT INTO ksiazki
(tytul, id_autora, isbn, gatunek, rok_pub)
VALUES('Nigdy w yciu', LAST_INSERT_ID(), '83-88221-55-8','powie','2001');

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;

Znak gwiazdki jest w tym przypadku znakiem wieloznacznoci powodujcym pobranie


wszystkich kolumn. Poniewa nie zostay okrelone adne kryteria, dziki ktrym miayby
zosta pobrane jedynie niektre wiersze, polecenie spowoduje pobranie wszystkich wierszy
tabeli ksiazki. Aby pobra konkretne kolumny i wiersze, naley poda nazwy kolumn i zastosowa klauzul WHERE z warunkami stawianymi poszczeglnym wierszom.

Pobieranie danych

41

SELECT id_rek, tytul, opis


FROM ksiazki
WHERE gatunek = 'nowela';

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

Rozdzia 3. Podstawy MySQL

Kolejno, limitowanie wynikw i grupowanie


Gdy pobiera si duy zbir danych, warto posortowa znajdujce si w nim informacje wedug konkretnego klucza. W tym celu stosuje si klauzul ORDER BY. Przypumy, i potrzebujemy pobra z bazy danych wszystkie sztuki napisane przez Williama Shakespearea. Ponisze zapytanie SQL pobierze odpowiedni list i posortuje j wedug tytuu sztuki:
SELECT ksiazki.id_rek, tytul, wydawca
FROM ksiazki, autorzy, wydawcy
WHERE nazwisko = 'Shakespeare'
AND gatunek = 'sztuka'
AND id_autora = autorzy.id_rek
AND id_wydawcy = wydawcy.id_rek
ORDER BY tytul, rok_pub;

Klauzula ORDER BY znajduje si na kocu, po klauzuli WHERE. Najpierw sortowanie odbywa


si po tytule (kolumnie tytul), a w ramach tego samego tytuu po roku publikacji (kolumnie
rok_pub). Domylnie dane porzdkowane s w porzdku alfabetycznym. Jeli chce si posortowa tytuy w odwrotnym porzdku alfabetycznym, zaraz po nazwie kolumny title w klauzuli
ORDER BY, ale przed przecinkiem rozpoczynajcym rok_pub, trzeba zastosowa opcj DESC.
Dua ksigarnia moe posiada wiele wyda sztuk Shakespearea, by moe nawet kilka wyda
tej samej sztuki. Aby ograniczy liczb wywietlanych rekordw, stosuje si klauzul LIMIT na
kocu polecenia SQL.
SELECT ksiazki.id_rek, tytul
FROM ksiazki, autorzy, wydawcy
WHERE nazwisko = 'Shakespeare'
AND gatunek = 'sztuka'
AND id_autora = autorzy.id_rek
AND id_wydawcy = wydawcy.id_rek
ORDER BY tytul, rok_pub
LIMIT 20;

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;

W dwuargumentowej wersji klauzuli pierwsza warto okrela liczb wierszy do pominicia


(w przykadzie 20), a druga maksymaln liczb wierszy do pobrania (w przykadzie 10).
Jeeli chcemy pobra jedynie list sztuk Shakespearea i nie jestemy zainteresowani dat publikacji ani wydawc innymi sowy, jestemy zainteresowani jedynie pierwszym znalezionym wierszem dla kadego tytuu moemy zastosowa klauzul GROUP BY.
SELECT ksiazki.id_rek, tytul
FROM ksiazki, autorzy
WHERE nazwisko = 'Shakespeare'
AND id_autora = autorzy.id_rek
GROUP BY tytul;

Kolejno, limitowanie wynikw i grupowanie

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.

Analiza i manipulacja danymi


MySQL umoliwia nie tylko pobieranie surowych danych, ale rwnie ich analiz i formatowanie. Przypumy, i chcemy si dowiedzie, ile powieci Tostoja posiadamy. W tym celu
trzeba w poleceniu SQL zastosowa funkcj COUNT().
SELECT COUNT(*)
FROM ksiazki, autorzy
WHERE nazwisko = 'Tostoj'
AND id_autora = autorzy.id_rek;
+----------+
| COUNT(*) |
+----------+
|
12 |
+----------+

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

Rozdzia 3. Podstawy MySQL

SELECT data_zakupu AS 'Data zakupu'


FROM zamowienia
WHERE id_rek = '1250';
+---------------+
| Data zakupu
|
+---------------+
| 2004-03-01
|
+---------------+

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';

To rozwizanie jest znacznie prostsze i krtsze, a co najwaniejsze, daje identyczne wyniki.


Aby poprawnie skorzysta z powyszej funkcji, trzeba zna kody formatujce. Zostay one
wymienione w rozdziale 6.

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

Rozdzia 3. Podstawy MySQL

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;

W pierwszym fragmencie polecenie SET suy do utworzenia zmiennej o nazwie @potter,


ktra bdzie zawiera wynik dziaania polecenia SELECT umieszczonego w nawiasach (podzapytanie). Cho MySQL w wersjach wczeniejszych ni 4.1 nie obsuguje podzapyta, przedstawiony kod zadziaa, gdy dotyczy zmiennych definiowanych przez uytkownika. Drugie
polecenie SQL usuwa z tabeli ksiazki wszystkie ksiki, ktre jako identyfikator autora posiadaj warto znajdujc si w zmiennej tymczasowej. Ostatnie polecenie usuwa dane z tabeli
autorzy, ponownie korzystajc ze zmiennej. Zmienne zdefiniowane przez uytkownika istniej do momentu ich zresetowania lub zamknicia sesji z serwerem MySQL.

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;

Wicej przykadw i moliwoci wyszukiwania danych znajduje si w rozdziale 4.

Hurtowy import danych


Cho polecenia INSERT i REPLACE s bardzo uyteczne, potrafi by czasochonne w przypadku wprowadzania duej iloci danych, gdy wymuszaj ich rczne wpisywanie. Czsto
w momencie tworzenia nowej bazy danych trzeba dokona przeniesienia danych ze starej
bazy danych. Zamy, i wydawca wysa nam dysk z list wszystkich swoich ksiek znajdujc si w zwykym pliku tekstowym. Kady rekord dotyczcy poszczeglnej ksiki znajduje si w osobnym wierszu, a kade pole zostao oddzielone znakiem pionowej kreski. Oto
w jaki sposb mog wyglda fikcyjne dane od wydawcy.
ISBN|TYTUL|NAZWISKO|IMIE|DATA WYDANIA
0-907587-68-2|Notatki z podziemia|Dostojewski|Fiodor|kwiecie 1992|
...
48

Rozdzia 3. Podstawy MySQL

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;

Hurtowy import danych

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;

Polecenie zawiera kilka sztuczek, umoliwiajcych poprawne wykonanie caego zadania.


Pity wiersz polecenia wydobywa rok wydania z pola daty wydania (oryginalnie data wydania zawiera miesic i rok wydania), stosujc funkcj RIGHT(), ktra pobiera cztery ostatnie
znaki kol5. Od 6. wiersza wystpuje podzapytanie, ktre okrela warto kolumny id_autora
na podstawie imienia i nazwiska autora. Wynik uzyskany w nawiasach zostanie przypisany
do kolumny id_autora. Na kocu dochodzi do zignorowania kolumn kol3, kol4 i pierwszego
wiersza pliku tekstowego. Wykonanie tego samego zadania we wczeniejszych wersjach MySQL
wymagaoby uycia kolumn tymczasowych lub dodatkowej tabeli. Znacznik IGNORE z pierwszego wiersza instruuje MySQL, aby ignorowa wszystkie komunikaty bdw, nie zastpowa
adnych duplikatw i kontynuowa wstawianie kolejnych rekordw.

Interfejs wiersza polece


Aby wysa zapytanie SQL do serwera MySQL, nie trzeba otwiera monitora MySQL. Czasem zachodzi potrzeba szybkiego wykonania polecenia SQL z samej powoki lub wiersza
polece. Przypumy, i mamy tabel o nazwie dostawcy i chcemy szybko uzyska list dostawcw z wojewdztwa lskiego wraz z numerami telefonw. Aby j uzyska, wystarczy
wpisa ponisze polecenie w powoce systemu Linux (lub innego rwnowanego systemu).
mysql --user='tina' --password='muller' \
-e "SELECT dostawca, telefon FROM dostawca \
WHERE woj='lskie'" ksiegarnia

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

Rozdzia 3. Podstawy MySQL

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

You might also like