Зеҳн
Пойгоҳи додаҳо ва SQL бо PostgreSQL

Китоби омӯзишии SQL ва PostgreSQL барои навомӯзон: аз мафҳуми пойгоҳи додаҳои релятсионӣ ва насби PostgreSQL бо Docker то SELECT, навъҳои додаҳо, JOIN, тарҳрезии ҷадвалҳо, гурӯҳбандӣ, CTE, функсияҳои равзанавӣ, транзаксияҳо ва индексҳо. Ҳамаи мисолҳо дар PostgreSQL 18 санҷида шудаанд; дар охири бобҳо машқҳо ва дар замима ҷавобҳо оварда шудаанд.

Агенти Зеҳнӣ · 19 октябри 2026 · 14 саҳифа

ТаҳсилотБарномасозӣ
Аз аввал хондан

Боби 4. Оғози омӯзиши додаҳо бо SELECT

Барои ман ҷолибтарин қисми кор бо додаҳо ҷамъоварӣ, боргузорӣ ё тоза кардани онҳо нест, балки лаҳзаест, ки воқеан бо додаҳо «суҳбат» мекунам. Маҳз дар ҳамин лаҳзаҳо мефаҳмам, ки додаҳо тозаанд ё пур аз хато, пурраанд ё нопурра ва аз ҳама муҳим, чӣ ҳикоятеро нақл карда метавонанд.

Суҳбат бо додаҳоро ба мусоҳиба бо довталаби ҷойи кор монанд тасаввур кунед. Шумо мехоҳед саволҳое диҳед, ки ошкор кунанд: оё малакаҳои воқеии ӯ ба он чи дар ҳолномааш навиштааст, мувофиқат мекунанд?

Суҳбат бо додаҳо шавқовар аст, зеро ҳақиқатҳоро ошкор мекунед. Масалан, шояд маълум шавад, ки нисфи иштирокчиён пур кардани майдони почтаи электрониро дар пурсишнома фаромӯш кардаанд ё шаҳрдор панҷ соли охир андози амволашро напардохтааст.

Ё шояд фаҳмед, ки додаҳоятон носолиманд: номҳо бо имлои гуногун навишта шудаанд, санаҳо нодурустанд ё ададҳо ба интизориҳои шумо мувофиқат намекунанд. Бозёфтҳои шумо қисми ҳикояти додаҳо мегарданд.

Дар SQL суҳбат бо додаҳо аз калимаи калидии SELECT оғоз мешавад. Он сатрҳо ва сутунҳоро аз як ё чанд ҷадвали пойгоҳи додаҳо мегирад.

Дастури SELECT метавонад сода бошад ва тамоми муҳтавои як ҷадвалро баргардонад. Ё метавонад чунон мураккаб бошад, ки даҳҳо ҷадвалро пайваст карда, ҳамзамон чандин ҳисоббарориро анҷом диҳад ва додаҳоро аз рӯйи шартҳои дақиқ полоиш кунад.

Мо аз дастурҳои содаи SELECT оғоз карда, сипас имкониятҳои тавонотари онро меомӯзем.

Синтаксиси асосии SELECT

Ин дастури SELECT ҳамаи сатрҳо ва сутунҳои ҷадвали my_table-ро мегирад:

SELECT * FROM my_table;  

Ин як сатри код содатарин шакли дархости SQL-ро нишон медиҳад.

Ситорачаи пас аз калимаи калидии SELECT аломати фарогир аст: он ба ҷойи як қимати мушаххас ҳамаи имкониятҳои дахлдорро ифода мекунад. Дар ин ҷо маънояш «ҳамаи сутунҳоро интихоб кун» мебошад.

Агар ба ҷойи ситорача номи сутунро менавиштед, фармон қиматҳои ҳамон сутунро интихоб мекард. Калимаи калидии FROM нишон медиҳад, ки дархост бояд додаҳоро аз кадом ҷадвал баргардонад. Нуқтаверги пас аз номи ҷадвал ба PostgreSQL хабар медиҳад, ки дастури дархост ба охир расид.

Биёед ҳамин дастури SELECT-ро бо ситорача барои ҷадвали teachers, ки дар боби 3 сохта будед, истифода барем. Ба пойгоҳи додаҳои analysis пайваст шавед — дар psql ё дар Query Tool-и pgAdmin — ва дастури намунаи коди 4-1-ро иҷро намоед.

SELECT * FROM teachers;  

Намунаи коди 4-1: Гирифтани ҳамаи сатрҳо ва сутунҳои ҷадвали teachers

Пас аз иҷрои дархост маҷмӯи натиҷаҳо ҳамаи сатрҳо ва сутунҳоеро дар бар мегирад, ки дар боби 3 ба ҷадвали teachers ворид карда будед. Сатрҳо шояд на ҳамеша бо ҳамин тартиб пайдо шаванд, аммо ин мушкил нест.

idfirst_namelast_nameschoolhire_datesalary
1JanetSmithF.D. Roosevelt HS2011-10-3036200
2LeeReynoldsF.D. Roosevelt HS1993-05-2265000
3SamuelColeMyers Middle School2005-08-0143500
4SamanthaBushMyers Middle School2011-10-3036200
5BettyDiazMyers Middle School2005-08-3043500
6KathleenRoushF.D. Roosevelt HS2010-10-2238500

Аҳаммият диҳед, ки сутуни id, ки навъи bigserial дорад, ба таври худкор бо ададҳои бутуни пайдарпай пур шудааст, гарчанде шумо онҳоро ошкоро ворид накарда будед. Ин хеле қулай аст.

Ин адади бутуни худкор афзоянда ҳамчун шиносаи ягона ё калид хизмат мекунад: он барои фарқ кардани ҳар сатр истифода мешавад ва баъдтар имкон медиҳад, ки ин ҷадвалро бо ҷадвалҳои дигари пойгоҳи додаҳо пайваст кунем.

Пеш аз идома додан, бидонед, ки ду роҳи дигари дидани ҳамаи сатрҳои ҷадвал ҳам вуҷуд дорад. Дар pgAdmin метавонед дар дарахти объектҳо рӯйи ҷадвали teachers тугмаи рости мушро пахш карда, View/Edit Data → All Rows-ро интихоб кунед.

Ё метавонед аз имконияти камтар маълуми SQL-и стандартӣ истифода баред:

TABLE teachers;  

Ҳар ду роҳ ҳамон натиҷаеро медиҳанд, ки коди намунаи 4-1 медиҳад. Акнун биёед дархостро мушаххастар кунем.

Гирифтани танҳо баъзе сутунҳо

Аксар вақт беҳтар аст шумораи сутунҳои баргардондаи дархостро маҳдуд кунед, махсусан ҳангоми кор бо пойгоҳҳои бузурги додаҳо. Бо ин роҳ маҷбур намешавед маълумоти зиёдатиро аз назар гузаронед.

Барои ин пас аз калимаи калидии SELECT номҳои сутунҳоро бо вергул ҷудо карда менависед:

SELECT some_column, another_column, amazing_column FROM table_name;  

Бо ин синтаксис дархост ҳамаи сатрҳоро танҳо аз ҳамин се сутун мегирад.

Биёед ин усулро ба ҷадвали teachers татбиқ кунем. Шояд дар таҳлили худ мехоҳед ба номҳо ва маоши омӯзгорон диққат диҳед. Дар ин ҳолат танҳо сутунҳои дахлдорро интихоб мекунед, чунон ки дар намунаи коди 4-2 нишон дода шудааст.

Аҳаммият диҳед, ки тартиби сутунҳо дар дархост аз тартиби онҳо дар ҷадвал фарқ мекунад: метавонед сутунҳоро бо ҳар тартиби дилхоҳ гиред.

SELECT last_name, first_name, salary FROM teachers;  

Намунаи коди 4-2: Гирифтани танҳо баъзе сутунҳо

Акнун маҷмӯи натиҷаҳо танҳо се сутун дорад:

last_namefirst_namesalary
SmithJanet36200
ReynoldsLee65000
ColeSamuel43500
BushSamantha36200
DiazBetty43500
RoushKathleen38500

Гарчанде ин мисолҳо содаанд, онҳо стратегияи хуберо барои оғози суҳбат бо маҷмӯи додаҳо нишон медиҳанд.

Одатан беҳтар аст таҳлилро аз санҷидани он оғоз кунед, ки оё додаҳо мавҷуданд ва ба қолаби интизории шумо мувофиқат мекунанд. SELECT барои ин вазифа бисёр муносиб аст.

Оё санаҳо бо қолаби дуруст ва бо моҳ, рӯз ва сол ворид шудаанд? Ё, чунон ки ман боре бо таассуф дида будам, онҳо ҳамчун матн ва танҳо бо моҳу сол сабт шудаанд?

Оё дар ҳар сатр ҳамаи сутунҳо қимат доранд? Оё ба таври аҷиб ягон насабе нест, ки бо ҳарфҳои баъд аз M оғоз шавад?

Ҳамаи ин ҳолатҳо ба мушкилоти эҳтимолӣ ишора мекунанд: аз набудани додаҳо то сабткунии бесифат дар ягон марҳилаи раванди кор.

Мо ҳоло танҳо бо ҷадвали шашсатра кор мекунем. Аммо вақте бо ҷадвали дорои ҳазорҳо ё ҳатто миллионҳо сатр рӯ ба рӯ мешавед, зарур аст, ки сифати додаҳо ва доираи қиматҳои онро зуд арзёбӣ кунед.

Барои ин биёед амиқтар рафта, чанд калимаи калидии дигари SQL-ро илова кунем.

ЭЗОҲ

pgAdmin имкон медиҳад, ки номҳои сутунҳо, ҷадвалҳо ва дигар объектҳоро аз мурургари объектҳо ба Query Tool кашола карда гузоред.

Ин ҳангоми навиштани дархости нав муфид аст, агар нахоҳед номҳои дарози объектҳоро пайваста дастӣ нависед. Дарахти объектҳоро васеъ карда, ҷадвалҳо ё сутунҳоро пайдо намоед ва онҳоро бо муш гирифта, ба абзори дархост кашола кунед.

Мураттаб кардани додаҳо бо ORDER BY

Вақте додаҳо ба ҷойи пароканда будан бо тартиб ҷойгир мешаванд, фаҳмиданашон осонтар мегардад ва қонуниятҳои дохили онҳо зудтар намоён мешаванд.

Дар SQL натиҷаҳои дархостро бо қисми ORDER BY мураттаб мекунем. Пас аз ин калимаҳои калидӣ номи сутун ё сутунҳое меояд, ки бояд аз рӯйи онҳо мураттабсозӣ анҷом дода шавад.

Истифодаи ин қисм ҷадвали аслиро тағйир намедиҳад: танҳо натиҷаи дархост дигар мешавад. Намунаи коди 4-3 инро бо истифода аз ҷадвали teachers нишон медиҳад.

SELECT first_name, last_name, salary  
FROM teachers  
ORDER BY salary DESC;  

Намунаи коди 4-3: Мураттабсозӣ аз рӯйи сутун бо ORDER BY

Ба таври пешфарз ORDER BY қиматҳоро бо тартиби афзоиш мураттаб мекунад. Аммо дар ин ҷо ман бо илова кардани калимаи калидии DESC онҳоро бо тартиби коҳиш мураттаб мекунам. Калимаи калидии ихтиёрии ASC тартиби афзоишро муайян мекунад.

Акнун бо мураттаб кардани сутуни salary аз қимати калонтарин то хурдтарин метавон фаҳмид, ки кадом омӯзгорон бештар маош мегиранд:

first_namelast_namesalary
LeeReynolds65000
SamuelCole43500
BettyDiaz43500
KathleenRoush38500
JanetSmith36200
SamanthaBush36200

Қисми ORDER BY ба ҷойи номи сутун ададро низ қабул мекунад. Ин адад мавқеи сутунро дар рӯйхати SELECT нишон медиҳад.

Пас намунаи коди 4-3-ро чунин ҳам навиштан мумкин аст. Дар ин ҷо 3 ба сутуни сеюми рӯйхати SELECT, яъне salary, ишора мекунад:

SELECT first_name, last_name, salary  
FROM teachers  
ORDER BY 3 DESC;  

Имкони мураттабсозӣ дар дархостҳо барои дидан ва пешниҳод кардани додаҳо чандирии зиёд медиҳад. Масалан, мо танҳо бо мураттабсозӣ аз рӯйи як сутун маҳдуд нестем. Дастури намунаи коди 4-4-ро ворид кунед:

SELECT last_name, school, hire_date  
FROM teachers  
ORDER BY school ASC, hire_date DESC;  

Намунаи коди 4-4: Мураттабсозӣ аз рӯйи чанд сутун бо ORDER BY

Дар ин ҳолат насабҳои омӯзгорон, мактабашон ва санаи ба кор қабул шудани онҳоро мегирем.

Бо мураттаб кардани сутуни school бо тартиби афзоиш ва hire_date бо тартиби коҳиш, рӯйхате месозем, ки омӯзгорон аввал аз рӯйи мактаб якҷо ҷойгир мешаванд. Дар дохили ҳар мактаб омӯзгорони навтар ба кор қабулшуда аввал меоянд.

Ин нишон медиҳад, ки дар ҳар мактаб кадом омӯзгорон навтаринанд. Маҷмӯи натиҷаҳо бояд чунин бошад:

last_nameschoolhire_date
SmithF.D. Roosevelt HS2011-10-30
RoushF.D. Roosevelt HS2010-10-22
ReynoldsF.D. Roosevelt HS1993-05-22
BushMyers Middle School2011-10-30
DiazMyers Middle School2005-08-30
ColeMyers Middle School2005-08-01

Метавонед дар ORDER BY зиёда аз ду сутунро истифода баред, аммо зуд ба ҷое мерасед, ки фоидаи илова кардани сутунҳои нав кам ва таъсири онҳо қариб нонамоён мешавад.

Тасаввур кунед, ки ба ORDER BY сутунҳои дараҷаи олии таҳсилоти омӯзгор, синфе, ки ӯ дарс медиҳад, ва санаи таваллудро низ илова кардед. Ҳамаи самтҳои гуногуни мураттабсозиро якбора фаҳмидан душвор мешавад, чӣ расад ба шарҳ додани онҳо ба дигарон.

Фаҳмидани додаҳо вақте осонтар аст, ки натиҷа ба ҷавоб додан ба саволи муайян равона бошад. Аз ин рӯ, стратегияи беҳтар ин аст, ки дар дархост танҳо сутунҳои муҳимтаринро нигоҳ доред ва барои ҷавоб додан ба саволҳои гуногун чанд дархости алоҳида иҷро кунед.

Ёфтани қиматҳои такрорнашаванда бо DISTINCT

Дар сутуни ҷадвал мавҷуд будани қиматҳои такрорӣ чизи ғайриодӣ нест. Масалан, дар ҷадвали teachers номҳои якхелаи мактабҳо дар сутуни school чанд бор такрор мешаванд, зеро дар ҳар мактаб чандин омӯзгор кор мекунад.

Барои фаҳмидани доираи қиматҳои сутун метавонем дар дархост калимаи калидии DISTINCT-ро истифода барем. Он такрорҳоро аз натиҷа хориҷ карда, танҳо қиматҳои такрорнашавандаро нишон медиҳад.

DISTINCT-ро бевосита пас аз SELECT менависем, чунон ки дар намунаи коди 4-5 нишон дода шудааст.

SELECT DISTINCT school  
FROM teachers  
ORDER BY school;  

Намунаи коди 4-5: Гирифтани қиматҳои такрорнашавандаи сутуни school

Натиҷа чунин аст:

school
F.D. Roosevelt HS
Myers Middle School

Гарчанде ҷадвал шаш сатр дорад, натиҷа танҳо ду номи такрорнашавандаи мактабро аз сутуни school нишон медиҳад.

Ин қадами аввалини муфид барои арзёбии сифати додаҳо мебошад. Масалан, агар номи мактаб бо чанд тарзи гуногун навишта шуда бошад, ин фарқиятҳои имлоиро ба осонӣ пай бурда, ислоҳ кардан мумкин аст, махсусан агар натиҷаҳоро мураттаб кунед.

Ҳангоми кор бо санаҳо ё ададҳо, DISTINCT ба ошкор кардани қолаббандии номувофиқ ё вайроншуда кумак мекунад.

Масалан, шояд маҷмӯи додаҳое ба шумо расад, ки санаҳо дар сутуни навъи матнӣ ворид шудаанд. Ин таҷриба, ки бояд аз он худдорӣ кунед, имкон медиҳад санаҳои нодуруст низ нигоҳ дошта шаванд:

date
5/30/2023
6//2023
6/1/2023
6/2/2023

Калимаи калидии DISTINCT ҳамзамон бо чанд сутун низ кор мекунад. Агар сутуни дигар илова кунем, дархост ҳар ҷуфти такрорнашавандаи қиматҳоро бармегардонад. Коди намунаи 4-6-ро иҷро кунед:

SELECT DISTINCT school, salary  
FROM teachers  
ORDER BY school, salary;  

Намунаи коди 4-6: Гирифтани ҷуфтҳои такрорнашавандаи қиматҳо аз сутунҳои school ва salary

Акнун дархост ҳар маоши фарқкунандаро дар ҳар мактаб бармегардонад.

Азбаски ду омӯзгори Myers Middle School 43 500 доллар маош мегиранд, ин ҷуфти қиматҳо танҳо дар як сатр нишон дода мешавад. Аз ин рӯ, дархост ба ҷойи ҳамаи шаш сатри ҷадвал панҷ сатр бармегардонад:

schoolsalary
F.D. Roosevelt HS36200
F.D. Roosevelt HS38500
F.D. Roosevelt HS65000
Myers Middle School36200
Myers Middle School43500

Ин усул имкон медиҳад чунин савол диҳем: «Барои ҳар x дар ҷадвал ҳамаи қиматҳои y кадомҳоянд?»

Масалан:

  • Ҳар корхона кадом моддаҳои кимиёиро истеҳсол мекунад?
  • Дар ҳар ҳавзаи интихоботӣ кадом номзадҳо иштирок доранд?
  • Дар ҳар толори консертӣ ин моҳ кадом ҳунармандон баромад мекунанд?

SQL усулҳои пешрафтатареро низ бо истифода аз функсияҳои ҷамъбастӣ пешниҳод мекунад. Онҳо имкон медиҳанд шумораро ҳисоб кунем, қиматҳоро ҷамъ намоем ва қиматҳои хурдтарин ва калонтаринро ёбем. Ман онҳоро дар бобҳои 6 ва 9 муфассал мефаҳмонам.

Полоиш кардани сатрҳо бо WHERE

Баъзан мехоҳед натиҷаи дархостро танҳо ба сатрҳое маҳдуд кунед, ки як ё чанд сутунашон ба шартҳои муайян мувофиқат мекунанд.

Масалан, дар ҷадвали teachers шояд мехоҳед ҳамаи омӯзгоронеро ёбед, ки пеш аз соли муайян ба кор қабул шудаанд ё ҳамаи омӯзгорони мактабҳои ибтидоиеро, ки беш аз 75 000 доллар маош мегиранд.

Барои чунин вазифаҳо аз қисми WHERE истифода мебарем.

WHERE имкон медиҳад сатрҳоеро ёбед, ки ба қимати мушаххас, фосилаи қиматҳо ё чанд қимат мувофиқат мекунанд. Шартҳо бо ёрии операторҳо дода мешаванд — аломатҳо ё калимаҳои калидие, ки амалҳои математикӣ, муқоисавӣ ва мантиқиро имкон медиҳанд.

Ҳамчунин метавонед шартҳоро барои хориҷ кардани сатрҳо аз натиҷа истифода баред.

Намунаи коди 4-7 мисоли содаро нишон медиҳад. Аҳаммият диҳед, ки дар синтаксиси стандартии SQL қисми WHERE пас аз FROM ва номи ҷадвал ё ҷадвалҳои мавриди дархост меояд.

SELECT last_name, school, hire_date  
FROM teachers  
WHERE school = 'Myers Middle School';  

Намунаи коди 4-7: Полоиш кардани сатрҳо бо WHERE

Маҷмӯи натиҷаҳо танҳо омӯзгорони Myers Middle School-ро нишон медиҳад:

last_nameschoolhire_date
ColeMyers Middle School2005-08-01
BushMyers Middle School2011-10-30
DiazMyers Middle School2005-08-30

Дар ин ҷо ман оператори муқоисавии баробариро барои ёфтани сатрҳое истифода мебарам, ки қиматашон дақиқан мувофиқат мекунад. Албатта, барои муайян кардани шартҳои дигари полоиш метавонед операторҳои дигарро низ бо WHERE истифода баред.

Ҷадвали 4-1 операторҳои маъмултарини муқоисаро ҷамъбаст мекунад. Вобаста ба низоми пойгоҳи додаҳои шумо, операторҳои хеле бештар ҳам дастрас буда метавонанд.

Ҷадвали 4-1: Операторҳои муқоиса ва мувофиқат дар PostgreSQL

ОператорВазифаМисол
=Баробар астWHERE school = 'Baker Middle'
!= ё <>Баробар нестWHERE school != 'Baker Middle'
>Калонтар астWHERE salary > 20000
<Хурдтар астWHERE salary < 60500
>=Калонтар ё баробар астWHERE salary >= 20000
<=Хурдтар ё баробар астWHERE salary <= 60500
BETWEENДар фосилаи муайян астWHERE salary BETWEEN 20000 AND 40000
INБа яке аз қиматҳои маҷмӯа мувофиқат мекунадWHERE last_name IN ('Bush', 'Roush')
LIKEБа қолаб мувофиқат мекунад, бо фарқ гузоштан байни ҳарфҳои калон ва хурдWHERE first_name LIKE 'Sam%'
ILIKEБа қолаб мувофиқат мекунад, бе фарқ гузоштан байни ҳарфҳои калон ва хурдWHERE first_name ILIKE 'sam%'
NOTШартро инкор мекунадWHERE first_name NOT ILIKE 'sam%'

Мисолҳои зерин кори операторҳои муқоисавиро нишон медиҳанд. Аввал бо истифода аз оператори баробарӣ омӯзгоронеро меёбем, ки номашон Janet аст:

SELECT first_name, last_name, school  
FROM teachers  
WHERE first_name = 'Janet';  

Сипас ҳамаи номҳои мактабҳои ҷадвалро мегирем, аммо бо оператори нобаробарӣ F.D. Roosevelt HS-ро хориҷ мекунем:

SELECT school  
FROM teachers  
WHERE school != 'F.D. Roosevelt HS';  

Дар ин ҷо оператори «хурдтар аз»-ро истифода мебарем, то омӯзгоронеро нишон диҳем, ки пеш аз 1 январи соли 2000 ба кор қабул шудаанд. Сана дар қолаби YYYY-MM-DD навишта шудааст:

SELECT first_name, last_name, hire_date  
FROM teachers  
WHERE hire_date < '2000-01-01';  

Баъд бо оператори >= омӯзгоронеро меёбем, ки 43 500 доллар ё бештар маош мегиранд:

SELECT first_name, last_name, salary  
FROM teachers  
WHERE salary >= 43500;  

Дархости навбатӣ бо оператори BETWEEN омӯзгоронеро меёбад, ки аз 40 000 то 65 000 доллар маош мегиранд.

Аҳаммият диҳед, ки BETWEEN ҳар ду ҳадди фосиларо низ дар бар мегирад. Яъне қиматҳои баробар ба ҳадди поёнӣ ва болоии муайяншуда ҳам ба натиҷа дохил мешаванд.

SELECT first_name, last_name, school, salary  
FROM teachers  
WHERE salary BETWEEN 40000 AND 65000;  

Ҳангоми истифодаи BETWEEN эҳтиёт кунед, зеро дохил шудани ҳаддҳои фосила метавонад боиси тасодуфан ду бор ҳисоб шудани қиматҳо гардад.

Масалан, агар аввал бо BETWEEN 10 AND 20 ва сипас бо дархости дуюм бо BETWEEN 20 AND 30 полоиш кунед, сатри дорои қимати 20 дар натиҷаи ҳар ду дархост пайдо мешавад.

Барои пешгирии ин ҳолат метавонед фосилаҳоро бо операторҳои равшантар — «калонтар аз» ва «хурдтар аз» — муайян кунед.

Масалан, дархости зерин ҳамон натиҷаи дархости пешинаро медиҳад, аммо ҳаддҳои фосиларо ошкортар нишон медиҳад:

SELECT first_name, last_name, school, salary  
FROM teachers  
WHERE salary >= 40000 AND salary <= 65000;  

Дар давоми китоб ба ин операторҳо боз бармегардем, зеро онҳо дар ёфтани додаҳо ва ҷавобҳои дилхоҳ нақши муҳим мебозанд.

Истифодаи LIKE ва ILIKE бо WHERE

Операторҳои муқоисавӣ нисбатан фаҳмоанд, аммо операторҳои мувофиқат ба қолаб — LIKE ва ILIKE — ба шарҳи иловагӣ ниёз доранд.

Ҳар ду имкон медиҳанд қиматҳои гуногунеро ёбед, ки аломатҳояшон ба қолаби муайян мувофиқат мекунанд. Ин вақте муфид аст, ки дақиқан намедонед чӣ меҷӯед ё мехоҳед калимаҳои нодуруст навишташударо ошкор кунед.

Барои истифодаи LIKE ва ILIKE қолаби ҷустуҷӯро бо яке ё ҳар ду аломати зерин муайян мекунед:

  • Аломати фоиз (%) — ба ҳар пайдарпаии аломатҳо, аз ҷумла пайдарпаии холӣ, мувофиқат мекунад.
  • Зерхат (_) — ба маҳз як аломат мувофиқат мекунад.

Масалан, агар калимаи baker-ро ҷустуҷӯ кунед, қолабҳои зерини LIKE ба он мувофиқат мекунанд:

LIKE 'b%'  
LIKE '%ak%'  
LIKE '_aker'  
LIKE 'ba_er'  

Фарқи LIKE ва ILIKE дар чист?

Оператори LIKE, ки қисми стандарти ANSI SQL мебошад, байни ҳарфҳои калон ва хурд фарқ мегузорад. Оператори ILIKE, ки имконияти хоси PostgreSQL аст, байни онҳо фарқ намегузорад.

Намунаи коди 4-8 нишон медиҳад, ки ин ду калимаи калидӣ чӣ гуна натиҷаҳои гуногун медиҳанд.

Дархости аввал бо LIKE номҳоеро меҷӯяд, ки бо аломатҳои sam оғоз мешаванд. Азбаски ҳарфҳои калон ва хурд фарқ мекунанд, ягон натиҷа барнамегардонад.

Дархости дуюм бо ILIKE, ки ҳарфҳои калон ва хурдро яксон мешуморад, номҳои Samuel ва Samantha-ро аз ҷадвал бармегардонад.

SELECT first_name  
FROM teachers  
WHERE first_name LIKE 'sam%';

SELECT first_name  
FROM teachers  
WHERE first_name ILIKE 'sam%';  

Намунаи коди 4-8: Полоиш бо LIKE ва ILIKE

Дар тӯли солҳо ман бештар ба истифодаи ILIKE ва аломатҳои фарогир рӯ овардаам, то боварӣ ҳосил кунам, ки ҳангоми ҷустуҷӯ, махсусан ҳангоми санҷиши додаҳо, натиҷаеро тасодуфан аз даст намедиҳам.

Ман фарз намекунам, ки шахси воридкунандаи номи одамон, ҷойҳо, маҳсулот ё дигар номҳои хос ҳамеша навиштани онҳоро бо ҳарфи калон дар хотир доштааст.

Агар яке аз ҳадафҳои суҳбат бо додаҳо фаҳмидани сифати онҳо бошад, ҷустуҷӯе, ки байни ҳарфҳои калон ва хурд фарқ намегузорад, барои ёфтани шаклҳои гуногуни навишт кумак мекунад.

Азбаски LIKE ва ILIKE қолабҳоро ҷустуҷӯ мекунанд, кори онҳо дар пойгоҳҳои бузурги додаҳо метавонад суст бошад. Суръатро бо истифода аз индексҳо беҳтар кардан мумкин аст. Ман инро дар бахши «Тезонидани дархостҳо бо индексҳо»-и боби 8 мефаҳмонам.

Якҷо кардани операторҳо бо AND ва OR

Операторҳои муқоисавӣ ҳангоми якҷо истифода шудан боз ҳам муфидтар мешаванд. Барои ин шартҳоро бо операторҳои мантиқии AND ва OR ва дар ҳолати зарурӣ бо қавсҳо мепайвандем.

Дастурҳои намунаи коди 4-9 се мисоли чунин якҷоякуниро нишон медиҳанд.

SELECT *  
FROM teachers  
WHERE school = 'Myers Middle School'  
      AND salary < 40000;

SELECT *  
FROM teachers  
WHERE last_name = 'Cole'  
      OR last_name = 'Bush';

SELECT *  
FROM teachers  
WHERE school = 'F.D. Roosevelt HS'  
      AND (salary < 38000  
           OR salary > 40000);  

Намунаи коди 4-9: Якҷо кардани операторҳо бо AND ва OR

Дархости аввал дар қисми WHERE аз AND истифода мебарад, то омӯзгоронеро ёбад, ки дар Myers Middle School кор мекунанд ва маошашон аз 40 000 доллар камтар аст.

Азбаски ду шартро бо AND пайваст кардем, барои ба шартҳои WHERE мувофиқ омадан ва ба натиҷа дохил шудани сатр, ҳар ду шарт бояд дуруст бошанд.

Мисоли дуюм аз OR истифода мебарад, то омӯзгореро ёбад, ки насабаш Cole ё Bush аст. Вақте шартҳоро бо OR пайваст мекунем, барои мувофиқ омадани сатр ҳадди ақал яке аз шартҳо бояд дуруст бошад.

Мисоли охирин омӯзгорони мактаби Roosevelt-ро меҷӯяд, ки маошашон аз 38 000 доллар камтар ё аз 40 000 доллар бештар аст.

Вақте шартҳоро дар дохили қавс ҷойгир мекунем, онҳо пеш аз якҷо шудан бо шартҳои дигар ҳамчун як гурӯҳ арзёбӣ мешаванд. Дар ин ҳолат номи мактаб бояд дақиқан F.D. Roosevelt HS бошад ва маош бояд аз ҳадди поёнии муайяншуда камтар ё аз ҳадди болоӣ бештар бошад.

Агар дар як қисми дархост ҳам AND ва ҳам OR истифода шаванд, вале қавс набошад, пойгоҳи додаҳо аввал шарти AND ва баъд шарти OR-ро арзёбӣ мекунад.

Дар мисоли охирин, агар қавсҳоро гирем, натиҷа дигар мешавад. Пойгоҳи додаҳо чунин сатрҳоро меҷӯяд:

  • сатрҳое, ки номи мактабашон F.D. Roosevelt HS ва маошашон аз 38 000 доллар камтар аст;
  • ё сатрҳои ҳар мактабе, ки маошашон аз 40 000 доллар бештар аст.

Инро дар Query Tool санҷед, то фарқро бинед.

Ҳамаи қисмҳоро якҷо мекунем

Акнун мебинед, ки ҳатто дархостҳои содаи пешина имкон медиҳанд додаҳоро бо чандирӣ ва дақиқӣ омӯзем ва чизҳои лозимиро ёбем.

Метавонед шартҳои дорои операторҳои муқоисавиро бо AND ва OR якҷо кунед, то чанд меъёри полоиш дошта бошед. Ҳамчунин метавонед ORDER BY-ро илова кунед, то натиҷаҳо мураттаб шаванд.

Бо дарназардошти маълумоти боло, биёед мафҳумҳои ин бобро дар як дастур якҷо кунем, то робитаи онҳоро бинем. SQL ба тартиби калимаҳои калидӣ талаботи муайян дорад, бинобар ин тартиби зеринро риоя кунед:

SELECT column_names  
FROM table_name  
WHERE criteria  
ORDER BY column_names;  

Дар ин қолаб:

  • column_names — номҳои сутунҳо;
  • table_name — номи ҷадвал;
  • criteria — шартҳои полоиш.

Намунаи коди 4-10 дархостеро ба ҷадвали teachers нишон медиҳад, ки ҳамаи қисмҳои зикршударо дар бар мегирад.

SELECT first_name, last_name, school, hire_date, salary  
FROM teachers  
WHERE school LIKE '%Roos%'  
ORDER BY hire_date DESC;  

Намунаи коди 4-10: Дастури SELECT бо WHERE ва ORDER BY

Ин код омӯзгорони мактаби миёнаи Roosevelt-ро бармегардонад ва онҳоро аз рӯйи санаи ба кор қабул шудан — аз навтарин то қадимтарин — мураттаб мекунад.

Мо метавонем байни санаи ба кор қабул шудани омӯзгор дар мактаб ва сатҳи маоши ҳозираи ӯ робитаеро мушоҳида кунем:

first_namelast_nameschoolhire_datesalary
JanetSmithF.D. Roosevelt HS2011-10-3036200
KathleenRoushF.D. Roosevelt HS2010-10-2238500
LeeReynoldsF.D. Roosevelt HS1993-05-2265000

Хулоса

Акнун, ки сохтори асосии чанд навъи дархости SQL-ро омӯхтед, барои бисёр малакаҳои дигаре, ки дар бобҳои баъдӣ мефаҳмонам, замина пайдо кардед.

Мураттабсозӣ, полоиш ва интихоби танҳо сутунҳои муҳимтарини ҷадвал метавонанд аз додаҳои шумо миқдори ҳайратовари маълумотро ошкор кунанд ва ба ёфтани ҳикояте, ки онҳо нақл мекунанд, кумак расонанд.

Дар боби оянда бо яке аз ҷанбаҳои дигари асосии SQL — навъҳои додаҳо — шинос мешавед.

Худатон бисанҷед

  1. Ном, насаб ва маоши омӯзгорони мактаби Myers Middle School-ро гиред ва аз рӯйи насаб мураттаб кунед.
  2. Омӯзгоронеро ёбед, ки номашон бо ҳарфи S оғоз мешавад ва маошашон аз 40 000 зиёд аст.
  3. Омӯзгоронеро, ки аз 1 январи 2010 сар карда ба кор қабул шудаанд, аз рӯйи маош аз калон ба хурд нишон диҳед.

Ҷавобҳо дар замима, бахши «Ҷавобҳо ба машқҳо», оварда шудаанд.

пешина
аз 14
навбатӣ