Ачааллж байна...
Өмнөх хичээлд бид WHERE-ийг харьцуулах тэмдгүүд болон AND, OR, NOT-оор ашиглаж сурсан. Эдгээрээр ямар ч нөхцлийг бичиж болно, гэхдээ зарим нөхцлийг бичихэд нүсэр болдог. Жишээ нь, нэрэндээ “Python” гэдэг үгтэй бүх номыг олъё гэвэл = тус болохгүй, учир нь = бүтэн текстийг яг таг харьцуулдаг. Таван өөр жанраас аль нэгийг нь олъё гэвэл OR-ийг дөрвөн удаа давтах хэрэгтэй болно. Хоёр оны хоорондох номыг олохын тулд AND-ээр хоёр харьцуулалт холбох шаардлагатай.
Энэ хичээлд эдгээр гурван нийтлэг хэрэгцээнд зориулсан гурван тусгай хэрэгслийг сурна. LIKE нь текстийг хэв маягаар (pattern) хайдаг, IN нь утгын жагсаалтаас аль нэгтэй таарах эсэхийг шалгадаг, BETWEEN нь утга хоёр хязгаарын хооронд байгаа эсэхийг шалгадаг. Гурвуулаа WHERE дотор ажилладаг бөгөөд өмнөх хичээлийн AND, OR, NOT-той чөлөөтэй хослуулж болно.
Мөн энэ хичээлд хоёр шударга анхааруулга бий: SQLite дахь LIKE кирилл үсгийн том жижгийг хэрхэн харьцдаг, мөн BETWEEN хязгаараа өөртөө багтаадаг уу гэдэг. Эдгээр нь олон хүнийг төөрөгдүүлдэг тул жишээгээр нь нотолж харуулна.
Өмнөх хичээлд WHERE-ийг хаалган дээрх харуултай зүйрлэсэн. Энэ хичээлийн гурван хэрэгсэл бол харуулд өгөх гурван өөр төрлийн заавар юм.
LIKE бол харуулд өгсөн трафарет (stencil) юм: "нэр нь ‘Python’-оор эхэлдэг, араас нь юу ч байсан хамаагүй номыг нэвтрүүл." Харуул ном бүрийн нэрийг трафарет дээр тавьж үзээд таарвал нэвтрүүлнэ. IN бол хүлээн авалтын үүдэнд байдаг зочдын жагсаалт юм: "жанр нь энэ жагсаалтад байгаа номыг нэвтрүүл." Харуул жагсаалтыг дээрээс доош харж, нэр нь бичигдсэн бол оруулна. BETWEEN бол хоёр шон хооронд татсан хашаа юм: "он нь энэ хоёр шоны хооронд байгаа номыг нэвтрүүл" — мөн энэ хашаанд шон өөрөө орох уу, үгүй юу гэдгийг доор нарийн харна.
Бидний 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 | Програмчлал | 2Query:
sql
SELECT title
FROM books
WHERE title LIKE 'Python%';Үр дүн:
title
-------------------
Python Crash CourseЭнэ query юу гэж хэлж байна вэ гэвэл: “books хүснэгтээс title нь ‘Python’ гэж эхэлж, араас нь юу ч байж болох мөрүүдийн title-ийг харуул.” LIKE нь =-тэй төстэй харьцуулалт боловч хэв маягийн дотор тусгай тэмдэгтүүдийг ойлгодог. Хамгийн чухал нь % тэмдэгт бөгөөд энэ нь "энд дурын тооны дурын тэмдэгт байж болно — нэг ч биш, нэг, эсвэл хэдэн ч" гэсэн утгатай. Тиймээс 'Python%' нь “Python”-оор эхэлсэн ямар ч текст, тэр дундаа зүгээр “Python” гэсэн ганц үгтэй ч таарна.
Мөшгье. “Python Crash Course” нь “Python”-оор эхэлж, араас нь “ Crash Course” гэсэн текст ирсэн — % түүнийг бүхэлд нь хамарсан тул таарлаа. Бусад таван номын нэр “Python”-оор эхлээгүй тул хасагдлаа. Анзаарвал хэв маягийн текст өмнөх хичээлийнх шиг дан хашилт дотор бичигдсэн бөгөөд % тэмдэгт тэр хашилтын дотор байна.
Хэрэв %-гүйгээр WHERE title LIKE 'Python' гэж бичвэл LIKE бараг = шиг ажиллаж, нэрийг нь яг “Python” гэсэн номыг хайна — манай хүснэгтэд ийм ном байхгүй тул хоосон үр дүн гарна. Өөрөөр хэлбэл LIKE-ийн бүх хүч нь тусгай тэмдэгтүүдэд л оршдог.
Жишээ 1: % хоёр талд — дунд нь агуулах
%-ийг хэв маягийн хоёр талд тавьбал "энэ үг хаана ч байсан" гэсэн утга гарна. Query:
sql
SELECT title
FROM books
WHERE title LIKE '%гурван%';Үр дүн:
title
---------------------
Учиртай гурван толгойЭнэ query юу гэж хэлж байна вэ гэвэл: “books хүснэгтээс title-ийнхээ хаа нэгтээ 'гурван' гэсэн үгтэй мөрүүдийг харуул.” Эхний % нь "Учиртай “ хэсгийг, хоёр дахь % нь “ толгой” хэсгийг хамарсан. Хэрэв нэр нь "гурван"-аар эхэлсэн эсвэл төгссөн байсан ч таарах байсан, учир нь % нь нэг ч тэмдэгтгүй байхыг зөвшөөрдөг. Энэ хэлбэр ('%үг%') нь вэб сайтын энгийн хайлтын талбарын цаана хамгийн их ажилладаг хэв маяг юм.
Жишээ 2: _ тэмдэгт — яг нэг тэмдэгт
LIKE-д хоёр дахь тусгай тэмдэгт бий: доогуур зураас _. Энэ нь "энд яг нэг, дурын тэмдэгт байна" гэсэн утгатай. 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.comЯг гурван үсэгтэй нэрийг олъё. Query:
sql
SELECT name
FROM members
WHERE name LIKE '___';Үр дүн:
name
----
Бат
АнуЭнэ query юу гэж хэлж байна вэ гэвэл: “members хүснэгтээс name нь яг гурван тэмдэгтээс бүрдсэн мөрүүдийн name-ийг харуул.” Хэв маяг нь гурван доогуур зураас — тус бүр нэг үсэг шаардана. "Бат" болон "Ану" гурван үсэгтэй тул таарлаа. "Сараа" болон "Номин" таван үсэгтэй тул хоёр тэмдэгт илүүдсэн, таарсангүй. _ нь %-ээс ялгаатай нь яг нэг тэмдэгтийг шаарддаг: дутуу ч болохгүй, илүү ч болохгүй. Практикт _ нь %-ээс хамаагүй ховор хэрэглэгддэг ч тогтсон урттай код, дугаар шалгахад хэрэгтэй.
Жишээ 3: IN — утгын жагсаалт
Өмнөх хичээлд роман эсвэл жүжгийг genre = 'Роман' OR genre = 'Жүжиг' гэж олсон. IN-ээр яг ижил зүйлийг илүү товч бичиж болно. Query:
sql
SELECT title, genre
FROM books
WHERE genre IN ('Роман', 'Жүжиг');Үр дүн:
title | genre
----------------------+------
Тунгалаг Тамир | Роман
Учиртай гурван толгой | ЖүжигЭнэ query юу гэж хэлж байна вэ гэвэл: “books хүснэгтээс genre нь ('Роман', 'Жүжиг') гэсэн жагсаалтад байгаа мөрүүдийг харуул.” IN-ийн араас хаалт дотор таслалаар тусгаарласан утгуудын жагсаалт ирдэг. Харуул ном бүрийн жанрыг жагсаалттай тулгаж, аль нэгтэй нь таарвал нэвтрүүлдэг. Үр дүн нь өмнөх хичээлийн OR query-тэй яг адилхан бөгөөд үнэндээ IN нь олон OR-ийн товчилсон хэлбэр юм.
Энэ хэлбэрийн давуу тал нь жагсаалт урт болох тусам улам тод илэрдэг. Арван жанраас аль нэгийг хайх бол OR-оор есөн удаа давтаж, баганын нэрийг арван удаа бичих хэрэгтэй болно; IN-ээр нэг удаа баганын нэрийг бичээд, жагсаалтдаа арван утга оруулахад хангалттай. Мөн хаалтны асуудал IN-д гардаггүй: IN бол нэг бүтэн нөхцөл тул түүнийг AND-тэй хослуулахад OR-ийн хаалтгүй алдаа гарахгүй. Тоон утгаар ч IN ажилладаг — жишээ нь WHERE joined_year IN (2022, 2025) нь Тэмүүлэн болон Ану хоёрыг буцаана. Тоог хашилтгүй, текстийг дан хашилттай бичдэг дүрэм энд ч хүчинтэй.
Жишээ 4: BETWEEN ба хязгаарын үнэн
1934-1999 оны хооронд хэвлэгдсэн номнуудыг олъё. Query:
sql
SELECT title, year
FROM books
WHERE year BETWEEN 1934 AND 1999;Үр дүн:
title | year
-------------------------+-----
Тунгалаг Тамир | 1962
Учиртай гурван толгой | 1934
The Pragmatic Programmer | 1999Энэ query юу гэж хэлж байна вэ гэвэл: “books хүснэгтээс year нь 1934-өөс 1999-ийн хооронд, хоёр хязгаараа оруулаад, байгаа мөрүүдийг харуул.” Үр дүнг анхааралтай хараарай: "Учиртай гурван толгой" яг 1934 онд, “The Pragmatic Programmer” яг 1999 онд хэвлэгдсэн бөгөөд хоёулаа үр дүнд орсон. Энэ нь BETWEEN хоёр хязгаараа өөртөө багтаадгийг (inclusive) нотолж байна. Өөрөөр хэлбэл year BETWEEN 1934 AND 1999 нь year >= 1934 AND year <= 1999-тэй яг ижил. Хашааны зүйрлэлээр бол шон өөрөө хашаанд багтдаг.
Энэ ялгааг тод харахын тулд ижил хязгаарыг > ба <-ээр бичье:
sql
SELECT title, year
FROM books
WHERE year > 1934 AND year < 1999;Үр дүн:
title | year
---------------+-----
Тунгалаг Тамир | 1962Энэ query юу гэж хэлж байна вэ гэвэл: “year нь 1934-өөс их бөгөөд 1999-өөс бага мөрүүдийг харуул.” Энэ удаад хоёр хил дээрх ном хоёулаа хасагдаж, ганцхан ном үлдлээ. Манай жижиг хүснэгтэд хил дээр яг таарах өгөгдөл санаатайгаар байгаа тул ялгаа тод харагдаж байна; бодит өгөгдөлд энэ ялгаа хэдэн мянган мөрийн дунд нуугдаж, тайлангийн тоог чимээгүйхэн буруу болгож болно. Тиймээс BETWEEN бичих бүрдээ "хил өөрөө орох ёстой юу" гэж өөрөөсөө асуух дадал гаргаарай. Орох ёстой бол BETWEEN, орох ёсгүй бол > ба <.
Жишээ 5: урвуу дараалсан BETWEEN
BETWEEN-ийн хоёр хязгаар заавал бага нь эхэнд, их нь сүүлд байх ёстой. Хэрэв эсрэгээр бичвэл:
sql
SELECT title, year
FROM books
WHERE year BETWEEN 1999 AND 1934;Үр дүн:
(хоосон — 0 мөр)Энэ query юу гэж хэлж байна вэ гэвэл: “year нь 1999 буюу түүнээс их бөгөөд 1934 буюу түүнээс бага мөрүүдийг харуул.” Ийм тоо байх боломжгүй тул нэг ч мөр ирээгүй — алдааны мессеж ч гараагүй. Мессежийн талбарт 0 rows returned гэж л бичигдэнэ. Хэрэв BETWEEN-тэй query хоосон үр дүн өгвөл хязгааруудынхаа дарааллыг эхлээд шалгаарай.
Гурван хэрэгсэл бүгд NOT-той хослодог: NOT LIKE, NOT IN, NOT BETWEEN. Жишээ нь WHERE genre NOT IN ('Програмчлал') нь програмчлалын бус бүх номыг, WHERE year NOT BETWEEN 1934 AND 1999 нь тэр хашаанаас гадуурх номнуудыг буцаана. Мөн тэдгээрийг AND, OR-оор бусад нөхцөлтэй холбож болно: WHERE genre IN ('Роман', 'Жүжиг') AND year BETWEEN 1900 AND 1970 гэх мэт. Нөхцөл бүр бүтэн нэг хэсэг тул хослол нь ойлгомжтой хэвээр байна. Гэхдээ NOT IN-ийг NULL утгатай баганад ашиглах үед нэг хачин зан гардаг бөгөөд үүнийг дараагийн хичээлд NULL-ийн тухай ярихдаа үзнэ.
Хэрэв сонирхож байвал '%code%' (жижиг үсгээр) болон '%тамир%' (жижиг үсгээр) хоёр хэв маягаар хайж, үр дүнг харьцуулаад үзээрэй — доорх анхааруулгатай холбоотой сонирхолтой ялгаа гарна. Мөн members хүснэгтээс имэйл хаяг нь ’n’ үсгээр эхэлдэг гишүүдийг LIKE-ээр, эсвэл 2023-2024 онд элссэн гишүүдийг BETWEEN-ээр олж үзэж болно. Эдгээр нь зөвхөн санал бөгөөд дараагийн хичээлүүд тэдгээрийг хийсэн гэж тооцохгүй.
Кирилл үсгийн том жижиг. SQLite-ийн LIKE нь латин үсгийн том жижгийг ялгадаггүй, харин кирилл үсгийнхийг ялгадаг. Өөрөөр хэлбэл title LIKE '%code%' нь “Clean Code”-ийг олно, гэвч title LIKE '%тамир%' нь "Тунгалаг Тамир"-ыг олохгүй, учир нь "Тамир" том Т үсгээр эхэлсэн. Энэ үед алдааны мессеж гарахгүй, зүгээр л хоосон үр дүн ирнэ. Энэ нь SQLite зөвхөн англи цагаан толгойн том жижиг үсгийн хослолыг мэддэг, бусад үсгийг ялгаатай тэмдэгт гэж үздэгтэй холбоотой. Одоохондоо практик шийдэл нь кирилл үгийг хүснэгтэд бичигдсэн хэлбэрээр нь яг таг хайх юм. PostgreSQL-д шилжих үед нөхцөл байдал өөр болно: тэнд LIKE латин үсэгт ч том жижгийг ялгадаг бөгөөд ялгахгүй хайлтад ILIKE гэдэг тусгай хэрэгсэл бий. Үүнийг Бүлэг 10-д харна.
Windows-ийн *-ийг ашиглах. Файл хайх үед *.txt гэж бичдэг дадлаас болж WHERE title LIKE 'Python*' гэж бичих нь элбэг. SQL-ийн LIKE *-ийг тусгай тэмдэгт гэж ойлгодоггүй тул нэрэндээ жинхэнэ од тэмдэгт агуулсан номыг хайж, хоосон үр дүн буцаана. Алдааны мессеж гарахгүй. SQL-д "дурын текст" гэдэг нь %, "нэг тэмдэгт" гэдэг нь _ гэдгийг санаарай.
IN-ий хаалтыг мартах. WHERE genre IN 'Роман', 'Жүжиг' гэж бичвэл near "'Роман'": syntax error гэсэн алдаа гарна. Энэ мессеж юу гэж хэлж байна вэ гэвэл: “'Роман' гэдэг утгын ойролцоо дүрэм зөрчигдлөө.” SQLite IN-ий араас нээх хаалт хүлээж байтал шууд текст ирсэн. Жагсаалт нэг утгатай байсан ч хаалт заавал байх ёстой: IN ('Роман').
IN-ий жагсаалтын сүүлд таслал. WHERE genre IN ('Роман', 'Жүжиг',) гэж бичвэл near ")": syntax error гарна. SQLite таслалын араас дахин нэг утга хүлээж байтал хаах хаалт ирсэн. Энэ нь Бүлэг 1-д SELECT-ийн баганын жагсаалтад харсан алдаатай ижил шалтгаантай — SQL-ийн жагсаалтууд сүүлийн таслалыг зөвшөөрдөггүй.
BETWEEN-ийн хязгаарыг урвуу бичих. Жишээ 5-д харсанчлан бага хязгаарыг сүүлд бичвэл алдаагүй хоосон үр дүн гарна. Хоосон үр дүнг харвал "үнэхээр ийм мөр байхгүй юу, эсвэл миний query буруу юу" гэж асуух нь бүх SQL ажлын суурь дадал юм.
Энэ хичээлд та WHERE-ийн гурван тусгай хэрэгслийг сурлаа. LIKE нь текстийг хэв маягаар хайдаг бөгөөд % нь дурын тооны тэмдэгтийг, _ нь яг нэг тэмдэгтийг орлодог; SQLite дээр кирилл үсгийн том жижгийг ялгадаг гэдгийг анхаарах хэрэгтэй. IN нь утгын жагсаалтаас аль нэгтэй таарах эсэхийг шалгадаг бөгөөд олон OR-ийн товч, найдвартай орлуулга юм. BETWEEN нь хоёр хязгаарын хоорондох утгыг олдог бөгөөд хоёр хязгаараа өөртөө багтаадаг; бага хязгаар заавал эхэнд бичигдэнэ. Гурвуулаа NOT-оор эргэж, AND, OR-оор бусад нөхцөлтэй хослодог.
Дараагийн хичээлд бид энэ бүлгийн турш хүснэгтэд маань нуугдаж байсан нэгэн зочин — NULL-тэй нүүр тулна. "Монголын нууц товчоо"-ны зохиогч болон Тэмүүлэнгийн имэйл яагаад тусгай харьцаа шаарддаг, = NULL гэж бичихэд яагаад юу ч олдохгүй, NULL ер нь яагаад байдаг вэ гэдгийг өөрсдийн нүдээр харна.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.