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

Китоби омӯзишии SQL ва PostgreSQL барои навомӯзон: аз мафҳуми пойгоҳи додаҳои релятсионӣ ва насби PostgreSQL бо Docker то SELECT, навъҳои додаҳо, JOIN, тарҳрезии ҷадвалҳо, гурӯҳбандӣ, CTE, функсияҳои равзанавӣ, транзаксияҳо ва индексҳо. Ҳамаи мисолҳо дар PostgreSQL 18 санҷида шудаанд; дар охири бобҳо машқҳо ва дар замима ҷавобҳо оварда шудаанд.
Агенти Зеҳнӣ · 19 октябри 2026 · 14 саҳифа
Боби 5. Навъҳои додаҳо
Фаҳмидани навъҳои додаҳо муҳим аст, зеро нигоҳ доштани додаҳо дар шакли мувофиқ асоси сохтани пойгоҳҳои додаҳои қобили истифода ва анҷом додани таҳлили дақиқ мебошад. Ҳар боре ки ба омӯзиши пойгоҳи додаҳои нав шурӯъ мекунам, навъи додаҳои барои ҳар сутуни ҳар ҷадвал муайяншударо месанҷам. Агар бахтам ояд, метавонам фарҳанги додаҳо пайдо кунам: ҳуҷҷате, ки ҳамаи сутунҳоро номбар мекунад, ададӣ, аломатӣ ё навъи дигар будани онҳоро нишон медиҳад ва маънои қиматҳои ҳар сутунро шарҳ медиҳад. Мутаассифона, бисёр ташкилотҳо ҳуҷҷатгузории хубро таҳия ва нигоҳдорӣ намекунанд. Аз ин рӯ, шунидани ҷумлаи «Мо фарҳанги додаҳо надорем» ғайриодӣ нест. Дар чунин ҳолат ман сохтори ҷадвалҳоро дар pgAdmin месанҷам, то ҳарчи бештар маълумот гирам.
Навъҳои додаҳо мафҳуми барномасозӣ мебошанд, ки танҳо ба SQL маҳдуд намешаванд. Мафҳумҳои дар ин боб омӯхтаатон ҳангоми омӯзиши забонҳои дигари барномасозӣ низ ба кор меоянд.
Дар пойгоҳи додаҳои SQL ҳар сутуни ҷадвал метавонад танҳо як навъи дода дошта бошад. Шумо ин навъро дар дастури CREATE TABLE, пас аз номи сутун, муайян мекунед. Дар ҷадвали содаи зерин, ки метавонед онро баррасӣ кунед, вале сохтани он зарур нест, се навъи гуногуни дода мавҷуд аст: сана, адади бутун ва матн.
CREATE TABLE eagle_watch (
observation_date date,
eagles_seen integer,
notes text
);
Дар ин ҷадвал бо номи eagle_watch, ки барои сабти фарзии уқобҳои сари сафед пешбинӣ шудааст, пас аз номи сутуни observation_date навъи date-ро менависем, то он қиматҳои санаро нигоҳ дорад. Ба ҳамин монанд, барои нигоҳ доштани ададҳои бутун дар сутуни eagles_seen навъи integer ва барои нигоҳ доштани аломатҳо дар сутуни notes навъи text-ро муайян мекунем.
Ин навъҳои додаҳо ба се гурӯҳе дохил мешаванд, ки бештар бо онҳо рӯ ба рӯ мешавед:
- Аломатҳо: ҳар гуна ҳарф, рақам ё код.
- Ададҳо: ададҳои бутун ва касрӣ.
- Сана ва вақт: маълумоти марбут ба замон.
Ҳар як навъи додаҳоро муфассал баррасӣ мекунем. Ҳамчунин нишон медиҳам, ки кадом навъ ба стандарти ANSI SQL дохил мешавад ва кадомаш махсуси PostgreSQL аст. Шарҳи умумӣ ва муфассали фарқиятҳои PostgreSQL аз стандарти SQL дар ин саҳифа дастрас аст:
Муқоисаи PostgreSQL бо стандарти SQL
Фаҳмидани навъҳои аломатӣ
Навъҳои сатрҳои аломатӣ навъҳои таъиноти умумӣ мебошанд ва барои ҳар гуна омезиши матн, рақамҳо ва аломатҳо мувофиқанд. Ба онҳо навъҳои зерин дохил мешаванд.
char(n)
Сутуне бо дарозии собит, ки шумораи аломатҳои он тавассути n муайян мешавад. Сутуни навъи char(20) дар ҳар сатр 20 аломат нигоҳ медорад, новобаста аз он ки шумо чанд аломат ворид мекунед. Агар дар ягон сатр камтар аз 20 аломат ворид кунед, PostgreSQL қисми боқимондаро бо фосилаҳо пур мекунад.
Ин навъ ба стандарти SQL дохил мешавад ва онро бо номи дарозтари character(n) низ навиштан мумкин аст. Имрӯзҳо char(n) кам истифода мешавад ва асосан мероси низомҳои кӯҳнаи компютерӣ ба ҳисоб меравад.
varchar(n)
Сутуне бо дарозии тағйирёбанда, ки дарозии ниҳоии он тавассути n муайян мешавад. Агар аз ҳадди ниҳоӣ камтар аломат ворид кунед, PostgreSQL фосилаҳои иловагӣ нигоҳ намедорад. Масалан, сатри blue чор ҷойи аломатӣ ва сатри 123 се ҷойи аломатиро ишғол мекунад.
Дар пойгоҳҳои додаҳои калон ин тарзи нигоҳдорӣ фазои зиёдеро сарфа мекунад. Ин навъ низ ба стандарти SQL дохил мешавад ва онро бо номи дарозтари character varying(n) навиштан мумкин аст.
text
Сутуне бо дарозии тағйирёбанда ва бе маҳдудияти дарозии аз ҷониби шумо муайяншуда. Мувофиқи ҳуҷҷатҳои PostgreSQL, дарозтарин сатри аломатие, ки нигоҳ дошта мешавад, тақрибан 1 гигабайт аст.
Навъи text ба стандарти SQL дохил намешавад, аммо татбиқҳои монанди онро дар низомҳои дигари пойгоҳи додаҳо, аз ҷумла Microsoft SQL Server ва MySQL, пайдо мекунед.
Мувофиқи ҳуҷҷатҳои PostgreSQL, байни ин се навъ аз ҷиҳати суръати кор фарқи назаррас вуҷуд надорад. Дар низоми дигари идоракунии пойгоҳи додаҳо вазъ метавонад фарқ кунад, бинобар ин санҷидани ҳуҷҷатҳои он кори оқилона аст.
Чандирӣ ва имкони сарфаи фазо ба varchar ва text бартарӣ медиҳанд. Аммо дар баҳсҳои интернетӣ баъзе корбарон пешниҳод мекунанд, ки барои сутуне, ки ҳамеша шумораи якхелаи аломатҳо дорад, истифодаи char роҳи хуби нишон додани муҳтавои интизории он аст. Масалан, барои ихтисораҳои дуҳарфии почтавии иёлатҳои ИМА мумкин аст char(2) истифода шавад.
Эзоҳ: Бо ададҳое, ки дар сутуни аломатӣ нигоҳ дошта шудаанд, мустақиман амалҳои математикӣ анҷом дода наметавонед. Ададҳоро танҳо вақте ҳамчун навъи аломатӣ нигоҳ доред, ки онҳо код бошанд, масалан индекси почтавии ZIP дар ИМА.
Барои дидани кори ин се навъи аломатӣ, скрипти намунаи 5-1-ро иҷро кунед. Ин скрипт ҷадвали содае месозад, ба он додаҳо ворид мекунад ва сипас додаҳоро ба файли матнӣ содир мекунад.
CREATE TABLE char_data_types (
char_column char(10),
varchar_column varchar(10),
text_column text
);
INSERT INTO char_data_types
VALUES
('abc', 'abc', 'abc'),
('defghi', 'defghi', 'defghi');
COPY char_data_types TO '/tmp/typetest.txt'
WITH (FORMAT CSV, HEADER, DELIMITER '|');
Намунаи 5-1: Истифодаи навъҳои аломатӣ
Мо се сутуни аломатӣ бо навъҳои гуногун муайян мекунем ва ба ҳар кадом ду сатр бо сатрҳои аломатии якхела ворид мекунем. Бар хилофи дастури INSERT INTO, ки дар боби 3 омӯхтед, дар ин ҷо номи сутунҳоро нишон намедиҳем. Агар шумораи қиматҳои ҳар сатри VALUES ба шумораи сутунҳои ҷадвал мувофиқ бошад, пойгоҳи додаҳо чунин мешуморад, ки шумо қиматҳоро мувофиқи тартиби муайян шудани сутунҳо ворид мекунед.
Сипас, бо калимаи калидии COPY дар PostgreSQL додаҳоро ба файли матнии typetest.txt содир мекунем. Дар PostgreSQL дастури COPY table_name TO барои содироти додаҳо ва COPY table_name FROM барои воридоти онҳо истифода мешавад. Имконоти калимаи калидии WITH додаҳои файлро тавре шакл медиҳанд, ки сутунҳо бо аломати амудии | аз ҳам ҷудо шаванд. Бо ин роҳ, шумо метавонед фосилаҳоеро бинед, ки қисмҳои истифоданашудаи сутуни char-ро пур мекунанд.
Дар хотир доред, ки COPY файлро на дар компютери шумо, балки дар сервер менависад. Сервери мо дар контейнери Docker кор мекунад, бинобар ин файли /tmp/typetest.txt дар дохили контейнер пайдо мешавад. Барои дидани он дар ҷузвдони postgres-learning иҷро кунед:
docker compose exec db cat /tmp/typetest.txt
Агар файлро дар компютери худ лозим донед, онро аз контейнер нусха кунед:
docker compose cp db:/tmp/typetest.txt .
Муҳтавои файл бояд чунин бошад:
char_column|varchar_column|text_column
abc |abc|abc
defghi |defghi|defghi
Гарчанде барои ҳар ду сутуни char ва varchar дарозии 10 аломат муайян кардаед, танҳо сутуни char дар ҳар ду сатр 10 аломат мебарорад ва ҷойҳои истифоданашударо бо фосилаҳо пур мекунад. Сутунҳои varchar ва text танҳо аломатҳои воридкардаи шуморо нигоҳ медоранд.
Боз ҳам таъкид мекунам: аз ҷиҳати суръати кор байни ин се навъ фарқи назаррас нест. Аммо ин намуна нишон медиҳад, ки char метавонад аз миқдори зарурӣ бештар фазои нигоҳдорӣ ишғол кунад. Чанд фосилаи истифоданашуда дар ҳар сутун шояд ночиз намояд, вале агар онҳоро ба миллионҳо сатр дар даҳҳо ҷадвал зарб кунед, ба зудӣ орзу мекунед, ки фазоро сарфакоронатар истифода мебурдед.
Ман одатан барои ҳамаи сутунҳои аломатии худ text-ро истифода мебарам. Ин маро аз зарурати муайян кардани дарозии ниҳоӣ барои сутунҳои сершумори varchar озод мекунад. Ҳамчунин, агар талабот ба сутуни аломатӣ тағйир ёбад, баъдтар ба тағйир додани сохтори ҷадвал ниёз намемонад.
Фаҳмидани ададҳо
Сутунҳои ададӣ навъҳои гуногуни ададҳоро нигоҳ медоранд. Аммо вазифаи онҳо танҳо ҳамин нест: онҳо имкон медиҳанд, ки бо ин ададҳо ҳисобу китоб анҷом диҳед. Ин фарқи муҳим аз ададҳое мебошад, ки ҳамчун сатр дар сутуни аломатӣ нигоҳ дошта шудаанд. Бо чунин сатрҳо мустақиман ҷамъ, зарб, тақсим ё дигар амалҳои математикӣ анҷом дода намешавад.
Ғайр аз ин, тартибдиҳии ададҳои ҳамчун аломат нигоҳдошташуда аз тартибдиҳии ададҳои дар навъи ададӣ нигоҳдошташуда фарқ мекунад. Пас, агар ҳисобу китоб анҷом диҳед ё тартиби ададӣ муҳим бошад, аз навъҳои ададӣ истифода баред.
Навъҳои ададии SQL инҳоро дар бар мегиранд:
- Ададҳои бутун: ададҳои мусбат ва манфии бе қисми касрӣ.
- Ададҳои нуқтасобит ва нуқташиновар: ду шакли нигоҳдории ададҳои касрӣ.
Ҳар кадомро алоҳида баррасӣ мекунем.
Истифодаи ададҳои бутун
Ҳангоми омӯзиши пойгоҳи додаҳои SQL, навъҳои ададҳои бутун аз маъмултарин навъҳои ададӣ мебошанд. Ба онҳо ададҳои бутуни мусбат, манфӣ ва сифр дохил мешаванд. Фикр кунед, ки ададҳои бутун дар зиндагӣ чӣ қадар истифода мешаванд: рақами хона ё манзил, рақами силсилавии яхдон ё рақами чиптаи қуръакашӣ.
Стандарти SQL се навъи адади бутунро пешбинӣ мекунад: smallint, integer ва bigint. Фарқи онҳо дар ҳадди ададҳое мебошад, ки нигоҳ дошта метавонанд. Ҷадвали 5-1 ҳадди поёнӣ, ҳадди болоӣ ва ҳаҷми нигоҳдории ҳар кадомро бо байт нишон медиҳад.
Ҷадвали 5-1: Навъҳои ададҳои бутун
| Навъи додаҳо | Ҳаҷми нигоҳдорӣ | Диапазон |
|---|---|---|
smallint | 2 байт | аз −32768 то +32767 |
integer | 4 байт | аз −2147483648 то +2147483647 |
bigint | 8 байт | аз −9223372036854775808 то +9223372036854775807 |
Навъи bigint қариб ҳамаи талаботи эҳтимолии шуморо ба сутуни ададӣ қонеъ мекунад, гарчанде аз ҳама бештар фазо ишғол мекунад. Агар бо ададҳои аз тақрибан 2,1 миллиард калонтар кор кунед, истифодаи он зарур аст. Ҳамчунин метавонед онро навъи пешфарзи худ интихоб кунед, то аз ҷой нагирифтани адад дар сутун хавотир нашавед.
Аз тарафи дигар, агар мутмаин бошед, ки ададҳо аз ҳудуди integer берун намебароянд, ин навъ интихоби хуб аст, зеро нисбат ба bigint камтар фазо ишғол мекунад. Ин масъала ҳангоми кор бо миллионҳо сатри додаҳо аҳаммият пайдо мекунад.
Агар донед, ки қиматҳо дар доираи маҳдуд мемонанд, истифодаи smallint мантиқӣ аст. Масалан, рӯзи моҳ ё рақами сол. Навъи smallint нисбат ба integer ду баробар камтар фазо истифода мебарад. Аз ин рӯ, агар қиматҳои сутун ҳамеша ба диапазони он мувофиқ бошанд, ин интихоби оқилона дар тарҳрезии пойгоҳи додаҳост.
Агар кӯшиш кунед ададеро ба яке аз ин сутунҳо ворид кунед, ки аз диапазони он берун аст, пойгоҳи додаҳо амалиётро қатъ карда, хатои out of range — «берун аз диапазон» — бармегардонад.
Ададҳои бутуни худкор афзоянда
Баъзан сохтани сутуне муфид аст, ки ададҳои бутуни он бо ҳар илова шудани сатри нав худкор зиёд шаванд. Масалан, шумо метавонед чунин сутунро барои сохтани рақами ягонаи шиносоӣ — ID — барои ҳар сатри ҷадвал истифода баред. Ин гуна шиноса метавонад ҳамчун калиди асосӣ истифода шавад.
Дар натиҷа, ҳар сатр ID-и худро дорад, ки ҷадвалҳои дигари пойгоҳи додаҳо метавонанд ба он муроҷиат кунанд. Ин мафҳумро дар боби 7 баррасӣ мекунам.
Дар PostgreSQL ду роҳи худкор зиёд кардани қимати сутуни адади бутун вуҷуд дорад. Яке навъи serial аст, ки татбиқи махсуси PostgreSQL барои сутунҳои худкор рақамгузоришаванда мебошад. Роҳи дигар истифодаи калимаи калидии IDENTITY аз стандарти ANSI SQL аст. Аз serial оғоз мекунем.
Афзоиши худкор бо serial
Дар боби 3, ҳангоми сохтани ҷадвали teachers, шумо сутуни id-ро бо bigserial муайян карда будед. Ин навъ ва навъҳои ҳамҷинси он — smallserial ва serial — бештар аз он ки навъҳои воқеии додаҳо бошанд, татбиқи махсуси навъҳои мувофиқи smallint, integer ва bigint мебошанд.
Ҳангоми илова кардани сутуни навъи serial, PostgreSQL бо ҳар ворид шудани сатр қиматро худкор зиёд мекунад: аз 1 оғоз карда, то ҳадди ниҳоии навъи мувофиқи адади бутун.
Ҷадвали 5-2 навъҳои serial ва диапазони онҳоро нишон медиҳад.
Ҷадвали 5-2: Навъҳои serial
| Навъи додаҳо | Ҳаҷми нигоҳдорӣ | Диапазон |
|---|---|---|
smallserial | 2 байт | аз 1 то 32767 |
serial | 4 байт | аз 1 то 2147483647 |
bigserial | 8 байт | аз 1 то 9223372036854775807 |
Барои истифодаи навъи serial дар сутун, онро дар дастури CREATE TABLE мисли навъи адади бутун муайян кунед. Масалан, метавонед ҷадвали people-ро созед, ки сутуни id-и он аз ҷиҳати ҳаҷм ба навъи integer баробар аст:
CREATE TABLE people (
id serial,
person_name varchar(100)
);
Ҳар боре ки ба ҷадвал сатри нав бо person_name илова мешавад, қимати сутуни id як воҳид зиёд мешавад.
Афзоиши худкор бо IDENTITY
Аз версияи 10 сар карда, PostgreSQL IDENTITY-ро дастгирӣ мекунад. Ин татбиқи стандартии SQL барои ададҳои бутуни худкор афзоянда мебошад.
Синтаксиси IDENTITY дарозтар аст, аммо баъзе корбарони пойгоҳи додаҳо онро афзал медонанд. Сабабҳо инҳоянд: мувофиқат бо низомҳои дигар, аз ҷумла Oracle, ва мавҷудияти имконияте, ки аз ворид кардани тасодуфии қимат ба сутуни худкор афзоянда пешгирӣ мекунад. Навъҳои serial чунин воридкуниро иҷозат медиҳанд.
IDENTITY-ро бо ду роҳ муайян кардан мумкин аст:
GENERATED ALWAYS AS IDENTITYба пойгоҳи додаҳо мегӯяд, ки сутунро ҳамеша бо қимати худкор афзоянда пур кунад. Корбар наметавонад ба сутуниidқимат ворид кунад, магар ин ки ин танзимро махсусан сарфи назар намояд. Барои тафсилот ба бахшиOVERRIDING SYSTEM VALUEдар ҳуҷҷатҳои дастури INSERT-и PostgreSQL нигаред.GENERATED BY DEFAULT AS IDENTITYба пойгоҳи додаҳо мегӯяд, ки агар корбар қимате пешниҳод накунад, сутунро бо қимати худкор афзоянда пур кунад. Ин интихоб имкони пайдо шудани қиматҳои такрориро фароҳам меорад ва метавонад истифодаи онро барои сутунҳои калидӣ мушкил созад. Ин мавзӯъро дар боби 8 муфассалтар баррасӣ мекунам.
Ҳоло интихоби аввал, яъне ALWAYS-ро истифода мебарем. Барои сохтани ҷадвали people, ки сутуни id-и он тавассути IDENTITY пур мешавад, чунин синтаксисро истифода мебарем:
Азбаски ҷадвали people бо serial аллакай вуҷуд дорад, аввал онро нест мекунем:
DROP TABLE people;
CREATE TABLE people (
id integer GENERATED ALWAYS AS IDENTITY,
person_name varchar(100)
);
Барои сутуни id навъи integer ва пас аз он калимаҳои калидии GENERATED ALWAYS AS IDENTITY-ро менависем. Акнун ҳар боре ки ба ҷадвал қимати person_name ворид кунем, пойгоҳи додаҳо сутуни id-ро бо қимати худкор афзоянда пур мекунад.
Бо назардошти мувофиқати он ба стандарти ANSI SQL, дар қисми боқимондаи китоб аз IDENTITY истифода мебарам.
Эзоҳ: Гарчанде қимати сутуни худкор афзоянда бо ҳар илова шудани сатр зиёд мешавад, дар баъзе ҳолатҳо пайдарпаии рақамҳо фосила пайдо мекунад. Масалан, агар сатре ҳазф шавад, рақами он дигар ба таври худкор пур карда намешавад. Ё агар амали ворид кардани сатр қатъ шавад, қимати пайдарпаии сутун метавонад аллакай зиёд шуда бошад.
Истифодаи ададҳои даҳӣ
Адади даҳӣ аз қисми бутун ва қисми касрӣ иборат аст. Қисми касрӣ бо рақамҳои пас аз нуқтаи даҳӣ ифода мешавад. Дар пойгоҳи додаҳои SQL чунин ададҳо тавассути навъҳои нуқтасобит ва нуқташиновар коркард мешаванд.
Масалан, масофа аз хонаи ман то наздиктарин мағозаи хӯрокворӣ 6,7 мил аст. Ман метавонам 6.7-ро ҳам ба сутуни нуқтасобит ва ҳам ба сутуни нуқташиновар ворид кунам ва PostgreSQL ҳеҷ эътирозе намекунад. Фарқ дар он аст, ки компютер додаҳоро чӣ гуна нигоҳ медорад. Ҳоло мебинед, ки ин фарқ оқибатҳои муҳим дорад.
Фаҳмидани ададҳои нуқтасобит
Навъи нуқтасобит, ки онро навъи дорои дақиқии ихтиёрӣ низ меноманд, чунин навишта мешавад:
numeric(precision, scale)
Аргументи precision шумораи ниҳоии умумии рақамҳои ҳар ду тарафи нуқтаи даҳиро муайян мекунад. Аргументи scale бошад, шумораи рақамҳои иҷозатдодашудаи тарафи рости нуқтаи даҳиро нишон медиҳад.
Ин навъро ба шакли зерин низ муайян кардан мумкин аст:
decimal(precision, scale)
Ҳар ду шакл ба стандарти ANSI SQL дохил мешаванд.
Агар қимати scale-ро муайян накунед, он ба сифр баробар мешавад ва дар амал адади бе қисми касрӣ ҳосил мегардад. Агар на precision ва на scale-ро муайян кунед, пойгоҳи додаҳо қиматҳоро бо ҳар гуна дақиқӣ ва шумораи рақамҳои касрӣ, то ҳадди иҷозатдодашуда, нигоҳ медорад.
Мувофиқи ҳуҷҷатҳои PostgreSQL, ин ҳадд то 131 072 рақам пеш аз нуқтаи даҳӣ ва 16 383 рақам пас аз он мебошад.
Масалан, фарз кунем шумо маълумоти ҳаҷми боришотро аз чанд фурудгоҳи маҳаллӣ ҷамъ мекунед. Ин як вазифаи комилан воқеии таҳлили додаҳост. Хадамоти миллии обуҳавошиносии ИМА чунин маълумотро одатан бо ду рақам пас аз нуқтаи даҳӣ пешниҳод мекунад. Шояд шумо ҳам мисли ман аз дарсҳои математикаи мактаби ибтидоӣ дар хотир дошта бошед, ки ду рақам пас аз нуқтаи даҳӣ ҳиссаҳои садякро нишон медиҳанд.
Барои сабти ҳаҷми боришот бо панҷ рақам дар маҷмӯъ — precision — ва ду рақам пас аз нуқтаи даҳӣ — scale — навъро чунин муайян мекунем:
numeric(5,2)
Пойгоҳи додаҳо ҳамеша ду рақам пас аз нуқтаи даҳӣ бармегардонад, ҳатто агар шумо ададеро бо ду рақами касрӣ ворид накарда бошед. Масалан:
1.47
1.00
121.50
Фаҳмидани навъҳои нуқташиновар
Ду навъи нуқташиновар вуҷуд дорад: real ва double precision. Ҳар ду ба стандарти SQL дохил мешаванд. Фарқи онҳо дар ҳаҷми додаҳои нигоҳдошташаванда мебошад.
Навъи real тақрибан шаш рақами даҳии боэътимод ва double precision тақрибан 15 рақами даҳии боэътимодро таъмин мекунад. Ин шумора рақамҳои ҳар ду тарафи нуқтаи даҳиро дар бар мегирад.
Ин навъҳои нуқташиноварро навъҳои дорои дақиқии тағйирёбанда низ меноманд. Пойгоҳи додаҳо ададро ба шакли қисмҳое нигоҳ медорад, ки рақамҳои адад ва нишондиҳандаи дараҷаро ифода мекунанд. Нишондиҳандаи дараҷа ҷойи нуқтаи даҳиро муайян мекунад.
Аз ин рӯ, бар хилофи numeric, ки дар он дақиқӣ ва шумораи рақамҳои касриро собит муайян мекунем, нуқтаи даҳӣ дар сутуни нуқташиновар вобаста ба адад метавонад «шино кунад».
Истифодаи навъҳои нуқтасобит ва нуқташиновар
Ҳар як навъ барои шумораи умумии рақамҳо, яъне дақиқӣ, маҳдудиятҳои гуногун дорад. Онҳо дар ҷадвали 5-3 нишон дода шудаанд.
Ҷадвали 5-3: Навъҳои нуқтасобит ва нуқташиновар
| Навъи додаҳо | Ҳаҷми нигоҳдорӣ | Тарзи нигоҳдорӣ | Диапазон ё дақиқӣ |
|---|---|---|---|
numeric, decimal | Тағйирёбанда | Нуқтасобит | То 131 072 рақам пеш аз нуқтаи даҳӣ ва то 16 383 рақам пас аз он |
real | 4 байт | Нуқташиновар | Тақрибан 6 рақами даҳии боэътимод |
double precision | 8 байт | Нуқташиновар | Тақрибан 15 рақами даҳии боэътимод |
Барои дидани он ки ҳар се навъ бо ададҳои якхела чӣ гуна кор мекунанд, ҷадвали хурде созед ва мувофиқи намунаи 5-2 чанд қимати санҷишӣ ворид кунед.
CREATE TABLE number_data_types (
numeric_column numeric(20,5),
real_column real,
double_column double precision
);
INSERT INTO number_data_types
VALUES
(.7, .7, .7),
(2.13579, 2.13579, 2.13579),
(2.1357987654, 2.1357987654, 2.1357987654);
SELECT * FROM number_data_types;
Намунаи 5-2: Истифодаи навъҳои ададӣ
Мо ҷадвале месозем, ки барои ҳар як навъи адади касрӣ як сутун дорад, ва ба он се сатр ворид мекунем. Дар ҳар сатр як адад дар ҳар се сутун такрор мешавад.
Ҳангоми иҷро шудани сатри охирини скрипт, ки ҳамаи додаҳои ҷадвалро интихоб мекунад, натиҷаи зерин ҳосил мешавад:
numeric_column real_column double_column
-------------- ----------- -------------
0.70000 0.7 0.7
2.13579 2.13579 2.13579
2.13580 2.1357987 2.1357987654
Ба он чи рӯй дод, диққат диҳед. Сутуни numeric, ки scale-и он панҷ аст, панҷ рақам пас аз нуқтаи даҳӣ нигоҳ медорад, новобаста аз он ки шумо чанд рақам ворид кардед.
Агар шумораи рақамҳои касрӣ аз панҷ кам бошад, ҷойҳои боқимондаро бо сифр пур мекунад. Агар аз панҷ зиёд бошад, ададро гирд мекунад. Ин ҳолатро дар сатри сеюм мебинем: адади воридшуда 10 рақам пас аз нуқтаи даҳӣ дошт.
Сутунҳои real ва double precision сифрҳои иловагӣ намегузоранд. Дар сатри сеюм рафтори пешфарзи PostgreSQL-ро барои ин ду сутун мебинед: он ададҳои нуқташиноварро бо кӯтоҳтарин ифодаи даҳие мебарорад, ки қимати нигоҳдошташударо дуруст бознамоӣ мекунад, на бо нишон додани ҳамаи рақамҳои он. Дар версияҳои кӯҳнаи PostgreSQL натиҷаҳо метавонанд каме фарқ кунанд.
Мушкилоти ҳисобу китоб бо ададҳои нуқташиновар
Агар фикр кунед: «Ададҳои нуқташиновар айнан мисли ададҳои нуқтасобит менамоянд», эҳтиёт кунед. Тарзи нигоҳ доштани ададҳои нуқташиновар дар компютер метавонад ба хатоҳои ғайричашмдошти математикӣ оварда расонад.
Бубинед, вақте бо ин ададҳо ҳисобу китоб мекунем, чӣ рӯй медиҳад. Скрипти намунаи 5-3-ро иҷро кунед.
SELECT
numeric_column * 10000000 AS fixed,
real_column * 10000000 AS floating
FROM number_data_types
WHERE numeric_column = .7;
Намунаи 5-3: Мушкилоти гирдкунӣ дар сутунҳои нуқташиновар
Дар ин ҷо қиматҳои numeric_column ва real_column-ро ба 10 миллион зарб мекунем. Бо шарти WHERE танҳо сатри аввалро интихоб мекунем.
Ҳар ду ҳисоб бояд натиҷаи якхела диҳанд, дуруст? Аммо дархост чунин натиҷа бармегардонад:
fixed floating
------------- ----------------
7000000.00000 6999999.88079071
Ана, дидед! Беҳуда нест, ки навъҳои нуқташиноварро «ғайридақиқ» меноманд. Хуб шуд, ки ман ин ҳисобро барои парвоз ба Миррих ё ҳисоб кардани касри буҷети федералӣ истифода намебарам.
Сабаби чунин хатоҳо дар ҳисобу китоби нуқташиновар он аст, ки компютер мекӯшад миқдори зиёди маълумотро дар шумораи маҳдуди битҳо ҷой диҳад. Дар бораи ин мавзӯъ бисёр навиштаанд ва шарҳи муфассали он аз доираи ин китоб берун аст. Агар таваҷҷуҳ дошта бошед, шарҳи хуберо дар сомонаи The Floating-Point Guide пайдо мекунед.
Ҳаҷми нигоҳдории навъи numeric тағйирёбанда аст. Вобаста ба precision ва scale-и муайяншуда, он метавонад нисбат ба навъҳои нуқташиновар хеле бештар фазо ишғол кунад. Агар бо миллионҳо сатр кор кунед, бояд баррасӣ намоед, ки оё ғайридақиқии нисбии ҳисобу китоби нуқташиновар барои вазифаи шумо қобили қабул аст ё не.
Интихоби навъи ададӣ
Ҳангоми кор бо навъҳои ададӣ ҳоло ин се дастурро ба назар гиред:
-
То ҳадди имкон аз ададҳои бутун истифода баред. Агар додаҳо қисми касрӣ надошта бошанд, навъҳои адади бутунро интихоб кунед.
-
Агар бо ададҳои касрӣ кор кунед ва ҳисобҳо бояд дақиқ бошанд,
numericё ҳаммаънои он —decimal-ро интихоб кунед. Ин махсусан ҳангоми кор бо пул муҳим аст. Навъҳои нуқташиновар фазоро сарфа мекунанд, аммо ғайридақиқии ҳисобҳои онҳо барои бисёр барномаҳо қобили қабул нест. Онҳоро танҳо вақте истифода баред, ки дақиқии комил он қадар муҳим набошад. -
Навъеро интихоб кунед, ки диапазонаш кофӣ бошад. Агар пойгоҳи додаҳоро барои миллионҳо сатр тарҳрезӣ накунед, беҳтар аст навъи калонтарро интихоб кунед. Ҳангоми истифодаи
numericёdecimal,precision-ро чунон муайян кунед, ки ҳамаи рақамҳои ҳар ду тарафи нуқтаи даҳиро ҷой диҳад. Барои ададҳои бутун азbigintистифода баред, магар ин ки комилан мутмаин бошед қиматҳои сутун ба диапазони хурдтариintegerёsmallintмувофиқ мемонанд.
Фаҳмидани сана ва вақт
Ҳар боре ки ба шакли ҷустуҷӯ сана ворид мекунед, аз қобилияти пойгоҳи додаҳо баҳра мебаред: он вақти ҷориро аз сервер мегирад ва шаклҳои гуногуни сана, вақт ва нозукиҳои тақвимро, аз ҷумла солҳои кабиса ва минтақаҳои вақтро, коркард мекунад.
Ин барои баёни рӯйдодҳо бо ёрии додаҳо муҳим аст, зеро саволи «Кай рӯй дод?» одатан ба андозаи саволҳои «Кӣ?», «Чӣ?» ё «Чанд нафар?» арзиш дорад.
PostgreSQL чор навъи асосии сана ва вақтро дастгирӣ мекунад, ки дар ҷадвали 5-4 нишон дода шудаанд.
Ҷадвали 5-4: Навъҳои сана ва вақт
| Навъи додаҳо | Ҳаҷми нигоҳдорӣ | Тавсиф | Диапазон |
|---|---|---|---|
timestamp | 8 байт | Сана ва вақт | Аз соли 4713 пеш аз милод то соли 294276 милодӣ |
date | 4 байт | Сана, бе вақт | Аз соли 4713 пеш аз милод то соли 5874897 милодӣ |
time | 8 байт | Вақт, бе сана | Аз 00:00:00 то 24:00:00 |
interval | 16 байт | Фосилаи вақт | Тақрибан ±178 000 000 сол |
Навъҳои сана ва вақт дар PostgreSQL чунинанд:
timestamp
Сана ва вақтро сабт мекунад. Ин барои ҳолатҳои гуногун муфид аст: вақти парвоз ва фурудоии ҳавопаймоҳои мусофирбар, ҷадвали бозиҳои Лигаи асосии бейсбол ё рӯйдодҳои ҷойгиршуда дар хатти замон.
Қариб ҳамеша беҳтар аст калимаҳои with time zone-ро илова кунед, то вақти рӯйдод бо дарназардошти минтақаи вақт коркард шавад. Дар акси ҳол, муқоисаи вақтҳои дар ҷойҳои гуногуни ҷаҳон сабтшуда номумкин мегардад.
Шакли timestamp with time zone ба стандарти SQL дохил мешавад. Дар PostgreSQL ҳамин навъро бо номи кӯтоҳи timestamptz низ муайян кардан мумкин аст.
date
Танҳо санаро сабт мекунад. Ба стандарти SQL дохил мешавад.
time
Танҳо вақтро сабт мекунад ва ба стандарти SQL дохил мешавад. Гарчанде ба он калимаҳои with time zone-ро илова кардан мумкин аст, бе сана минтақаи вақт маънои пурра надорад.
interval
Қиматеро нигоҳ медорад, ки фосилаи вақтро ба шакли «миқдор + воҳид» ифода мекунад. Он оғоз ё анҷоми давраро сабт намекунад, танҳо дарозии онро нигоҳ медорад. Масалан:
12 days
8 hours
Яъне 12 рӯз ё 8 соат. Дар ҳуҷҷатҳои PostgreSQL воҳидҳо аз микросония то ҳазорсола оварда шудаанд.
Одатан ин навъро барои ҳисобу китоб ё полоиши сутунҳои дигари сана ва вақт истифода мебаред. Он низ ба стандарти SQL дохил мешавад, аммо синтаксиси махсуси PostgreSQL имконоти бештар дорад.
Акнун ба навъҳои timestamp with time zone ва interval диққат медиҳем. Барои дидани кори онҳо скрипти намунаи 5-4-ро иҷро кунед.
CREATE TABLE date_time_types (
timestamp_column timestamp with time zone,
interval_column interval
);
INSERT INTO date_time_types
VALUES
('2022-12-31 01:00 EST','2 days'),
('2022-12-31 01:00 -8','1 month'),
('2022-12-31 01:00 Australia/Melbourne','1 century'),
(now(),'1 week');
SELECT * FROM date_time_types;
Намунаи 5-4: Истифодаи навъҳои timestamp ва interval
Дар ин ҷо ҷадвале месозем, ки барои ҳар кадоми ин ду навъ як сутун дорад, ва ба он чор сатр ворид мекунем.
Дар се сатри аввал барои timestamp_column сана ва вақти якхела — 31 декабри соли 2022, соати 01:00-и шаб — истифода шудааст. Сана ва вақт дар шакли Созмони байналмилалии стандартизатсия — ISO — навишта шудаанд:
YYYY-MM-DD HH:MM:SS
Яъне:
сол-моҳ-рӯз соат:дақиқа:сония
SQL шаклҳои дигари санаро, аз ҷумла MM/DD/YYYY, низ дастгирӣ мекунад. Аммо барои истифодаи байналмилалӣ шакли ISO тавсия дода мешавад.
Пас аз вақт минтақаи вақтро нишон медиҳем, вале дар ҳар яке аз се сатри аввал онро бо шакли гуногун менависем.
Дар сатри аввал ихтисораи EST истифода шудааст, ки вақти стандартии шарқии ИМА мебошад.
Дар сатри дуюм минтақаи вақтро бо қимати -8 муайян мекунем. Ин қимат фарқи соатиро аз Вақти ҳамоҳангшудаи ҷаҳонӣ — UTC, ки меъёри ҷаҳонии вақт аст, нишон медиҳад. Нуқтаи истиноди UTC ±00:00 мебошад. Аз ин рӯ, -8 минтақаи вақтеро нишон медиҳад, ки ҳашт соат аз UTC қафо аст.
Дар ИМА, вақте вақти тобистона амал мекунад, -8 ба минтақаи вақти Аляска мувофиқ меояд. Аз моҳи ноябр то аввали март, ҳангоми бозгашт ба вақти стандартӣ, он ба минтақаи вақти Уқёнуси Ором мувофиқ аст.
Барои дидани харитаи минтақаҳои вақти UTC ба ин харита нигаред.
Дар сатри сеюм минтақаи вақт бо номи минтақа ва шаҳр муайян шудааст:
Australia/Melbourne
Ин шакл қиматҳои пойгоҳи стандартии минтақаҳои вақтро истифода мебарад, ки дар барномасозӣ маъмул аст. Маълумоти бештарро дар саҳифаи пойгоҳи минтақаҳои вақт пайдо мекунед.
Дар сатри чорум, ба ҷойи муайян кардани сана, вақт ва минтақаи вақт, скрипт функсияи now()-и PostgreSQL-ро истифода мебарад. Он вақти ҷории транзаксияро аз соати низом мегирад.
Пас аз иҷрои скрипт натиҷа бояд ба намунаи зерин монанд бошад, аммо ҳатман айнан якхела намешавад:
timestamp_column interval_column
----------------------------- ---------------
2022-12-31 01:00:00-05 2 days
2022-12-31 04:00:00-05 1 mon
2022-12-30 09:00:00-05 100 years
2020-05-31 21:31:15.716063-05 7 days
Гарчанде дар се сатри аввал ба timestamp_column сана ва вақти якхела дода будем, натиҷаи ҳар сатр фарқ мекунад. Сабаб ин аст, ки PostgreSQL сана ва вақтро мувофиқи минтақаи вақти ҷаласаи ҷорӣ нишон медиҳад. Натиҷаҳои боло дар компютери муаллифи аслӣ гирифта шудаанд ва минтақаи вақти ӯ бо фарқи -05 аз UTC дар охири ҳар қимати timestamp нишон дода шудааст.
Фарқи -05 маънои панҷ соат қафо будан аз UTC-ро дорад. Ин ба минтақаи вақти шарқии ИМА дар моҳҳои тирамоҳу зимистон, ҳангоми амал кардани вақти стандартӣ, мувофиқ меояд.
Агар дар минтақаи вақти дигар зиндагӣ кунед, эҳтимол фарқи дигареро мебинед. Сана ва вақтҳо низ метавонанд аз намунаи боло фарқ кунанд. Минтақаи вақти пешфарзи контейнери Docker UTC аст, бинобар ин шумо эҳтимол фарқи +00-ро мебинед. Минтақаи вақти ҷаласаро бо дастури SET тағйир додан мумкин аст, масалан SET timezone TO 'Asia/Dushanbe'; — пас аз он ҳамон қиматҳо бо фарқи +05 нишон дода мешаванд.
Сутуни interval_column қиматҳои воридкардаи шуморо нишон медиҳад. PostgreSQL 1 century-ро ба 100 years ва 1 week-ро ба 7 days табдил додааст. Ин ба танзимоти пешфарзи намоиши фосилаҳои вақт вобаста аст.
Барои маълумоти бештар дар бораи имконоти фосилаҳои вақт ба бахши «Interval Input» дар ҳуҷҷатҳои PostgreSQL нигаред.
Истифодаи навъи interval дар ҳисобу китоб
Навъи interval барои ҳисобҳои фаҳмо бо сана ва вақт муфид аст. Масалан, фарз кунем сутуне доред, ки санаи имзои шартнома аз ҷониби муштариро нигоҳ медорад. Бо истифодаи interval метавонед ба санаи ҳар шартнома 90 рӯз илова кунед, то вақти тамоси навбатӣ бо муштариро муайян намоед.
Барои дидани кори interval аз ҷадвали навсохтаи date_time_types истифода мебарем, тавре ки дар намунаи 5-5 нишон дода шудааст.
SELECT
timestamp_column,
interval_column,
timestamp_column - interval_column AS new_date
FROM date_time_types;
Намунаи 5-5: Истифодаи навъи interval
Ин дастури маъмулии SELECT аст, бо як фарқ: сутуни ҳисобшавандае бо номи new_date месозем, ки натиҷаи тарҳи interval_column аз timestamp_column-ро дар бар мегирад. Ифодаҳое, ки чунин қиматҳои ҳисобшавандаро ҳосил мекунанд, ифодаҳо — expressions ном доранд. Мо аз ин усул бисёр истифода мебарем.
Дар ҳар сатр фосилаи вақти дар interval нишон додашударо аз сана кам мекунем. Натиҷа чунин мешавад:
timestamp_column interval_column new_date
----------------------------- --------------- -----------------------------
2022-12-31 01:00:00-05 2 days 2022-12-29 01:00:00-05
2022-12-31 04:00:00-05 1 mon 2022-11-30 04:00:00-05
2022-12-30 09:00:00-05 100 years 1922-12-30 09:00:00-05
2020-05-31 21:31:15.716063-05 7 days 2020-05-24 21:31:15.716063-05
Диққат диҳед, ки сутуни new_date ба таври пешфарз навъи timestamp with time zone дорад. Ин имкон медиҳад, ки ҳам сана ва ҳам вақт нишон дода шаванд, аз ҷумла вақте ки қимати interval воҳидҳои вақтро дар бар мегирад.
Дар pgAdmin навъи додаҳоро дар ҷадвали натиҷаҳо, зери номи сутунҳо, дидан мумкин аст. Боз ҳам, вобаста ба минтақаи вақти шумо натиҷа метавонад фарқ кунад.
Фаҳмидани JSON ва JSONB
JSON ихтисораи JavaScript Object Notation мебошад. Он шакли сохторёфтаи додаҳост, ки ҳам барои нигоҳдории додаҳо ва ҳам барои мубодилаи онҳо байни низомҳои компютерӣ истифода мешавад.
Ҳамаи забонҳои асосии барномасозӣ хондан ва навиштани додаҳоро дар шакли JSON дастгирӣ мекунанд. JSON маълумотро ба шакли маҷмӯи ҷуфтҳои калид/қимат ва рӯйхатҳои қиматҳо ташкил медиҳад.
Намунаи сода:
{
"business_name": "Old Ebbitt Grill",
"business_type": "Restaurant",
"employees": 300,
"address": {
"street": "675 15th St NW",
"city": "Washington",
"state": "DC",
"zip_code": "20005"
}
}
Ин порча сохтори асосии JSON-ро нишон медиҳад. Калид, масалан business_name, бо қимате алоқаманд аст. Дар ин ҷо қимат Old Ebbitt Grill мебошад.
Қимати калид инчунин метавонад маҷмӯи ҷуфтҳои иловагии калид/қимат бошад, чунон ки дар address мебинем.
Стандарти JSON қоидаҳои муайяни навиштро талаб мекунад. Масалан, калид ва қимат бояд бо ду нуқта — : — ҷудо шаванд ва номи калидҳо дар нохунакҳои дугона навишта шаванд.
Барои санҷидани дурустии сохтори объекти JSON метавонед аз абзорҳои онлайн, аз ҷумла JSONLint, истифода баред.
PostgreSQL ду навъи додаҳоро барои JSON пешниҳод мекунад. Ҳар ду дурустии сохтори JSON-ро месанҷанд ва функсияҳои кор бо ин шаклро дастгирӣ мекунанд:
json: нусхаи дақиқи матни JSON-ро нигоҳ медорад.jsonb: матни JSON-ро дар шакли дуӣ нигоҳ медорад.
Байни ин ду фарқиятҳои муҳим вуҷуд доранд. Масалан, jsonb индексгузориро дастгирӣ мекунад, ки метавонад суръати коркардро беҳтар намояд.
JSON соли 2016 ба стандарти SQL ворид шуд, аммо PostgreSQL дастгирии онро чанд сол пештар, аз версияи 9.2, илова карда буд. PostgreSQL чанд функсияи дар стандарти SQL муайяншударо татбиқ мекунад ва ҳамзамон функсияву операторҳои иловагии худро барои JSON пешниҳод менамояд.
Индекси GIN, ки ҷустуҷӯро дар сутунҳои jsonb тез мекунад, дар боби 12 шарҳ дода мешавад.
Истифодаи навъҳои дигар
Навъҳои аломатӣ, ададӣ ва санаю вақт эҳтимол қисми асосии кори шуморо бо SQL ташкил медиҳанд. Аммо PostgreSQL бисёр навъҳои иловагиро низ дастгирӣ мекунад, аз ҷумла:
- Навъи мантиқии Boolean, ки қимати
trueёfalse— «дуруст» ё «нодуруст» — нигоҳ медорад. - Навъҳои геометрӣ барои нуқтаҳо, хатҳо, доираҳо ва дигар объектҳои дученака.
- Навъҳои ҷустуҷӯи матнӣ барои муҳаррики ҷустуҷӯи пурраматнии PostgreSQL.
- Навъҳои суроғаҳои шабакавӣ, аз ҷумла суроғаҳои IP ва MAC.
- Навъи шиносаи ягонаи умумӣ — UUID, ки баъзан ҳамчун қимати калиди ягона дар ҷадвалҳо истифода мешавад.
- Навъҳои диапазонӣ, ки имкон медиҳанд диапазони қиматҳо, масалан ададҳои бутун ё
timestamp-ҳоро, муайян кунед. - Навъҳо барои нигоҳдории додаҳои дуӣ.
- Навъи XML, ки маълумотро дар ҳамин шакли сохторёфта нигоҳ медорад.
Дар давоми китоб ин навъҳоро мувофиқи зарурат баррасӣ мекунам.
Табдил додани қиматҳо аз як навъ ба навъи дигар бо CAST
Баъзан лозим мешавад қиматро аз навъи додаҳои нигоҳдошташудааш ба навъи дигар табдил диҳед. Масалан, шояд хоҳед ададеро ҳамчун сатри аломатӣ гиред, то онро бо матн пайваст кунед.
Ё мумкин аст санаҳои ҳамчун матн нигоҳдошташударо ба навъи воқеии date табдил диҳед, то онҳоро аз рӯйи сана тартиб диҳед ё бо фосилаҳои вақт ҳисобу китоб кунед.
Ин табдилҳоро бо функсияи CAST() анҷом додан мумкин аст.
Функсияи CAST() танҳо вақте муваффақ мешавад, ки навъи мақсад қимати аслиро қабул карда тавонад. Табдил додани адади бутун ба матн имконпазир аст, зеро навъҳои аломатӣ метавонанд рақамҳоро дар бар гиранд. Аммо табдил додани матни дорои ҳарфҳои алифбо ба адад имкон надорад.
Намунаи 5-6 се мисолро бо истифода аз се ҷадвали навъҳои додаҳо, ки ҳоло сохтем, дар бар мегирад. Ду мисоли аввал кор мекунанд. Мисоли сеюм кӯшиши табдили нодурустро анҷом медиҳад, то шумо намуди хатои табдили навъро бинед.
SELECT timestamp_column, CAST(timestamp_column AS varchar(10))
FROM date_time_types;
SELECT numeric_column,
CAST(numeric_column AS integer),
CAST(numeric_column AS text)
FROM number_data_types;
SELECT CAST(char_column AS integer) FROM char_data_types;
Намунаи 5-6: Се мисоли истифодаи CAST()
Дастури якуми SELECT қимати timestamp_column-ро ҳам дар шакли аслӣ ва ҳам ҳамчун varchar бармегардонад. Тавре дар хотир доред, varchar навъи аломатии дорои дарозии тағйирёбанда аст.
Дар ин ҷо дарозиро 10 аломат муайян кардам. Яъне пас аз табдил ба сатри аломатӣ танҳо 10 аломати аввал нигоҳ дошта мешавад. Дар ин ҳолат ин қулай аст, зеро танҳо қисми санаро мегирем ва вақтро хориҷ мекунем.
Албатта, барои хориҷ кардани вақт аз timestamp роҳҳои беҳтар вуҷуд доранд. Масалан, функсияи date_trunc() ва табдили timestamp_column::date.
Дастури дуюми SELECT қимати numeric_column-ро се маротиба бармегардонад: дар шакли аслӣ, ҳамчун адади бутун ва ҳамчун матн.
Ҳангоми табдил ба integer, PostgreSQL қиматро то адади бутун гирд мекунад. Аммо ҳангоми табдил ба text гирдкунӣ анҷом намешавад.
Дастури охирини SELECT кор намекунад. Он хатои зеринро бармегардонад:
invalid input syntax for type integer
Яъне «синтаксиси қимати воридшуда барои навъи integer нодуруст аст», зеро ҳарфҳо ба адади бутун табдил намеёбанд!
Истифодаи шакли кӯтоҳи CAST
Ҳамеша беҳтар аст SQL-ро тавре нависед, ки шахси дигар баъдтар онро хонда фаҳмад. Шакли навишти CAST() мақсади шуморо хеле равшан нишон медиҳад.
Аммо PostgreSQL шакли кӯтоҳтаре низ пешниҳод мекунад, ки ҷойи камтар мегирад, ҳарчанд маънояш он қадар ошкор нест: ду аломати ду нуқта — ::.
Ин аломатҳоро байни номи сутун ва навъи додаҳое гузоред, ки мехоҳед қимат ба он табдил ёбад. Масалан, ҳар ду дастури зерин timestamp_column-ро ба varchar табдил медиҳанд:
SELECT timestamp_column, CAST(timestamp_column AS varchar(10))
FROM date_time_types;
SELECT timestamp_column::varchar(10)
FROM date_time_types;
Ҳар кадомеро, ки бароятон мувофиқ аст, истифода баред. Аммо дар хотир дошта бошед, ки шакли :: махсуси PostgreSQL аст ва дар дигар гунаҳои SQL вуҷуд надорад. Аз ин рӯ, чунин кодро наметавон бе тағйир ба низомҳои дигар гузаронд.
Хулоса
Акнун шумо метавонед нозукиҳои шаклҳои додаҳоеро, ки ҳангоми омӯзиши пойгоҳҳои додаҳо вомехӯранд, беҳтар фаҳмед.
Агар қиматҳои пулиеро бинед, ки ҳамчун ададҳои нуқташиновар нигоҳ дошта шудаанд, пеш аз анҷом додани ҳисобу китоб онҳоро ба навъи даҳии дақиқ табдил медиҳед. Ҳамчунин медонед, ки барои пешгирӣ аз аз ҳад зиёд калон шудани пойгоҳи додаҳо кадом навъи сутуни матниро истифода баред.
Дар боби оянда бо ин навъҳо ҳисобу китоб мекунем: амалҳои математикӣ, фоизҳо ва омори ибтидоӣ бо SQL.
Худатон бисанҷед
- Барои сутуни масофа бо километр, ки як рақам пас аз вергул дорад ва аз 9999,9 зиёд намешавад, кадом навъи додаро интихоб мекунед? Чаро
realне? - Сатри
'2024-03-08'-ро ба навъиdateтабдил дода, ба он 10 рӯз илова кунед. - Дархости
SELECT 0.1::double precision + 0.2::double precision, 0.1::numeric + 0.2::numeric;-ро иҷро кунед ва натиҷаҳоро муқоиса намоед. СипасCAST('12.5' AS integer)-ро санҷед. Чӣ мешавад?
Ҷавобҳо дар замима, бахши «Ҷавобҳо ба машқҳо», оварда шудаанд.

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