Linux Gazette Prevodi
Trikovi MySQL-a
Članak na Engleskom je ovde - http://linuxgazette.net/issue67/tag/16.html
Pitanje – hteo bih videti članak o osnovnim komandama MySQL-a, nešto korisno.
Majkov odgovor – evo nekih osnovnih komandi. Šta je za tebe korisno?

Pitanje – vidim da mnogi članci nemaju osnove korišćenja/administracije, pa bi bilo korisna kombinacija ovoga.
Majkov odgovor – komanda *myslq* je trvoj prijatelj za pretragu baze, pravljenje i editovanje tabela, testiranje ideaj pre ugradnje u kod.
Evo primera na data bazi *test* koja dolazi sa MySQL-om. Prvo vidimo imena tabela, zatim strukturu TEAM tabele, pa brojimo koliko ima rekorda, i na kraju pokazujemo neka polja.
$ mysql test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1325 to server version: 3.23.35-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql> show tables;
+------------------+
| Tables_in_test   |
+------------------+
| COLORS           |
| TEAM             |
+------------------+
2 rows in set (0.00 sec)

mysql> describe TEAM;
+------------+---------------+------+-----+---------+----------------+
| Field      | Type          | Null | Key | Default | Extra          |
+------------+---------------+------+-----+---------+----------------+
| MEMBER_ID  | int(11)       |      | PRI | NULL    | auto_increment |
| FIRST_NAME | varchar(32)   |      |     |         |                |
| LAST_NAME  | varchar(32)   |      |     |         |                |
| REMARK     | varchar(64)   |      |     |         |                |
| FAV_COLOR  | varchar(32)   |      | MUL |         |                |
| LAST_DATE  | timestamp(14) | YES  | MUL | NULL    |                |
| OPEN_DATE  | timestamp(14) | YES  | MUL | NULL    |                |
+------------+---------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

mysql> select count(*) from TEAM;
+----------+
| count(*) |
+----------+
|        4 |
+----------+
1 row in set (0.00 sec)

mysql> select MEMBER_ID, REMARK, LAST_DATE from TEAM;
+-----------+-----------------+----------------+
| MEMBER_ID | REMARK          | LAST_DATE      |
+-----------+-----------------+----------------+
|         1 | Techno Needy    | 20000508105403 |
|         2 | Meticulous Nick | 20000508105403 |
|         3 | The Data Diva   | 20000508105403 |
|         4 | The Logic Bunny | 20000508105403 |
+-----------+-----------------+----------------+
4 rows in set (0.01 sec)
Recimo da smo zaboravili puno ime Diva osobe.
mysql> select MEMBER_ID, FIRST_NAME, LAST_NAME, REMARK

-> from TEAM
-> where REMARK LIKE "%Diva%";

+-----------+------------+-----------+---------------+
| MEMBER_ID | FIRST_NAME | LAST_NAME | REMARK        |
+-----------+------------+-----------+---------------+
|         3 | Brittney   | McChristy | The Data Diva |
+-----------+------------+-----------+---------------+
1 row in set (0.01 sec)
Šta ako Brittney McChristy promeni prezime u Spears?
mysql> update TEAM set LAST_NAME='Spears' WHERE MEMBER_ID=3;
Query OK, 1 row affected (0.01 sec)

mysql> select MEMBER_ID, FIRST_NAME, LAST_NAME, LAST_DATE from TEAM
-> where MEMBER_ID=3;

+-----------+------------+-----------+----------------+
| MEMBER_ID | FIRST_NAME | LAST_NAME | LAST_DATE      |
+-----------+------------+-----------+----------------+
|         3 | Brittney   | Spears    | 20010515134528 |
+-----------+------------+-----------+----------------+
1 row in set (0.00 sec)
Pošto je LAST_DATE prvi TIMESTAMP polje u tabeli, automatski se promeni na tekuće vreme svaki put kada nešto izmeniš. Pogledajmo sada sve igrače čija je omiljena boja plava, listajući prvo one koji su poslednji editovani.
mysql> select MEMBER_ID, FIRST_NAME, LAST_NAME, FAV_COLOR, LAST_DATE from TEAM

-> where FAV_COLOR = 'blue'
-> order by LAST_DATE desc;

+-----------+------------+-----------+-----------+----------------+
| MEMBER_ID | FIRST_NAME | LAST_NAME | FAV_COLOR | LAST_DATE      |
+-----------+------------+-----------+-----------+----------------+
|         3 | Brittney   | Spears    | blue      | 20010515134528 |
|         2 | Nick       | Borders   | blue      | 20000508105403 |
+-----------+------------+-----------+-----------+----------------+
2 rows in set (0.00 sec)
Sada napravimo tabelu TEAM2 slične strukture kao TEAM.
mysql> create table TEAM2 (

-> MEMBER_ID int(11) not null auto_increment primary key,
-> FIRST_NAME varchar(32) not null,
-> LAST_NAME varchar(32) not null,
-> REMARK varchar(64) not null,
-> FAV_COLOR varchar(32) not null,
-> LAST_DATE timestamp,
-> OPEN_DATE timestamp);
Query OK, 0 rows affected (0.01 sec)

mysql> describe TEAM2;
+------------+---------------+------+-----+---------+----------------+
| Field      | Type          | Null | Key | Default | Extra          |
+------------+---------------+------+-----+---------+----------------+
| MEMBER_ID  | int(11)       |      | PRI | NULL    | auto_increment |
| FIRST_NAME | varchar(32)   |      |     |         |                |
| LAST_NAME  | varchar(32)   |      |     |         |                |
| REMARK     | varchar(64)   |      |     |         |                |
| FAV_COLOR  | varchar(32)   |      |     |         |                |
| LAST_DATE  | timestamp(14) | YES  |     | NULL    |                |
| OPEN_DATE  | timestamp(14) | YES  |     | NULL    |                |
+------------+---------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
Uporedi ovo sa opisom tabele TEAM. Obe su iste (osim višestrukog indeksa koji nismo kreirali jer je ovo prost primer). Na primer, vršimo pretragu u Python programu:
$ python
Python 1.6 (#1, Sep  5 2000, 17:46:48)  [GCC 2.7.2.3] on linux2
Copyright (c) 1995-2000 Corporation for National Research Initiatives.
All Rights Reserved.
Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.
All Rights Reserved.
>>> import MySQLdb
>>> conn = MySQLdb.connect(host='localhost', user='me', passwd='mypw', db='test')
>>> c = conn.cursor()
>>> c.execute("select MEMBER_ID, FIRST_NAME, LAST_NAME from TEAM")
4L
>>> records = c.fetchall()
>>> import pprint
>>> pprint.pprint(records)
((1L, 'Brad', 'Stec'),
 (2L, 'Nick', 'Borders'),
  (3L, 'Brittney', 'Spears'),
   (4L, 'Fuzzy', 'Logic'))
Možemo takodje da podesimo da Python ili shell skript piše SQL komande u fajl, pa onda 'mysql' komanda čita iz tog fajla. Ili shell skript šalje komandu ka mysql:
$ echo "select REMARK from TEAM" | mysql -t test
+-----------------+
| REMARK          |
+-----------------+
| Techno Needy    |
| Meticulous Nick |
| The Data Diva   |
| The Logic Bunny |
+-----------------+
( -t kaže MySQL da nacrta dekoraciju tabele iako je u *batch* modu. Dodaj tvoje MySQL korisničko ime i lozinku ako je potrebno.)

'mysqldump' štampa set SQL komandi koje kreiraju tabele. Ovo je jednostavan način za čuvanje ili povratak podataka.
$ mysqldump --opt -u Username -pPassword test TEAM >/backups/team.sql
$ mysql -u Username -pPassword test

Ovo može biti korišćeno za zaštitu sistema ili pojedinačnu zaštitu dok menjaš neke stvari (i spašavati život ako zaboraviš WHERE u UPDATE kombinaciji pa promeniš sve rekorde umesto samo jednog!)

Zaštita sistema je moguća i sa rsync ili tar celog /var/lib/mysql/ direktorijuma. Ali postoji rizik da je tabla u pola editovanja kada se zaštita dešava.
MySQL ima komandu *LOCK TABLES the_table READ*, ali nije zgodno ovo koristiti sa Python/Perl jezicima ili kao deo shell skripta bez upotrebe mysql kao ko-procesora.

Druga operacija održavanja je kreiranje korisnika i dozvoljavanje pristupa. Studiraj "GRANT i REVOKE sintakse" (sekcija 7.25) u MySQL referentnom dokumentu. Ja uvek ovo čitam iz početka kada dodajem nove baze. U principu treba ti komanda kao ova:
mysql> grant SELECT, INSERT, DELETE, UPDATE on test.TEAM to somebody

-> identified by 'her_password';
Query OK, 0 rows affected (0.03 sec)
Ovo omogućava "somebody" da vidi i promeni rekorde ali ne može da menja strukturu tabele. (ja uvek menja tabele kao MzSQL root korisnik.)

Koristi "on test.*" da bi video i modifikovao sve tekuće/buduće tabele u bazi 'test'. Da dozvoliš korisniku pristup bez lozinke, izostavi "identified by 'her_password'" deo. Da ograničiš pristup na osnovu klijentovog imena mašine, koristi 'to somebody@"%.mysite.com"'.

Zapamti da MySQL korisničko ime nije u vezi sa login korisničkim imenom.

Da zajedno spojiš više tabela (MySQL je relaciona DBMS pre svegal), pogledaj "SELECT syntax" (sekcija 7.11).

U stvari celo poglavlje 7 je dobro kao referenca. MySQL dokumentacija je ovde- http://www.mysql.com/doc/
Napomena prevodioca:
Ја sam 100% amater u prevođenju i veoma se dvoumim kada treba da prevedem neke reči karakteristične za oblast računara.
Biće mi drago ako ima onih koji su veštiji u prevođenju i voljni da razvijaju ovaj sajt.