Ачааллж байна...
Өмнөх хичээлд бид library.db өгөгдлийн сан үүсгэж, books болон members хүснэгтүүдийг дүүргэж, үр дүнг Browse Data табаас нүдээр харсан. Энэ хичээлд бид тэр хүснэгтүүдийг анх удаа SQL-ээр уншина. Үүний тулд SELECT гэдэг SQL-ийн хамгийн их хэрэглэгддэг тушаалыг сурна. Мэргэжлийн хөгжүүлэгчийн бичдэг SQL-ийн дийлэнх нь SELECT-ээр эхэлдэг тул энэ хичээл бол бүх сургалтын суурь чулуу юм.
Энэ хичээлээс эхлэн бид сургалтын онцгой дадлыг хэвшүүлнэ: query бүрийг задлахаасаа өмнө монгол хэлээр чангаар уншина. Энэ нь эхэндээ жаахан хачин санагдаж магадгүй, гэхдээ шалтгаан нь энгийн. SQL нь юу хүсэж байгаагаа хэлдэг хэл тул query-г монгол өгүүлбэр болгон хөрвүүлж чадвал та түүнийг үнэхээр ойлгосон гэсэн үг. Харин хөрвүүлж чадахгүй бол хаа нэгтээ ойлголт дутуу байгааг тэр даруй мэдэрнэ.
Мөн энэ хичээлээс эхлэн жишээ бүрийг ижил хэлбэрээр харуулна: эхлээд хүснэгтийн одоогийн өгөгдөл, дараа нь query, дараа нь үр дүн, хамгийн сүүлд тайлбар. Хүснэгтүүд маань жижиг тул мөр бүрт юу тохиолдсоныг та өөрийн нүдээр мөшгиж чадна.
Хүснэгт бол бүртгэлийн дэвтэр гэдгийг бид мэднэ. Тэгвэл SELECT бол номын санчид өгдөг хүсэлтийн хуудас юм. Та номын санчид "Номын бүртгэлийн дэвтрээс бүх зүйлийг хуулж өгөөч" гэж хэлж болно, эсвэл "Номын бүртгэлийн дэвтрээс зөвхөн номын нэр болон хэвлэгдсэн оныг хуулж өгөөч" гэж хэлж болно. Аль ч тохиолдолд номын санч дэвтрийг өөрчлөхгүй — зөвхөн хуулбар бэлдэж танд өгнө.
Энэ хамгийн чухал санаа: SELECT өгөгдлийг хэзээ ч өөрчилдөггүй. Та SELECT-ийг хэдэн мянган удаа ажиллуулсан ч books хүснэгт тань яг хэвээрээ үлдэнэ. Тиймээс энэ хичээлд та юуг ч эвдэхээс айх хэрэггүй — хүссэнээрээ туршиж, алдаж, дахин бичиж болно. Өгөгдлийг өөрчилдөг тушаалууд (INSERT, UPDATE, DELETE) Бүлэг 3-т ирэх бөгөөд тэр үед бид болгоомжлолын дадлыг сурна.
Номын санчийн хуулж өгсөн хуудас нь DB Browser дахь үр дүнгийн хүснэгт (result grid) юм. Энэ нь жинхэнэ хүснэгттэй адилхан харагддаг ч түр зуурын хуулбар бөгөөд дараагийн query ажиллуулахад алга болно.
DB Browser-оо нээгээд Documents\sql-course\library.db файлыг Open Database товчоор нээгээрэй (хэрэв нээлттэй байгаа бол шууд үргэлжлүүлнэ). Дараа нь Execute SQL таб руу шилжинэ. Хэрэв бичих талбарт өмнөх хичээлийн скрипт үлдсэн байвал бүгдийг нь сонгоод (Ctrl+A) устгаарай.
Одоо books хүснэгт ийм байгаа:
id | title | author | year | genre | copies
---+--------------------------+------------------+------+-------------+-------
1 | Монголын нууц товчоо | NULL | 1240 | Түүх | 2
2 | Тунгалаг Тамир | Ч.Лодойдамба | 1962 | Роман | 3
3 | Учиртай гурван толгой | Д.Нацагдорж | 1934 | Жүжиг | 1
4 | Clean Code | Robert C. Martin | 2008 | Програмчлал | 4
5 | Python Crash Course | Eric Matthes | 2015 | Програмчлал | 5
6 | The Pragmatic Programmer | Andrew Hunt | 1999 | Програмчлал | 2Бичих талбарт дараах query-г бичээд F5 (эсвэл Ctrl+Enter, эсвэл гурвалжин товч) дарна:
sql
SELECT * FROM books;Үр дүн:
id | title | author | year | genre | copies
---+--------------------------+------------------+------+-------------+-------
1 | Монголын нууц товчоо | NULL | 1240 | Түүх | 2
2 | Тунгалаг Тамир | Ч.Лодойдамба | 1962 | Роман | 3
3 | Учиртай гурван толгой | Д.Нацагдорж | 1934 | Жүжиг | 1
4 | Clean Code | Robert C. Martin | 2008 | Програмчлал | 4
5 | Python Crash Course | Eric Matthes | 2015 | Програмчлал | 5
6 | The Pragmatic Programmer | Andrew Hunt | 1999 | Програмчлал | 2Энэ query юу гэж хэлж байна вэ гэвэл: “books хүснэгтээс бүх баганыг сонгож өг.” Одоо үг бүрийг задалъя. SELECT нь "сонго" гэсэн утгатай бөгөөд query-ний эхэнд ирж, бид ямар багануудыг хүсэж байгааг зарладаг. * тэмдэгтийг "од" гэж уншдаг бөгөөд SQL-д "бүх багана" гэсэн утгатай — та зургаан баганын нэрийг нэг бүрчлэн бичихийн оронд нэг тэмдэгтээр хэлж байна. FROM нь “-аас/-ээс” гэсэн утгатай бөгөөд ямар хүснэгтээс уншихыг заана. books бол хүснэгтийн нэр. Хамгийн сүүлийн цэг таслал (;) нь "энэ query энд дуусав" гэсэн тэмдэг юм.
Үр дүн нь анхны хүснэгттэй яг адилхан харагдаж байгааг анзаараарай. Учир нь бид бүх баганыг, бүх мөрийг хүссэн бөгөөд ямар ч нөхцөл тавиагүй. DB Browser-ийн доод хэсэгт байх мессежийн талбарт 6 rows returned in 0ms from: SELECT * FROM books; гэх мэт мөр гарна. Үүнийг уншвал: "энэ query-ээс 6 мөр буцаж ирлээ, гүйцэтгэхэд 0 миллисекунд зарцууллаа." Хугацаа танд арай өөр байж болох ч зургаан мөр гэдэг тоо яг ижил байх ёстой. Энэ мессежийг query ажиллуулах бүрдээ харах дадал гаргаарай — хэдэн мөр ирсэн нь query зөв ажилласан эсэхийг шалгах хамгийн хурдан арга юм.
Жишээ 1: зөвхөн нэг багана сонгох
Ихэнх тохиолдолд бидэнд хүснэгтийн бүх багана хэрэггүй. Жишээ нь, номын сан ямар номтойг харахыг хүсвэл зөвхөн номын нэр хангалттай. Хүснэгт нь дээрхтэй адил хэвээр байгаа. Query:
sql
SELECT title FROM books;Үр дүн:
title
------------------------
Монголын нууц товчоо
Тунгалаг Тамир
Учиртай гурван толгой
Clean Code
Python Crash Course
The Pragmatic ProgrammerЭнэ query юу гэж хэлж байна вэ гэвэл: “books хүснэгтээс зөвхөн title баганыг сонгож өг.” Энд *-ийн оронд баганын нэрийг шууд бичсэн. Үр дүнд зургаан мөр хэвээр ирсэн ч мөр бүрт зөвхөн нэг багана үлдсэн. Энэ нь чухал ялгааг харуулж байна: SELECT-ийн дараа бичсэн баганын жагсаалт нь хэдэн мөр ирэхийг өөрчилдөггүй, харин мөр бүрээс ямар хэсгийг авахыг шийддэг. Хэдэн мөр ирэхийг шийддэг хэрэгсэл — WHERE — дараагийн бүлэгт ирнэ.
Жишээ 2: хэд хэдэн багана сонгох
Одоо номын нэр, зохиогч, хэвлэгдсэн оныг хамт харъя. Query:
sql
SELECT title, author, year FROM books;Үр дүн:
title | author | year
-------------------------+------------------+-----
Монголын нууц товчоо | NULL | 1240
Тунгалаг Тамир | Ч.Лодойдамба | 1962
Учиртай гурван толгой | Д.Нацагдорж | 1934
Clean Code | Robert C. Martin | 2008
Python Crash Course | Eric Matthes | 2015
The Pragmatic Programmer | Andrew Hunt | 1999Энэ query юу гэж хэлж байна вэ гэвэл: “books хүснэгтээс title, author, year гэсэн гурван баганыг сонгож өг.” Олон багана сонгохдоо баганын нэрсийг таслалаар тусгаарладаг. Сүүлийн баганын дараа таслал тавьдаггүйг анзаараарай — энэ нь Python-ы жагсаалтаас ялгаатай бөгөөд эхлэгчдийн түгээмэл алдааны нэг юм (доор Түгээмэл алдаанууд хэсэгт харуулна). Мөн "Монголын нууц товчоо"-ны author нүдэнд NULL гэж харагдаж байгаа нь зохиогч нь тодорхойгүй гэсэн утгатай бөгөөд энэ тухай Бүлэг 2-т бүтэн хичээл бий.
Энэ query болон SELECT * FROM books; хоёрын хооронд практик ялгаа бий. Манай жижиг хүснэгтэд ялгаа мэдрэгдэхгүй ч бодит ажилд нэг хүснэгт хэдэн арван баганатай, тэдгээрийн зарим нь урт текст хадгалдаг байж болно. Тийм үед * ашиглавал хэрэггүй их өгөгдөл сүлжээгээр дамжиж, програм удаашрах шалтгаан болдог. Тиймээс * нь хүснэгттэй анх танилцах, судлахад тохиромжтой бол бодит програмын код дотор хэрэгтэй багануудаа нэрлэж бичих нь сайн дадал юм.
Жишээ 3: баганын дарааллыг өөрчлөх
SELECT-ийн дараа бичсэн дараалал нь үр дүнгийн баганын дарааллыг шийддэг. Хүснэгтэд year баганыг title-ийн араас хадгалсан ч бид хүссэн дарааллаараа харж болно. Query:
sql
SELECT year, title FROM books;Үр дүн:
year | title
-----+-------------------------
1240 | Монголын нууц товчоо
1962 | Тунгалаг Тамир
1934 | Учиртай гурван толгой
2008 | Clean Code
2015 | Python Crash Course
1999 | The Pragmatic ProgrammerЭнэ query юу гэж хэлж байна вэ гэвэл: “books хүснэгтээс эхлээд year, дараа нь title баганыг сонгож өг.” Үр дүнд он эхний баганад гарч ирсэн. Энэ нь хүснэгтэд ямар нэг зүйл өөрчлөгдсөн гэсэн үг биш — books хүснэгт дотроо өмнөх дарааллаараа хэвээр байгаа. Бид зөвхөн номын санчид "эхлээд оныг нь, дараа нь нэрийг нь бичээд өгөөч" гэж хүссэн юм. Мөрүүдийн дараалал харин id-ийн дарааллаар хэвээр үлдсэнийг анзаараарай: SELECT нь баганын дарааллыг шийддэг ч мөрийн дарааллыг шийддэггүй. Мөрийг эрэмбэлэх ORDER BY Бүлэг 2-т ирнэ.
Жишээ 4: өөр хүснэгтээс унших
SELECT нь ямар ч хүснэгттэй ижил байдлаар ажилладаг. members хүснэгт ийм байгаа:
id | name | city | joined_year | email
---+----------+-------------+-------------+------------------
1 | Бат | Улаанбаатар | 2023 | bat@example.com
2 | Сараа | Дархан | 2024 | saraa@example.com
3 | Тэмүүлэн | Улаанбаатар | 2022 | NULL
4 | Номин | Эрдэнэт | 2024 | nomin@example.com
5 | Ану | Улаанбаатар | 2025 | anu@example.comQuery:
sql
SELECT name, city FROM members;Үр дүн:
name | city
---------+------------
Бат | Улаанбаатар
Сараа | Дархан
Тэмүүлэн | Улаанбаатар
Номин | Эрдэнэт
Ану | УлаанбаатарЭнэ query юу гэж хэлж байна вэ гэвэл: “members хүснэгтээс name болон city баганыг сонгож өг.” Бүтэц нь өмнөх жишээнүүдтэй яг ижил: SELECT, баганын жагсаалт, FROM, хүснэгтийн нэр. Хүснэгт солигдсон ч хэлний дүрэм хэвээр байна. Энэ бол SQL-ийн хүч юм — нэг удаа сурсан хэлбэр таны ажиллах бүх хүснэгт дээр адилхан ажилладаг. "Улаанбаатар" гурван удаа давтагдаж байгааг анзаарсан бол сайн — давтагдсан утгыг нэг удаа харуулах DISTINCT гэдэг хэрэгслийг Бүлэг 2-т сурна.
SQL-ийн түлхүүр үгс том жижиг үсэг ялгадаггүй: select * from books; гэж бичсэн ч яг адилхан ажиллана. Гэхдээ энэ сургалтад бид түлхүүр үгсийг үргэлж том үсгээр бичнэ, учир нь тэгэхэд query-г харахад аль нь SQL-ийн үг, аль нь таны хүснэгт ба баганын нэр болохыг шууд ялгаж болно. Мөн SQL мөр шилжилт, хоосон зайг тоодоггүй. Тиймээс урт query-г хэд хэдэн мөрөнд хувааж бичиж болно:
sql
SELECT title, author, year
FROM books;Энэ нь SELECT title, author, year FROM books; гэж нэг мөрөнд бичсэнтэй яг адилхан үр дүн өгнө. Одоохондоо query-нүүд маань богино тул нэг мөр хангалттай, гэхдээ дараагийн бүлгүүдэд query урт болох тусам мөр хуваах нь уншихад ихээхэн тус болно.
Нэг практик зөвлөгөө: хэрэв бичих талбарт хэд хэдэн query зэрэг байгаа бол DB Browser бүгдийг нь дарааллаар ажиллуулж, үр дүнгийн хүснэгтэд зөвхөн хамгийн сүүлийнхийг харуулдаг. Хэрэв та зөвхөн нэг query-г ажиллуулахыг хүсвэл тэр query-г хулганаар тодруулж сонгоод F5 дарна — тэгэхэд зөвхөн сонгосон хэсэг ажиллана. Эсвэл query бүрийн өмнө бичих талбараа цэвэрлэх нь хамгийн энгийн арга.
Хэрэв сонирхож байвал members хүснэгтээс зөвхөн гишүүдийн нэр ба элссэн оныг, эсвэл books хүснэгтээс жанр болон хувийн тоог сонгож үзээрэй. Query бүрийг ажиллуулахаасаа өмнө монгол хэлээр чангаар уншаад, үр дүн тань таны хэлсэн өгүүлбэртэй тохирч байгаа эсэхийг шалгаарай. Мөн нэг query-д нэг баганыг хоёр удаа бичвэл (жишээ нь, SELECT title, title FROM books;) юу болохыг харж болно. Эдгээр нь зөвхөн санал бөгөөд дараагийн хичээлүүд тэдгээрийг хийсэн гэж тооцохгүй.
Хүснэгтийн нэрийг буруу бичих. Хэрэв та SELECT * FROM book; гэж бичвэл (s үсэг дутуу) мессежийн талбарт no such table: book гэсэн алдаа гарна. Энэ мессеж юу гэж хэлж байна вэ гэвэл: “book гэдэг нэртэй хүснэгт байхгүй байна.” SQLite хүснэгтийн нэрийг яг таны бичсэнээр хайдаг бөгөөд "та books гэж хэлэх гэсэн юм биш үү" гэж таамагладаггүй. Засах арга нь Database Structure табаас хүснэгтийн зөв нэрийг шалгаад query-гээ засах юм.
Баганын нэрийг буруу бичих. SELECT titel FROM books; гэж бичвэл no such column: titel гэсэн алдаа гарна. Утга нь “titel гэдэг нэртэй багана байхгүй байна.” Энэ алдааны мессеж нь буруу бичсэн үгийг яг таны бичсэнээр нь буцааж хэлдэг тул алдааг олоход хялбар. Баганын зөв нэрийг Database Structure табаас хүснэгтийн хажуугийн сумыг дарж харж болно.
Сүүлийн баганын дараа таслал тавих. Python-д жагсаалтын сүүлийн элементийн дараа таслал тавьж болдог тул олон хүн SQL-д ч мөн адил бичдэг: SELECT title, author, FROM books;. Энэ үед near "FROM": syntax error гэсэн алдаа гарна. Энэ мессеж юу гэж хэлж байна вэ гэвэл: “FROM гэдэг үгийн ойролцоо SQL-ийн дүрэм зөрчигдсөн байна.” SQLite таслалын дараа дахин нэг баганын нэр ирнэ гэж хүлээж байтал FROM гэдэг түлхүүр үг ирсэн тул ойлгоогүй. Алдааны мессеж асуудлын яг өөрт нь биш, харин түүний ойролцоох үгийг заадгийг анзаараарай — near гэдэг үг "ойролцоо" гэсэн утгатай. Тиймээс алдааг заасан үгийн яг өмнөхөн хайх нь ихэвчлэн зөв.
FROM-ийг мартах. SELECT title books; гэж бичвэл SQLite алдаа өгөхгүй байж магадгүй, гэвч үр дүн нь хачин харагдана: title баганын утгууд books гэсэн толгойтой гарч ирэх эсвэл өөр алдаа гарна. Энэ нь хамгийн аюултай төрлийн алдаа — алдааны мессежгүй мөртлөө буруу. Хэрэв үр дүнгийн баганын нэр таны хүлээснээс өөр харагдвал FROM байгаа эсэхийг эхлээд шалгаарай. Энэ хачин зан яагаад гардгийг дараагийн хичээлд SELECT-ийн бүтцийг судлахдаа ойлгоно.
Энэ хичээлд та анхны SQL query-гээ бичлээ. SELECT * FROM books; нь хүснэгтийн бүх баганыг уншдаг, харин SELECT title, author FROM books; шиг баганын нэрсийг таслалаар тусгаарлан бичвэл зөвхөн хэрэгтэй багануудаа сонгож авна. SELECT-ийн дараах дараалал нь үр дүнгийн баганын дарааллыг шийддэг ч мөрийн тоо болон дарааллыг өөрчилдөггүй. Мөн SELECT өгөгдлийг хэзээ ч өөрчилдөггүй тул айхгүйгээр туршиж болно. Хамгийн чухал нь, та query бүрийг монгол хэлээр чангаар унших дадлаа эхлүүллээ.
Дараагийн хичээлд бид SELECT-ийн бүтцийг илүү нарийн судална. Query-ний хэсгүүд яагаад заавал тодорхой дарааллаар ирэх ёстой, цаашид WHERE, ORDER BY, LIMIT зэрэг хэсгүүд энэ бүтцийн аль хэсэгт байрлах вэ гэдгийг харна. Мөн дарааллыг нь зөрчсөн query ямар алдаа өгдгийг өөрсдөө үзнэ.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.