Пойгоҳи додаҳо ва 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;
Натиҷа тақрибан чунин мешавад:
| id | full_name | age |
|---|---|---|
| 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/address | 127.0.0.1 |
| Port | 5432 |
| Maintenance database | learning |
| Username | postgres |
| 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-ро месозем, ки барои аксари мисолҳои китоб истифода мешавад.

Барномасозӣ
Олами Афсонаҳо
Ахбор
Дунё