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

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

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

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

Боби 2. Насби PostgreSQL бо Docker

Бо Docker шумо метавонед PostgreSQL-ро дар контейнер ба кор дароред ва барои омӯзиши SQL истифода баред. Дар ин дастур PostgreSQL-ро оғоз мекунем, ба он пайваст мешавем ва ҷадвали аввалро месозем.

1. Насб кардани Docker

Барои Windows ё macOS барномаи Docker Desktop-ро насб кунед:

Docker Desktop абзори Docker Compose-ро ҳам дар бар мегирад. Он имкон медиҳад танзимоти контейнерро дар як файл нигоҳ дорем. Маълумоти бештар: Docker Docs.

Пас аз насб Docker Desktop-ро кушоед. Сипас дар Terminal ё PowerShell фармонҳои зеринро иҷро кунед:

docker --version  
docker compose version  

Агар рақами версияҳо намоён шавад, метавонед идома диҳед.

2. Сохтани ҷузвдони лоиҳа

Дар терминал иҷро кунед:

mkdir postgres-learning  
cd postgres-learning  

Дар дохили ин ҷузвдон файле бо номи compose.yaml созед ва матни зеринро дар он гузоред:

services:  
  db:  
    image: postgres:18  
    restart: unless-stopped

    environment:  
      POSTGRES_USER: postgres  
      POSTGRES_PASSWORD: "LearnSQL_2026_ChangeMe"  
      POSTGRES_DB: learning  
      POSTGRES_INITDB_ARGS: "--locale-provider=icu --icu-locale=tg --icu-rules='&е<ё<<<Ё &и<ӣ<<<Ӣ &у<ӯ<<<Ӯ'"

    ports:  
      - "127.0.0.1:5432:5432"

    volumes:  
      - postgres_data:/var/lib/postgresql

volumes:  
  postgres_data:  

Дар ин танзимот:

ТанзимМаъно
image: postgres:18Истифодаи тасвири расмии PostgreSQL 18
POSTGRES_USERНоми корбари ибтидоӣ
POSTGRES_PASSWORDРамзи корбар; онро бо рамзи худ иваз кунед
POSTGRES_DBНоми пойгоҳи додаҳои ибтидоӣ
POSTGRES_INITDB_ARGSТартиби алифбои тоҷикӣ барои мураттабсозии матн (шарҳ дар поён)
portsДастрасӣ аз ҳамин компютер тавассути порти 5432
postgres_dataҶойи доимии нигоҳдории додаҳо

Тартиби алифбои тоҷикӣ

Вақте ки SQL матнро бо ORDER BY мураттаб мекунад, тартиби ҳарфҳоро аз танзими collation мегирад. Тасвири PostgreSQL ба таври пешфарз тартиби англисиро истифода мебарад. Дар он Ё, Ӣ ва Ӯ ҳамчун шаклҳои дигари Е, И ва У ҳисоб мешаванд, бинобар ин, масалан, Ӯба пеш аз Ум меояд — на мисли алифбои тоҷикӣ.

Сатри POSTGRES_INITDB_ARGS инро ислоҳ мекунад:

  • --locale-provider=icu --icu-locale=tg — китобхонаи ICU ва забони тоҷикиро интихоб мекунад;
  • --icu-rules='&е<ё<<<Ё &и<ӣ<<<Ӣ &у<ӯ<<<Ӯ' — қоидаҳое, ки ё-ро пас аз е, ӣ-ро пас аз и ва ӯ-ро пас аз у ҳамчун ҳарфҳои алоҳида мегузоранд. Ҳарфҳои Ғ, Қ, Ҳ ва Ҷ бе ин ҳам дуруст ҷойгир мешаванд.

Ҳамаи пойгоҳҳои додаҳое, ки баъдтар месозед, ин танзимро мерос мегиранд. Масалан, SELECT ... ORDER BY калимаҳоро чунин мураттаб мекунад:

Гулдара Ғарм Евро Ёвон Ия Ӣ Йод Кӯл Қалъа Ум Ӯба Хуҷанд Ҳисор Чашма Ҷануб Шимол  

Ин танзим танҳо ҳангоми бори аввал сохта шудани ҷузвдони додаҳо татбиқ мешавад. Агар PostgreSQL-ро аллакай бе ин сатр оғоз карда бошед, сатрро илова кунед ва пойгоҳро аз нав созед: docker compose down -v ва баъд docker compose up -d. Эҳтиёт шавед: -v ҳамаи додаҳои мавҷударо нест мекунад.

Барои тасвири расмии PostgreSQL 18 нуқтаи пайвасткунии volume — /var/lib/postgresql аст. Дар дастурҳои версияҳои 17 ва пештар мумкин аст роҳи /var/lib/postgresql/data-ро бинед. Маълумоти бештар: Docker Hub.

3. Ба кор даровардани PostgreSQL

Дар ҳамон ҷузвдоне, ки compose.yaml ҷойгир аст, иҷро кунед:

docker compose up -d  

Ҳангоми иҷрои аввал Docker тасвири заруриро боргирӣ мекунад ва контейнерро оғоз менамояд. Параметри -d контейнерро дар замина ба кор медарорад. Маълумоти бештар: Docker Docs.

Барои санҷидани ҳолат:

docker compose ps  

Барои дидани гузориши кори PostgreSQL:

docker compose logs db  

Дар гузориш паёми зеринро ҷустуҷӯ кунед:

database system is ready to accept connections  

Ин маънои онро дорад, ки сервер барои пайвастшавӣ омода аст.

4. Кушодани PostgreSQL дар терминал

PostgreSQL сервери пойгоҳи додаҳост. Барои навиштан ва иҷро кардани SQL ба он тавассути барномаи муштарӣ пайваст мешавем. Яке аз чунин барномаҳо psql мебошад, ки дар контейнер мавҷуд аст.

Иҷро кунед:

docker compose exec db psql -U postgres -d learning  

Пас аз пайвастшавӣ чунин сатри воридкунӣ пайдо мешавад:

learning=#  

Акнун метавонед SQL нависед:

SELECT version();  

Барои дидани сана ва вақти ҷорӣ:

SELECT now();  

Ҳар дастури SQL-ро бо нуқтаверг — ; — анҷом диҳед.

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

Дар дохили psql ин кодро иҷро кунед:

CREATE TABLE students (  
    id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,  
    full_name text NOT NULL,  
    age integer  
);  

Акнун чанд сабт илова мекунем:

INSERT INTO students (full_name, age)  
VALUES  
    ('Аҳмад', 19),  
    ('Мадина', 21),  
    ('Фарид', 20);  

Барои дидани натиҷа:

SELECT * FROM students;  

Натиҷа тақрибан чунин мешавад:

idfull_nameage
1Аҳмад19
2Мадина21
3Фарид20

Якчанд фармони муфиди psql:

ФармонВазифа
\lНамоиши пойгоҳҳои додаҳо
\dtНамоиши ҷадвалҳо
\d studentsНамоиши сохтори ҷадвали students
\qБаромадан аз psql

Пас аз \q сервери PostgreSQL кор карданро идома медиҳад.

6. Пайвастшавӣ тавассути pgAdmin

Агар муҳити графикиро дӯст доред, pgAdmin-ро дар компютери худ насб кунед.

Дар pgAdmin ба бахши Servers бо тугмаи рости муш зер карда, Register → Server-ро интихоб намоед.

Дар ҷадвали General ном гузоред:

Local Docker PostgreSQL  

Дар ҷадвали Connection маълумоти зеринро ворид кунед:

МайдонҚимат
Host name/address127.0.0.1
Port5432
Maintenance databaselearning
Usernamepostgres
PasswordРамзи гузоштаи шумо дар compose.yaml

Сипас Save-ро пахш кунед. pgAdmin барои кор бо сервер аввал пайвастшавиро талаб мекунад. Маълумоти бештар: ҳуҷҷатҳои pgAdmin.

Пас аз пайвастшавӣ пойгоҳи learning-ро интихоб карда, Query Tool-ро кушоед. Дар он нависед:

SELECT * FROM students;  

Бо пахши Execute ё тугмаи F5 натиҷаро мебинед.

Ин танзимот барои pgAdmin-и дар худи компютер насбшуда аст.

7. Қатъ кардан ва дубора оғоз намудан

Барои муваққатан қатъ кардани контейнер:

docker compose stop  

Барои дубора оғоз кардани он:

docker compose start  

Барои қатъ кардан ва бардоштани контейнер:

docker compose down  

Додаҳо дар volume боқӣ мемонанд. Баъдтар бо фармони зерин контейнерро дубора месозед:

docker compose up -d  

Ба docker compose down параметри -v илова накунед, агар мехоҳед додаҳо нигоҳ дошта шаванд: он volume-и ин лоиҳаро ҳам ҳазф мекунад.

8. Ду мушкили маъмул

Порти 5432 аллакай истифода мешавад. Шояд дар компютер PostgreSQL-и дигар фаъол бошад. Дар compose.yaml порти тарафи компютерро тағйир диҳед:

ports:  
  - "127.0.0.1:5433:5432"  

Сипас:

docker compose up -d  

Ҳангоми пайвастшавӣ аз pgAdmin акнун порти 5433-ро истифода баред.

Рамзро дар файл иваз кардам, вале рамзи нав кор намекунад. Тағйирёбандаҳои POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB ва POSTGRES_INITDB_ARGS танҳо ҳангоми омодасозии аввалини ҷузвдони холии додаҳо истифода мешаванд. Тағйири файл рамзи пойгоҳи мавҷударо иваз намекунад. Маълумоти бештар: Docker Hub.

Барои иваз кардани рамз ба psql ворид шавед:

docker compose exec db psql -U postgres -d learning  

Сипас иҷро кунед:

\password postgres  

Рамзи навро ду бор ворид кунед ва онро дар танзимоти пайвастшавии pgAdmin низ нав кунед.

Хулоса

Акнун дар компютери шумо сервери PostgreSQL 18 дар контейнери Docker кор мекунад. Шумо бо psql ва pgAdmin ба он пайваст шудед, ҷадвали аввалро сохтед ва медонед, ки контейнерро чӣ гуна қатъ ва дубора оғоз кунед, бе он ки додаҳо гум шаванд.

Ҳамаи фармонҳои docker compose-ро дар ҷузвдони postgres-learning, ки файли compose.yaml дар он ҷойгир аст, иҷро кунед. Дар боби оянда пойгоҳи додаҳои analysis-ро месозем, ки барои аксари мисолҳои китоб истифода мешавад.

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