Ачааллж байна...
Түвшин 1-ийн төгсгөлд хүрлээ. Өнгөрсөн арван нэгэн хичээлд та SQL-ийн бүх үндсэн үйлдлийг нэг нэгээр нь сурсан: SELECT-ээр унших, WHERE-ээр шүүх, LIKE, IN, BETWEEN-ээр нарийн хайх, NULL-тэй зөв харьцах, ORDER BY, LIMIT, DISTINCT-ээр үр дүнг хэлбэржүүлэх, INSERT, UPDATE, DELETE-ээр өгөгдлийг өөрчлөх. Гэвч бид тэдгээрийг үргэлж бэлэн өгөгдөл дээр, бие биенээсээ тусад нь ашиглаж ирсэн. Энэ хичээлд бүгдийг нэг төсөлд нийлүүлнэ.
Бид шинэ өгөгдлийн сан үүсгэж, таны үзсэн киноны жагсаалтыг хадгална. Хоосон файлаас эхэлж, хүснэгт үүсгэж, кинонуудаа нэмж, тэднээс янз бүрийн асуулт асууж, алдаагаа засаж, илүүдлийг устгаж, эцэст нь ажлаа хадгалж backup хийнэ. Энэ бол удирдамжтай дасгал (guided build) бөгөөд алхам бүрийг дагаж хийхэд л хангалттай — шинээр зохион бодох зүйл байхгүй. Алхам бүрийн төгсгөлд "шалгах цэг" байх бөгөөд таны хүснэгт тэр цэг дээр яг ямар байх ёстойг харуулна.
Хичээлийн жишээнд би кинонуудын жагсаалт өгсөн ч хэрэв хүсвэл өөрийн үнэхээр үзсэн кинонуудыг ашиглаж болно. Гэхдээ эхний удаад хичээлийн өгөгдлөөр дагаж хийхийг зөвлөж байна, учир нь тэгвэл таны үр дүн шалгах цэгүүдтэй яг таарах бөгөөд ямар нэг зүйл зөрвөл шууд анзаарах боломжтой. Дараа нь өөрийн өгөгдлөөр дахин хийх нь хамгийн сайн давталт болно.
Эцсийн үр дүн нь movies.db нэртэй өгөгдлийн сан бөгөөд дотор нь movies гэсэн нэг хүснэгт байна. Хүснэгт бүр киноны дараах мэдээллийг хадгална: давтагдашгүй дугаар (id), киноны нэр (title), гарсан он (year), төрөл (genre), таны өгсөн үнэлгээ 1-ээс 10 хүртэл (rating), мөн та хэзээ үзсэн огноо (watched_on). Үнэлгээ өгөөгүй кино ч байж болох бөгөөд энэ нь NULL-ийн яг тохирох хэрэглээ байх болно — "хараахан үнэлээгүй."
DB Browser for SQLite-ийг нээнэ. Хэрэв library.db нээлттэй байвал хадгалаагүй өөрчлөлт байхгүй эсэхийг шалгаарай (Write Changes товч саарал байх ёстой).
Хэрэгслийн мөрөөс New Database дарна.
Documents\sql-course хавтас руу ороод файлын нэрд movies гэж бичээд Save дарна.
Edit table definition цонх гарч ирэхэд Cancel дарна — хүснэгтээ SQL-ээр үүсгэнэ.
Шалгах цэг 1: Цонхны гарчигт movies.db гэж бичигдсэн, Database Structure таб хоосон байна. sql-course хавтсанд одоо library.db болон movies.db гэсэн хоёр файл бий. Хоёр өөр дэвтэр, нэг ширээ.
Execute SQL таб руу шилжээд дараах тушаалыг ажиллуулна:
sql
CREATE TABLE movies (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
year INTEGER,
genre TEXT,
rating INTEGER,
watched_on TEXT
);CREATE TABLE-ийн бүх нарийн ширийнийг Бүлэг 4-т сурна. Одоохондоо мөр бүрийг ингэж уншаад хангалттай: “movies гэсэн хүснэгт үүсгэ; түүний id нь бүхэл тоо бөгөөд мөр бүрийн давтагдашгүй дугаар байна (автоматаар олгогдоно); title нь текст бөгөөд хоосон байж болохгүй; year нь бүхэл тоо; genre нь текст; rating нь бүхэл тоо; watched_on нь текст.” Бүлэг 1-ийн бэлтгэлийн скриптэд яг ийм тушаалуудыг уншилгүй ажиллуулсан бол одоо та тэдгээрийг бараг ойлгож байгаа.
Огноог текстээр хадгалж байгаа нь санамсаргүй биш. SQLite-д огнооны тусгай төрөл байдаггүй бөгөөд огноог '2026-03-14' гэх мэт он-сар-өдөр (YYYY-MM-DD) хэлбэрийн текстээр хадгалах нь тогтсон дадал юм. Энэ хэлбэрийн гайхалтай давуу тал бий: том нэгж эхэндээ, жижиг нь сүүлдээ байдаг тул текстийн энгийн эрэмбэлэлт огнооны эрэмбэлэлттэй яг таардаг. '2026-03-14' нь '2026-05-17'-оос текстийн хувьд ч бага, огнооны хувьд ч эрт. Тиймээс ORDER BY, BETWEEN, <, > бүгд огноон дээр зөв ажиллана — гэхдээ зөвхөн та бүх огноогоо яг энэ хэлбэрээр, сар өдрийг хоёр оронтойгоор (03, 9 биш 09) бичсэн үед.
Шалгах цэг 2: Мессеж Execution finished without errors. Database Structure табд movies хүснэгт зургаан баганатай харагдана.
Эхлээд үнэлгээтэй долоон киног нэг тушаалаар нэмнэ. Баганын жагсаалтыг үргэлж бичих дадлаа санаарай — id-ийг бичихгүй, SQLite өөрөө олгоно:
sql
INSERT INTO movies (title, year, genre, rating, watched_on)
VALUES
('Цогт тайж', 1945, 'Түүх', 8, '2026-03-14'),
('The Matrix', 1999, 'Уран зөгнөлт', 9, '2026-01-05'),
('Spirited Away', 2001, 'Хүүхэлдэйн', 10, '2026-02-20'),
('The Story of the Weeping Camel', 2003, 'Баримтат', 7, '2026-04-02'),
('Mongol', 2007, 'Түүх', 8, '2026-03-28'),
('Inception', 2010, 'Уран зөгнөлт', 9, '2026-05-17'),
('Parasite', 2019, 'Драм', 9, '2026-05-30');Мессеж: 7 rows affected. Энэ тушаал юу гэж хэлж байна вэ гэвэл: “movies хүснэгтэд title, year, genre, rating, watched_on баганууддаа харгалзах утгатай долоон шинэ мөр нэм.”
Одоо сая үзсэн, гэхдээ хараахан үнэлгээ өгөөгүй нэг киног нэмье. Баганын жагсаалтаас rating-ийг санаатайгаар орхино:
sql
INSERT INTO movies (title, year, genre, watched_on)
VALUES ('Interstellar', 2014, 'Уран зөгнөлт', '2026-06-09');Мессеж: 1 rows affected. Энэ тушаал юу гэж хэлж байна вэ гэвэл: “movies хүснэгтэд rating-гүйгээр Interstellar киног нэм.” Баганын жагсаалтад нэрлээгүй rating автоматаар NULL болно — "хараахан үнэлээгүй" гэсэн үнэн. Хэрэв бид 0 бичсэн бол "маш муу кино" гэсэн худал мэдээлэл болох байсан.
Одоо ажлаа хадгална: Write Changes (Ctrl+S).
Шалгах цэг 3: SELECT * FROM movies; ажиллуулахад:
id | title | year | genre | rating | watched_on
---+--------------------------------+------+--------------+--------+-----------
1 | Цогт тайж | 1945 | Түүх | 8 | 2026-03-14
2 | The Matrix | 1999 | Уран зөгнөлт | 9 | 2026-01-05
3 | Spirited Away | 2001 | Хүүхэлдэйн | 10 | 2026-02-20
4 | The Story of the Weeping Camel | 2003 | Баримтат | 7 | 2026-04-02
5 | Mongol | 2007 | Түүх | 8 | 2026-03-28
6 | Inception | 2010 | Уран зөгнөлт | 9 | 2026-05-17
7 | Parasite | 2019 | Драм | 9 | 2026-05-30
8 | Interstellar | 2014 | Уран зөгнөлт | NULL | 2026-06-09Найман мөр, Interstellar-ийн rating NULL, Write Changes товч саарал. Хэрэв таны хүснэгт яг ийм биш бол Алхам 2-оос дахин эхлэхийн тулд DROP TABLE movies; ажиллуулаад үргэлжлүүлж болно.
Жагсаалтаа хамгийн шилдэг гурван киногоор нь эхлүүлье. Query:
sql
SELECT title, rating
FROM movies
ORDER BY rating DESC, title
LIMIT 3;Үр дүн:
title | rating
--------------+-------
Spirited Away | 10
Inception | 9
Parasite | 9Энэ query юу гэж хэлж байна вэ гэвэл: “movies хүснэгтийн мөрүүдийг rating-ээр нь ихээс бага руу, үнэлгээ тэнцвэл title-ээр нь цагаан толгойн дарааллаар эрэмбэлээд, эхний гурвынх нь title болон rating-ийг харуул.” 9 оноотой гурван кино (The Matrix, Inception, Parasite) байгаа тул тэнцээг нэрээр шийдсэн нь чухал байлаа — эс бөгөөс гурав дахь байранд аль нь гарах нь баталгаагүй болох байсан. Нэрээр эрэмбэлэхэд “Inception”, “Parasite”, “The Matrix” гэсэн дараалал гарсан тул The Matrix дөрөвдүгээр байранд шилжиж, LIMIT-ээр таслагдсан. Мөн Interstellar-ийн NULL үнэлгээ SQLite-д DESC эрэмбэлэлтийн хамгийн төгсгөлд очдог тул топ гуравт орох боломжгүй байсан.
Одоо өгөгдлөөсөө зургаан асуулт асууна. Асуулт бүр Түвшин 1-ийн нэг хэрэгслийг ашиглана. Query бүрийг ажиллуулахаасаа өмнө чангаар уншаад, хүснэгтээс хариултыг нь таамаглаарай.
Асуулт 1: 9-өөс дээш оноотой уран зөгнөлт кинонууд аль нь вэ?
sql
SELECT title, rating
FROM movies
WHERE genre = 'Уран зөгнөлт' AND rating >= 9;Үр дүн:
title | rating
-----------+-------
The Matrix | 9
Inception | 9Энэ query юу гэж хэлж байна вэ гэвэл: “movies хүснэгтээс genre нь 'Уран зөгнөлт' бөгөөд rating нь 9 буюу түүнээс их мөрүүдийн title болон rating-ийг харуул.” Уран зөгнөлт гурван кино байгаа ч Interstellar ороогүй — түүний rating NULL тул NULL >= 9 гэдэг асуултын хариулт "мэдэхгүй" гарсан. Бүлэг 2-ын NULL-ийн хичээлийн сургамж таны өөрийн өгөгдөл дээр давтагдлаа.
Асуулт 2: “The”-ээр эхэлсэн нэртэй кинонууд аль нь вэ?
sql
SELECT title
FROM movies
WHERE title LIKE 'The %';Үр дүн:
title
------------------------------
The Matrix
The Story of the Weeping CamelЭнэ query юу гэж хэлж байна вэ гэвэл: “movies хүснэгтээс title нь ‘The ‘ (зайтай) гэж эхэлсэн мөрүүдийн title-ийг харуул.” Хэв маягт зайг санаатайгаар оруулсан: 'The%' гэвэл “Theater” гэх мэт “The”-ээр эхэлсэн өөр үгтэй нэр ч таарах байсан.
Асуулт 3: Түүхэн болон баримтат кинонуудаас юу үзсэн бэ?
sql
SELECT title, genre
FROM movies
WHERE genre IN ('Түүх', 'Баримтат');Үр дүн:
title | genre
-------------------------------+---------
Цогт тайж | Түүх
The Story of the Weeping Camel | Баримтат
Mongol | ТүүхЭнэ query юу гэж хэлж байна вэ гэвэл: “movies хүснэгтээс genre нь ('Түүх', 'Баримтат') жагсаалтад байгаа мөрүүдийг харуул.”
Асуулт 4: Гуравдугаар сард ямар кино үзсэн бэ?
sql
SELECT title, watched_on
FROM movies
WHERE watched_on BETWEEN '2026-03-01' AND '2026-03-31';Үр дүн:
title | watched_on
----------+-----------
Цогт тайж | 2026-03-14
Mongol | 2026-03-28Энэ query юу гэж хэлж байна вэ гэвэл: “movies хүснэгтээс watched_on нь 2026 оны 3-р сарын 1-ээс 31-ний хооронд, хоёр хязгаараа оруулаад, байгаа мөрүүдийг харуул.” Алхам 2-т огноог YYYY-MM-DD хэлбэрээр хадгалах шалтгааныг тайлбарласан нь энд үр дүнгээ өглөө: текстийн BETWEEN огнооны хүрээ шиг зөв ажилласан. BETWEEN хязгаараа багтаадаг тул хэрэв та 3-р сарын 31-нд кино үзсэн бол тэр ч орох байсан.
Асуулт 5: Аль кинод үнэлгээ өгөхөө мартсан бэ?
sql
SELECT title
FROM movies
WHERE rating IS NULL;Үр дүн:
title
------------
InterstellarЭнэ query юу гэж хэлж байна вэ гэвэл: “movies хүснэгтээс rating нь хоосон мөрүүдийн title-ийг харуул.” = NULL биш, IS NULL — энэ ялгааг та одоо автоматаар бичдэг болсон байх.
Асуулт 6: Ямар ямар төрлийн кино үздэг вэ?
sql
SELECT DISTINCT genre
FROM movies
ORDER BY genre;Үр дүн:
genre
------------
Баримтат
Драм
Түүх
Уран зөгнөлт
ХүүхэлдэйнЭнэ query юу гэж хэлж байна вэ гэвэл: “movies хүснэгтээс genre-ийн давхардалгүй утгуудыг цагаан толгойн дарааллаар харуул.” Найман кино таван төрөлд хуваагдаж байна. Хэрэв та жанр бүрт хэдэн кино үзсэнийг мэдэхийг хүсвэл — энэ бол Бүлэг 8-ын GROUP BY-ийн асуулт бөгөөд тэнд хүрэхэд энэ жагсаалт руугаа эргэж ирж болно.
Шалгах цэг 5: Энэ алхамд бид зөвхөн уншсан тул хүснэгт Шалгах цэг 3-тай яг ижил, Write Changes товч саарал хэвээр байна.
Interstellar-ийг эргэцүүлээд 10 оноо өгөхөөр шийдлээ. Эхлээд SELECT, дараа нь UPDATE гэсэн дадлаа дагана. Алхам 1:
sql
SELECT *
FROM movies
WHERE id = 8;Үр дүн:
id | title | year | genre | rating | watched_on
---+--------------+------+--------------+--------+-----------
8 | Interstellar | 2014 | Уран зөгнөлт | NULL | 2026-06-09Нэг мөр, зөв кино. Алхам 2 — эхний хоёр мөрийг солиод, WHERE-д хүрэхгүй:
sql
UPDATE movies
SET rating = 10
WHERE id = 8;Мессеж: 1 rows affected. Алхам 3: SELECT нэг мөр, UPDATE нэг мөр — таарч байна. Энэ query юу гэж хэлж байна вэ гэвэл: “movies хүснэгтэд id нь 8 байгаа мөрийн rating-ийг 10 болго.” Write Changes дарна.
Шалгах цэг 6: SELECT title, rating FROM movies WHERE id = 8; нь Interstellar | 10 гэж буцаана.
Бодит амьдралд өгөгдөл оруулахад алдаа гардаг. Үүнийг дуурайхын тулд Inception-ийг санамсаргүй дахин, бас алдаатай нэрээр нэмье:
sql
INSERT INTO movies (title, year, genre, rating, watched_on)
VALUES ('Inceptoin', 2010, 'Уран зөгнөлт', 9, '2026-05-17');Одоо давхар бичилтийг олъё. Нэрээр нь хайвал хоёр бичилт хоёулаа гарч ирэх хэв маяг ашиглана:
sql
SELECT *
FROM movies
WHERE title LIKE 'Incep%';Үр дүн:
id | title | year | genre | rating | watched_on
---+-----------+------+--------------+--------+-----------
6 | Inception | 2010 | Уран зөгнөлт | 9 | 2026-05-17
9 | Inceptoin | 2010 | Уран зөгнөлт | 9 | 2026-05-17Энэ query юу гэж хэлж байна вэ гэвэл: “movies хүснэгтээс title нь ‘Incep’-ээр эхэлсэн мөрүүдийг харуул.” Энд чухал сургамж бий. Хэрэв бид энэ SELECT-ийг шууд DELETE болгон хувиргавал зөв бичилт (id 6) ч мөн устгагдана — SELECT хоёр мөр харуулсан нь DELETE хоёр мөр устгах гэж байна гэсэн үг. Бидний зорилго бол зөвхөн алдаатай нь. Тиймээс энэ SELECT нь устгах мөрийг олох хэрэгсэл болсон бөгөөд одоо түүний id-г (9) мэдлээ. Өөрчлөх, устгах үйлдэлд нэрээр биш, id-аар шүүх нь яг ийм учиртай.
WHERE-ийг нарийсгаж дахин шалгана:
sql
SELECT *
FROM movies
WHERE id = 9;Нэг мөр — Inceptoin. Одоо SELECT *-ийг DELETE-ээр солино:
sql
DELETE
FROM movies
WHERE id = 9;Мессеж: 1 rows affected. Энэ query юу гэж хэлж байна вэ гэвэл: “movies хүснэгтээс id нь 9 байгаа мөрийг устга.” Write Changes дарна.
Шалгах цэг 7: SELECT * FROM movies; нь Шалгах цэг 3-ын найман мөрийг буцаах бөгөөд ганц ялгаа нь Interstellar-ийн rating одоо 10.
Ажил дууслаа. Write Changes товч саарал байгаа эсэхийг шалгаад (хадгалаагүй өөрчлөлт байхгүй гэсэн үг), DB Browser-ийн цэснээс File → Close Database дарна. Дараа нь File Explorer-оор Documents\sql-course хавтас руу ороод movies.db файлыг хуулж, movies-backup.db нэрээр хадгална. Өмнөх хичээлд сурсанчлан SQLite-ийн backup бол файлын энгийн хуулбар юм. Хэрэв ирээдүйд энэ өгөгдлийн сан дээр туршилт хийж байгаад ямар нэг юм эвдэвэл backup таныг аварна.
Хэрэв та "Хөгжүүлэгчийн хэрэгсэл" сургалтад Git-ийг сурсан бол энэ ажлаа Git-д хадгалах нь сайн дадал. Execute SQL табд энэ хичээлийн бүх query-г нэг дор бичээд, табын дээд талын Save SQL file товчоор movies.sql нэртэй файл болгон хадгалж, sql-course хавтасдаа git add movies.sql болон git commit -m "Add movies database queries" хийж болно. .sql файл нь текст тул Git түүний өөрчлөлтийг мөр бүрээр харуулна.
Эцсийн шалгах цэг: sql-course хавтсанд library.db, movies.db, movies-backup.db гурван файл байна. movies.db-г дахин нээвэл:
id | title | year | genre | rating | watched_on
---+--------------------------------+------+--------------+--------+-----------
1 | Цогт тайж | 1945 | Түүх | 8 | 2026-03-14
2 | The Matrix | 1999 | Уран зөгнөлт | 9 | 2026-01-05
3 | Spirited Away | 2001 | Хүүхэлдэйн | 10 | 2026-02-20
4 | The Story of the Weeping Camel | 2003 | Баримтат | 7 | 2026-04-02
5 | Mongol | 2007 | Түүх | 8 | 2026-03-28
6 | Inception | 2010 | Уран зөгнөлт | 9 | 2026-05-17
7 | Parasite | 2019 | Драм | 9 | 2026-05-30
8 | Interstellar | 2014 | Уран зөгнөлт | 10 | 2026-06-09Хэрэв сонирхож байвал энэ өгөгдлийн санг одоо өөрийн болгоорой. Үзсэн кинонуудаа нэмж, хичээлийн жишээ кинонуудаас үзээгүйгээ SELECT-ээр шалгаад DELETE-ээр устгаж болно. Дараа нь өөрөө асуулт зохиогоод үзээрэй: 2000 оноос өмнөх кинонуудаас аль нь хамгийн өндөр үнэлгээтэй вэ? Энэ онд хамгийн сүүлд үзсэн гурван кино аль нь вэ? Нэрэндээ “Mongol” гэдэг үгтэй кино байна уу? Өгөгдөл өөрчлөхийн өмнө backup хийх, эхлээд SELECT хийх дадлаа мартуузай. Эдгээр нь зөвхөн санал бөгөөд дараагийн хичээлүүд тэдгээрийг хийсэн гэж тооцохгүй.
Огноог буруу хэлбэрээр бичих. Хэрэв нэг кинонд '2026-3-14' (сарыг нэг оронтойгоор) эсвэл '14/03/2026' гэж бичвэл алдааны мессеж гарахгүй, гэвч Асуулт 4-ийн BETWEEN тэр киног олохгүй, ORDER BY буруу байранд тавина. Шалтгаан нь текстийн харьцуулалт тэмдэгт бүрээр явагддагт: '2026-3-14' нь '2026-03-01'-ээс их, '2026-03-31'-ээс ч их гарна, учир нь “3” тэмдэгт “0”-оос их. Огноог үргэлж YYYY-MM-DD хэлбэрээр, тэгээр нөхсөн хоёр оронтой сар, өдөртэй бичээрэй.
Өөр өгөгдлийн сан нээлттэй байхад query ажиллуулах. DB Browser нэг удаад нэг өгөгдлийн сан нээдэг. Хэрэв library.db нээлттэй байхад SELECT * FROM movies; ажиллуулбал no such table: movies гарна. Энэ мессеж юу гэж хэлж байна вэ гэвэл: "одоо нээлттэй өгөгдлийн санд movies гэдэг хүснэгт байхгүй." Цонхны гарчигт аль файл нээлттэй байгааг шалгаарай.
Нэрээр шүүж устгах. Алхам 7-д харсанчлан нэр эсвэл LIKE-ээр шүүсэн DELETE нь санамсаргүй зөв мөрийг ч барьж болно. Өөрчлөх, устгах үйлдэлд id-аар шүүх нь хамгийн найдвартай.
Хүснэгтийг дахин үүсгэх гэж оролдох. Алхам 2-ын CREATE TABLE-ийг хоёр дахь удаа ажиллуулбал table movies already exists гэсэн алдаа гарна. Утга нь “movies хүснэгт аль хэдийн байна.” Хэрэв та үнэхээр эхнээс нь эхлэхийг хүсвэл эхлээд DROP TABLE movies; ажиллуулах хэрэгтэй — гэхдээ энэ нь доторх бүх киног устгана гэдгийг санаарай.
Backup-ийг DB Browser нээлттэй, хадгалаагүй өөрчлөлттэй байхад хийх. Хадгалаагүй өөрчлөлт файлд хараахан ороогүй тул backup хуулбарт ч орохгүй. Backup хийхээсээ өмнө Write Changes дарж, өгөгдлийн сангаа хаах нь хамгийн найдвартай.
Энэ дасгалд та хоосон файлаас эхэлж бүтэн өгөгдлийн сан бүтээлээ. Хүснэгт үүсгэж, олон мөрийн болон баганын жагсаалттай INSERT-ээр кинонуудаа нэмж, ORDER BY ба LIMIT-ээр шилдгүүдээ гаргаж, WHERE, AND, LIKE, IN, BETWEEN, IS NULL, DISTINCT-ээр зургаан өөр асуултад хариулж, эхлээд SELECT хийх дадлаар UPDATE болон DELETE-ийг аюулгүй гүйцэтгэж, эцэст нь ажлаа хадгалж backup хийлээ. Замдаа огноог YYYY-MM-DD текстээр хадгалах шалтгаан, мөн өөрчлөх үйлдэлд нэрээр биш id-аар шүүхийн ач холбогдлыг өөрийн өгөгдөл дээр харлаа.
Ингээд Түвшин 1 — “SQL хэлтэй нүүр тулах” — бүрэн дууслаа. Сургалтын эхэнд "миний код ажилладаг, гэхдээ доор нь юу болдгийг би мэдэхгүй" гэсэн мэдрэмжийн тухай ярьсан. Одоо та тэр "доор нь" байдаг хэлийг уншиж, бичиж чаддаг болсон. Дараагийн түвшинд бид өөр төрлийн асуултад шилжинэ: хүснэгтийг хэрхэн зөв зохион байгуулах вэ? Бүлэг 4-т өнөөдөр бэлэн скриптээр ажиллуулсан CREATE TABLE-ийг бүрэн ойлгож, багана бүрд ямар дүрэм тавьж болохыг сурна.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.