29
Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: [email protected] PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ IDZ DO IDZ DO ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG KATALOG KSI¥¯EK KATALOG KSI¥¯EK TWÓJ KOSZYK TWÓJ KOSZYK CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE O NOWOŒCIACH ZAMÓW INFORMACJE O NOWOŒCIACH ZAMÓW CENNIK ZAMÓW CENNIK CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE SPIS TREŒCI SPIS TREŒCI DODAJ DO KOSZYKA DODAJ DO KOSZYKA KATALOG ONLINE KATALOG ONLINE MySQL. Almanach Autor: Russell J. T. Dyer T³umaczenie: Rafa³ Joñca ISBN: 83-246-0130-9 Tytu³ orygina³u: MySQL in a Nutshell Format: B5, stron: 294 Przewodnik po najpopularniejszej dostêpnej nieodp³atnie bazie danych • Przegl¹d instrukcji jêzyka SQL • Polecenia klienta i serwera MySQL • Funkcje interfejsów programistycznych MySQL to stabilny, wydajny i szybki system zarz¹dzania bazami danych dostêpny nieodp³atnie, na licencji open source. Najczêœciej stosowany jest jako zaplecze bazodanowe witryn WWW, ale coraz czêœciej siêgaj¹ po niego twórcy rozbudowanych aplikacji, którzy do niedawna wykorzystywali drogie, komercyjne bazy danych. MySQL posiada spore mo¿liwoœci, a administracja nim nie nastrêcza wiêkszych problemów, dziêki wielu narzêdziom tekstowym i graficznym u³atwiaj¹cym pracê z tym systemem. Dostêpnoœæ wielu interfejsów programistycznych (API) bardzo u³atwia tworzenie aplikacji opartych na MySQL. Ksi¹¿ka „MySQL. Almanach” to podrêcznik dla u¿ytkowników, administratorów i programistów korzystaj¹cych z bazy danych MySQL. Zawiera opisy instrukcji i funkcji MySQL, narzêdzi administracyjnych i najpopularniejszych interfejsów programistycznych. Przedstawia proces instalacji bazy i tworzenia nowych tabel, sposoby konstruowania efektywnych zapytañ oraz sk³adniê i parametry poleceñ stosowanych w pracy z tekstowymi narzêdziami klienckimi i administracyjnymi. • Instalacja MySQL w ró¿nych systemach operacyjnych • Tworzenie baz i tabel • Wprowadzanie danych i import z plików tekstowych • Wybieranie danych • Instrukcje i funkcje jêzyka SQL • Operacje na liczbach, tekstach i datach • Narzêdzia dostêpne z wiersza poleceñ • Funkcje API dla Perla, PHP i C Dziêki wiadomoœciom zawartym w tej ksi¹¿ce praca z MySQL stanie siê bardziej wydajna.

MySQL. Almanach

Embed Size (px)

DESCRIPTION

Przewodnik po najpopularniejszej dostępnej nieodpłatnie bazie danych * Przegląd instrukcji języka SQL* Polecenia klienta i serwera MySQL* Funkcje interfejsów programistycznych MySQL to stabilny, wydajny i szybki system zarządzania bazami danych dostępny nieodpłatnie, na licencji open source. Najczęściej stosowany jest jako zaplecze bazodanowe witryn WWW, ale coraz częściej sięgają po niego twórcy rozbudowanych aplikacji, którzy do niedawna wykorzystywali drogie, komercyjne bazy danych. MySQL posiada spore możliwości, a administracja nim nie nastręcza większych problemów, dzięki wielu narzędziom tekstowym i graficznym ułatwiającym pracę z tym systemem. Dostępność wielu interfejsów programistycznych (API) bardzo ułatwia tworzenie aplikacji opartych na MySQL. Książka "MySQL. Almanach" to podręcznik dla użytkowników, administratorów i programistów korzystających z bazy danych MySQL. Zawiera opisy instrukcji i funkcji MySQL, narzędzi administracyjnych i najpopularniejszych interfejsów programistycznych. Przedstawia proces instalacji bazy i tworzenia nowych tabel, sposoby konstruowania efektywnych zapytań oraz składnię i parametry poleceń stosowanych w pracy z tekstowymi narzędziami klienckimi i administracyjnymi. * Instalacja MySQL w różnych systemach operacyjnych* Tworzenie baz i tabel* Wprowadzanie danych i import z plików tekstowych* Wybieranie danych* Instrukcje i funkcje języka SQL* Operacje na liczbach, tekstach i datach* Narzędzia dostępne z wiersza poleceń* Funkcje API dla Perla, PHP i C Dzięki wiadomościom zawartym w tej książce praca z MySQL stanie się bardziej wydajna.

Citation preview

Page 1: MySQL. Almanach

Wydawnictwo Helionul. Chopina 644-100 Gliwicetel. (32)230-98-63e-mail: [email protected]

PRZYK£ADOWY ROZDZIA£PRZYK£ADOWY ROZDZIA£

IDZ DOIDZ DO

ZAMÓW DRUKOWANY KATALOGZAMÓW DRUKOWANY KATALOG

KATALOG KSI¥¯EKKATALOG KSI¥¯EK

TWÓJ KOSZYKTWÓJ KOSZYK

CENNIK I INFORMACJECENNIK I INFORMACJE

ZAMÓW INFORMACJEO NOWOŒCIACH

ZAMÓW INFORMACJEO NOWOŒCIACH

ZAMÓW CENNIKZAMÓW CENNIK

CZYTELNIACZYTELNIAFRAGMENTY KSI¥¯EK ONLINEFRAGMENTY KSI¥¯EK ONLINE

SPIS TREŒCISPIS TREŒCI

DODAJ DO KOSZYKADODAJ DO KOSZYKA

KATALOG ONLINEKATALOG ONLINE

MySQL. AlmanachAutor: Russell J. T. DyerT³umaczenie: Rafa³ JoñcaISBN: 83-246-0130-9Tytu³ orygina³u: MySQL in a NutshellFormat: B5, stron: 294

Przewodnik po najpopularniejszej dostêpnej nieodp³atnie bazie danych

• Przegl¹d instrukcji jêzyka SQL• Polecenia klienta i serwera MySQL• Funkcje interfejsów programistycznych

MySQL to stabilny, wydajny i szybki system zarz¹dzania bazami danych dostêpny nieodp³atnie, na licencji open source. Najczêœciej stosowany jest jako zaplecze bazodanowe witryn WWW, ale coraz czêœciej siêgaj¹ po niego twórcy rozbudowanych aplikacji, którzy do niedawna wykorzystywali drogie, komercyjne bazy danych. MySQL posiada spore mo¿liwoœci, a administracja nim nie nastrêcza wiêkszych problemów, dziêki wielu narzêdziom tekstowym i graficznym u³atwiaj¹cym pracê z tym systemem. Dostêpnoœæ wielu interfejsów programistycznych (API) bardzo u³atwia tworzenie aplikacji opartych na MySQL.

Ksi¹¿ka „MySQL. Almanach” to podrêcznik dla u¿ytkowników, administratorówi programistów korzystaj¹cych z bazy danych MySQL. Zawiera opisy instrukcjii funkcji MySQL, narzêdzi administracyjnych i najpopularniejszych interfejsów programistycznych. Przedstawia proces instalacji bazy i tworzenia nowych tabel, sposoby konstruowania efektywnych zapytañ oraz sk³adniê i parametry poleceñ stosowanych w pracy z tekstowymi narzêdziami klienckimi i administracyjnymi.

• Instalacja MySQL w ró¿nych systemach operacyjnych• Tworzenie baz i tabel• Wprowadzanie danych i import z plików tekstowych• Wybieranie danych• Instrukcje i funkcje jêzyka SQL• Operacje na liczbach, tekstach i datach• Narzêdzia dostêpne z wiersza poleceñ• Funkcje API dla Perla, PHP i C

Dziêki wiadomoœciom zawartym w tej ksi¹¿ce praca z MySQL stanie siêbardziej wydajna.

Page 2: MySQL. Almanach

5

Spis treści

Przedmowa ...................................................................................................................19

1. Wprowadzenie do MySQL .......................................................................................... 23Wartość MySQL 23Pakiet MySQL 24Licencje 25Listy mailingowe 25Książki i inne publikacje 26

2. Instalacja MySQL ......................................................................................................... 27Wybór dystrybucji 27Dystrybucje źródłowe dla systemów uniksowych 28Dystrybucje binarne dla systemów uniksowych 30Dystrybucje RPM systemu Linux 31Dystrybucje dla systemu Mac OS X 32Dystrybucje dla systemu Novell NetWare 32Dystrybucje dla systemu Windows 33Zadania po instalacji 35

3. Podstawy MySQL ........................................................................................................ 37Klient mysql 37Tworzenie bazy danych i tabel 38Pokaż mi 40Wstawianie danych 41Pobieranie danych 41Kolejność, limitowanie wyników i grupowanie 43Analiza i manipulacja danymi 44Modyfikacja danych 45Usuwanie danych 47Wyszukiwanie danych 48Hurtowy import danych 48Interfejs wiersza poleceń 50Podsumowanie 51

Page 3: MySQL. Almanach

6 | Spis treści

4. Instrukcje SQL .............................................................................................................. 53Polecenia pogrupowane według typu 53Polecenia i klauzule w kolejności alfabetycznej 54ALTER DATABASE 55ALTER TABLE 55ALTER VIEW 59ANALYZE TABLE 59BACKUP TABLE 60CACHE INDEX 60CHANGE MASTER TO 61CHECK TABLE 62CHECKSUM TABLE 63COMMIT 63CREATE DATABASE 64CREATE INDEX 64CREATE TABLE 65CREATE VIEW 70DELETE 71DESCRIBE 72DO 73DROP DATABASE 73DROP INDEX 73DROP TABLE 74DROP USER 74DROP VIEW 75EXPLAIN 75FLUSH 75GRANT 76HANDLER 78INSERT 80JOIN 83KILL 85LOAD DATA FROM MASTER 85LOAD DATA INFILE 86LOAD INDEX INTO CACHE 87LOAD TABLE … FROM MASTER 87LOCK TABLES 88OPTIMIZE TABLE 89PURGE MASTER LOGS 89RENAME TABLE 89REPAIR TABLE 90REPLACE 91RESET 92RESET MASTER 92

Page 4: MySQL. Almanach

Spis treści | 7

RESET SLAVE 92RESTORE TABLE 93REVOKE 93ROLLBACK 94ROLLBACK TO SAVEPOINT 94SAVEPOINT 94SELECT 95SET 101SET PASSWORD 102SET SQL_LOG_BIN 102SET TRANSACTION 102SHOW BINLOG EVENTS 103SHOW CHARACTER SET 104SHOW COLLATION 104SHOW COLUMNS 105SHOW CREATE DATABASE 105SHOW CREATE TABLE 106SHOW CREATE VIEW 106SHOW DATABASES 106SHOW ENGINES 107SHOW ERRORS 107SHOW GRANTS 107SHOW INDEX 108SHOW INNODB STATUS 108SHOW LOGS 109SHOW MASTER LOGS 109SHOW MASTER STATUS 109SHOW PRIVILEGES 109SHOW PROCESSLIST 109SHOW SLAVE HOSTS 110SHOW SLAVE STATUS 110SHOW STATUS 111SHOW TABLE STATUS 111SHOW TABLES 112SHOW VARIABLES 112SHOW WARNINGS 113START SLAVE 113START TRANSACTION 114STOP SLAVE 114TRUNCATE TABLE 114UNION 115UNLOCK TABLES 115USE 115

Page 5: MySQL. Almanach

8 | Spis treści

5. Funkcje tekstów .......................................................................................................... 117Funkcje tekstów pogrupowane według typu 117Funkcje tekstów w kolejności alfabetycznej 118AES_DECRYPT() 118AES_ENCRYPT() 118ASCII() 118BIN() 119BINARY 119BIT_LENGTH() 120CHAR() 120CHAR_LENGTH() 120CHARACTER_LENGTH() 121COMPRESS() 121CONCAT() 121CONCAT_WS() 121CONV() 122DECODE() 122DES_DECRYPT() 123DES_ENCRYPT() 123ELT() 123ENCODE() 124ENCRYPT() 124EXPORT_SET() 124FIELD() 125FIND_IN_SET() 125HEX() 125INET_ATON() 126INET_NTOA() 126INSERT() 126INSTR() 127LCASE() 127LEFT() 127LENGTH() 127LOAD_FILE() 128LOCATE() 128LOWER() 129LPAD() 129LTRIM() 129MAKE_SET() 129MATCH() AGAINST() 130MD5() 130MID() 131OCT() 131OCTET_LENGTH() 131

Page 6: MySQL. Almanach

Spis treści | 9

OLD_PASSWORD() 131ORD() 132PASSWORD() 132POSITION() 132QUOTE() 133REPEAT() 133REPLACE() 133REVERSE() 133RIGHT() 134RPAD() 134RTRIM() 134SHA() 135SHA1() 135SOUNDEX() 135SPACE() 135STRCMP() 136SUBSTRING() 136SUBSTRING_INDEX() 137TRIM() 137UCASE() 137UNCOMPRESS() 138UNCOMPRESSED_LENGTH() 138UNHEX() 138UPPER() 138

6. Funkcje daty i czasu ....................................................................................................139Funkcje daty i czasu pogrupowane według typu 140Funkcje daty i czasu w porządku alfabetycznym 140ADDDATE() 140ADDTIME() 141CONVERT_TZ() 141CURDATE() 142CURRENT_DATE() 142CURRENT_TIME() 142CURRENT_TIMESTAMP() 142CURTIME() 143DATE() 143DATE_ADD() 144DATE_FORMAT() 144DATE_SUB() 146DATEDIFF() 146DAY() 146DAYNAME() 147DAYOFMONTH() 147

Page 7: MySQL. Almanach

10 | Spis treści

DAYOFWEEK() 147DAYOFYEAR() 148EXTRACT() 148FROM_DAYS() 148FROM_UNIXTIME() 149GET_FORMAT() 149HOUR() 150LAST_DAY() 151LOCALTIME() 151LOCALTIMESTAMP() 151MAKEDATE() 152MAKETIME() 152MICROSECOND() 152MINUTE() 153MONTH() 153MONTHNAME() 153NOW() 154PERIOD_ADD() 154PERIOD_DIFF() 154QUARTER() 155SEC_TO_TIME() 156SECOND() 156STR_TO_DATE() 157SUBDATE() 157SUBTIME() 157SYSDATE() 158TIME() 158TIMEDIFF() 159TIMESTAMP() 159TIMESTAMPDIFF() 159TIMESTAMPADD() 160TIME_FORMAT() 160TIME_TO_SEC() 160TO_DAYS() 161UNIX_TIMESTAMP() 161UTC_DATE() 161UTC_TIME() 162UTC_TIMESTAMP() 162WEEK() 163WEEKDAY() 163WEEKOFYEAR() 163YEAR() 164YEARWEEK() 164

Page 8: MySQL. Almanach

Spis treści | 11

7. Funkcje matematyczne i agregujące .........................................................................165Funkcje w kolejności alfabetycznej 165ABS() 165ACOS() 165ASIN() 166ATAN() 166ATAN2() 166AVG() 167BIT_AND() 167BIT_OR() 167BIT_XOR() 167CEIL() 167CEILING() 168COS() 168COT() 168COUNT() 168CRC32() 169DEGREES() 169EXP() 169FLOOR() 169FORMAT() 170GREATEST() 170GROUP_CONCAT() 170LEAST() 171LN() 171LOG() 172LOG2() 172LOG10() 172MAX() 172MIN() 172MOD() 173PI() 173POW() 173POWER() 174RADIANS() 174RAND() 174ROUND() 174SIGN() 175SIN() 175SQRT() 175STD() 175STDDEV() 176STD() 176TAN() 176

Page 9: MySQL. Almanach

12 | Spis treści

TRUNCATE() 176VARIANCE() 177

8. Funkcje sterowania przepływem ..............................................................................179Funkcje w kolejności alfabetycznej 179CASE() 179IF() 180IFNULL() 181NULLIF() 181

9. Pozostałe funkcje ...................................................................................................... 183Funkcje w kolejności alfabetycznej 183ANALYSE() 183BENCHMARK() 184BIT_COUNT() 184CAST() 185CHARSET() 185COALESCE() 185COERCIBILITY() 185COLLATION() 186CONNECTION_ID() 186CONVERT() 186CURRENT_USER() 186DATABASE() 187FOUND_ROWS() 187GET_LOCK() 187INTERVAL() 188IS_FREE_LOCK() 188IS_USED_LOCK() 188ISNULL() 189LAST_INSERT_ID() 189MASTER_POS_WAIT() 189RELEASE_LOCK() 190SESSION_USER() 190SYSTEM_USER() 190USER() 190UUID() 191VERSION() 191

10. Serwer i klient MySQL ................................................................................................193mysql 193mysqld 195mysqld_multi 201mysqld_safe 202

Page 10: MySQL. Almanach

Spis treści | 13

11. Narzędzia wiersza poleceń ....................................................................................... 205comp_err 205isamchk 206make_binary_distribution 206msql2mysql 206my_print_defaults 206myisamchk 207myisamlog 210myisampack 211mysqlaccess 212mysqladmin 214mysqlbinlog 217mysqlbug 218mysqlcheck 218mysqldump 220mysqldumpslow 224mysqlhotcopy 225mysqlimport 226mysqlshow 229perror 230

12. Interfejs programistyczny dla języka Perl .................................................................231Korzystanie z Perl DBI w celu łączenia z MySQL 231Omówienie metod i funkcji Perl DBI 235available_drivers() 235begin_work() 236bind_col() 236bind_columns() 236bind_param() 236bind_param_array() 237bind_param_inout() 237can() 237clone() 237column_info() 238commit() 238connect() 238connect_cached() 238data_sources() 238disconnect() 239do() 239dump_results() 239err() 240errstr() 240execute() 240

Page 11: MySQL. Almanach

14 | Spis treści

execute_array() 241execute_for_fetch() 241fetch() 241fetchall_arrayref() 241fetchall_hashref() 241fetchrow_array() 242fetchrow_arrayref() 242fetchrow_hashref() 242finish() 243foreign_key_info() 243func() 243get_info() 243installed_versions() 243last_insert_id() 244looks_like_number() 244neat() 244neat_list() 244parse_dsn() 245parse_trace_flag() 245parse_trace_flags() 245ping() 245prepare() 245prepare_cached() 246primary_key() 246primary_key_info() 246quote() 246quote_identifier() 247rollback() 247rows() 247selectall_arrayref() 247selectall_hashref() 248selectcol_arrayref() 248selectrow_array() 249selectrow_arrayref() 249selectrow_hashref() 249set_err() 250state() 250table_info() 250table_info_all() 250tables() 250trace() 250trace_msg() 251type_info() 251type_info_all() 251Atrybuty uchwytów 251

Page 12: MySQL. Almanach

Spis treści | 15

Atrybuty dotyczące wszystkich uchwytów 251Atrybuty dotyczące jedynie uchwytów baz danych 253Atrybuty dotyczące jedynie uchwytów poleceń 254Dynamiczne atrybuty DBI 254

13. Interfejs programistyczny dla języka PHP ................................................................ 255Korzystanie z MySQL w PHP 255Funkcje PHP związane z MySQL w kolejności alfabetycznej 257mysql_affected_rows() 257mysql_change_user() 258mysql_client_encoding() 258mysql_close() 258mysql_connect() 259mysql_create_db() 260mysql_data_seek() 260mysql_db_name() 261mysql_db_query() 261mysql_drop_db() 262mysql_errno() 262mysql_error() 262mysql_escape_string() 262mysql_fetch_array() 263mysql_fetch_assoc() 263mysql_fetch_field() 264mysql_fetch_lengths() 265mysql_fetch_object() 265mysql_fetch_row() 266mysql_field_flags() 266mysql_field_len() 267mysql_field_name() 267mysql_field_seek() 268mysql_field_table() 268mysql_field_type() 269mysql_free_result() 269mysql_get_client_info() 270mysql_get_host_info() 270mysql_get_proto_info() 270mysql_get_server_info() 270mysql_info() 271mysql_insert_id() 271mysql_list_dbs() 271mysql_list_fields() 272mysql_list_processes() 272mysql_list_tables() 272mysql_num_fields() 273

Page 13: MySQL. Almanach

16 | Spis treści

mysql_num_rows() 273mysql_pconnect() 274mysql_ping() 274mysql_query() 274mysql_real_escape_string() 275mysql_result() 275mysql_select_db() 275mysql_stat() 276mysql_tablename() 276mysql_thread_id() 276mysql_unbuffered_query() 276

14. Interfejs programistyczny dla języka C .................................................................... 279Korzystanie z MySQL z poziomu języka C 279Funkcje w kolejności alfabetycznej 282mysql_affected_rows() 282mysql_autocommit() 282mysql_change_user() 282mysql_character_set_name() 283mysql_close() 283mysql_commit() 284mysql_connect() 284mysql_create_db() 284mysql_data_seek() 285mysql_debug() 285mysql_drop_db() 285mysql_dump_debug_info() 286mysql_eof() 286mysql_errno() 286mysql_error() 287mysql_escape_string() 287mysql_fetch_field() 288mysql_fetch_field_direct() 288mysql_fetch_fields() 288mysql_fetch_lengths() 289mysql_fetch_row() 289mysql_field_count() 290mysql_field_seek() 290mysql_field_tell() 291mysql_free_result() 291mysql_get_client_info() 291mysql_get_client_version() 292mysql_get_host_info() 292mysql_get_proto_info() 292mysql_get_server_info() 293

Page 14: MySQL. Almanach

Spis treści | 17

mysql_get_server_version() 293mysql_info() 293mysql_init() 294mysql_insert_id() 294mysql_kill() 294mysql_list_dbs() 295mysql_list_fields() 295mysql_list_processes() 296mysql_list_tables() 296mysql_more_results() 296mysql_next_result() 297mysql_num_fields() 297mysql_num_rows() 297mysql_options() 297mysql_ping() 298mysql_query() 299mysql_real_connect() 299mysql_real_escape_string() 300mysql_real_query() 301mysql_reload() 302mysql_rollback() 302mysql_row_seek() 302mysql_row_tell() 303mysql_select_db() 303mysql_set_server_option() 303mysql_shutdown() 303mysql_sqlstate() 304mysql_stat() 304mysql_store_result() 304mysql_thread_id() 305mysql_thread_safe() 305mysql_use_result() 305mysql_warning_count() 306Typy danych interfejsu programistycznego MySQL dla języka C 306

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

B Operatory ...................................................................................................................313

C Zmienne środowiskowe .............................................................................................317

Skorowidz ...................................................................................................................319

Page 15: MySQL. Almanach

37

ROZDZIAŁ 3.

Podstawy MySQL

Choć niniejsza książka zawiera materiał podręcznikowy, który można czytać małymi frag-mentami w razie potrzeby, w niniejszym rozdziale znajduje się proste ćwiczenie uczące podstawMySQL. Informuje, w jaki sposób zalogować się do serwera, utworzyć bazę danych, a takżewpisać i dokonać edycji znajdujących się w niej danych. Trzeba jednak zdawać sobie sprawęz tego, iż ćwiczenie nie obejmuje wszystkich zagadnień. Stanowi raczej wskazówkę, w jakisposób należy wykonywać pewne rodzaje zadań w MySQL.

Klient mysqlIstnieje wiele sposobów interakcji z serwerem MySQL, a tym samym tworzenia i używaniabazy danych. Najprostszym interfejsem jest klient mysql. Dzięki niemu możliwa jest interakcjaprzy użyciu wiersza poleceń. Program często nazywany jest monitorem MySQL.

Jeśli serwer MySQL został poprawnie zainstalowany i uruchomiony, mysql powinien włączyćsię bez przeszkód. Jeżeli tak się nie stanie, należy przeprowadzić instalację zgodnie z kroka-mi opisanymi w rozdziale 2. Jeżeli instalacja została przeprowadzona w sposób domyślny,program mysql znajduje się w katalogu /usr/local/mysql/bin/. Aby upewnić się, iż znajdzie sięon w ścieżce wyszukiwania, wystarczy wykonać poniższe wiersze:

PATH=$PATH:/usr/local/mysql/binexport PATH

Zakładając, iż wszystko działa poprawnie, potrzebna jest jeszcze nazwa użytkownika i hasło.Jeśli nie jest się administratorem, należy uzyskać obie informacje od osoby zarządzającej ser-werem. Jeżeli serwer MySQL został zainstalowany dopiero przed chwilą, użytkownik rootposiada puste hasło. Sposób ustawiania haseł i tworzenia użytkowników z różnymi prawamizostał opisany w rozdziale 2.

Logowanie się do serwera MySQL z poziomu powłoki wygląda następująco.mysql -h host -u użytkownik -p

Jeśli dokonuje się logowania do lokalnego serwera (mieszczącego się na tym samym kompu-terze fizycznie lub logicznie, na przykład dzięki połączeniu Telnet lub SSH), można pominąćargument -h host. Klient domyślnie przyjmuje, iż logowanie dotyczy hosta localhost, któryodnosi się do aktualnego systemu. W przypadku chęci dołączenia do serwera istniejącego nainnym komputerze, trzeba podać jego nazwę, którą można przełożyć na adres IP, lub bezpo-średnio wpisać adres IP.

Page 16: MySQL. Almanach

38 | Rozdział 3. Podstawy MySQL

Argument użytkownik należy zastąpić właściwą nazwą użytkownika. Opcja -p instruuje mysql,aby poprosił o podanie hasła. Możliwe jest przekazanie hasła na końcu opcji -p (wpisz-prower, jeśli hasłem jest rower); między opcją a hasłem nie występuje znak spacji. Wpisy-wanie hasła w wierszu poleceń nie jest dobrym rozwiązaniem ze względów bezpieczeństwa,ponieważ jest wówczas przesyłane przez sieć jako niezakodowany tekst, a w dodatku ktoś możepodejrzeć listę procesów uruchomionych na danym komputerze.

Aby zakończyć pracę z mysql, wpisz quit lub exit i naciśnij klawisz Enter.

Tworzenie bazy danych i tabelZakładając, iż ma się wszystkie prawa wymagane do tworzenia i modyfikowania bazy danychna serwerze, można przystąpić do tworzenia nowej bazy danych i tabel. W niniejszym rozdzialewykonamy bazę danych dla fikcyjnej księgarni.

CREATE DATABASE ksiegarnia;

To krótkie polecenie tworzy bazę danych o nazwie ksiegarnia. W niniejszej książce poleceniai zarezerwowane słowa będą pisane wielkimi literami. Nie jest to jednak wymagane — MySQLnie rozróżnia wielkości liter w słowach kluczowych i klauzulach. Nazwy baz danych i tabelsą czułe na wielkość liter w systemach operacyjnych czułych na wielkość liter, na przykładsystemach uniksowych, ale nie są czułe w systemach, które nie zwracają uwagi na wielkośćliter, na przykład systemach Windows. Przyjęło się jednak, by słowa kluczowe w dokumen-tacjach SQL pisać wielkimi literami, a nazwy tabel, baz danych i kolumn małymi literami.

Polecenia SQL są zakończone znakiem średnika. Polecenie SQL może rozciągać się na więcej niżjeden wiersz. Jego wysłanie do serwera i przetworzenie rozpoczyna się dopiero po wykryciuznaku średnika. Aby zatrzymać uruchomione polecenie SQL, zamiast średnika należy wpisać \c.

Skoro baza danych jest już założona, warto w aktualnej sesji określić domyślną bazę danych,stosując poniższe polecenie:

USE ksiegarnia;

Kolejny krok to utworzenie pierwszej tabeli, w której później znajdą się dane. Pierwsza tabelabędzie przechowywała podstawowe informacje o książce, ponieważ jest to najważniejszyelement książkowego 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 pro-stu numer identyfikacyjny każdego z rekordów. Jest typu całkowitoliczbowego. Warto pa-miętać, iż w MySQL pola nazywane są kolumnami, a rekordy wierszami. Typem danych dladrugiej i trzeciej kolumny są pola tekstowe o zmiennej długości — mogą pomieścić maksy-malnie 50 znaków. Lista kolumn znajduje się w nawiasach.

Aby poznać opis właśnie utworzonej tabeli, wpisz instrukcję DESCRIBE, która wyświetli po-niższą tabelę:

Page 17: MySQL. Almanach

Tworzenie bazy danych i tabel | 39

DESCRIBE ksiazki;

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

Przyglądając się tabeli, nietrudno się domyślić, iż potrzebne byłyby dodatkowe kolumnyz wydawcą, rokiem publikacji, numerem ISBN, gatunkiem, opisem książki itp. Co więcej,przydałoby się, by MySQL automatycznie przypisał wartość kolumnie id_rek, aby nie trzebabyło samemu martwić się wymyślaniem wartości i sprawdzaniem, czy się nie powielają. Do-datkowo, decydujemy się zamienić kolumnę autor z wersji zawierającej nazwisko autora nanumer identyfikacyjny autora, który będzie pochodził z osobnej tabeli zawierającej listę autorów.Zredukuje to ilość tekstu do wpisywania, ułatwi sortowanie i wyszukiwanie, gdyż dane będąjednorodne. Aby dokonać zmian w już istniejącej tabeli, zastosuj następującą instrukcję SQL:

ALTER TABLE ksiazkiCHANGE 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);

Każdy wiersz, w którym znajdują się informacje o zmienianych lub dodawanych kolumnach,poza pierwszym, musi być oddzielony przecinkiem. W drugim wierszu następuje zmiana ko-lumny id_rek. Choć nazwa kolumny i jej typ pozostaje bez zmian, trzeba podać je raz jeszcze.Znacznik AUTO_INCREMENT służy do zapewnienia działania opisanego we wcześniejszym akapi-cie, czyli przypisania każdej nowej książce unikatowej wartości. Dodatkowo wiersz zostajeoznaczony jako PRIMARY KEY, aby przyspieszyć pobieranie danych.

Trzeci wiersz dokonuje zmian w kolumnie autor w taki sposób, aby dostosować jej tytuł i typdo tabeli autorzy, która wkrótce powstanie. Tabela autorzy będzie zawierała kolumnę kluczagłównego, po której dokona się złączenia tabel. Ponieważ kolumna ta będzie typu całkowito-liczbowego, taki typ trzeba zastosować w zmienianej kolumnie autora.

Czwarty wiersz dodaje kolumnę z opisem książki. Zastosowany typ danych to BLOB, co jestskrótem od binary large object (duży obiekt binarny). Ten typ danych ma zmienną długośći potrafi przechowywać do 64 kilobajtów danych. Istnieją typy danych potrafiące przecho-wywać jeszcze więcej informacji. Ich pełna lista wraz z limitami znajduje się w dodatku A.

W kolumnie gatunek wymienia się możliwe wartości, aby zapewnić jednorodność. Dostępnesą również wartości: pusta i NULL, choć nie zostały jawnie wymienione w poleceniu.

Przed rozpoczęciem dodawania danych do tabeli ksiazki, warto jeszcze utworzyć tabelę autorzy.Tabela autorzy będzie tak zwaną tabelą referencyjną (nazywaną też czasem słownikiem). Trzebają ustawić jako pierwszą, ponieważ w trakcie wpisywania danych do tabeli ksiazki potrzebnybędzie numer identyfikacyjny autora.

Page 18: MySQL. Almanach

40 | Rozdział 3. Podstawy MySQL

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

Ta tabela nie wymaga znaczącej liczby kolumn, choć w rzeczywistej księgarni zapewne zo-stałyby zastosowane dodatkowe kolumny opisowe. W przyszłości dojdzie do złączenia tabelksiazki i autorzy za pomocą wartości z kolumny id_autora tabeli ksiazki i kolumny id_rek po-wyższej tabeli. Osobiście zawsze w ten sam sposób nazywam kolumnę klucza głównegokażdej tabeli (id_rek), aby przy wpisywaniu zapytań nie zastanawiać się nad nazwą i nie mu-sieć sprawdzać jej poleceniem DESCRIBE.

W powyższej tabeli imię i nazwisko autora zostało rozbite na dwie kolumny, aby ułatwićsortowanie i wyszukiwanie po nazwisku. Dodatkowo pojawiła się kolumna kraju pochodzeniaautora, co umożliwi wyszukiwanie książek napisanych przez autorów pochodzących z krajupodanego przez użytkownika.

Pokaż miWarto zatrzymać się na chwilę i popodziwiać wykonaną do tej pory pracę. Aby uzyskać listębaz danych, należy wykonać polecenie SHOW DATABASES.

SHOW DATABASES;

+------------+| Database |+------------+| ksiegarnia || mysql || test |+------------+

Wynik wykonania polecenia ujawnia istnienie dwóch dodatkowych baz danych poza właśniewykonaną bazą. Jedną z tych dodatkowych baz jest mysql, która zawiera dane dotycząceprzywilejów użytkowników. Została ona pokrótce omówiona w poprzednim rozdziale. Trze-cia wymieniona baza danych (test) jest tworzona automatycznie w trakcie instalacji MySQL.Tradycyjnie używa się jej do dodawania tabel, dla których chce się przeprowadzić testowaniepoleceń SQL.

Aby wyświetlić listę tabel bazy danych ksiegarnia (po wcześniejszym wybraniu tej bazy danychpoleceniem USE), wpisz poniższe polecenie:

SHOW TABLES;

+----------------------+| Tables_in_ksiegarnia |+----------------------+| autorzy || ksiazki |+----------------------+

Page 19: MySQL. Almanach

Pobieranie danych | 41

Wynik działania polecenia SHOW TABLES przedstawia listę zawierającą, zgodnie z oczekiwa-niami, dwie tabele. Jeśli chce się wyświetlić listę tabel innej bazy danych, korzystając nadalz aktywnej bazy danych ksiegarnia, należy do wcześniejszego polecenia dodać klauzulę FROM.

USE ksiegarnia;SHOW TABLES FROM mysql;

Spowoduje to wyświetlenie tabel bazy danych mysql, choć klient nadal będzie ściśle związanyz bazą danych ksiegarnia.

Wstawianie danychPo wykonaniu dwóch pierwszych tabel warto wstawić do nich dane. Najprostszy sposóbwykonania tego zadania to użycie polecenia INSERT. Dzięki temu poleceniu można za jednympodejściem dodać jeden lub więcej rekordów. Przed dodaniem informacji o książce do tabeliksiazki trzeba wypełnić pole tabeli autorzy, aby móc odnieść się od identyfikatora autora. Wy-konaj poniższe polecenie, korzystając z klienta mysql:

INSERT INTO autorzy(nazwisko, imie, kraj)VALUES('Grochola','Katarzyna','Polska');

Po dodaniu informacji o autorze, można wstawić napisaną przez niego książkę.

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 spowodowało dodanie rekordu dla Katarzyny Grocholi, autorki książkiNigdy w życiu. Standardowa składnia polecenia INSERT najpierw określa kolumny, w którychmają zostać umieszczone dane. Jeśli chce się wstawiać dane do wszystkich kolumn w kolej-ności określonej w bazie danych, nie trzeba podawać nazw kolumn. W drugim poleceniu SQLlista kolumn ma inną kolejność niż oryginalna lista kolumn w tabeli. Takie rozwiązanie jestw pełni akceptowane przez MySQL — trzeba jednak zapewnić taką samą kolejność przekazy-wanych danych. Identyfikator autora dla kolumny id_autora pobieramy z poprzedniego pole-cenia, korzystając z funkcji LAST_INSERT_ID().

Pobieranie danychSkoro w obu tabelach znajdują się dane, warto wykonać pewne zapytania. Do pobrania da-nych służy polecenie SELECT. Aby pobrać wszystkie kolumny i wiersze tabeli ksiazki, wpiszponiższe polecenie:

SELECT * FROM ksiazki;

Znak gwiazdki jest w tym przypadku znakiem wieloznaczności powodującym pobraniewszystkich kolumn. Ponieważ nie zostały określone żadne kryteria, dzięki którym miałybyzostać pobrane jedynie niektóre wiersze, polecenie spowoduje pobranie wszystkich wierszytabeli ksiazki. Aby pobrać konkretne kolumny i wiersze, należy podać nazwy kolumn i zasto-sować klauzulę WHERE z warunkami stawianymi poszczególnym wierszom.

Page 20: MySQL. Almanach

42 | Rozdział 3. Podstawy MySQL

SELECT id_rek, tytul, opisFROM ksiazkiWHERE gatunek = 'nowela';

Polecenie SQL wyświetla jedynie numer identyfikacyjny, tytuł i opis wszystkich książek z ta-beli ksiazki, które należą do gatunku nowela. Oczywiście wyniki byłyby bardziej imponujące,gdyby w tabeli znajdowało się więcej książek. Załóżmy, iż wpisaliśmy do bazy danych kil-kadziesiąt książek i kontynuujmy pracę.

Aby z bazy danych pobrać wszystkie książki napisane przez wybranego autora, trzeba do-konać połączenia tabeli ksiazki z tabelą autorzy. Poniżej został przedstawiony przykład takiegopołączenia.

SELECT ksiazki.id_rek, tytul, rok_pub, CONCAT(imie, ' ' , nazwisko) AS autorFROM ksiazki, autorzyWHERE nazwisko = 'Grochola' AND id_autora = autorzy.id_rek;

Obie tabele posiadają kolumnę o nazwie id_rek, więc poza nazwą kolumny trzeba określićnazwę tabeli, by poprawnie dokonać złączenia. W tym celu przed nazwą kolumny umieszczasię nazwę tabeli oraz znak kropki jako separator. Przykład takiego rozwiązania znajduje sięw pierwszym wierszu, w którym dochodzi do pobrania numeru identyfikacyjnego rekordu.Drugi wiersz korzysta z funkcji tekstów o nazwie CONCAT(). Dzięki tej funkcji można połą-czyć ze sobą kilka fragmentów danych w jeden tekst, aby uzyskać lepiej wyglądający wynik.W tym przypadku funkcja łączy imię, znak spacji (w apostrofach) oraz nazwisko autora.Wynik połączenia będzie widoczny jako jedna kolumna o nazwie autor, ponieważ taka na-zwa została podana jako alias dzięki słowu kluczowemu AS. Klauzula FROM wymienia obietabele oddzielone przecinkiem. Jeśli istniałoby więcej tabel, wystarczyłoby je podać w tejklauzuli w dowolnej kolejności, oddzielając je przecinkami. W klauzuli WHERE informujemyserwer, iż jesteśmy zainteresowani książkami napisanymi przez autora o nazwisku „Gro-chola”. Dodatkowo klauzula ta zawiera warunek złączenia obu tabel (ostatni wiersz). Złącze-nie dotyczy kolumny id_autora tabeli ksiazki i kolumny id_rek tabeli autorzy. Jeśli w tabeli nieznajduje się żadna książka napisana przez takiego autora, nie zostaną zwrócone żadne wiersze.Jeżeli książka takiego autora została wpisana, ale jego dane nie znajdują się w tabeli autorzy,również nie zostaną wyświetlone żadne wiersze. Oto przykładowy wynik wykonania poprzed-niego polecenia SQL.

+--------+-------------------+---------+--------------------+| id_rek | tytul | rok_pub | autor |+--------+-------------------+---------+--------------------+| 1 | Nigdy w życiu | 2001 | Katarzyna Grochola || 2 | Podanie o miłość | 2002 | Katarzyna Grochola |+--------+-------------------+---------+--------------------+

Nietrudno zauważyć, iż zostały odnalezione dwie książki Katarzyny Grocholi. Tytuł ostatniejkolumny został określony w zapytaniu za pomocą słowa kluczowego AS. Podobne zmianymożna wymusić dla innych kolumn, korzystając z tego samego słowa kluczowego. Alias autormoże zostać użyty w innym miejscu polecenia SELECT, ale niestety nie w klauzuli WHERE.Więcej informacji na temat AS znajduje się w rozdziale 4.

Page 21: MySQL. Almanach

Kolejność, limitowanie wyników i grupowanie | 43

Kolejność, limitowanie wyników i grupowanieGdy pobiera się duży zbiór danych, warto posortować znajdujące się w nim informacje we-dług konkretnego klucza. W tym celu stosuje się klauzulę ORDER BY. Przypuśćmy, iż potrze-bujemy pobrać z bazy danych wszystkie sztuki napisane przez Williama Shakespeare’a. Po-niższe zapytanie SQL pobierze odpowiednią listę i posortuje ją według tytułu sztuki:

SELECT ksiazki.id_rek, tytul, wydawcaFROM ksiazki, autorzy, wydawcyWHERE nazwisko = 'Shakespeare' AND gatunek = 'sztuka' AND id_autora = autorzy.id_rek AND id_wydawcy = wydawcy.id_rekORDER BY tytul, rok_pub;

Klauzula ORDER BY znajduje się na końcu, po klauzuli WHERE. Najpierw sortowanie odbywasię po tytule (kolumnie tytul), a w ramach tego samego tytułu po roku publikacji (kolumnierok_pub). Domyślnie dane porządkowane są w porządku alfabetycznym. Jeśli chce się posor-tować tytuły w odwrotnym porządku alfabetycznym, zaraz po nazwie kolumny title w klauzuliORDER BY, ale przed przecinkiem rozpoczynającym rok_pub, trzeba zastosować opcję DESC.

Duża księgarnia może posiada wiele wydań sztuk Shakespeare’a, być może nawet kilka wydańtej samej sztuki. Aby ograniczyć liczbę wyświetlanych rekordów, stosuje się klauzulę LIMIT nakońcu polecenia SQL.

SELECT ksiazki.id_rek, tytulFROM ksiazki, autorzy, wydawcyWHERE nazwisko = 'Shakespeare' AND gatunek = 'sztuka' AND id_autora = autorzy.id_rek AND id_wydawcy = wydawcy.id_rekORDER BY tytul, rok_pubLIMIT 20;

Dodatkowa klauzula ograniczy liczbę zwróconych wierszy do pierwszych 20. Liczenie roz-poczyna się od pierwszego wiersza zbioru wyników zaraz po posortowaniu danych zgodniez wymaganiami zawartymi w klauzuli ORDER BY. Jeśli chce się pobrać kolejnych 10 pozycji,trzeba w klauzuli LIMIT najpierw podać liczbę wierszy do pominięcia, a następnie po prze-cinku liczbę wierszy do pobrania. Jeżeli zechcemy pominąć pierwszych 20 wyników i wy-świetlić jedynie kolejnych 10, trzeba zastąpić wcześniejszą klauzulę LIMIT następującą wersją:

...LIMIT 20, 10;

W dwuargumentowej wersji klauzuli pierwsza wartość określa liczbę wierszy do pominięcia(w przykładzie 20), a druga maksymalną liczbę wierszy do pobrania (w przykładzie 10).

Jeżeli chcemy pobrać jedynie listę sztuk Shakespeare’a i nie jesteśmy zainteresowani datą pu-blikacji ani wydawcą — innymi słowy, jesteśmy zainteresowani jedynie pierwszym znalezio-nym wierszem dla każdego tytułu — możemy zastosować klauzulę GROUP BY.

SELECT ksiazki.id_rek, tytulFROM ksiazki, autorzyWHERE nazwisko = 'Shakespeare' AND id_autora = autorzy.id_rekGROUP BY tytul;

Page 22: MySQL. Almanach

44 | Rozdział 3. Podstawy MySQL

Wynikiem działania powyższego polecenia SQL jest lista wszystkich tytułów sztuk Shake-speare’a istniejących w bazie danych. Numer identyfikacyjny będzie dotyczył pierwszegoznalezionego wiersza dla każdego tytułu. Co ciekawe, GROUP BY zwróci te same dane co ORDER BYzastosowane dla tej samej kolumny.

Analiza i manipulacja danymiMySQL umożliwia nie tylko pobieranie surowych danych, ale również ich analizę i formato-wanie. Przypuśćmy, iż chcemy się dowiedzieć, ile powieści Tołstoja posiadamy. W tym celutrzeba w poleceniu SQL zastosować funkcję COUNT().

SELECT COUNT(*)FROM ksiazki, autorzyWHERE nazwisko = 'Tołstoj' AND id_autora = autorzy.id_rek;

+----------+| COUNT(*) |+----------+| 12 |+----------+

Załóżmy, że po ustawieniu i uruchomieniu bazy danych zawiera ona tabelę zamowienia z in-formacjami na temat zamówień użytkowników. Możemy wykorzystać tę tabelę, aby spraw-dzić sprzedaż wybranej książki. Aby sprawdzić kwotę uzyskaną ze sprzedaży książki Armadilloautorstwa Williama Boyda, wystarczy wpisać poniższe polecenie SQL w kliencie mysql:

SELECT SUM(kwota_sprzedazy) AS 'Sprzedaż Armadillo'FROM zamowienia, ksiazki, autorzyWHERE 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ść kolumnykwota_sprzedazy dla każdego wiersza tabeli zamowienia spełniającego kryteria zawarte w klau-zuli WHERE. Następnie sumuje znajdujące się tam wartości i wyświetla je w kolumnie o poda-nej nazwie. Większość nazw kolumn występuje tylko w jednej tabeli, więc MySQL nie maproblemów ze stwierdzeniem, czego dotyczą. Niemniej dla kilku kolumn trzeba zastosowaćwersję tabela.kolumna.

Korzystając z wielu różnorodnych funkcji, można sterować sposobem formatowania kolumnzawierających datę lub czas. Załóżmy, iż chcemy wydobyć z tabeli zamowienia datę złożeniazamówienia na podstawie posiadanego numeru rachunku (na przykład 1250), który tak na-prawdę jest numerem identyfikującym rekord (id_rek). Zastosowanie poniższego poleceniaSQL spowoduje zwrócenie daty w domyślnym formacie.

Page 23: MySQL. Almanach

Modyfikacja danych | 45

SELECT data_zakupu AS 'Data zakupu'FROM zamowieniaWHERE id_rek = '1250';

+---------------+| Data zakupu |+---------------+| 2004-03-01 |+---------------+

Zastosowany format (rok-miesiąc-dzień) jest w pełni zrozumiały. Jeżeli jednak chce się wy-świetlić nazwę miesiąca jako tekst, a nie liczbę, można skorzystać z odpowiednich funkcji daty.

SELECT CONCAT(DAYOFMONTH(data_zakupu), ' ', MONTHNAME(data_zakupu), ' ', YEAR(data_zakupu)) AS 'Data zakupu'FROM ordersWHERE rec_id = '1250';

+---------------+| Data zakupu |+---------------+| 1 March 2004 |+---------------+

Aby przedstawić datę w formacie często stosowanym w Polsce, korzystamy z funkcji CONCAT()i kilku funkcji daty. Początkowo zastosowany kod może wydawać się niezrozumiały z po-wodu wstawiania dodatkowych znaków spacji między poszczególne elementy daty. Pierwszaz funkcji pobiera z daty liczbę reprezentującą dzień i po prostu ją wyświetla. Kolejna funkcjawydobywa z kolumny data_zakupu miesiąc i zwraca go jako nazwę w języku angielskim.Trzecia funkcja, znajdująca się w trzecim wierszu, wydobywa rok. Przyglądając się wyni-kowi, łatwo stwierdzić, iż ten złożony kod działa prawidłowo. Nie jest to jednak najbardziejwygodny sposób formatowania daty. Lepsze rozwiązanie polega na zastosowaniu funkcjiDATE_FORMAT().

SELECT DATE_FORMAT(data_zakupu, "%d %M %Y") AS 'Data zakupu'FROM ordersWHERE rec_id = '1250';

To rozwiązanie jest znacznie prostsze i krótsze, a co najważniejsze, daje identyczne wyniki.Aby poprawnie skorzystać z powyższej funkcji, trzeba znać kody formatujące. Zostały onewymienione w rozdziale 6.

Modyfikacja danychDo modyfikacji danych w bazie danych służy kilka różnych poleceń. Najbardziej podstawo-wą i chyba najpopularniejszą instrukcją jest UPDATE. Dzięki niej można zmienić dane wewskazanych kolumnach wszystkich wierszy spełniających klauzulę WHERE. Przyglądając sięwynikom jednego z wcześniejszych zapytań można zauważyć, iż data wydania dla książkiKatarzyny Grocholi Podanie o miłość to rok 2002. Nie jest to poprawna wartość, gdyż książkazostała wydana w roku 2001. Aby uaktualnić tę informację, wpisz poniższe polecenie SQL:

Page 24: MySQL. Almanach

46 | Rozdział 3. Podstawy MySQL

UPDATE ksiazkiSET rok_pub = 2001WHERE id_rek = '2';

Query OK, 1 rows affected (0.22 sec)Rows matched: 1 Changed: 1 Warnings: 0

Najpierw podaje się nazwę aktualizowanej tabeli. Następnie po słowie kluczowym SET poja-wiają się nazwy kolumn i przypisywane im nowe wartości. Jeżeli zmienia się wartość więcejniż jednej kolumny, poszczególne przypisania należy rozdzielić przecinkami. Słowo kluczoweSET stosuje się tylko raz.

Powyższe polecenie posiada klauzulę WHERE, co powoduje ograniczenie liczby modyfikowa-nych wierszy wyłącznie do wierszy spełniających podane warunki. W przedstawionym przy-kładzie warunek dotyczy kolumny z unikatowymi wartościami, więc zmieniony zostanie tylkojeden wiersz. Wynik wykonania polecenia wskazuje na wpłynięcie na jeden z wierszy, dopa-sowanie się do jednego wiersza, zmienienie jednego z wierszy. W trakcie wykonywania niepojawiły się żadne błędy powodujące zgłoszenie ostrzeżeń.

Czasem wstawienie danych do tabeli spowoduje powstanie duplikatu wiersza, gdy danewiersza istniały już wcześniej. Przypuśćmy, iż wykonaliśmy polecenie SQL wstawiające dotabeli kilka książek, ale jedna z tych książek już była zawarta w bazie danych. Jeżeli zastosujesię polecenie INSERT, powstanie duplikat. Aby temu zapobiec, można użyć polecenia REPLACE,które wstawia nowy wiersz lub zastępuje istniejący wiersz nowymi danymi. Z perspektywyMySQL duplikacja występuje tylko wtedy, gdy unikatowe kolumny miałyby zawierać tę sa-mą wartość. Ponieważ wartość kolumny id_rek jest przypisywana automatycznie, jej duplikacjajest mało prawdopodobna na etapie dodawania nowych rekordów. Unikatowym elementemkażdej książki jest numer ISBN — dzięki niemu można jednoznacznie określić książkę. Abyzapewnić, iż nie pojawią się wiersze z tym samym numerem ISBN, warto ponownie zmody-fikować tabelę ksiazki i wymusić unikatowość wartości znajdujących się w kolumnie isbn. W tensposób zapobiegnie się dwukrotnemu wpisaniu danych związanych z tą samą książką.

ALTER TABLE ksiazkiCHANGE COLUMN isbn isbn VARCHAR(20) UNIQUE;

Od teraz można wstawiać dane kolejnych książek nie martwiąc się o zduplikowane wierszeo tym samym numerze ISBN. Poniżej znajduje się przykładowy kod próbujący dodać dwieksiążki autorstwa Katarzyny Grocholi, z których 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'),

Składnia polecenie REPLACE jest taka sama jak polecenia INSERT. Warto zauważyć dodaniedwóch wierszy w jednym poleceniu. Dokładnie tę samą składnię stosuje się, aby dodać wielewierszy poleceniem INSERT. Dane każdego wiersza umieszcza się w nawiasach, a poszcze-gólne grupy nawiasów oddziela przecinkami. Ponieważ w przedstawionym przykładzie w ba-zie danych istnieje wiersz dla książki o numerze ISBN 83-88221-55-8 (Nigdy w życiu), zostanieon zastąpiony, a nie dodany. Ponieważ drugiej książki nie ma jeszcze w tabeli, zostanie doniej dodana.

Page 25: MySQL. Almanach

Usuwanie danych | 47

Usuwanie danychDo usuwania konkretnych wierszy danych służy polecenie DELETE. Jeśli na przykład chce sięusunąć z tabeli ksiazki wszystkie wiersze dotyczące książek autorki J. K. Rowling, ponieważpodjęło się decyzję o niesprzedawaniu książek Harry Potter (nie chce się prowadzić tego ro-dzaju biznesu), można użyć poniższego polecenia:

DELETE FROM ksiazkiWHERE id_autora = (SELECT autorzy.id_rek FROM autorzy WHERE nazwisko = 'Rowling' AND imie = 'J.K.');

DELETE FROM autorzyWHERE nazwisko = 'Rowling' AND imie = 'J.K.';

Powyższy kod usuwa z tabeli ksiazki wszystkie książki, których identyfikator autora zawierawartość zwróconą przez podzapytanie. Zapytanie zwraca identyfikator z tabeli autorzy doty-czący autora o wskazanym imieniu i nazwisku. Innymi słowy, kolumna id_autora musi za-wierać wartość zwróconą przez polecenie SELECT (podzapytanie w nawiasie). Ponieważ kodkorzysta z podzapytań, do poprawnego działania wymaga MySQL w wersji 4.1 lub nowszej.Aby wykonać to samo zadanie w jednej z wcześniejszych wersji MySQL, trzeba by wykonaćpolecenie SELECT, zapamiętać zwrócony identyfikator autora, a następnie wykonać polecenieDELETE, ręcznie wpisując numer identyfikacyjny.

Alternatywne rozwiązanie dla poprzedniej konstrukcji polega na zastosowaniu zmiennychzdefiniowanych przez użytkownika. Oto przykład korzystający ze zmiennych:

SET @potter = (SELECT id_rek FROM autorzy WHERE nazwisko = 'Rowling' AND imie = 'J.K.');

DELETE FROM ksiazkiWHERE id_autora = @potter;

DELETE FROM autorzyWHERE id_rek = @potter;

W pierwszym fragmencie polecenie SET służy do utworzenia zmiennej o nazwie @potter,która będzie zawierać wynik działania polecenia SELECT umieszczonego w nawiasach (podza-pytanie). Choć MySQL w wersjach wcześniejszych niż 4.1 nie obsługuje podzapytań, przed-stawiony kod zadziała, gdyż dotyczy zmiennych definiowanych przez użytkownika. Drugiepolecenie SQL usuwa z tabeli ksiazki wszystkie książki, które jako identyfikator autora posia-dają wartość znajdującą się w zmiennej tymczasowej. Ostatnie polecenie usuwa dane z tabeliautorzy, ponownie korzystając ze zmiennej. Zmienne zdefiniowane przez użytkownika ist-nieją do momentu ich zresetowania lub zamknięcia sesji z serwerem MySQL.

Page 26: MySQL. Almanach

48 | Rozdział 3. Podstawy MySQL

Wyszukiwanie danychGdy baza danych zawiera ogromną liczbę informacji, znajdowanie danych przy użyciu ręcz-nego przeszukiwania wyników polecenia SELECT jest nie do zaakceptowania. Co więcej, cza-sem nie zna się dokładnego lub pełnego tekstu, który miałby istnieć w wybranej kolumnie.W takich sytuacjach korzysta się z operatora LIKE. Załóżmy, iż tabela ksiazki zawiera tysiącewpisów. Klient chce odnaleźć książkę, ale nie pamięta jej autora. Wie jedynie, iż w tytuleksiążki występowały wyrazy zimową i podróżny. Można użyć tego strzępka informacji doprzeszukania zawartości bazy danych, używając poniższego polecenia:

SELECT ksiazki.id_rek, tytul, CONCAT(imie, ' ', nazwisko) AS autorFROM ksiazki, autorzyWHERE tytul LIKE '%podróżny%' AND tytul LIKE '%zimową%' AND id_autora = autorzy.id_rek;

+--------+-------------------------------+---------------+| id_rek | tytul | autor |+--------+-------------------------------+---------------+| 1400 | Jeśli zimową nocą podróżny | Italo Calvino |+--------+-------------------------------+---------------+

Poza operatorem LIKE dwukrotnie został użyty znak wieloznaczny procenta, aby wskazać, iżposzukuje się wszystkich wierszy, w których kolumna tytul zaczyna się od zera lub więcejznaków przed wzorcem podróżny, a po wzorcu może się pojawić 0 lub więcej innych zna-ków. Innymi słowy, wyraz podróżny musi się znaleźć w dowolnym miejscu w danych wy-branej kolumny. Podobna sytuacja dotyczy wyrazu zimową. Warto pamiętać, iż słowo LIKEto operator. Więcej informacji na temat operatorów znajduje się w dodatku B.

Jeżeli inny klient poprosi o wyszukanie w bazie danych tytułu książki zawierającej wyrazFord lub Chevrolet, należy zastosować w klauzuli WHERE operator OR.

SELECT ksiazki.id_rek, tytul, CONCAT(imie, ' ', nazwisko) AS autorFROM ksiazki, autorzyWHERE tytul LIKE '%Ford%' AND id_autora = autorzy.id_rekOR tytul LIKE '%Chevrolet%' AND id_autora = autorzy.id_rek;

Więcej przykładów i możliwości wyszukiwania danych znajduje się w rozdziale 4.

Hurtowy import danychChoć polecenia INSERT i REPLACE są bardzo użyteczne, potrafią być czasochłonne w przy-padku wprowadzania dużej ilości danych, gdyż wymuszają ich ręczne wpisywanie. Częstow momencie tworzenia nowej bazy danych trzeba dokonać przeniesienia danych ze starejbazy danych. Załóżmy, iż wydawca wysłał nam dysk z listą wszystkich swoich książek znaj-dującą się w zwykłym pliku tekstowym. Każdy rekord dotyczący poszczególnej książki znaj-duje się w osobnym wierszu, a każde pole zostało oddzielone znakiem pionowej kreski. Otow jaki sposób mogą wyglądać fikcyjne dane od wydawcy.

ISBN|TYTUL|NAZWISKO|IMIE|DATA WYDANIA0-907587-68-2|Notatki z podziemia|Dostojewski|Fiodor|kwiecień 1992|...

Page 27: MySQL. Almanach

Hurtowy import danych | 49

Oczywiście rzeczywisty plik od wydawcy zawierałby znacznie więcej pól i rekordów niż zo-stało tutaj przedstawione, ale tutaj ograniczymy się jedynie do przykładu. Pierwszy wierszzawiera opis pól rekordów. Nie należy pobierać pierwszego wiersza. Zawiera on po prostuinstrukcje dla osoby edytującej plik. Poinformujemy MySQL, by zignorował pierwszy wiersz.Jeśli chodzi o dane, trzeba zająć się kilkoma problemami. Pola nie znajdują się w takiej samejkolejności, w jakiej są zapisane w bazie danych. Trzeba poinformować MySQL o zmianie ko-lejności przy zapisie. Inny problem polega na tym, iż plik tekstowy zawiera dane dla tabelksiazki i autorzy. Obejście tego problemu nie jest łatwe, ale wykonalne. W pierwszym podej-ściu wydobędziemy jedynie informacje o autorze. Osobne polecenie SQL posłuży do wydo-bycia informacji na temat książki. Na początek należy przenieść plik od wydawcy (ksiazki.txt)do katalogu /tmp, a następnie wykonać polecenie LOAD DATA INFILE w kliencie mysql.

LOAD DATA INFILE '/tmp/ksiazki.txt' REPLACE INTO TABLE autorzyFIELDS TERMINATED BY '|' LINES TERMINATED BY '\r\n'TEXT_FIELDS(kol1, kol2, kol3, kol4, kol5)SET nazwisko = kol3, imie = kol4IGNORE kol1, kol2, kol5, 1 LINES;

Klauzule TEXT_FIELDS i IGNORE dla kolumn nie są dostępne w wersjach MySQL starszych niż4.1. Klauzula IGNORE n LINES jest dostępna w MySQL już od dłuższego czasu. Treść IGNORE1 LINES spowoduje pominięcie pierwszego wiersza. Wracając do pierwszego wiersza pole-cenia, występuje w nim nazwa wczytywanego pliku i tabela, w której mają zostać umiesz-czone dane. Znacznik REPLACE daje taki sam efekt jak opisywane wcześniej polecenie REPLACE.

Drugi wiersz informuje o tym, iż pola oddzielane są znakiem pionowej kreski, a wiersze od-dzielane znakami powrotu karetki (\r) i przejścia do nowego wiersza (\n). Jest to format ty-powego pliku MS-DOS. Pliki systemu Unix korzystają jedynie ze znaku przejścia do nowegowiersza. Trzeci wiersz tworzy aliasy dla poszczególnych kolumn. Czwarty wiersz zawieranazwy kolumn tabeli i przypisuje im odpowiednie dane, korzystając z aliasów określonychw poprzednim wierszu. Ostatni wiersz informuje MySQL, aby zignorował niechciane kolumny,a także pominął pierwszy wiersz pliku tekstowego, gdyż nie zawiera on danych.

Jeśli korzysta się ze starszej wersji serwera MySQL, który nie zawiera nowej funkcji pozwa-lającej zignorować niechciane kolumny, trzeba wykonać kilka dodatkowych kroków. Istniejekilka możliwych sposobów na wykonanie tego zadania. Jednym z prostszych sposobów (jeśliwczytywanych danych nie jest zbyt dużo) jest dodanie tymczasowych kolumn do tabeli auto-rzy. Kolumny te pomieszczą nadmiarowe dane z pliku tekstowego. Później będzie można jeusunąć. Oto skrypt wykonujący całe zadanie:

ALTER TABLE autorzyADD COLUMN kol1 VARCHAR(50),ADD COLUMN kol2 VARCHAR(50),ADD COLUMN kol5 VARCHAR(50);

LOAD DATA INFILE '/tmp/ksiazki.txt' REPLACE INTO TABLE autorzyFIELDS TERMINATED BY '|' LINES TERMINATED BY '\r\n'IGNORE 1 LINES(kol1, kol2, nazwisko, imie, kol5);

ALTER TABLE autorzyDROP COLUMN kol1,DROP COLUMN kol2,DROP COLUMN kol5;

Page 28: MySQL. Almanach

50 | Rozdział 3. Podstawy MySQL

Przedstawione rozwiązanie działa poprawnie, choć nie jest tak przyjemne i proste jak wcze-śniejsze polecenie. Zauważ, iż w drugim poleceniu SQL klauzula IGNORE wymusza pominię-cie jednego wiersza. Ostatni wiersz tego polecenia wymienia kolumny tabeli autorzy, w którychmają zostać umieszczone importowane dane. Trzecie polecenie usuwa kolumny tymczasowepo zakończeniu wczytywania danych z pliku tekstowego. W tym celu stosuje instrukcję DROP.Na ogół nie można cofnąć wyników działania tej instrukcji, więc warto uważać.

Po umieszczeniu danych autorów z pliku tekstowego w tabeli autorzy, można przystąpić dowczytania danych książek i odszukania poprawnych wartości kolumny id_autora dla każdejksiążki. Zadanie to wykona poniższe polecenie SQL:

LOAD DATA INFILE '/tmp/ksiazki.txt' IGNORE INTO TABLE ksiazkiFIELDS 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, umożliwiających poprawne wykonanie całego zadania.Piąty wiersz polecenia wydobywa rok wydania z pola daty wydania (oryginalnie data wy-dania zawiera miesiąc i rok wydania), stosując funkcję RIGHT(), która pobiera cztery ostatnieznaki kol5. Od 6. wiersza występuje podzapytanie, które określa wartość kolumny id_autorana podstawie imienia i nazwiska autora. Wynik uzyskany w nawiasach zostanie przypisanydo kolumny id_autora. Na końcu dochodzi do zignorowania kolumn kol3, kol4 i pierwszegowiersza pliku tekstowego. Wykonanie tego samego zadania we wcześniejszych wersjach MySQLwymagałoby użycia kolumn tymczasowych lub dodatkowej tabeli. Znacznik IGNORE z pierw-szego wiersza instruuje MySQL, aby ignorował wszystkie komunikaty błędów, nie zastępowałżadnych duplikatów i kontynuował wstawianie kolejnych rekordów.

Interfejs wiersza poleceńAby wysłać zapytanie SQL do serwera MySQL, nie trzeba otwierać monitora MySQL. Cza-sem zachodzi potrzeba szybkiego wykonania polecenia SQL z samej powłoki lub wierszapoleceń. Przypuśćmy, iż mamy tabelę o nazwie dostawcy i chcemy szybko uzyskać listę do-stawców z województwa śląskiego wraz z numerami telefonów. Aby ją uzyskać, wystarczywpisać poniższe polecenie w powłoce systemu Linux (lub innego równoważnego systemu).

mysql --user='tina' --password='muller' \-e "SELECT dostawca, telefon FROM dostawca \ WHERE woj='śląskie'" ksiegarnia

Narzędzie mysql zostaje wywołane, ale nie wchodzi w tryb monitora. Pierwsze argumentyprzekazują nazwę użytkownika i hasło. Pierwszy wiersz kończy się znakiem lewego ukośnika,aby poinformować powłokę, iż będą jeszcze następne argumenty. W przeciwnym przypadkutrzeba by wszystko umieścić w jednym wierszu. Drugi wiersz zawiera argument -e wskazu-jący, iż tekst umieszczony za nim w cudzysłowach powinien zostać wykonany przez klientamysql. Zawarte w cudzysłowach polecenie SQL ma dokładnie taką samą postać, jaka byłabyużyta w trybie monitora. Na końcu pojawia się nazwa bazy danych.

Page 29: MySQL. Almanach

Podsumowanie | 51

Istnieją inne opcje i narzędzia wiersza poleceń. Niektóre z nich służą da tworzenia kopiibezpieczeństwa lub wykonywania konserwacji serwera. Ich pełne omówienie znajduje sięw rozdziale 11.

PodsumowanieOczywiście to nie wszystkie zadania, które można wykonywać przy użyciu serwera MySQL.Niniejsze ćwiczenie miało jedynie na celu przybliżenie podstaw tworzenia i zarządzania baządanych. Kolejne rozdziały książki zawierają szczegółowe omówienia wszystkich instrukcji,klauzul, argumentów, opcji i funkcji serwera MySQL. Jeśli dopiero rozpoczyna się swoją przy-godę z MySQL, warto zacząć od instrukcji i klauzul wymienionych w niniejszym rozdziale,a następnie skorzystać z kolejnych rozdziałów, by rozszerzyć swą wiedzę o dostępnych opcjachi funkcjach.