Sužinokite „MySQL/MariaDB“ pradedantiesiems - 1 dalis


Šiame straipsnyje mes parodysime, kaip sukurti duomenų bazę (dar vadinamą schema), lenteles (su duomenų tipais) ir paaiškinsime, kaip atlikti duomenų manipuliavimo kalbos (DML) operacijas su duomenimis MySQL/MariaDB serveryje.

Manoma, kad anksčiau 1) įdiegėte reikiamus paketus savo „Linux“ sistemoje ir 2) vykdėte „mysql_secure_installation“, kad pagerintumėte duomenų bazės serverio saugumą. Jei ne, vadovaukitės žemiau pateiktais vadovais, kad įdiegtumėte „MySQL/MariaDB“ serverį.

  1. Įdiekite naujausią „MySQL“ duomenų bazę „Linux“ sistemose
  2. Įdiekite naujausią „MariaDB“ duomenų bazę „Linux“ sistemose

Trumpumo dėlei šiame straipsnyje kalbėsime tik apie „MariaDB“, tačiau čia išdėstytos sąvokos ir komandos taip pat taikomos „MySQL“.

Duomenų bazių, lentelių ir įgaliotų vartotojų kūrimas

Kaip žinote, duomenų bazę paprastai galima apibrėžti kaip organizuotą informacijos rinkimą. Visų pirma, „MariaDB“ yra reliacinių duomenų bazių valdymo sistema (RDBMS), kuri naudoja Structure Query kalbą operacijoms duomenų bazėse atlikti. Be to, nepamirškite, kad „MariaDB“ terminų duomenų bazę ir schemą naudoja pakaitomis.

Norėdami išsaugoti nuolatinę informaciją duomenų bazėje, naudosime lenteles, kuriose saugomos duomenų eilutės. Dažnai dvi ar daugiau lentelių bus kažkaip susijusios. Tai yra organizacijos dalis, apibūdinanti reliacinių duomenų bazių naudojimą.

Norėdami sukurti naują duomenų bazę pavadinimu BooksDB , įveskite „MariaDB“ eilutę naudodami šią komandą (būsite paraginti įvesti „root MariaDB“ vartotojo slaptažodį):

 mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.1.14-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE BookstoreDB;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> 

Sukūrę duomenų bazę, turime sukurti bent dvi lenteles. Tačiau pirmiausia panagrinėkime duomenų tipų sąvoką.

Pristatome „MariaDB“ duomenų tipus

Kaip paaiškinome anksčiau, lentelės yra duomenų bazės objektai, kuriuose laikysime nuolatinę informaciją. Kiekvieną lentelę sudaro du ar daugiau nurodyto duomenų tipo (informacijos tipo) laukų (dar vadinamų stulpeliais), kuriuos tokiame lauke galima išsaugoti.

„MariaDB“ dažniausiai naudojami šie duomenų tipai (visą sąrašą galite rasti oficialiuose „MariaDB“ internetiniuose dokumentuose):

  1. BOOLEAN 0 vertina kaip klaidingą, o kitas vertes - kaip tikrąsias.
  2. „TINYINT“, jei naudojamas su SIGNED, apima diapazoną nuo -128 iki 127, o UNSIGNED diapazonas yra nuo 0 iki 255.
  3. „SMALLINT“, jei naudojamas su „SIGNED“, apima diapazoną nuo -32768 iki 32767. UNSIGNED diapazonas yra nuo 0 iki 65535.
  4. INT, jei naudojamas su NEPASIRINKTU, apima diapazoną nuo 0 iki 4294967295, o kitu atveju - nuo -2147483648 iki 2147483647.

Pastaba: „TINYINT“, „SMALLINT“ ir „INT“ laikoma, kad numatytasis PARENGTAS.

DVIGUBAS (M, D), kur M yra bendras skaitmenų skaičius, o D yra skaitmenų skaičius po kablelio, reiškia dvigubo tikslumo slankiojo kablelio skaičių. Jei nurodoma UNSIGNED, neigiamos vertės neleidžiamos.

  1. VARCHAR (M) reiškia kintamo ilgio eilutę, kur M yra didžiausias leistinas stulpelio ilgis baitais (teoriškai 65 535). Daugeliu atvejų baitų skaičius yra identiškas simbolių skaičiui, išskyrus kai kuriuos simbolius, kurie gali užimti net 3 baitus. Pavyzdžiui, ispanų raidė ñ reiškia vieną simbolį, tačiau užima 2 baitus.
  2. TEXT (M) reiškia stulpelį, kurio maksimalus ilgis yra 65 535 simboliai. Tačiau, kaip tai atsitinka naudojant „VARCHAR“ (M), faktinis didžiausias ilgis sumažėja, jei saugomi kelių baitų simboliai. Jei nurodomas M, stulpelis sukuriamas kaip mažiausias tipas, kuriame galima laikyti tokį skaičių simbolių.
  3. „MEDIUMTEXT“ (M) ir „LONGTEXT“ (M) yra panašios į „TEXT“ (M), tik todėl, kad maksimalus leistinas ilgis yra atitinkamai 16 777 215 ir 4 294 967 295 simboliai.

  1. DATA nurodo datą MMMM-MM-DD formatu.
  2. TIME rodo laiką HH: MM: SS.sss formatu (valanda, minutės, sekundės ir milisekundės).
  3. DATETIME yra DATE ir TIME derinys MMMM-MM-DD HH: MM: SS formatu.
  4. TIMESTAMP naudojamas apibrėžti momentą, kai eilutė buvo pridėta ar atnaujinta.

Peržiūrėję šiuos duomenų tipus, galėsite geriau nustatyti, kokį duomenų tipą turite priskirti tam tikram lentelės stulpeliui.

Pvz., Asmens vardas gali lengvai tilpti į „VARCHAR“ (50), o tinklaraščio įrašui reikės TEXT tipo (pasirinkite „M“ pagal savo poreikius).

Prieš pradedant kurti lenteles, yra dvi pagrindinės santykių duomenų bazių sąvokos, kurias turime peržiūrėti: pirminis ir užsienio raktai.

Pagrindiniame rakte yra reikšmė, kuri unikaliai identifikuoja kiekvieną lentelės eilutę arba įrašą. Kita vertus, svetimas raktas naudojamas susiejimui tarp dviejų lentelių duomenų sukurti ir valdyti duomenis, kuriuos galima saugoti lentelėje, kurioje yra svetimas raktas. Tiek pirminiai, tiek užsienio raktai paprastai yra INT.

Norėdami iliustruoti, naudokime BookstoreDB ir sukurkime dvi lenteles, pavadintas AuthorsTBL ir BooksTBL . Apribojimas NOT NULL rodo, kad susietam laukui reikalinga kita reikšmė nei NULL.

Be to, AUTO_INCREMENT naudojamas vienu pagrindu padidinti INT pirminio rakto stulpelių vertę, kai į lentelę įterpiamas naujas įrašas.

MariaDB [(none)]> USE BookstoreDB;

MariaDB [(none)]> CREATE TABLE AuthorsTBL (
AuthorID INT NOT NULL AUTO_INCREMENT,
AuthorName VARCHAR(100),
PRIMARY KEY(AuthorID)
);

MariaDB [(none)]> CREATE TABLE BooksTBL (
BookID INT NOT NULL AUTO_INCREMENT,
BookName VARCHAR(100) NOT NULL,
AuthorID INT NOT NULL,
BookPrice DECIMAL(6,2) NOT NULL,
BookLastUpdated TIMESTAMP,
BookIsAvailable BOOLEAN,
PRIMARY KEY(BookID),
FOREIGN KEY (AuthorID) REFERENCES AuthorsTBL(AuthorID)
);
MariaDB [(none)]> USE BookstoreDB;
Database changed
MariaDB [BookstoreDB]> CREATE TABLE AuthorsTBL (
    -> AuthorID INT NOT NULL AUTO_INCREMENT,
    -> AuthorName VARCHAR(100),
    -> PRIMARY KEY(AuthorID)
    -> );
Query OK, 0 rows affected (0.05 sec)

MariaDB [BookstoreDB]> CREATE TABLE BooksTBL (
    -> BookID INT NOT NULL AUTO_INCREMENT,
    -> BookName VARCHAR(100) NOT NULL,
    -> AuthorID INT NOT NULL,
    -> BookPrice DECIMAL(6,2) NOT NULL,
    -> BookLastUpdated TIMESTAMP,
    -> BookIsAvailable BOOLEAN,
    -> PRIMARY KEY(BookID),
    -> FOREIGN KEY (AuthorID) REFERENCES AuthorsTBL(AuthorID)
    -> );
Query OK, 0 rows affected (0.05 sec)

MariaDB [BookstoreDB]> 

Dabar galime pradėti įrašus įterpti į AuthorsTBL ir BooksTBL .

Pirmiausia užpildysime lentelę AuthorsTBL . Kodėl? Nes prieš įterpdami įrašus į „BooksTBL“ turime turėti AuthorID reikšmes.

Vykdykite šią užklausą iš savo „MariaDB“ raginimo:

MariaDB [BookstoreDB]> INSERT INTO AuthorsTBL (AuthorName) VALUES ('Agatha Christie'), ('Stephen King'), ('Paulo Coelho');

Po to mes atrinksime visus įrašus iš AuthorsTBL. Atminkite, kad norint sukurti „BooksTBL“ užklausą INSERT, kiekvienam įrašui reikės „AuthorID“.

Jei norite gauti vieną įrašą vienu metu, galite naudoti sąlygą WHERE nurodydami sąlygą, kurią turi atitikti eilutė, kad būtų grąžinta. Pavyzdžiui,

MariaDB [BookstoreDB]> SELECT * FROM AuthorsTBL WHERE AuthorName='Agatha Christie';

Arba galite vienu metu pasirinkti visus įrašus:

MariaDB [BookstoreDB]> SELECT * FROM AuthorsTBL;
MariaDB [BookstoreDB]> SELECT * FROM AuthorsTBL WHERE AuthorName='Agatha Christie';
+----------+-----------------+
| AuthorID | AuthorName      |
+----------+-----------------+
|        1 | Agatha Christie |
+----------+-----------------+
1 row in set (0.00 sec)

MariaDB [BookstoreDB]> SELECT * FROM AuthorsTBL;
+----------+-----------------+
| AuthorID | AuthorName      |
+----------+-----------------+
|        1 | Agatha Christie |
|        2 | Stephen King    |
|        3 | Paulo Coelho    |
+----------+-----------------+
3 rows in set (0.00 sec)

MariaDB [BookstoreDB]>

Dabar sukurkime „BooksTBL“ užklausą INSERT, naudodami atitinkamą „AuthorID“, kad atitiktų kiekvienos knygos autorių. „BookIsAvailable“ vertė 1 rodo, kad knygos yra sandėlyje, kitaip - 0:

MariaDB [BookstoreDB]> INSERT INTO BooksTBL (BookName, AuthorID, BookPrice, BookIsAvailable)
VALUES ('And Then There Were None', 1, 14.95, 1),
('The Man in the Brown Suit', 1, 23.99, 1),
('The Stand', 2, 35.99, 1),
('Pet Sematary', 2, 17.95, 0),
('The Green Mile', 2, 29.99, 1),
('The Alchemist', 3, 25, 1),
('By the River Piedra I Sat Down and Wept', 3, 18.95, 0);
MariaDB [BookstoreDB]> INSERT INTO BooksTBL (BookName, AuthorID, BookPrice, BookIsAvailable)
    -> VALUES ('And Then There Were None', 1, 14.95, 1),
    -> ('The Man in the Brown Suit', 1, 23.99, 1),
    -> ('The Stand', 2, 35.99, 1),
    -> ('Pet Sematary', 2, 17.95, 0),
    -> ('The Green Mile', 2, 29.99, 1),
    -> ('The Alchemist', 3, 25, 1),
    -> ('By the River Piedra I Sat Down and Wept', 3, 18.95, 0);
Query OK, 7 rows affected (0.03 sec)
Records: 7  Duplicates: 0  Warnings: 0

Šiuo metu atliksime SELECT, kad pamatytume „BooksTBL“ įrašus. Tada atnaujinkime Paulo Coelho „Alchemiko“ kainą ir vėl PASIRINKKIME tą konkretų įrašą.

Atkreipkite dėmesį, kaip dabar „BookLastUpdated“ lauke rodoma kitokia vertė. Kaip paaiškinome anksčiau, lauke TIMESTAMP rodoma reikšmė, kai įrašas buvo įdėtas ar paskutinį kartą modifikuotas.

MariaDB [BookstoreDB]> SELECT * FROM BooksTBL;
MariaDB [BookstoreDB]> UPDATE BooksTBL SET BookPrice=22.75 WHERE BookID=6;
MariaDB [BookstoreDB]> SELECT * FROM BooksTBL WHERE BookID=6;
MariaDB [BookstoreDB]> SELECT * FROM BooksTBL;
+--------+-----------------------------------------+----------+-----------+---------------------+-----------------+
| BookID | BookName                                | AuthorID | BookPrice | BookLastUpdated     | BookIsAvailable |
+--------+-----------------------------------------+----------+-----------+---------------------+-----------------+
|      1 | And Then There Were None                |        1 |     14.95 | 2016-10-01 23:31:41 |               1 |
|      2 | The Man in the Brown Suit               |        1 |     23.99 | 2016-10-01 23:31:41 |               1 |
|      3 | The Stand                               |        2 |     35.99 | 2016-10-01 23:31:41 |               1 |
|      4 | Pet Sematary                            |        2 |     17.95 | 2016-10-01 23:31:41 |               0 |
|      5 | The Green Mile                          |        2 |     29.99 | 2016-10-01 23:31:41 |               1 |
|      6 | The Alchemist                           |        3 |     25.00 | 2016-10-01 23:31:41 |               1 |
|      7 | By the River Piedra I Sat Down and Wept |        3 |     18.95 | 2016-10-01 23:31:41 |               0 |
+--------+-----------------------------------------+----------+-----------+---------------------+-----------------+
7 rows in set (0.00 sec)

MariaDB [BookstoreDB]> UPDATE BooksTBL SET BookPrice=22.75 WHERE BookID=6;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [BookstoreDB]> SELECT * FROM BooksTBL WHERE BookID=6;
+--------+---------------+----------+-----------+---------------------+-----------------+
| BookID | BookName      | AuthorID | BookPrice | BookLastUpdated     | BookIsAvailable |
+--------+---------------+----------+-----------+---------------------+-----------------+
|      6 | The Alchemist |        3 |     22.75 | 2016-10-01 23:35:00 |               1 |
+--------+---------------+----------+-----------+---------------------+-----------------+
1 row in set (0.00 sec)

MariaDB [BookstoreDB]> 

Nors mes to čia nepadarysime, bet taip pat galite ištrinti įrašą, jei jis nebebus naudojamas. Pavyzdžiui, tarkime, kad norime ištrinti „The Alchemist“ iš BooksTBL.

Norėdami tai padaryti, mes naudosime DELETE sakinį taip:

MariaDB [BookstoreDB]> DELETE FROM BooksTBL WHERE BookID=6;

Kaip ir „UPDATE“ atveju, pirmiausia verta atlikti „SELECT“, norint peržiūrėti įrašą (-us), kurį (-iuos) gali paveikti „DELETE“.

Taip pat nepamirškite pridėti sąlygos WHERE ir sąlygos (BookID = 6), kad pasirinktumėte konkretų įrašą, kurį norite pašalinti. Priešingu atveju rizikuojate ištrinti visas lentelės eilutes!

Jei norite susieti du (ar daugiau) laukus, galite naudoti teiginį CONCAT. Pavyzdžiui, tarkime, kad norime grąžinti rezultatų rinkinį, kurį sudaro vienas laukas su knygos pavadinimu ir autoriumi „Alchemikas (Paulo Coelho)“ ir kitas stulpelis su kaina.

Tam reikės JUNGTI tarp AuthorsTBL ir BooksTBL bendrame lauke, kurį bendrina abi lentelės (AuthorID):

MariaDB [BookstoreDB]> SELECT CONCAT(BooksTBL.BookName, ' (', AuthorsTBL.AuthorName, ')') AS Description, BooksTBL.BookPrice FROM AuthorsTBL JOIN BooksTBL ON AuthorsTBL.AuthorID = BooksTBL.AuthorID;

Kaip matome, CONCAT leidžia mums sujungti kelias eilutes, atskirtas kableliais. Jūs taip pat pastebėsite, kad mes pasirinkome pseudonimą Aprašas, kad atspindėtų sujungimo rezultatų rinkinį.

Ankstesnės užklausos išvestis rodoma žemiau esančiame paveikslėlyje:

MariaDB [BookstoreDB]> SELECT CONCAT(BooksTBL.BookName, ' (', AuthorsTBL.AuthorName, ')') AS Description, BooksTBL.BookPrice FROM AuthorsTBL JOIN BooksTBL ON AuthorsTBL.AuthorID = BooksTBL.AuthorID;
+--------------------------------------------------------+-----------+
| Description                                            | BookPrice |
+--------------------------------------------------------+-----------+
| And Then There Were None (Agatha Christie)             |     14.95 |
| The Man in the Brown Suit (Agatha Christie)            |     23.99 |
| The Stand (Stephen King)                               |     35.99 |
| Pet Sematary (Stephen King)                            |     17.95 |
| The Green Mile (Stephen King)                          |     29.99 |
| The Alchemist (Paulo Coelho)                           |     25.00 |
| By the River Piedra I Sat Down and Wept (Paulo Coelho) |     18.95 |
+--------------------------------------------------------+-----------+
7 rows in set (0.00 sec)

Naudoti root, norint atlikti visas DML operacijas duomenų bazėje, yra bloga idėja. Norėdami to išvengti, galime sukurti naują „MariaDB“ vartotojo abonementą (pavadinsime jį knygyno naudotoju) ir priskirti visus būtinus „BookstoreDB“ leidimus:

MariaDB [BookstoreDB]> CREATE USER [email  IDENTIFIED BY 'YourPasswordHere';
MariaDB [BookstoreDB]> GRANT ALL PRIVILEGES ON  BookstoreDB.* to [email ;
MariaDB [BookstoreDB]> FLUSH PRIVILEGES;
MariaDB [BookstoreDB]> CREATE USER [email  IDENTIFIED BY 'tecmint';
Query OK, 0 rows affected (0.00 sec)

MariaDB [BookstoreDB]> GRANT ALL PRIVILEGES ON  BookstoreDB.* to [email ;
Query OK, 0 rows affected (0.00 sec)

MariaDB [BookstoreDB]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Turėdami atskirą, atskirą vartotoją kiekvienai duomenų bazei, išvengsite visos duomenų bazės pažeidimų, jei pakenktų vienai paskyrai.

Norėdami išvalyti „MariaDB“ eilutę, įveskite šią komandą ir paspauskite „Enter“:

MariaDB [BookstoreDB]> \! clear

Norėdami patikrinti pateiktos lentelės konfigūraciją, atlikite šiuos veiksmus:

MariaDB [BookstoreDB]> SELECT COLUMNS IN [TABLE NAME HERE ];

Pavyzdžiui,

MariaDB [BookstoreDB]> SHOW COLUMNS IN BooksTBL;
MariaDB [BookstoreDB]> SHOW COLUMNS IN BooksTBL;
+-----------------+--------------+------+-----+-------------------+-----------------------------+
| Field           | Type         | Null | Key | Default           | Extra                       |
+-----------------+--------------+------+-----+-------------------+-----------------------------+
| BookID          | int(11)      | NO   | PRI | NULL              | auto_increment              |
| BookName        | varchar(100) | NO   |     | NULL              |                             |
| AuthorID        | int(11)      | NO   | MUL | NULL              |                             |
| BookPrice       | decimal(6,2) | NO   |     | NULL              |                             |
| BookLastUpdated | timestamp    | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| BookIsAvailable | tinyint(1)   | YES  |     | NULL              |                             |
+-----------------+--------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.02 sec)

Greitai patikrinus paaiškėja, kad laukas „BookIsAvailable“ pripažįsta NULL reikšmes. Kadangi mes nenorime to leisti, lentelę pakeisime taip:

MariaDB [BookstoreDB]> ALTER TABLE BooksTBL MODIFY BookIsAvailable BOOLEAN NOT NULL;

(Nedvejodami vėl rodykite stulpelius - pažymėtas TAIP aukščiau esančiame paveikslėlyje dabar turėtų būti NE).

Galiausiai, norėdami peržiūrėti visas serverio duomenų bazes, atlikite šiuos veiksmus:

MariaDB [BookstoreDB]> SHOW DATABASES;
OR
MariaDB [BookstoreDB]> SHOW SCHEMAS;
 mysql -u bookstoreuser -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.1.14-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [BookstoreDB]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| BookstoreDB        |
| information_schema |
+--------------------+
2 rows in set (0.00 sec)

MariaDB [BookstoreDB]> SHOW SCHEMAS;
+--------------------+
| Database           |
+--------------------+
| BookstoreDB        |
| information_schema |
+--------------------+
2 rows in set (0.00 sec)

Šiame paveikslėlyje parodytas pirmiau nurodytos komandos rezultatas, pasiekus MariaDB eilutę kaip knygyno naudotojas (atkreipkite dėmesį, kaip ši paskyra negali „pamatyti“ jokių kitų duomenų bazių, išskyrus „BookstoreDB“ ir „information_schema“ (prieinama visiems vartotojams):

Santrauka

Šiame straipsnyje mes paaiškinome, kaip vykdyti DML operacijas ir kaip sukurti duomenų bazę, lenteles ir specialius vartotojus MariaDB duomenų bazėje. Be to, pasidalijome keliais patarimais, kurie gali palengvinti jūsų, kaip sistemos/duomenų bazės administratoriaus, gyvenimą.

  1. „MySQL“ duomenų bazių administravimo 1 dalis
  2. „MySQL“ duomenų bazių administravimo 2 dalis
  3. „MySQL“ našumo valdymas ir optimizavimas - 3 dalis

Jei turite klausimų apie šį straipsnį, nedvejodami praneškite mums! Norėdami susisiekti su mumis, drąsiai naudokitės žemiau esančia komentaro forma.