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

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

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

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

Боби 3. Сохтани аввалин пойгоҳи додаҳо ва ҷадвал

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

Ҷадвал сохторест аз сатрҳо ва сутунҳо, ки додаҳоро нигоҳ медорад. Ҳар сатр аз маҷмӯи сутунҳо иборат аст ва ҳар сутун додаҳои навъи муайянро дар бар мегирад: маъмулан ададҳо, аломатҳо ва санаҳо. Мо SQL-ро барои муайян кардани сохтори ҷадвал ва робитаи он бо ҷадвалҳои дигари пойгоҳи додаҳо истифода мебарем. Ҳамчунин, бо SQL аз ҷадвалҳо додаҳоро мегирем, яъне ба онҳо дархост мефиристем.

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

Шиносоӣ бо ҷадвалҳо

Донистани сохтори ҷадвалҳо барои фаҳмидани додаҳои пойгоҳи шумо аҳаммияти асосӣ дорад. Ҳар вақте ки ман бо пойгоҳи додаҳои нав корро оғоз мекунам, пеш аз ҳама ҷадвалҳои онро аз назар мегузаронам. Аз номи ҷадвалҳо ва сохтори сутунҳояшон нишонаҳо меҷӯям. Оё онҳо матн доранд, адад доранд ё ҳар дуро? Дар ҳар ҷадвал чанд сатр ҳаст?

Сипас шумораи ҷадвалҳои пойгоҳи додаҳоро месанҷам. Содатарин пойгоҳи додаҳо метавонад танҳо як ҷадвал дошта бошад. Барномаи мукаммале, ки маълумоти муштариёнро идора мекунад ё парвозҳои ҳавопаймоҳоро пайгирӣ менамояд, метавонад даҳҳо ё садҳо ҷадвал дошта бошад. Шумораи ҷадвалҳо на танҳо ҳаҷми додаҳои таҳлилшавандаро нишон медиҳад, балки ишора мекунад, ки бояд робитаҳои байни додаҳои ҷадвалҳои гуногунро низ омӯзам.

Пеш аз он ки ба омӯзиши SQL ворид шавед, биёед намунаеро бинем, ки муҳтавои ҷадвалҳо чӣ гуна буда метавонад. Мо пойгоҳи додаҳои фарзиро барои идора кардани сабти номи донишҷӯён ба дарсҳо истифода мебарем. Дар ин пойгоҳ чанд ҷадвал мавҷуд аст, ки донишҷӯён ва дарсҳои онҳоро пайгирӣ мекунанд.

Ҷадвали аввал, ки student_enrollment ном дорад, нишон медиҳад, ки кадом донишҷӯён ба ҳар гурӯҳи дарсӣ номнавис шудаанд:

student_idclass_idclass_sectionsemester
CHRISPA004COMPSCI1013Fall 2023
DAVISHE010COMPSCI1013Fall 2023
ABRILDA002ENG10140Fall 2023
DAVISHE010ENG10140Fall 2023
RILEYPH002ENG10140Fall 2023

Ин ҷадвал нишон медиҳад, ки ду донишҷӯ ба COMPSCI101 ва се донишҷӯ ба ENG101 номнавис шудаанд. Аммо маълумоти муфассал дар бораи ҳар донишҷӯ ва ҳар дарс дар куҷост? Дар ин мисол, чунин маълумот дар ҷадвалҳои алоҳидаи students ва classes нигоҳ дошта мешавад ва он ҷадвалҳо бо ҷадвали мазкур робита доранд. Маҳз дар ҳамин ҷо тавоноии пойгоҳи додаҳои релятсионӣ, яъне робитавӣ, намоён мегардад.

Чанд сатри аввали ҷадвали students чунинанд:

student_idfirst_namelast_namedob
ABRILDA002AbrilDavis2005-01-10
CHRISPA004ChrisPark1999-04-10
DAVISHE010DavisHernandez2006-09-14
RILEYPH002RileyPhelps2005-06-15

Ҷадвали students маълумоти муфассали ҳар донишҷӯро нигоҳ медорад ва қимати сутуни student_id барои шинохтани ҳар яки онҳо истифода мешавад. Ин қимат ҳамчун калиди ягона амал карда, ду ҷадвалро бо ҳам мепайвандад. Бо ёрии ин робита шумо метавонед сутуни class_id-ро аз ҷадвали student_enrollment ва сутунҳои first_name ва last_name-ро аз ҷадвали students гирифта, чунин сатрҳоро ҳосил кунед:

class_idfirst_namelast_name
COMPSCI101DavisHernandez
COMPSCI101ChrisPark
ENG101AbrilDavis
ENG101DavisHernandez
ENG101RileyPhelps

Ҷадвали classes низ ҳамин тавр кор мекунад: он сутуни class_id ва чанд сутуни дигар барои маълумоти муфассали дарс дорад. Созандагони пойгоҳи додаҳо одатан барои ҳар мавҷудияти асосие, ки пойгоҳ идора мекунад, ҷадвали алоҳида месозанд. Ин кор такрори нолозими додаҳоро кам мекунад.

Дар мисоли мо ном ва санаи таваллуди ҳар донишҷӯ танҳо як бор нигоҳ дошта мешавад. Ҳатто агар донишҷӯ ба чанд дарс номнавис шавад — чунон ки Davis Hernandez кардааст — мо номи ӯро дар ҷадвали student_enrollment дар паҳлуи ҳар дарс дубора ворид карда, ҷойи пойгоҳи додаҳоро беҳуда сарф намекунем. Танҳо шиносаи донишҷӯро менависем.

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

Сохтани пойгоҳи додаҳо

Барномаи PostgreSQL, ки дар боби 2 ба кор даровардед, низоми идоракунии пойгоҳи додаҳо мебошад. Ин маҷмӯи нармафзор ба шумо имкон медиҳад, ки додаҳои дар пойгоҳҳо нигоҳдошташударо муайян ва идора кунед ва ба онҳо дархост фиристед.

Пойгоҳи додаҳо маҷмӯи объектҳоест, ки ҷадвалҳо, функсияҳо ва бисёр чизҳои дигарро дар бар мегирад. Ҳангоми бори аввал оғоз шудани контейнер сервери пойгоҳи додаҳо — нусхаи барномае, ки дар компютери шумо кор мекунад — сохта шуд. Ин сервер пойгоҳи додаҳои пешфарзи postgres ва пойгоҳи learning-ро, ки дар compose.yaml муайян кардед, дар бар мегирад.

Тибқи ҳуҷҷатҳои PostgreSQL, пойгоҳи додаҳои пешфарзи postgres «барои истифодаи корбарон, барномаҳои ёрирасон ва барномаҳои тарафи сеюм пешбинӣ шудааст».

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

Барои сохтани пойгоҳи додаҳо ҳамагӣ як сатри SQL лозим аст:

CREATE DATABASE analysis;  

Ин дастур дар сервери шумо пойгоҳи додаеро бо номи analysis бо танзимоти пешфарзи PostgreSQL месозад. Аҳаммият диҳед, ки код аз ду калимаи калидӣ — CREATE ва DATABASE — ва баъд аз онҳо аз номи пойгоҳи додаҳои нав иборат аст.

Дар охири дастур нуқтаверг (;) мегузоред, ки анҷоми фармонро нишон медиҳад. Мувофиқи стандарти ANSI SQL, ҳамаи дастурҳои PostgreSQL-ро бояд бо нуқтаверг анҷом диҳед. Дар баъзе ҳолатҳо дархостҳо бе нуқтаверг ҳам кор мекунанд, аммо на ҳамеша. Бинобар ин, истифодаи он одати хуб аст.

Иҷро кардани SQL

Дар боби 2 PostgreSQL-ро дар Docker ба кор даровардед ва бо ду барномаи муштарӣ шинос шудед: psql дар терминал ва pgAdmin бо интерфейси графикӣ. Ҳар дуи онҳо барои иҷрои мисолҳои ин китоб мувофиқанд — аз ҳамонеро истифода баред, ки бароятон қулайтар аст. Иҷро кардани дастурҳои навиштаатонро иҷро кардани код меноманд.

Аввал боварӣ ҳосил кунед, ки контейнер кор мекунад. Дар ҷузвдони postgres-learning иҷро кунед:

docker compose up -d  

Бо psql. Ба пойгоҳи додаҳои learning, ки ҳангоми насб сохта шуда буд, пайваст шавед:

docker compose exec db psql -U postgres -d learning  

Дастури CREATE DATABASE analysis;-ро нависед ва Enter-ро пахш кунед. PostgreSQL ҷавоб медиҳад:

CREATE DATABASE  

Бо фармони \l метавонед рӯйхати пойгоҳҳои додаҳоро бинед — analysis бояд дар он бошад.

Бо pgAdmin. Дар мурургари объектҳо — панели амудии тарафи чап — сервери Local Docker PostgreSQL-ро, ки дар боби 2 сабт кардед, кушоед. Бахши Databases-ро васеъ карда, learning-ро интихоб кунед ва бо Tools → Query Tool абзори дархостро кушоед. Дастури CREATE DATABASE analysis;-ро дар муҳаррир нависед ва нишонаи Execute ё тугмаи F5-ро пахш кунед. Дар бахши Messages паём дар бораи бомуваффақият иҷро шудани дархост пайдо мешавад. Барои дидани пойгоҳи нав рӯйи Databases тугмаи рости мушро пахш карда, Refresh-ро интихоб кунед.

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

Пайвастшавӣ ба пойгоҳи додаҳои analysis

Пеш аз сохтани ҷадвал бояд боварӣ ҳосил кунед, ки ба пойгоҳи додаҳои analysis пайваст ҳастед, на ба learning. Ҷадвале, ки дар пойгоҳи нодуруст сохта шавад, дар analysis намоён намешавад.

Дар psql бо фармони \c ба пойгоҳи дигар гузаред:

\c analysis  

Сатри воридкунӣ ба analysis=# иваз мешавад. Дафъаҳои дигар метавонед бевосита ба analysis пайваст шавед:

docker compose exec db psql -U postgres -d analysis  

Дар pgAdmin абзори дархости кушодаро бо пахш кардани X пӯшед, дар мурургари объектҳо analysis-ро интихоб кунед ва бо Tools → Query Tool равзанаи навро кушоед. Дар болои он бояд навиштаи analysis/postgres@Local Docker PostgreSQL-ро бинед.

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

Сохтани ҷадвал

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

Навъи дода муайян мекунад, ки сутун кадом қиматҳоро қабул карда метавонад: масалан, матн, ададҳои бутун, ададҳои даҳӣ ё санаҳо. Муайян кардани навъи дода яке аз роҳҳоест, ки SQL тавассути он дурустӣ ва якпорчагии додаҳоро таъмин мекунад.

Масалан, сутуни навъи date додаҳоро танҳо дар яке аз қолабҳои стандартии сана, аз ҷумла YYYY-MM-DD, қабул мекунад. Агар кӯшиш кунед ба он аломатҳоеро ворид намоед, ки қолаби сана надоранд, масалан калимаи peach, паёми хато мегиред.

Ба додаҳои дар ҷадвал нигоҳдошташуда бо дастурҳои SQL дастрасӣ пайдо карда, онҳоро таҳлил кардан ё аз онҳо дархост гирифтан мумкин аст. Шумо метавонед додаҳоро мураттаб кунед, таҳрир намоед ва бинед. Ҳамчунин, агар ниёзҳоятон тағйир ёбанд, баъдтар сохтори ҷадвалро ба осонӣ дигар карда метавонед.

Биёед дар пойгоҳи додаҳои analysis ҷадвал созем.

Истифодаи дастури CREATE TABLE

Барои ин машқ аз додаҳое истифода мебарем, ки бисёр мавриди баҳс қарор мегиранд: маоши омӯзгорон. Намунаи коди 3-1 дастури SQL-ро барои сохтани ҷадвале бо номи teachers нишон медиҳад. Пеш аз иҷрои он, биёед кодро баррасӣ кунем.

CREATE TABLE teachers (  
    id bigserial,  
    first_name varchar(25),  
    last_name varchar(50),  
    school varchar(50),  
    hire_date date,  
    salary numeric  
);  

Намунаи коди 3-1: Сохтани ҷадвали teachers бо шаш сутун

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

Код бо ду калимаи калидии SQL — CREATE ва TABLE — оғоз мешавад. Ин калимаҳо ҳамроҳ бо номи teachers ба PostgreSQL мефаҳмонанд, ки қисми баъдии код ҷадвалеро тавсиф мекунад, ки бояд ба пойгоҳи додаҳо илова шавад.

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

Ҳар номи сутун як унсури алоҳидаи додаҳоро ифода мекунад, ки навъи муайян дорад. Сутуни id навъи bigserial дорад. Ин навъи махсуси адади бутун аст, ки ҳангоми илова шудани ҳар сатр ба таври худкор зиёд мешавад. Дар сутуни id сатри аввал қимати 1, сатри дуюм қимати 2 мегирад ва ҳамин тавр идома меёбад.

Навъи bigserial ва дигар навъҳои serial татбиқҳои хоси PostgreSQL мебошанд, аммо аксари низомҳои пойгоҳи додаҳо имкони монанд доранд.

Сипас барои ном ва насаби омӯзгор ва мактабе, ки ӯ дар он дарс медиҳад, сутунҳо месозем. Ҳар кадоми онҳо навъи varchar доранд: сутуни матние, ки дарозии ҳадди аксараш бо адади дохили қавс муайян мешавад.

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

Барои сутуни hire_date, яъне санаи ба кор қабул шудани омӯзгор, навъи date ва барои сутуни salary, яъне маош, навъи numeric муайян шудааст.

Навъҳои додаҳоро дар боби 5 муфассалтар мефаҳмонам, аммо ин ҷадвал чанд намунаи маъмули онҳоро нишон медиҳад. Блоки код бо қавси пӯшида ва нуқтаверг анҷом меёбад.

Акнун, ки тасаввур кардед коди SQL чӣ гуна аст, биёед онро иҷро кунем.

Сохтани ҷадвали teachers

Шумо кодро доред ва ба пойгоҳи додаҳои analysis пайваст ҳастед. Коди CREATE TABLE-ро аз намунаи 3-1 дар psql ё дар абзори дархости pgAdmin нависед ва иҷро кунед.

Агар ҳама чиз дуруст бошад, psql чунин ҷавоб медиҳад:

CREATE TABLE  

pgAdmin бошад, дар бахши Messages паёми монанди зеринро нишон медиҳад:

Query returned successfully in 84 msec.  

Яъне: «Дархост дар 84 миллисония бомуваффақият иҷро шуд». Албатта, шумораи миллисонияҳо вобаста ба низоми шумо фарқ мекунад.

Акнун ҷадвали сохтаатонро пайдо кунед. Дар psql фармони \dt рӯйхати ҷадвалҳоро нишон медиҳад ва фармони \d teachers сохтори ҷадвалро — номи сутунҳо ва навъҳои онҳоро:

analysis=# \d teachers  
                                  Table "public.teachers"  
   Column   |         Type          | Collation | Nullable |               Default  
------------+-----------------------+-----------+----------+--------------------------------------  
 id         | bigint                |           | not null | nextval('teachers_id_seq'::regclass)  
 first_name | character varying(25) |           |          |  
 last_name  | character varying(50) |           |          |  
 school     | character varying(50) |           |          |  
 hire_date  | date                  |           |          |  
 salary     | numeric               |           |          |  

Аҳаммият диҳед, ки ин намоиш нишонагузориҳои иловагии пешфарзро ҳам дар бар мегирад, ки ҳангоми сохтани ҷадвал ба таври худкор илова шудаанд: масалан, bigserial ба bigint бо қимати пешфарзи nextval(...) табдил ёфтааст.

Дар pgAdmin рӯйи analysis тугмаи рости мушро пахш намуда, Refresh-ро интихоб кунед ва аз роҳи Schemas → public → Tables → teachers → Columns гузаред. Маълумоти дигар, аз ҷумла индексҳо, триггерҳо ва маҳдудиятҳо низ дар он ҷо пайдо мешаванд, аммо онҳоро дар бобҳои баъдӣ мефаҳмонам.

Табрик! То ин ҷо шумо пойгоҳи додаҳо сохтед ва ба он ҷадвал илова кардед. Қадами навбатӣ ворид кардани додаҳо ба ҷадвал аст, то тавонед аввалин дархости худро нависед.

Ворид кардани сатрҳо ба ҷадвал

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

Аммо барои оғоз мо бо истифода аз дастури INSERT INTO ... VALUES чанд сатр илова мекунем. Дар ин дастур сутунҳои мақсад ва қиматҳои додаҳо муайян мешаванд. Сипас додаҳоро дар ҷойи нави нигоҳдориашон мебинем.

Истифодаи дастури INSERT

Барои ворид кардани додаҳо ба ҷадвал коди намунаи 3-2-ро иҷро кунед:

INSERT INTO teachers (first_name, last_name, school, hire_date, salary)  
VALUES ('Janet', 'Smith', 'F.D. Roosevelt HS', '2011-10-30', 36200),  
       ('Lee', 'Reynolds', 'F.D. Roosevelt HS', '1993-05-22', 65000),  
       ('Samuel', 'Cole', 'Myers Middle School', '2005-08-01', 43500),  
       ('Samantha', 'Bush', 'Myers Middle School', '2011-10-30', 36200),  
       ('Betty', 'Diaz', 'Myers Middle School', '2005-08-30', 43500),  
       ('Kathleen', 'Roush', 'F.D. Roosevelt HS', '2010-10-22', 38500);  

Намунаи коди 3-2: Ворид кардани додаҳо ба ҷадвали teachers

Ин блоки код номҳо ва маълумоти шаш омӯзгорро ворид мекунад. Дар ин ҷо синтаксиси PostgreSQL ба стандарти ANSI SQL мувофиқ аст: баъд аз калимаҳои калидии INSERT INTO номи ҷадвал ва дар дохили қавс номи сутунҳое меоянд, ки бояд пур шаванд.

Дар сатри баъдӣ калимаи калидии VALUES ва додаҳое оварда мешаванд, ки бояд ба сутунҳои ҳар сатр ворид гарданд.

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

Ҳар маҷмӯи додаҳои сатр бо вергул анҷом меёбад, ба истиснои охирин маҷмӯъ, ки тамоми дастурро бо нуқтаверг ба охир мерасонад.

Аҳаммият диҳед, ки баъзе қиматҳои воридшаванда дар нохунакҳои якка ('...') гирифта шудаанд ва баъзеи дигар не. Ин талаботи стандартии SQL аст. Матн ва санаҳо ба нохунак ниёз доранд; ададҳо, аз ҷумла ададҳои бутун ва даҳӣ, ба нохунак ниёз надоранд. Ҳар гоҳе ки ин талабот дар мисолҳо пеш ояд, ба он ишора мекунам.

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

Чаро беҳтар аст қолаби YYYY-MM-DD-ро истифода барем? Барои дидани ҳаҷвнигории ҷолибе дар ин бора ба xkcd нигаред. PostgreSQL бисёр қолабҳои дигари санаро низ дастгирӣ мекунад ва ман дар мисолҳо чандтои онҳоро истифода мебарам.

Шояд дар бораи сутуни id, ки сутуни аввали ҷадвал аст, савол дошта бошед. Ҳангоми сохтани ҷадвал дар код барои ин сутун навъи bigserial-ро муайян кардед. Аз ин рӯ, PostgreSQL ҳангоми ворид кардани ҳар сатр сутуни id-ро ба таври худкор бо адади бутуни афзоянда пур мекунад. Инро дар боби 5, ҳангоми баррасии навъҳои додаҳо, муфассал мефаҳмонам.

Акнун кодро иҷро кунед. Ин дафъа чунин натиҷа пайдо мешавад:

INSERT 0 6  

Аз ду ададе, ки баъд аз калимаи INSERT омадаанд, адади охирин шумораи сатрҳои воридшударо нишон медиҳад: 6.

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

Дидани додаҳо

Додаҳоеро, ки нав ба ҷадвали teachers ворид кардед, зуд аз назар гузаронед:

SELECT * FROM teachers;  

Шаш сатри додаҳоро мебинед ва ҳар сутун бо қиматҳои дастури SQL пур шудааст:

 id | first_name | last_name |       school        | hire_date  | salary  
----+------------+-----------+---------------------+------------+--------  
  1 | Janet      | Smith     | F.D. Roosevelt HS   | 2011-10-30 |  36200  
  2 | Lee        | Reynolds  | F.D. Roosevelt HS   | 1993-05-22 |  65000  
  3 | Samuel     | Cole      | Myers Middle School | 2005-08-01 |  43500  
  4 | Samantha   | Bush      | Myers Middle School | 2011-10-30 |  36200  
  5 | Betty      | Diaz      | Myers Middle School | 2005-08-30 |  43500  
  6 | Kathleen   | Roush     | F.D. Roosevelt HS   | 2010-10-22 |  38500  
(6 rows)  

Аҳаммият диҳед: гарчанде ба сутуни id қимате ворид накардед, ба ҳар омӯзгор рақами шиноса дода шудааст.

Дар pgAdmin ҳамин додаҳоро бе навиштани SQL низ дидан мумкин аст: рӯйи ҷадвал тугмаи рости мушро пахш карда, View/Edit Data → All Rows-ро интихоб кунед. Дар он ҷо сарлавҳаи ҳар сутун навъи додаро низ нишон медиҳад; varchar дар шакли пуррааш ҳамчун character varying намоён мешавад. Аммо мо диққати худро ба навиштани SQL барои иҷрои ин вазифаҳо равона мекунем.

Ҳангоми кор накардани код аз куҷо кумак гирифтан мумкин аст?

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

Хатоҳо рух медиҳанд. Хоҳ ҳангоми навиштан иштибоҳ кунед, хоҳ тартиби амалҳоро омехта намоед, забонҳои компютерӣ ба хатои синтаксисӣ гузашт намекунанд.

Масалан, агар дар коди намунаи 3-2 як вергулро фаромӯш кунед, PostgreSQL чунин паёми хато медиҳад:

ERROR:  syntax error at or near "("  
LINE 4:     ('Samuel', 'Cole', 'Myers Middle School', '2005-08-01', 43...  
            ^  

Хушбахтона, паёми хато ишора мекунад, ки мушкил чист ва дар куҷост: дар наздикии қавси кушода дар сатри 4 хатои синтаксисӣ рух додааст.

Аммо баъзан паёмҳои хато метавонанд норавшантар бошанд. Дар чунин ҳолат ҳамон кореро мекунед, ки барномасозони беҳтарин мекунанд: паёми хаторо зуд дар интернет ҷустуҷӯ менамоед. Ба эҳтимоли зиёд, каси дигар низ бо ҳамин мушкил рӯ ба рӯ шудааст ва шояд ҷавобашро донад.

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

Қолаббандии SQL барои осон хондан

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

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

  • Калимаҳои калидии SQL-ро бо ҳарфҳои калон нависед, масалан SELECT. Баъзе барномасозони SQL номҳои навъҳои додаҳоро низ бо ҳарфҳои калон менависанд, масалан TEXT ва INTEGER. Ман дар ин китоб навъҳои додаҳоро бо ҳарфҳои хурд менависам, то дар зеҳни шумо аз калимаҳои калидӣ фарқ кунанд. Аммо агар хоҳед, метавонед онҳоро бо ҳарфҳои калон нависед.
  • Аз услуби camelCase худдорӣ кунед. Барои номи объектҳо, аз ҷумла ҷадвалҳо ва сутунҳо, шакли lowercase_and_underscores — ҳарфҳои хурд ва зерхатҳо — ро истифода баред. Маълумоти бештар дар бораи ҳарфҳои калон ва хурд дар боби 8 оварда мешавад.
  • Барои хонданбобӣ қисмҳои дастур ва блокҳои кодро бо ду ё чор фосила ба дарун гузоред. Баъзе барномасозон ба ҷойи фосила табулятсияро меписанданд. Аз он усуле истифода баред, ки барои шумо ё ташкилотатон мувофиқ аст.

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

Хулоса

Дар ин боб шумо корҳои зиёдеро анҷом додед: пойгоҳи додаҳо сохтед, ба он ҷадвал илова кардед ва сипас ҷадвалро бо додаҳо пур намудед. Шумо дар роҳи илова кардани SQL ба маҷмӯи абзорҳои таҳлили додаҳои худ қарор доред!

Дар боби оянда аз ҳамин маҷмӯи додаҳои омӯзгорон истифода мебаред, то асосҳои дархост гирифтани додаҳо аз ҷадвалро бо истифода аз SELECT омӯзед.

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

  1. Ҷадвали subjects-ро бо се сутун созед: id бо навъи bigserial, subject_name бо навъи varchar(50) ва hours_per_week бо навъи integer. Ба он се фанн ворид кунед ва натиҷаро бо SELECT * FROM subjects; санҷед.
  2. Кӯшиш кунед ба ҷадвали teachers омӯзгореро ворид кунед, ки hire_date-и ӯ 'дирӯз' аст. PostgreSQL чӣ ҷавоб медиҳад ва чаро?
  3. Ба ҷадвали subjects фанне ворид кунед ва танҳо subject_name-ро нишон диҳед. Дар сутуни hours_per_week чӣ қимат пайдо мешавад?

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

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