You are on page 1of 372

Ti liu PostgreSQL 9.0.

13
Nhm pht trin ton cu PostgreSQL
I. Sch ch dn
&
II. Ngn ng SQL

Dch sang ting Vit: L Trung Ngha, letrungnghia.foss@gmail.com


Dch xong: 13/03/2014
Bn gc ting Anh:
http://www.postgresql.org/files/documentation/pdf/9.0/postgresql-9.0-A4.pdf

PostgreSQL 9.0.13 Documentation


The PostgreSQL Global Development Group
I. Tutorial
&
II. The SQL Language

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Ti liu PostgreSQL 9.0.13


ca Nhm pht trin ton cu PostgreSQL
Bn quyn 1996-2013 ca Nhm pht trin ton cu PostgreSQL
Lu php l
PostgreSQL l bn quyn 1996-2013 ca Nhm pht trin ton cu PostgreSQL v c phn phi theo cc iu
khon ca giy php ca i hc California bn di.
Postgres95 l Bn quyn 1994-1995 ca Regents ca i hc California.
Quyn s dng, sao chp, sa i v phn phi phn mm ny v ti liu ca n v bt k mc ch no, khng c
chi ph, v khng c tha thun bng vn bn no c trao y, min l lu bn quyn trn v on ny v 2
on sau xut hin trong tt c cc bn sao.
KHNG TRONG S KIN NO I HC CALIFORNIA C TRCH NHIM I VI BT K BN NO V
NHNG THIT HI TRC TIP, GIN TIP, C BIT, NGU NHIN HOC DO HU QU, BAO GM
MT LI NHUN, NY SINH T S S DNG PHN MM NY V TI LIU CA N, THM CH NU
I HC CALIFORNIA TNG C C VN V KH NNG THIT HI NH VY.
I HC CALIFORNIA C BIT T CHI BT K M BO NO, BAO GM, NHNG KHNG B
GII HN I VI, NHNG M BO C NG V KH NNG BN C V S PH HP CHO
MT MC CH C BIT. PHN MM C CUNG CP DI Y L TRN C S NH N C,
V I HC CALIFORNIA KHNG C CC BN PHN CUNG CP S DUY TR, H TR, CC BN CP
NHT, CC CI TIN HOC NHNG SA I.
PostgreSQL 9.0.13 Documentation
by The PostgreSQL Global Development Group
Copyright 1996-2013 The PostgreSQL Global Development Group
Legal Notice
PostgreSQL is Copyright 1996-2013 by the PostgreSQL Global Development Group and is distributed under the
terms of the license of the University of California below.
Postgres95 is Copyright 1994-5 by the Regents of the University of California.
Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and
without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the
following two paragraphs appear in all copies.
IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT,
INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY
OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT
NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN AS-IS BASIS, AND THE
UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
UPDATES, ENHANCEMENTS, OR MODIFICATIONS.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 2/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Li ngi dch
Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL xut bn nm 2013, nh trong
phn LI NI U bn di gii thiu, gm 7 phn chnh, nh s t I ti VII v phn dnh cho
cc ph lc, c nh s VIII, tng cng di 2.364 trang.
Bn dch ln ny gm 2 phn u c dch xong trc v a ra cc c gi s dng sm,
bao gm:

Phn I: Sch ch dn, l mt gii thiu khng chnh thc cho nhng ngi mi s dng.

Phn II: Ngn ng SQL, vit v mi trng ngn ng truy vn SQL, bao gm c cc dng
v cc hm d liu, cng nh vic tinh chnh hiu nng mc ca ngi s dng. Mi
ngi s dng PostgreSQL u nn c phn ny.

Chnh v ti liu khng c dch xong hon ton tt c cc phn cng mt lc, nn trong qu trnh
s dng, c mt s ni dung tham chiu cc Phn I v Phn II ti cc phn cn li ca ti liu cc
c gi ch c th xem ni dung bn gc ting Anh (nh theo ng dn ba trc ca ti liu)
m cha c phn dch ting Vit. Rt mong c cc c gi thng cm.
Hy vng cc phn tip sau s c dch sang ting Vit sm.
Vic dch thut chc chn khng khi c nhng li nht nh, rt mong cc bn c gi, mt khi
pht hin c, xin lin lc vi ngi dch v ng gp kin v cch chnh sa ti liu s ngy
mt c cht lng tt hn, phc v cho cc bn c gi v mi ngi c nhu cu c tt hn. Xin
chn thnh cm n trc cc bn c gi v cc ng gp chnh sa .
Mi thng tin ng gp chnh sa cho bn dch ting Vit, xin vui lng gi vo a ch th in t:
letrungnghia.foss@gmail.com
Chc cc c gi thnh cng!

H Ni, ngy 13/03/2014


L Trung Ngha

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 3/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Mc lc
Li ni u..........................................................................................................................................12
1. PostgreSQL l g?......................................................................................................................12
2. Ngn gn v lch s ca PostgreSQL........................................................................................13
2.1. D n POSTGRES ca Berkeley.......................................................................................13
2.2. Postgres95..........................................................................................................................14
2.3. PostgreSQL........................................................................................................................15
3. Cc qui c...............................................................................................................................15
4. Thng tin thm...........................................................................................................................16
5. Cc ch dn bo co li .............................................................................................................16
5.1. Xc nh cc li..................................................................................................................17
5.2. Bo co ci g.....................................................................................................................18
5.3, Bo co cc li u.........................................................................................................20
I. Sch ch dn ...................................................................................................................................22
Chng 1. Lm quen.....................................................................................................................23
1.1. Ci t................................................................................................................................23
1.2. C bn v kin trc............................................................................................................23
1.3. To mt c s d liu.........................................................................................................24
1.4. Truy cp c s d liu........................................................................................................26
Chng 2. Ngn ng SQL ............................................................................................................28
2.1 Gii thiu............................................................................................................................28
2.2. Cc khi nim.....................................................................................................................28
2.3. To mt bng mi..............................................................................................................29
2.4. a d liu vo bng vi cc hng....................................................................................29
2.5. Truy vn bng.....................................................................................................................30
2.6. Lin kt gia cc bng.......................................................................................................32
2.7. Cc hng tng hp.............................................................................................................34
2.8. Cp nht.............................................................................................................................36
2.9. Xa.....................................................................................................................................36
Chng 3. Cc tnh nng cao cp .................................................................................................37
3.1. Gii thiu...........................................................................................................................37
3.2. Cc kiu nhn.....................................................................................................................37
3.3. Cc kha ngoi...................................................................................................................37
3.4. Cc giao dch......................................................................................................................38
3.5. Hm ca s.........................................................................................................................40
3.6. S k tha..........................................................................................................................43
3.7. Kt lun..............................................................................................................................45
II. Ngn ng SQL ..............................................................................................................................46
Chng 4. C php SQL ...............................................................................................................47
4.1. Cu trc t vng.................................................................................................................47
4.1.1. M nh danh v cc t kha......................................................................................47
4.1.2. Hng s.......................................................................................................................49
4.1.2.1. Hng s chui (hng chui)................................................................................50
4.1.2.2. Hng chui vi cc thot dng C........................................................................50
4.1.2.3. Hng chui vi cc thot Unicode......................................................................51

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 4/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

4.1.2.4. Hng chui trong cc du $................................................................................52


4.1.2.5. Hng chui bit.....................................................................................................53
4.1.2.6. Hng l s...........................................................................................................54
4.1.2.7. Hng cc dng khc............................................................................................54
4.1.3. Ton t........................................................................................................................55
4.1.4. K t c bit.............................................................................................................56
4.1.5. Cc ch gii................................................................................................................56
4.1.6. Quyn u tin trc ca t vng................................................................................57
4.2. Biu thc gi tr..................................................................................................................58
4.2.1. Cc tham chiu ct ....................................................................................................59
4.2.2. Tham s v tr..............................................................................................................59
4.2.3. Ch s di - Subscript...............................................................................................59
4.2.4. Chn trng................................................................................................................60
4.2.5. Vin dn ton t..........................................................................................................60
4.2.6. Li gi hm................................................................................................................61
4.2.7. Biu thc tng hp.....................................................................................................61
4.2.8. Li gi hm ca s.....................................................................................................62
4.2.9. Cast dng....................................................................................................................64
4.2.10. Truy vn con v hng.............................................................................................65
4.2.11. Cc cu trc mng ...................................................................................................65
4.2.12. Cu trc hng............................................................................................................67
4.2.13. Cc qui tc nh gi biu thc.................................................................................68
4.3. Gi hm .............................................................................................................................69
4.3.1. S dng k hiu v tr ................................................................................................69
4.3.2. S dng k hiu c t tn.....................................................................................70
4.3.3. S dng k hiu pha trn...........................................................................................70
Chng 5. nh ngha d liu ......................................................................................................71
5.1. C bn v bng...................................................................................................................71
5.2. Cc gi tr mc nh...........................................................................................................72
5.3. Rng buc..........................................................................................................................73
5.3.1. Rng buc kim tra.....................................................................................................73
5.3.2. Rng buc khng null.................................................................................................75
5.3.3. Rng buc c nht....................................................................................................76
5.3.4. Kha ch.....................................................................................................................77
5.3.5. Kha ngoi.................................................................................................................78
5.3.6. Rng buc loi tr......................................................................................................80
5.4. Ct h thng.......................................................................................................................81
5.5. Sa i bng.......................................................................................................................83
5.5.1. Thm ct.....................................................................................................................83
5.5.2. Loi b ct .................................................................................................................84
5.5.3. Thm rng buc .........................................................................................................84
5.5.4. Loi b rng buc.......................................................................................................84
5.5.5. Thay i gi tr mc nh ca ct ..............................................................................85
5.5.6. Thay i dng d liu ca mt ct ............................................................................85
5.5.7. i tn ct..................................................................................................................85
5.5.8. i tn bng...............................................................................................................85
5.6. Cc quyn u tin...............................................................................................................86

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 5/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

5.7. S (schema)...................................................................................................................87
5.7.1. To s ....................................................................................................................87
5.7.2. S cng khai..........................................................................................................88
5.7.3. ng tm kim s ................................................................................................88
5.7.4. S v quyn u tin...............................................................................................90
5.7.5. S catalog h thng...............................................................................................90
5.7.6. S dng cc mu........................................................................................................91
5.7.7. Tnh kh chuyn.........................................................................................................91
5.8. K tha...............................................................................................................................92
5.8.1. Cc vn cn tn ti ...............................................................................................95
5.9. Phn vng...........................................................................................................................95
5.9.1. Tng quan...................................................................................................................96
5.9.2. Trin khai phn vng..................................................................................................97
5.9.3. Qun l phn vng...................................................................................................100
5.9.4. Loi tr rng buc v phn vng..............................................................................101
5.9.5. Phng php phn vng khc..................................................................................102
5.9.6. Cc vn cn tn ti .............................................................................................103
5.10. i tng c s d liu khc.........................................................................................103
5.11. Theo di s ph thuc....................................................................................................104
Chng 6. iu khin d liu......................................................................................................106
6.1. Chn d liu.....................................................................................................................106
6.2. Cp nht d liu...............................................................................................................107
6.3. Xa d liu.......................................................................................................................108
Chng 7. Truy vn ....................................................................................................................109
7.1. Tng quan.........................................................................................................................109
7.2. Biu thc bng.................................................................................................................109
7.2.1. Mnh FROM........................................................................................................110
7.2.1.1. Bng kt ni......................................................................................................110
7.2.1.2. Tn hiu ca bng v ct .................................................................................114
7.2.1.3. Truy vn con.....................................................................................................115
7.2.1.4. Hm bng..........................................................................................................115
7.2.2. Mnh WHERE.....................................................................................................116
7.2.3. Cc mnh GROUP BY v HAVING...................................................................117
7.2.4. X l hm ca s......................................................................................................119
7.3. Danh sch chn ...............................................................................................................119
7.3.1. Cc khon ca danh sch chn ................................................................................120
7.3.2. Nhn ct...................................................................................................................120
7.3.3. Khc bit - DISTINCT ............................................................................................121
7.4. Kt hp cc truy vn........................................................................................................121
7.5. Sp xp hng....................................................................................................................122
7.6. LIMIT v OFFSET..........................................................................................................123
7.7. Danh sch gi tr..............................................................................................................124
7.8. Truy vn vi WITH (Biu thc bng chung)...................................................................124
Chng 8. Dng d liu...............................................................................................................129
8.1. Dng s............................................................................................................................130
8.1.1. Dng s nguyn........................................................................................................131
8.1.2. S chnh xc ty ....................................................................................................131

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 6/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

8.1.3. Dng du chm ng................................................................................................132


8.1.4. Dng tun t (Serial)................................................................................................134
8.2. Dng tin t......................................................................................................................134
8.3. Dng k t........................................................................................................................135
8.4. Dng d liu nh phn......................................................................................................137
8.4.1. nh dng bytea hex.................................................................................................138
8.4.2. nh dng thot bytea...............................................................................................138
8.5. Dng Date/Time (Ngy thng/Thi gian)........................................................................139
8.5.1. u vo ngy thng/thi gian...................................................................................141
8.5.1.1. Ngy thng........................................................................................................142
8.5.1.2. Thi gian...........................................................................................................142
8.5.1.3. Du thi gian....................................................................................................143
8.5.1.4. Gi tr c bit..................................................................................................144
8.5.2. u ra ngay thng/thi gian ....................................................................................145
8.5.3. Vng thi gian..........................................................................................................146
8.5.4. u vo khong........................................................................................................148
8.5.5. u ra khong..........................................................................................................150
8.5.6. Chi tit bn trong......................................................................................................151
8.6. Dng boolean...................................................................................................................151
8.7. Cc dng nh s.............................................................................................................152
8.7.1. Khai bo cc dng nh s.......................................................................................152
8.7.2. Xp th t.................................................................................................................152
8.7.3. An ton dng.............................................................................................................153
8.7.4. Cc chi tit trin khai................................................................................................153
8.8. Dng a l ......................................................................................................................154
8.8.1. im.........................................................................................................................154
8.8.2. Cc on thng.........................................................................................................154
8.8.3. Cc hp.....................................................................................................................155
8.8.4. ng ......................................................................................................................155
8.8.5. a gic......................................................................................................................155
8.8.6. ng trn...............................................................................................................156
8.9. Dng a ch mng...........................................................................................................156
8.9.1. inet............................................................................................................................156
8.9.2. cidr............................................................................................................................157
8.9.3. inet so vi cidr..........................................................................................................157
8.9.4. macaddr....................................................................................................................157
8.10. Dng chui bit................................................................................................................158
8.11. Dng tm kim vn bn..................................................................................................159
8.11.1. tsvector...................................................................................................................159
8.11.2. tsquery....................................................................................................................160
8.12. Dng UUID....................................................................................................................161
8.13. Dng XML ....................................................................................................................162
8.13.1. To gi tr XML .....................................................................................................162
8.13.2. iu khin vic m ha..........................................................................................163
8.13.3. Truy cp cc gi tr XML ......................................................................................164
8.14. Mng..............................................................................................................................164
8.14.1. Khai bo dng mng...............................................................................................164

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 7/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

8.14.2. u vo gi tr mng .............................................................................................165


8.14.3. Truy cp mng........................................................................................................167
8.14.4. Sa i mng .........................................................................................................168
8.14.5. Tm kim trong mng.............................................................................................171
8.14.6. C php u vo v u ra ca mng.....................................................................171
8.15. Dng tng hp................................................................................................................173
8.15.1. Khai bo dng tng hp ........................................................................................173
8.15.2. u vo gi tr tng hp.........................................................................................174
8.15.3. Truy cp dng tng hp .........................................................................................175
8.15.4. Sa i dng tng hp ...........................................................................................175
8.15.5 C php u v v ra ca dng tng hp ................................................................176
8.16. Dng m nh danh i tng........................................................................................177
8.17. Dng b danh..................................................................................................................179
Chng 9. Hm v ton t...........................................................................................................180
9.1. Cc ton t logic..............................................................................................................180
9.2. Cc ton t so snh..........................................................................................................181
9.3. Hm v ton t ton hc..................................................................................................182
9.4. Hm v ton t chui.......................................................................................................185
9.5. Hm v ton t chui nh phn........................................................................................194
9.6. Hm v ton t chui bit..................................................................................................195
9.7. Khp mu.........................................................................................................................196
9.7.1. LIKE.........................................................................................................................196
9.7.2. Biu thc thng dng SIMILAR TO........................................................................197
9.7.3. Cc biu thc POSIX thng thng.........................................................................198
9.7.3.1. Chi tit ca biu thc thng thng.................................................................202
9.7.3.2. Cc biu thc du ngoc vung........................................................................204
9.7.3.3. Cc thot biu thc thng thng.....................................................................205
9.7.3.4. Siu c php ca biu thc thng thng.........................................................208
9.7.3.5. Cc qui tc khp ca biu thc thng thng..................................................209
9.7.3.6. Gii hn v tnh tng thch.............................................................................211
9.7.3.7. Biu thc c bn thng thng.........................................................................211
9.8. Hm nh dng dng d liu............................................................................................212
9.9. Hm v ton t ngy thng / thi gian.............................................................................218
9.9.1. EXTRACT, date_part...............................................................................................221
9.9.2. date_trunc.................................................................................................................225
9.9.3. AT TIME ZONE.......................................................................................................226
9.9.4. Date/Time hin hnh ...............................................................................................226
9.9.5. Thc thi tr ..............................................................................................................228
9.10. Hm h tr nh s Enum ............................................................................................228
9.11. Hm v ton t hnh hc ...............................................................................................229
9.12. Hm v ton t a ch mng ........................................................................................232
9.13. Hm v ton t tm kim vn bn .................................................................................233
9.14. Hm XML .....................................................................................................................236
9.14.1. To ni dung XML ................................................................................................236
9.14.1.1. xmlcomment...................................................................................................236
9.14.1.2. xmlconcat........................................................................................................236
9.14.1.3. xmlelement.....................................................................................................237

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 8/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

9.14.1.4. xmlforest.........................................................................................................238
9.14.1.5. xmlpi ..............................................................................................................239
9.14.1.6. xmlroot............................................................................................................239
9.14.1.7. xmlagg............................................................................................................239
9.14.1.8. T v XML .....................................................................................................240
9.14.2. X l XML ............................................................................................................240
9.14.3. Bng nh x ti XML ............................................................................................241
9.15. Hm iu khin s tun t ............................................................................................244
9.16. Biu thc iu kin........................................................................................................246
9.16.1. CASE......................................................................................................................246
9.16.2. COALESCE...........................................................................................................247
9.16.3. NULLIF..................................................................................................................248
9.16.4. GREATEST v LEAST..........................................................................................248
9.17. Hm v ton t mng ....................................................................................................248
9.18. Hm tng hp.................................................................................................................250
9.19. Hm ca s.....................................................................................................................253
9.20. Biu thc truy vn con ..................................................................................................254
9.20.1. EXISTS..................................................................................................................254
9.20.2. IN ...........................................................................................................................255
9.20.3. NOT IN...................................................................................................................255
9.20.4. ANY/SOME...........................................................................................................256
9.20.5. ALL........................................................................................................................257
9.20.6. So snh hng khn ngoan ......................................................................................257
9.21. So snh hng v mng....................................................................................................258
9.21.1. IN............................................................................................................................258
9.21.2. NOT IN...................................................................................................................258
9.21.3. ANY/SOME (mng)...............................................................................................259
9.21.4. ALL (mng)............................................................................................................259
9.21.5. So snh hng khn ngoan ......................................................................................259
9.22. Hm thit lp tr v .......................................................................................................260
9.23. Hm thng tin h thng..................................................................................................263
9.24. Hm qun tr h thng ...................................................................................................272
9.25. Hm Trigger...................................................................................................................278
Chng 10. Bin i dng ..........................................................................................................280
10.1. Tng quan.......................................................................................................................280
10.2. Ton t............................................................................................................................282
10.3. Hm................................................................................................................................284
10.4. Lu gi tr.......................................................................................................................288
10.5. UNION, CASE v cc cu trc c lin quan.................................................................288
Chng 11. Cc ch s.................................................................................................................291
11.1. Gii thiu........................................................................................................................291
11.2. Cc dng ch s..............................................................................................................292
11.3. Cc ch s nhiu ct.......................................................................................................294
11.4. Ch s v ORDER BY....................................................................................................295
11.5. Kt hp nhiu ch s ......................................................................................................296
11.6. Ch s duy nht...............................................................................................................297
11.7. Ch s trong cc biu thc..............................................................................................297

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 9/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

11.8. Ch s mt phn..............................................................................................................298
11.9. Lp ton t v h ton t...............................................................................................301
11.10. Kim tra s dng ch s................................................................................................302
Chng 12. Tm kim ton vn...................................................................................................304
12.1. Gii thiu.......................................................................................................................304
12.1.1. Ti liu l g?..........................................................................................................305
12.1.2. Trng khp vn bn c bn....................................................................................306
12.1.3. Cu hnh.................................................................................................................307
12.2. Bng v ch s................................................................................................................308
12.2.1. Tm kim bng........................................................................................................308
12.2.2. To ch s...............................................................................................................309
12.3. Kim sot tm kim ton vn ........................................................................................310
12.3.1. Phn tch ti liu.....................................................................................................310
12.3.2. Phn tch truy vn...................................................................................................311
12.3.3. Xp hng cc kt qu tm kim..............................................................................313
12.3.4. Nhn mnh cc kt qu..........................................................................................315
12.4. Tnh nng b sung..........................................................................................................316
12.4.1. iu khin ti liu..................................................................................................316
12.4.2. iu khin truy vn ...............................................................................................317
12.4.2.1. Vit truy vn ..................................................................................................318
12.4.3. Trigger cho cp nht t ng..................................................................................320
12.4.4. Thu thp thng k ti liu ......................................................................................321
12.5. Trnh phn tch...............................................................................................................322
12.6. T in...........................................................................................................................323
12.6.1. T cht....................................................................................................................325
12.6.2. T in n gin.....................................................................................................325
12.6.3. T in t ng ngha............................................................................................327
12.6.4. T in t ng ngha............................................................................................328
12.6.4.1. Cu hnh t in t ng ngha......................................................................329
12.6.4.2. V d v t in t ng ngha.......................................................................330
12.6.5. T in Ispell..........................................................................................................331
12.6.6. T in bng tuyt (Snowball)...............................................................................332
12.7. V d cu hnh................................................................................................................332
12.8. Kim th v g li tm kim vn bn.............................................................................334
12.8.1. Kim th cu hnh .................................................................................................334
12.8.2. Kim th trnh phn tch .......................................................................................336
12.8.3. Kim th t in.....................................................................................................337
12.9. Dng ch s GiST v GIN..............................................................................................338
12.10. H tr psql....................................................................................................................339
12.11. Hn ch.........................................................................................................................342
12.12. Chuyn tm kim vn bn khi phin bn trc 8.3....................................................342
Chng 13. Kim sot ng thi ................................................................................................344
13.1. Gii thiu.......................................................................................................................344
13.2. S cch li giao dch........................................................................................................344
13.2.1. Mc cch li c thc hin c ............................................................................345
13.2.2. Mc cch li c kh nng tun t............................................................................347
13.2.2.1. Cch li tun t so vi s tun t ng............................................................348

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 10/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

13.3. Kha c quyn.............................................................................................................349


13.3.1. Kha mc bng .....................................................................................................349
13.3.2. Cc kha mc hng ...............................................................................................351
13.3.3. Kha cht................................................................................................................352
13.3.4. Kha c vn............................................................................................................353
13.4. Kim tra s nht qun ca d liu mc ng dng......................................................354
13.5. Kha v ch s................................................................................................................355
Chng 14. Mo cho hiu nng...................................................................................................357
14.1. S dng EXPLAIN........................................................................................................357
14.2. S liu thng k c trnh hoch nh s dng ...........................................................362
14.3. Kim sot trnh hoch nh vi mnh r rng JOIN.................................................364
14.4. a d liu vo c s d liu........................................................................................366
14.4.1. V hiu ha thc hin t ng (Autocommit).......................................................367
14.4.2. S dng COPY.......................................................................................................367
14.4.3. Loi b ch s.........................................................................................................367
14.4.4. Loi b rng buc kha ngoi ...............................................................................368
14.4.5. Gia tng maintenance_work_mem.........................................................................368
14.4.6. Tng checkpoint_segments....................................................................................368
14.4.7. Nhn bn dng v lu tr WAL v hiu ha c.................................................368
14.4.8. Chy ANALYZE sau .........................................................................................369
14.4.9. Vi lu v pg_dump............................................................................................369
14.5. Thit lp khng bn vng...............................................................................................370
Tham kho th loi ..........................................................................................................................371

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 11/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Li ni u
Cun sch ny l ti liu chnh thc ca PostgreSQL. N c cc lp trnh vin v nhng ngi
tnh nguyn khc ca PostgreSQL vit song song vi s pht trin ca phn mm PostgreSQL. N
m t tt c cc chc nng m phin bn hin hnh ca PostgreSQL chnh thc h tr.
lm cho s lng ln cc thng tin v PostgreSQL c kh nng qun l c, cun sch ny
c t chc trong vi phn. Mi phn c mc ch cho tng lp ngi s dng khc nhau, hoc
cho cc giai on khc nhau ca ngi s dng i vi kinh nghim v PostgreSQL ca h:

Phn I l mt gii thiu khng chnh thc cho nhng ngi mi s dng.

Phn II vit v mi trng ngn ng truy vn SQL, bao gm c cc dng v cc hm d


liu, cng nh vic tinh chnh hiu nng mc ca ngi s dng. Mi ngi s dng
PostgreSQL u nn c phn ny.

Phn III m t s ci t v qun tr my ch. Tng ngi m qun l mt my ch


PostgreSQL, d l s dng ring hay v nhng l do khc, nn c phn ny.

Phn IV m t cc giao din lp trnh cho cc chng trnh my trm PostgreSQL.

Phn V bao gm cc thng tin cho nhng ngi s dng cao cp v cc kh nng m rng
ca my ch. Cc ch bao gm cc dng v hm d liu do ngi s dng nh ngha.

Phn VI bao gm cc thng tin tham chiu v cc lnh SQL, cc chng trnh my trm v
my ch. Phn ny h tr cc phn khc vi cc thng tin c sp xp theo lnh hoc
chng trnh.

Phn VII bao gm cc thng tin hn hp c th c s dng cho cc lp trnh vin ca


PostgreSQL.

1. PostgreSQL l g?
PostgreSQL l mt h qun tr c s d liu i tng - quan h - ORDBMS (object-relational
database management system) da trn POSTGRES, phin bn 4.21, c Phng Khoa hc My
tnh Berkeley ca i hc California pht trin. POSTGRES i tin phong trong nhiu khi
nim m ch tr thnh sn sng trong mt s h thng c s d liu thng mi lu sau ny.
PostgreSQL l mt hu bi ngun m vi m gc ban u ca Berkeley. N h tr mt phn ln
tiu chun SQL v a ra nhiu tnh nng hin i:

cc truy vn phc tp

cc kha ngoi

cc trigger

http://db.cs.berkeley.edu/postgres.html

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 12/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

cc kiu nhn

tnh ton vn ca giao dch

kim sot ng thi nhiu phin bn

Xut bn nm 2013

Hn na, PostgreSQL cn c th c ngi s dng m rng theo nhiu cch thc, v d bng
vic b sung thm mi:

cc dng d liu

cc hm

cc ton t

cc hm tng hp

cc phng php nh ch s

cc ngn ng th tc

V v c giy php t do, PostgreSQL c th c bt k ai s dng, sa i v phn phi mt cch


min ph v bt k mc ch g, d l ring t, thng mi hay hn lm.

2. Ngn gn v lch s ca PostgreSQL


H qun tr c s d liu i tng - quan h ORDBMS m by gi c bit nh l PostgreSQL
c xut x t gi POSTGRES c i hc California Berkeley vit. Vi hn 2 thp nin pht
trin qua, PostgreSQL by gi l c s d liu ngun m tin tin nht sn sng khp ni.

2.1. D n POSTGRES ca Berkeley


D n POSTGRES, do Gio s Michael Stonebraker lnh o, c C quan cc D n Nghin
cu Tin tin Quc phng - DARPA (Defense Advanced Research Projects Agency), Vn phng
Nghin cu Qun s - ARO (Army Research Office), Qu Khoa hc Quc gia NSF (National
Science Foundation), v cng ty ESL ti tr. S trin khai ca POSTGRES bt u vo nm
1986. Cc khi nim ban u v h thng ny c trnh by trong Thit k POSTGRES, v nh
ngha m hnh d liu ban u xut hin trong M hnh d liu POSTGRES. Thit k h thng
cc qui tc khi c m t trong Thit k h thng cc qui tc ca POSTGRES. Nhn t c
bn v kin trc ca trnh qun l lu tr c chi tit ha trong Thit k h thng lu tr ca
POSTGRES.
POSTGRES tri qua vi phin bn chnh k t . H thng phn mm demo demoware u
tin c vn hnh vo nm 1987 v tng c trnh by ti Hi ngh ACM-SIGMOD 1988.
Phin bn 1, c m t trong Trin khai POSTGRES, c pht hnh cho mt t ngi s dng
bn ngoi vo thng 06/1989. p li mt ch trch ca h thng cc qui tc u tin (Bnh lun v
h thng cc qui tc ca POSTGRES), h thng cc qui tc c thit k li (V cc qui tc, th

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 13/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

tc, lu tr tm v kiu nhn trong cc h thng c s d liu), v Phin bn 2 c pht hnh


vo thng 06/1990 vi h thng cc qui tc mi. Phin bn 3 xut hin vo nm 1991 v b
sung thm s h tr cho nhiu trnh qun l lu tr, mt trnh thc thi cc truy vn c ci tin, v
mt h thng cc qui tc c vit li. Phn ln, cc phin bn tip sau cho ti Postgres95 (xem bn
di) tp trung vo tnh kh chuyn v tin cy.
POSTGRES tng c s dng trin khai nhiu ng dng sn xut v nghin cu khc nhau.
Chng bao gm: mt h thng phn tch d liu ti chnh, mt gi gim st hiu nng ng c phn
lc, mt c s d liu theo di thin vn, mt c s d liu thng tin y t v vi h thng thng tin
a l. POSTGRES cng tng c s dng nh mt cng c gio dc vi trng i hc. Cui
cng, Illustra Information Technologies (sau ny st nhp vo Informix 2, v by gi IBM s hu3)
ly m v thng mi ha n. Vo cui nm 1992, POSTGRES tr thnh trnh qun l d
liu hng u cho d n tnh ton khoa hc Sequoia 20004.
Kch thc ca cng ng ngi s dng bn ngoi gn gp i vo nm 1993. tr nn ngy
cng r rng rng s duy tr m bn mu v s h tr chim lng thi gian ln m nn c
chuyn tm cho s nghin cu c s d liu. Trong mt n lc gim gnh nng h tr ny, d n
POSTGRES ca Berkeley chnh thc kt thc vi phin bn 4.2.

2.2. Postgres95
Vo nm 1994, Andrew Yu v Jolly Chen b sung mt trnh bin dch ngn ng SLQ vo
POSTGRES. Di mt ci tn mi, Postgres95 lin tc c pht hnh ln web tm kim con
ng ring ca n trn th gii nh l mt hu du ngun m ca m gc ban u POSTGRES
ca Berkeley.
M Postgres95 tng hon ton l ANSI C v c ct ta ti 25% v kch c. Nhiu thay i ni b
ci thin hiu nng v kh nng duy tr. Postgres95 phin bn 1.0.x chy nhanh hn khong
30-50% trn Wiscosin Benchmark so vi POSTGRES phin bn 4.2. Ngoi vic sa li, nhng ci
tin chnh sau y c thc hin:

2
3
4

Ngn ng truy vn PostQUEL c thay th bng SQL (c trin khai my ch). Cc


truy vn con khng c h tr cho ti PostgreSQL (xem bn di), nhng chng c th
c m phng trong Postgres95 vi cc hm SQL do ngi s dng nh ngha. Cc hm
tng hp c ti trin khai li. S h tr cho mnh truy vn GROUP BY cng
c b sung thm vo.

Mt chng trnh mi (psql) c cung cp cho cc truy vn SQL tng tc, n s


dng GNU Readline. iu ny thay th phn ln chng trnh gim st c.

Mt th vin mi cho mt tin giao tip (front end), libpgtcl, h tr cho cc my trm
da vo TCL. Mt trnh bin dch shell mu, pgtclsh, cung cp cc lnh TCL mi cc

http://www.informix.com/
http://www.ibm.com/
http://meteora.ucsd.edu/s2k/s2k_home.html

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 14/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

chng trnh TCL giao din vi my ch Postgres95.

Mt giao din i tng ln c xem xt li k lng. S o ngc cc i tng ln


tng l c ch duy nht cho vic lu tr cc i tng ln. (S o ngc h thng tp b
loi b).

Mt h thng qui tc mc s vic b loi b. Cc qui tc tng vn sn sng nh cc qui


tc c vit li.

Mt sch ch dn ngn gii thiu cc chc nng SQL thng xuyn cng nh cc chc nng
ca Postgre95 c phn phi vi m ngun.

GNU make (thay cho BSD make) c s dng xy dng. Hn na, Postgres95 c th
c bin dch vi mt GCC khng v vu (cn chnh cc p bn d liu c sa).

2.3. PostgreSQL
Ti nm 1996, tr nn r rng rng ci tn Postgres95 c l khng ph hp v thi gian.
Chng ti chn ci tn mi, PostgreSQL, phn nh mi quan h gia POSTGRES gc ban
u v cc phin bn gn hn vi kh nng SQL. Cng lc, chng ti thit lp vic nh s
phin bn, bt u vi phin bn 6.0, t cc con s ngc v mt cch tun t m d n
POSTGRES ca Berkeley bt u.
Nhiu ngi tip tc tham chiu ti PostgreSQL nh l Postgres (by gi him khi vi tt c cc
ch hoa) v truyn thng hoc v n l d pht m hn. S s dng ny c chp nhn rng ri
nh mt tn hiu hoc b danh.
S nhn mnh trong qu trnh pht trin ca Postgres95 tng l vo vic xc nh v hiu cc vn
trong m ca my ch. Vi PostgreSQL, s nhn mnh chuyn sang vic nng cao cc tnh
nng v kh nng, d cng vic tip tc trong tt c cc kha cnh.
Cc chi tit v nhng g xy ra trong PostgreSQL k t c th thy trong Ph lc E.

3. Cc qui c
Cun sch ny s dng cc qui c in n sau y nh du cc phn nht nh ca vn bn: cc
khi nim mi, cc cm t ngoi, v cc on vn bn quan trng c nhn mnh bng ch
nghing. Mi th trnh by u vo hoc u ra ca my tnh, c bit cc lnh, m chng trnh,
v u ra mn hnh, c biu din theo mt phng ch n cch ( v d). Trong cc on vn bn
nh vy, cc ch nghing (v d) ch phn gi ch; bn phi chn mt gi tr thc t vo thay cho
phn gi ch . Nhn y, cc phn m chng trnh cng c nhn mnh bng ch m ( v d),
nu chng tng c b sung thm hoc b thay i k t v d trc .
Nhng qui c sau s c s dng trong bng tm tt ca mt lnh: cc du ngoc vung ([v])
ch cc phn ty chn. (Trong cc bng tm tt mt lnh TCL, du hi (?) c s dng thay
th, nh thng thng trong TCL). Cc du ngoc nhn ({v}) v cc ng thng ng (|) ch rng

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 15/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

bn phi chn mt la chn. Cc du chm () c ngha l yu t trc c th c lp li.


nhng ni cn s lm sng t, cc lnh SQL c t trc bng mt du nhc =>, v cc lnh
bin dch shell c t trc vi mt du nhc $. D thng thng, cc du nhc s khng c
th hin.
Ngi qun tr thng l mt ngi m c trch nhim trong vic ci t v qun l my ch.
Ngi s dng c th l bt k ai ang s dng, hoc mun s dng, bt k phn no ca h thng
PostgreSQL. Nhng khi nim s khng c dch ngha qu hp; cun sch ny khng c cc
gi thit c nh v cc th tc qun tr h thng.

4. Thng tin thm


Ngoi cun sch ny ra, c nhng ti nguyn khc v PostgreSQL:
Wiki.
Wiki5 ca PostgreSQL bao gm danh sch cc cu hi p thng gp (FAQ6) ca d n,
danh sch cc ch dn cch lm TODO7, v thng tin chi tit ha v nhiu ch hn na.
Website.
Website8 ca PostgreSQL c cc chi tit v phin bn mi nht v cc thng tin khc thc
hin cng vic ca bn hoc chi vi PostgreSQL mt cch c nng sut hn.
Cc danh sch th.
Cc dnh sch th l mt ni tt cc cu hi ca bn c tr li, chia s cc kinh
nghim vi nhng ngi s dng khc, v lin h vi cc lp trnh vin. Hy hi website
ca PostgreSQL c c cc chi tit.
Bn thn bn!
PostgreSQL l mt d n ngun m. V th, n ph thuc vo cng ng nhng ngi s
dng v s h tr lin tc. Khi bn bt u s dng PostgreSQL, bn s da vo nhng
ngi khc, hoc thng qua ti liu hoc cc danh sch th c c s h tr. Hy cn
nhc vic ng gp tri thc ca bn ngc tr li. Hy c cc danh sch th v cc cu hi
p. Nu bn hc c th g m khng c trong ti liu ny, hy vit ra v ng gp n.
Nu bn b sung thm cc tnh nng cho m, hy ng gp chng.

5. Cc ch dn bo co li
Khi bn thy c mt li trong PostgreSQL, chng ti mong mun c nghe v n. Cc bo co li
ca bn s ng gp mt phn quan trng trong vic lm cho PostgreSQL tin cy hn v thm ch
5
6
7
8

http://wiki.postgresql.org
http://wiki.postgresql.org/wiki/Frequently_Asked_Questions
http://wiki.postgresql.org/wiki/Todo
http://www.postgresql.org

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 16/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

s chm sc tt bc cng khng th m bo c rng mi phn ca PostgreSQL s lm vic c


trong mi nn tng theo mi hon cnh c.
Nhng gi sau y c nh h tr cho bn trong vic thng bo cc bo co li m c th c
x tr theo mt cch thc c hiu qu. Khng ai b yu cu phi tun th chng, nhng lm nh vy
c xu hng tn dng c u th ca mi ngi.
Chng ti khng th ha s sa c mi li ngay lp tc. Nu li l r rng, c tnh sng cn,
hoc nh hng ti nhiu ngi s dng, th nhng c hi l tt ai s xem xt n. Cng c th
xy ra rng chng ti ni cho bn cp nht mt phin bn mi xem liu li c xy ra
hay khng. Hoc chng ti c th quyt nh rng li khng th sa c trc khi mt vi s
vit li chnh yu m chng ti ln k hoch c thc hin. Hoc c th n gin l qu kh v c
nhiu iu quan trng hn trong chng trnh ngh s. Nu bn cn s gip ngay lp tc, hy
xem xt c c mt hp ng h tr thng mi.

5.1. Xc nh cc li
Trc khi bn bo co mt li, xin hy c v c li ti liu ny kim tra xem bn thc s c
th lm bt k iu g m bn ang c gng hay khng. Nu cn cha r t ti liu, liu bn c th
lm th g hay khng, xin cng hy bo co iu ; y l mt li trong ti liu. Nu ha ra l
mt chng trnh lm th g khc vi nhng g ti liu ni, th l mt li. iu c th bao
gm, nhng khng b gii hn, ti cc hon cnh sau:

Mt chng trnh kt thc vi mt du hiu ch t hoc mt thng ip li h iu hnh m


c th ch ti mt vn trong chng trnh. (Mt phn v d c th l mt thng ip a
y, khi bn phi t sa iu ).

Mt chng trnh to ra u ra sai vi bt k u vo no.

Mt chng trnh t chi chp nhn u vo hp l (nh c xc nh trong ti liu).

Mt chng trnh chp nhn u vo khng hp l m khng c thng ip lu hoc bo


li. Nhng hy nh trong u rng tng ca bn v u vo khng hp l c th l
tng ca chng ti v mt m rng hoc s tng thch vi thc tin theo truyn thng.

PostgreSQL khng bin dch, xy dng, hoc ci t ph hp vi cc lnh trong cc nn


tng c h tr.

y chng trnh tham chiu ti bt k s thc thi no, ch khng ch cho my ch phn ph
tr (backend).
Chy chm hoc thiu ti nguyn khng phi l mt li. Hy c ti liu hoc hi trn mt trong
cc danh sch th c tr gip trong vic tinh chnh cc ng dng ca bn. Khng tun th
c vi tiu chun SQL cng khng nht thit l mt li, tr phi s tun th i vi tnh nng c
bit c nu mt cch r rng.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 17/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Trc khi bn tip tc, hy kim tra danh sch TODO (hy lm) v trong cc cu hi p thng
gp - FAQ xem liu li ca bn c bit ri hay cha. Nu bn khng th gii m c
thng tin trn danh sch TODO, hy nu vn ca bn. iu t nht chng ti c th l lm cho
danh sch TODO c r rng hn.

5.2. Bo co ci g
iu quan trng nht phi nh v vic bo co li l ni ln tt c cc s vic v ch cc s vic.
Khng on nhng g bn ngh s l sai, nhng g n dng nh lm, hoc phn no ca chng
trnh c mt li. Nu bn khng quen vi s trin khai, th bn c th on sai v khng gip c
chng ti t g. V thm ch nu bn lm ng, th nhng gii thch c hc l mt s b sung ln
ch khng phi l s thay th c cho cc s vic. Nu chng ti nh s sa li th chng ti
s phi xem n xy ra i vi bn thn chng ti trc. Vic bo co cc s vic trn tri l kh
thng thn (bn c th sao chp v dn chng t mn hnh) nhng tt c cc chi tit thng rt quan
trng s b t ra ngoi v ai ngh n khng l vn hoc bo co c th hiu c bng bt k
cch g. Nhng iu sau y nn c trong tng bo co li:

Tun t cc bc chnh xc t khi to chng trnh, cn thit ti hin li vn . iu


ny nn l khp kn; khng a vo mt lnh SELECT trn tri m khng c cc lnh
trc nh CREATE TABLE v INSERT, nu u ra ph thuc vo d liu trong cc bng.
Chng ti khng c thi gian thc hin k thut nghch o s c s d liu ca bn,
v nu chng ti x tr to ra cc d liu ring ca chng ti th chng ti c l s b qua
vn .
nh dng tt nht cho mt v kim th cc vn c lin quan ti SQL l mt tp c th
c chy qua mt tin psql m ch ra c vn . (Hy chc chn khng c bt k th
g trong tp khi to ~/.psqlrc ca bn). Mt cch d dng to tp ny l s dng
pg_dump ra cc khai bo bng v cc d liu cn thit thit lp kch bn, sau b
sung truy vn ca vn . Bn c khuyn khch ti thiu ha kch c v d ca bn,
nhng iu ny l khng cn thit mt cch tuyt i. Nu li c kh nng ti to c, th
chng ti s tm c cch lm th.
Nu ng dng ca bn s dng mt s giao din my trm khc, nh PHP, th xin hy c
cch li cc truy vn gy ra li. Chng ti c th s khng thit lp mt my ch web ti
to vn ca bn. Trong mi trng hp, hy ghi nh cung cp cc tp u vo chnh xc;
khng on rng vn xy ra v cc tp ln hoc cc c s d liu c cc kch c sai,
v thng tin ny l qu khng chnh xc s dng.

u ra bn c. Xin hy khng ni rng n khng lm vic hoc b hng. Nu c


mt thng ip li, hy ch n ra, thm ch nu bn khng hiu n. Nu chng trnh kt
thc vi mt li ca h iu hnh, hy ni li g. Nu khng c g xy ra c, hy ni th.
Thm ch nu kt qu ca v kim th ca bn l mt s hng chng trnh hoc, nu khc,
r rng n c th khng xy ra trong nn tng ca bn. iu d nht l sao chp u ra t

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 18/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ca s dng lnh terminal, nu c th.


Lu : Nu bn ang bo co mt thng ip li, xin hy c mu di dng nht ca
thng ip . Trong psql, hy ni s di dng ca \set VERBOSITY trc. Nu bn
ang trch ra thng ip t lu k (log) ca my ch, hy t tham s thi gian chy
log_error_verbosity ni di sao cho tt c cc chi tit s c lu k li.
Lu : Trong trng hp c cc li ch t, thng ip li c my trm nu c l
khng bao gm tt c cc thng tin c sn. Xin cng nhn vo cc kt qu u ra lu
k ca my ch c s d liu. Nu bn khng gi u ra lu my ch ca bn, th
y c th l thi im tt bt u lm th.

Kt qu u ra m bn mong i rt quan trng nu. Nu bn ch vit Lnh ny cho ti


kt qu u ra hoc y khng phi l iu ti mong i, th chng ti c th t lm
n, qut kt qu u ra, v ngh n trng OK v chnh xc l nhng g chng ti mong
i. Chng ti s khng mt thi gian gii m ng ngha chnh xc ng sau cc lnh ca
bn. c bit hy kim ch vic ch ni rng y khng phi l nhng g SQL
ni/Oracle lm. Vic o su hnh vi ng t SQL khng phi l mt vic nh lm cho
vui, cng khng phi chng ti bit tt c cch tt c cc c s d liu quan h khc hnh
x. (Nu vn ca bn l hng chng trnh, th bn c th r rng qun i khon ny).

Bt k la chn dng lnh no v cc la chn khi to khc, bao gm bt k bin mi


trng ph hp no hoc cc tp cu hnh no m bn thay i so vi mc nh. Mt ln
na, xin cung cp thng tin chnh xc. Nu bn ang s dng mt phn phi trc khi c
ng gi m khi ng my ch c s d liu lc khi ng, th bn nn c tm ra cch m
iu c thc hin.

Bt k iu g bn lm trc tip t cc ch dn ci t.

Phin bn PostgreSQL. Bn c th chy lnh chn phin bn - SELECT version (); tm ra


phin bn ca my ch m bn c kt ni ti. Hu ht cc chng trnh thc thi cng h
tr mt - la chn phin bn; t nht l postgres -- version v psql -- version s lm vic.
Nu chc nng hoc cc la chn ny khng tn ti th phin bn ca bn ln hn phin
bn c m bo mt s nng cp. Nu bn chy mt phin bn trc khi c ng gi,
nh RPM, gi s th, bao gm bt k phin bn con no m gi c th c. Nu bn ang
ni v mt hnh chp ca Git, hy nu n, bao gm c hm bm trnh.
Nu phin bn ca bn c hn 9.0.13 th chng ti hu nh chc chn s ni bn nng
cp. C nhiu sa li v ci tin trong tng phin bn mi, nn hon ton c kh nng l
mt li bn gp trong mt phin bn c hn ca PostgreSQL c sa ri. Chng ti
ch c th cung cp s h tr c gii hn cho cc site s dng cc phin bn c hn ca
PostgreSQL; nu bn yu cu nhiu hn so vi chng ti c th cung cp, hy xem xt c
c mt hp ng h tr thng mi.

Thng tin nn tng. iu ny bao gm tn v phin bn nhn, th vin C, trnh x l, thng

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 19/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

tin b nh, Trong hu ht cc trng hp l bo co v nh cung cp v phin bn,


nhng khng gi thit bt k ai cng bit chnh xc nhng g Debian bao gm hoc tng
ngi chy trong i386s. Nu bn c cc vn v ci t th thng tin v chui cng c
trong my ca bn (trnh bin dch, make, ) cng l cn thit.
Khng s nu bo co li ca bn tr nn di hn. l thc t cuc sng. L tt hn bo co
mi iu ln u tin hn l vic phi bp li cc s vic thot khi bn. Mt khc, nu cc tp u
vo ca bn l khng l, l hp l yu cu trc ht liu c ai c quan tm trong vic nhn
vo hay khng. y l mt bi vit9 m phc tho mt s mo v bo co cc li.
Khng b ra tt c thi gian ca bn ch ra nhng thay i no u vo lm cho vn bin
mt. iu ny c th s khng gip gii quyt c vn . Nu ha ra l li khng th sa c
ngay lp tc, th bn vn s c thi gian tm v chia s s khc phc ca bn. Hn na, mt ln
na, khng b ph thi gian on v sao li tn ti. Chng ti s tm ra iu sm.
Khi vit mt bo co li, xin hy trnh nhm ln thut ng. Gi phn mm trong ton b c gi
l PostgreSQL, i khi ngn gn l Postgres. Nu bn ni mt cch c bit v my ch phn
ph tr (backend), hy nu iu , khng ch ni nhng hng hc ca PostgreSQL. Mt s hng
hc ca mt qui trnh my ch phn ph tr l hon ton khc vi s hng hc ca qui trnh cha ca
Postgres; xin ng ni my ch b hng khi bn ng mt qui trnh phn ph tr duy nht
khng lm vic c, v cng khng ngc li. Hn na, cc chng trnh my trm nh psql
mt tin (front-end) tng tc l hon ton tch bit vi phn ph tr. Xin hy c gng phn bit
liu vn l pha my trm hay pha my ch.

5.3, Bo co cc li u
Ni chung, hy gi cc bo co li vo danh sch th bo co li ti <pgsql-bugs@postgresql.org>.
Bn c yu cu s dng mt ch m t cho thng ip th in t ca bn, c l cc phn ca
thng ip li.
Mt phng php khc l in vo mu c sn trn web bo co li website ca d n 10. a vo
bo co li theo cch ny s lm cho n c gi bng th in t cho danh sch th < pgsqlbugs@postgresql.org>.
Nu bo co li ca bn c nhng lin quan v an ninh v bn thch iu khng tr thnh ngay
lp tc c nhn thy trong cc kho lu tr cng khai, hy ng gi n cho pgsql-bugs. Cc vn
v an ninh c th c bo co ring cho <security@postgresql.org>.
Khng gi cc bo co li ti bt k danh sch th no ca ngi s dng, nh <pgsqlsql@postgresql.org> hoc <pgsql-general@postgresql.org>. Cc danh sch th l dnh cho vic
tr li cc cu hi ca ngi s dng, v nhng ngi ng k ca chng thng khng mun nhn
cc bo co li. Quan trng hn, h c l s khng sa c chng.
9 http://www.chiark.greenend.org.uk/~sgtatham/bugs.html
10 http://www.postgresql.org

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 20/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Hn na, xin khng gi cc bo co li cho danh sch th ca cc lp trnh vin <pgsqlhackers@postgresql.org>. Danh sch ny l tho lun v s pht trin ca PostgreSQL, v c th
l tt nu chng ti c th gi cc bo co li c tch bit. Chng ti c th chn tin hnh
tho lun v bo co li ca bn trong pgsql-hackers, nu vn cn r sot li tip.
Nu bn c vn vi ti liu, th ni tt nht bo co n l danh sch th cho ti liu < pgsqldocs@postgresql.org>. Xin ch ra phn no ca ti liu m bn khng thch.
Nu li ca bn l mt vn v tnh kh chuyn trong mt nn tng khng c h tr, hy gi
th in t ti <pgsql-hackers@postgresql.org>, sao cho chng ti (v bn) c th lm vic v vic
chuyn PostgreSQL ti nn tng ca bn.
Lu : V khng may s lng spam ln ang xy ra hin nay, tt c cc a ch th in t
trn u l cc danh sch th ng. Ngha l, bn cn phi ng k vo mt danh sch
c php vit bi trong . (Tuy nhin, bn khng cn phi ng k s dng mu bo co
li trn web). Nu bn mun gi th nhng khng mun nhn cc th ca danh sch, th bn
c th ng k v thit lp la chn ng k ca bn thnh nomail. c thm thng tin,
hy gi th ti <majordomo@postgresql.org> vi t duy nht help (gip) thn ca thng
ip.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 21/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

I. Sch ch dn
Cho mng bn ti vi Sch ch dn PostgreSQL. Cc chng sau y c nh a ra mt gii
thiu n gin v PostgreSQL, cc khi nim v c s d liu quan h, v ngn ng SQL cho
nhng ai cn mi i vi bt k mt trong nhng kha cnh . Chng ti ch c mt s tri thc
chung v cch s dng cc my tnh. Khng c bt k kinh nghim lp trnh no hay kinh nghim
Unix c th no c yu cu. Phn ny ch yu c nh a ra cho bn mt s kinh nghim
truyn tay vi cc kha cnh quan trng ca h thng PostgreSQL. N khng c nh s l s x
l y hoc t m cc ch m n bao trm.
Sau khi bn lm vic qua vi sch ch dn ny, bn c th mun chuyn ti c Phn II c
c nhiu tri thc chnh thng hn v ngn ng SQL, hoc Phn IV c thng tin v vic pht
trin cc ng dng cho PostgreSQL. Nhng ngi m mun thit lp v qun tr my ch ca ring
h cng nn c Phn III.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 22/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Chng 1. Lm quen
1.1. Ci t
Trc khi bn c th s dng PostgreSQL, bn cn ci t n, tt nhin. C kh nng l
PostgreSQL c ci t ri trn site ca bn, hoc v n c a vo trong pht tn h iu
hnh ca bn ri hoc v ngi qun tr h thng ci t n ri. Nu ng l nh vy, th bn nn
c thng tin t ti liu h iu hnh hoc ngi qun tr h thng ca bn v cch truy cp
PostgreSQL.
Nu bn khng chc liu PostgreSQL c sn sng ri hay liu bn c th s dng n cho th nghim
ca bn hay khng th t bn c th ci t n, ri sau tham chiu ti Chng 15 c cc ch
dn v ci t, v quay li vi sch ch dn ny khi vic ci t hon tt. Hy chc chn tun theo
mt cch st sao phn v thit lp cc bin mi trng mt cch thch hp.
Nu ngi qun tr site ca bn cn cha thit lp mi iu theo cch thc mc nh, th bn c th
c mt s cng vic na phi lm. V d, nu my tnh lm my ch c s d liu l mt my xa,
th bn s cn thit lp bin mi trng PGHOST v tn ca my lm my ch c s d liu. Bin
mi trng PGPORT cng c th phi c thit lp. Vn l th ny: nu bn c gng khi ng
mt chng trnh ng dng v n ku rng n khng th kt ni c ti c s d liu, th bn nn
hi ngi qun tr site ca bn hoc, nu l bn, hy tra cu ti liu chc chn rng mi
trng ca bn c thit lp mt cch ph hp. Nu bn khng hiu on trc th hy c
phn tip sau.

1.2. C bn v kin trc


Trc khi chng ti x l, bn nn hiu kin trc c bn ca h thng PostgreSQL. Vic hiu cch
m cc phn ca PostgreSQL tng tc s lm cho chng ny r hn mt cht.
Trong bit ng v c s d liu, PostgreSQL s dng m hnh my trm/my ch phc v. Mt
phin lm vic ca PostgreSQL bao gm cc tin trnh (cc chng trnh) kt hp sau y:

Mt tin trnh my ch, n qun l cc tp c s d liu, chp nhn cc kt ni ti c s d


liu t cc ng dng my trm, v thc hin cc hnh ng ca c s d liu nhn danh cc
my trm. Chng trnh ca my ch c s d liu c gi l postgres.

ng dng my trm (giao din mt tin frontend) ca ngi s dng m mun thc hin
cc hot ng c s d liu. Cc ng dng my trm c th rt a dng v bn cht t nhin:
mt my trm c th l mt cng c hng vn bn, mt ng dng ha, mt my ch
web m truy cp c s d liu hin th cc trang web, hoc mt cng c duy tr c s d
liu c chuyn mn ha. Mt s ng dng my trm c cung cp vi phn phi
PostgreSQL; hu ht do nhng ngi s dng pht trin.

Nh l in hnh i vi cc ng dng my trm/my ch, my trm v my ch c th nm cc

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 23/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ni t ch (host) khc nhau. Trong trng hp chng giao tip qua mt kt ni mng TCP/IP.
Bn nn nh iu ny trong u, v cc tp c th c truy cp trong mt my tnh trm c th
khng truy cp c (hoc c th ch truy cp c bng vic s dng mt tn tp khc) trn my
tnh ch c s d liu.
My ch PostgreSQL c th x tr nhiu kt ni ng thi t cc my trm. t c iu ny
th n khi ng (r nhnh) mt tin trnh mi cho tng kt ni. T thi im tr i, my trm
v tin trnh ca my ch giao tip m khng c s can thip ca tin trnh postgres gc ban u. V
th, tin trnh ch o ca my ch lun chy, ch cc kt ni ca my trm, trong khi my trm v
cc tin trnh my ch c lin quan ti vic n v i. (Tt c iu ny tt nhin l khng nhn thy
i vi ngi s dng. Chng ti ch nu n y cho y thi).

1.3. To mt c s d liu
Bi tp u tin xem liu bn c th truy cp my ch c s d liu hay khng l th to ra mt
c s d liu. Mt my ch PostgreSQL ang chy c th qun l nhiu c s d liu. Thng
thng, mt c s d liu ring bit c s dng cho tng d n hoc cho tng ngi s dng.
C kh nng, ngi qun tr site ca bn to ri mt c s d liu bn s dng. Anh ta s phi
ni cho bn tn ca c s d liu l g. Trong trng hp bn c th b qua bc ny v nhy
tip sang phn tip sau.
to mt c s d liu mi, trong v d ny tn l mydb, bn s dng lnh sau:
$ createdb mydb

Nu iu ny khng a ra cu tr li no th bc ny thnh cng v bn c th b qua phn


cn li ca phn ny.
Nu bn thy mt thng ip tng t nh:
createdb: command not found

th PostgreSQL c ci t khng ng. Hoc n khng c ci t hon ton, hoc ng


dn tm kim trnh bin dch shell ca bn khng c thit lp a n vo. Hy thay vo
bng vic c gi lnh vi mt ng dn tuyt i:
$ /usr/local/pgsql/bin/createdb mydb

ng dn site ca bn c th l khc. Hy lin h vi ngi qun tr site ca bn hoc kim tra


cc ch dn ci t sa li tnh trng .
Mt cu tr li khc c th nh th ny:
createdb: could not connect to database postgres: could not connect to server: No such file Is the server
running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

iu ny c ngha l my ch khng c khi ng, hoc n khng c khi ng ni


m createdb mong i n.
Mt ln na, hy kim tra cc ch dn ci t hoc hi ngi qun tr h thng.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 24/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Mt cu tr li khc c th l th ny:
createdb: could not connect to database postgres: FATAL: role "joe" does not exist

trong tn ng nhp ca ring bn c nhc ti. iu ny s xy ra nu ngi qun tr khng


to ra mt ti khon PostgreSQL cho bn. (Cc ti khon ca ngi s dng PostgreSQL l khc
bit i vi cc ti khon ngi s dng ca h iu hnh). Nu bn l ngi qun tr, hy xem
Chng 20 c s tr gip cho vic to cc ti khon. Bn s cn tr thnh ngi s dng ca h
iu hnh theo PostgreSQL c ci t (thng l postgres) to ti khon ngi s dng
u tin. Cng c th bn c ch nh mt ci tn ngi s dng PostgreSQL m l khc vi
tn ngi s dng ca h iu hnh ca bn; trong trng hp bn cn s dng -U chuyn
hoc thit lp bin mi trng PGUSER ch nh tn ngi s dng PostgreSQL ca bn.
Nu bn c mt ti khon ngi s dng nhng n khng c cc quyn c yu cu to mt c
s d liu, th bn hy xem iu sau y:
createdb: database creation failed: ERROR: permission denied to create database

Khng phi mi ngi s dng u c quyn to cc c s d liu mi. Nu PostgreSQL t chi


to cc c s d liu i vi bn, th ngi qun tr site cn phi trao cc quyn cho bn to
cc c s d liu. Hy hi ngi qun tr site nu iu ny xy ra. Nu bn t ci PostgreSQL th
bn nn ng nhp vo v cc mc ch ca sch ch dn ny tun theo ti khon ngi s dng m
bn khi ng my ch1.
Bn cng c th to cc c s d liu vi cc tn khc. PostgreSQL cho php bn to bt k s
lng no cc c s d liu mt site. Cc tn c s d liu phi c k t abc u tin v b gii
hn ti 63 bytes chiu di. Mt la chn thun tin l to mt c s d liu vi cng tn nh tn
ngi s dng hin hnh ca bn. Nhiu cng c c tn c s d liu nh l mc nh, nn n c
th tit kim cho bn vic g ch. to c s d liu, n gin g vo:
$ createdb

Nu bn khng mun s dng c s d liu ca bn hn na th bn c th loi b n. V d, nu


bn l ngi ch (ngi to ra) c s d liu mydb, th bn c th hy dit n bng vic s dng
lnh sau:
$ dropdb mydb

(i vi lnh ny, tn c s d liu khng l mc nh i vi tn ti khon ca ngi s dng. Bn


lun cn phi ch nh n). Hnh ng ny v vt l loi b tt c cc tp c lin quan ti c s d
liu v khng th hon lnh c, v th iu ny ch nn c thc hin vi mt suy ngh trc
mt cch ht sc thn trng.
1

Nh mt s gii thch v sao iu ny lm vic: Cc tn ngi s dng ca PostgreSQL l c lp vi ti khon ca


ngi s dng h iu hnh. Khi bn kt ni ti mt c s d liu, bn c th chn tn ngi s dng PostgreSQL
no kt ni; nu bn khng mun, n s mc nh tn y ht nh ti khon h iu hnh hin hnh ca bn. Khi
iu ny xy ra, s lun c mt ti khon ngi s dng PostgreSQL m c cng tn nh ngi s dng h iu
hnh khi ng my ch, v iu ny cng xy ra rng ngi s dng lun c quyn to cc c s d liu.
Thay v vic ng nhp nh ngi s dng , bn cng c th ch nh la chn -U bt k u chn mt tn
ngi s dng PostgreSQL kt ni.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 25/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Nhiu thng tin hn v createdb v dropdb c th thy createdb v dropdb mt cch tng ng.

1.4. Truy cp c s d liu


Mt khi bn to ra mt c s d liu, bn c th truy cp n bng:

Chy mt chng trnh u cui (terminal) tng tc, gi l psql, cho php bn lm vic
mt cch tng tc vi cc lnh SQL nh vo, sa v thc thi.

S dng mt cng c ha mt tin nh pgAdmin hoc mt b phn mm vn phng vi


s h tr ca ODBC hoc JDBC to v iu khin mt c s d liu. Cc kh nng s
khng c cp ti trong sch ch dn ny.

Vit mt ng dng ty , c s dng mt trong vi rng buc ngn ng c sn. Cc kh


nng c tho lun xa hn trong Phn IV.

Bn c th mun khi to psql th cc v d trong sch ch dn ny. N c th c kch hot


cho c s d liu mydb bng vic g lnh:
$ psql mydb

Nu bn khng cung cp tn c s d liu th n s mc nh s dng tn ti khon ngi s dng


ca bn. Bn pht hin ri s ny trong phn trc bng vic s dng createdb.
Trong psql, bn s c cho n vi thng ip sau:
psql (9.0.13)

Hy g help xin tr gip.


mydb=>

iu c th c ngha l bn l siu ngi dng (superuser) ca mt c s d liu, n ging ht


trng hp nu bn t ci t PostgreSQL. L siu ngi s dng c ngha l bn khng phi
tun th cc kim sot truy cp. V cc mc ch ca sch ch dn ny, iu khng quan trng.
Nu bn gp phi cc vn khi ng psql th hy quay ngc v phn trc. Cc d on ca
createdb v psql l tng t nhau, v nu ci trc lm vic c th ci sau cng s lm vic.
Dng cui cng c in ra t psql l du nhc, v n ch ra rng psql ang nghe bn v rng bn c
th g cc truy vn SQL vo mt khng gian lm vic c psql duy tr. Hy th cc lnh :
mydb=> SELECT version();

version
----------------------------------------------------------------------PostgreSQL 9.0.13 on i586-pc-linux-gnu, compiled by GCC 2.96, 32-bit
(1 row)
mydb=> SELECT current_date;

date
-----------2002-08-31
(1 row)

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 26/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

mydb=> SELECT 2 + 2;

?column?
---------4
(1 row)

Chng trnh psql c mt s lnh ni b khng phi l cc lnh SQL. Chng bt u vi k t cho
ngc, \. V d, bn c th c c s tr gip trong c php ca cc lnh SQL khc nhau ca
PostgreSQL bng vic g:
mydb=> \h

ra khi psql, hy g:
mydb=> \q

v psql s thot ra v tr bn v vi trnh bin dch lnh shell ca bn. ( bit thm v cc lnh ni
b, hy g \? du nhc psql). Cc kh nng y ca psql c vit thnh ti liu trong psql.
Nu PostgreSQL c ci t ng th bn cng c th g man psql du nhc shell ca h iu
hnh thy ti liu . Trong sch ch dn ny chng ti s khng s dng cc tnh nng mt
cch r rng, nhng t bn c th s dng chng khi cn thit.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 27/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Chng 2. Ngn ng SQL


2.1 Gii thiu
Chng ny a ra tng quan v cch s dng SQL tin hnh cc hot ng n gin. Sch ch
dn ny ch c nh gii thiu cho bn ch khng phi l mt ch dn SQL hon chnh. Nhiu
cun sch tng c vit v SQL, bao gm Hiu SQL mi v Ch dn v Tiu chun SQL. Bn nn
nhn thc c l mt s tnh nng ca ngn ng SQL l cc m rng cho tiu chun .
Trong cc v d bn di, chng ti gi thit l bn to ra mt c s d liu c tn l mydb, nh
c m t trong chng trc, v tng c kh nng khi to psql.
Cc v d trong sch ch dn ny cng c th c thy trong phn phi ngun ca PostgreSQL
trong th mc src/tutorial/. (Cc phn phi nh phn ca PostgreSQL c th khng bin dch cc tp
). s dng cc tp , trc ht hy thay i ti th mc v chy lnh make:
$ cd ..../src/tutorial
$ make

iu ny to ra cc script v bin dch cc tp C c cha cc hm v cc dng do ngi s dng


nh ngha. Sau , khi ng sch ch dn, hy lm nh sau:
$ cd ..../tutorial
$ psql -s mydb
...
mydb=> \i basics.sql

Lnh \i c trong cc lnh t tp c ch nh. La chn psql t bn vo ch mt bc duy


nht v tm ngng trc khi gi tng lnh ti my ch. Cc lnh c s dng trong phn ny l
trong tp basics.sql.

2.2. Cc khi nim


PostgreSQL l mt h qun tr c s d liu quan h (RDBMS). iu c ngha n l mt h
thng cho vic qun l cc d liu c lu tr theo cc quan h. Mi quan h , v c bn, l
khi nim ton hc cho bng. Khi nim ca vic lu tr cc d liu trong cc bng l rt ph bin
ngy nay, c th dng nh l vn d r rng vy, nhng c mt s cch thc khc trong vic t
chc cc c s d liu. Cc tp v cc th mc trong cc h iu hnh ging Unix to nn v d v
mt c s d liu c tn ti trt t. Mt s pht trin hin i hn l c s d liu hng i tng.
Mi bng l mt tp hp c t tn ca cc hng. Mi hng ca mt bng c a ra c cng
tp hp cc ct c t tn, v tng ct c dng d liu c th. Trong khi cc ct c mt trt t c
nh theo tng hng, th iu quan trng phi nh l SQL khng m bo trt t ca cc hng bn
trong bng theo bt k cch g (d chng c th c sp xp mt cch r rng hin th).
Cc bng c nhm li trong cc c s d liu, v mt b su tp cc c s d liu c mt ci
t my ch PostgreSQL duy nht qun l to thnh mt cm c s d liu.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 28/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

2.3. To mt bng mi
Bn c th to mt bng mi bng vic ch nh tn bng, cng vi tt c cc tn ct v cc dng
ca chng:
CREATE TABLE weather (
city
varchar(80),
temp_lo
int,
temp_hi
int,
prcp
real,
date date
);

-- low temperature
-- high temperature
-- precipitation

Bn c th a iu ny vo trong psql vi cc ngt dng. Psql s nhn thc c rng lnh


khng b dng cho ti khi c du chm phy.
Du trng (nh, cc du trng, cc tab v cc dng mi) c th c s dng mt cch t do trong
cc lnh SQL. iu c ngha l bn c th g lnh c dng hng khc nhau so vi trn, hoc
thm ch tt c ch trong mt dng. Hai du gch ngang (--) gii thiu cc ghi ch bnh lun.
Bt k th g i sau chng s b b qua cho ti kt thc dng . SQL phn bit gia ch hoa v
ch thng i vi cc t kha v cc t nhn dng, ngoi tr khi cc t nhn dng c t trong
cc du ngoc kp gi li cc ch thng hoc ch hoa (khng c thc hin trn).
Varchar (80) ch nh dng d liu c th lu tr ty cc chui k t cho ti 80 k t v di. int
l dng s nguyn thng thng. real l mt dng lu tr cc s c du chm ng vi chnh
xc duy nht. date l t gii thch. (Vng, ct dng date cng c tn l date. iu ny c th l
thun tin hoc kh hiu - ty bn chn).
PostgreSQL h tr cc dng SQL tiu chun int, smallint, real, double precision, char(N), varchar(N),
date, time, timestamp, v interval, cng nh cc dng tin ch thng thng khc v mt tp hp
giu c cc dng a l. PostgreSQL c th c ty bin vi mt s lng ty cc dng d liu
do ngi s dng nh ngha. H qu l, cc tn dng khng phi l cc t kha trong c php,
ngoi tr nhng ni c yu cu h tr cc trng hp c bit trong tiu chun SQL.
V d th 2 s lu tr cc thnh ph v v tr a l c lin quan ca chng:
CREATE TABLE cities (
name
varchar(80),
location
point
);

Dng point l mt v d v dng d liu c bit ca PostgreSQL.


Cui cng, c lu rng nu bn khng cn mt bng no na hoc mun to li n theo cch
khc th bn c th xa n bng vic s dng lnh:
DROP TABLE tablename;

2.4. a d liu vo bng vi cc hng


Lnh chn INSERT c s dng a d liu vo mt bng vi cc hng:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 29/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

INSERT INTO weather VALUES (San Francisco, 46, 50, 0.25, 1994-11-27);

Lu rng tt c cc dng d liu s dng kh r rng cc nh dng u vo. Cc hng m khng


phi l cc gi tr s n gin thng phi c a vo trong cc du nhy n (' ), nh trong v
d trn. Dng date thng kh l mm do theo nhng g n chp nhn, nhng i vi sch ch dn
ny th chng ti s gn nh dng khng m h c ch ra y.
Dng point yu cu mt cp ta nh l u vo, nh c ch ra y:
INSERT INTO cities VALUES (San Francisco, (-194.0, 53.0));

C php c s dng cho ti nay i hi bn nh trt t cc ct. Mt la chn c php khc cho
php bn lit k cc ct mt cch r rng:
INSERT INTO weather (city, temp_lo, temp_hi, prcp, date)
VALUES (San Francisco, 43, 57, 0.0, 1994-11-29);

Bn c th lit k cc ct theo mt trt t khc nu bn mun hoc thm ch b st mt s ct,


ngha l, nu s hp tp cha c nhn ra:
INSERT INTO weather (date, city, temp_hi, temp_lo)
VALUES (1994-11-29, Hayward, 54, 37);

Nhiu lp trnh vin coi vic lit k r rng cc ct l dng tt hn so vi vic da vo trt t khng
r rng.
Hy vo tt c cc lnh c ch ra trn sao cho bn c mt s d liu lm vic trong cc phn
tip sau.
Bn cng c th s dng lnh sao chp COPY ti lng d liu ln t cc tp vn bn th.
iu ny thng xuyn l nhanh hn v lnh COPY c ti u ha cho ng dng ny trong khi cho
php tnh mm do t hn so vi lnh INSERT. Mt v d:
COPY weather FROM /home/user/weather.txt;

trong tn tp cho tp ngun phi l sn sng i vi my tnh lm my ch phn ph tr


(backend), khng phi my trm, v my ch phn ph tr c tp mt cch trc tip. Bn c th
c nhiu hn v lnh COPY trong COPY.

2.5. Truy vn bng


truy xut d liu t mt bng, bng c truy vn. Mt lnh chn SELECT ca SQL c s
dng lm iu ny. Lnh ny c chia thnh mt danh sch chn (phn lit k cc ct s c
tr v), mt danh sch bng (phn lit k cc bng t s truy xut cc d liu), v phn nh tnh
ty chn (phn ch nh bt k gii hn no). V d, trch xut tt c cc hng ca bng thi tit,
hy g:
SELECT * FROM weather;

y * l vit tt cho tt c cc ct1. V th kt qu y ht c th c vi:


1

Trong khi SELECT * l hu dng cho cc truy vn t c chun b trc, th n c xem mt cch rng ri nh l dng ti
trong vic to m, v vic b sung mt ct vo bng c th lm thay i cc kt qu.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 30/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

SELECT city, temp_lo, temp_hi, prcp, date FROM weather;

u ra s l:
city
| temp_lo | temp_hi | prcp | date
---------------------+------------+-----------+-------+-----------------San Francisco |
46 |
50 | 0.25 | 1994-11-27
San Francisco |
43 |
57 |
0 | 1994-11-29
Hayward
|
37 |
54 |
| 1994-11-29
(3 rows)

Bn c th vit cc biu thc, khng ch cc tham chiu ct n gin, trong danh sch chn. V d,
bn c th lm:
SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;

iu ny s a ra:
city
| temp_avg | date
---------------------+--------------+-----------------San Francisco |
48 | 1994-11-27
San Francisco |
50 | 1994-11-29
Hayward
|
45 | 1994-11-29
(3 rows)

Lu cch m mnh AS c s dng gn li nhn cho ct u ra. (Mnh AS l ty chn).


Mt truy vn c th c hn ch bng vic b sung thm mt mnh ni m - WHERE ch nh
cc hng no s c mong mun. Mnh WHERE cha mt biu thc Boolean (gi tr ng), v
ch cc hng m biu thc Boolean l ng mi c tr v. Cc ton t Boolean thng dng
(AND, OR, v NOT) s c php trong phn nh tnh.
V d, th sau y trch xut thi tit ca San Francisco vo nhng ngy ma:
SELECT * FROM weather
WHERE city = San Francisco AND prcp > 0.0;

Kt qu:
city
| temp_lo | temp_hi | prcp | date
---------------------+------------+-----------+-------+-----------------San Francisco |
46 |
50 | 0.25 | 1994-11-27
(1 row)

Bn c th yu cu cc kt qu ca mt truy vn c tr v theo trt t sp xp:


SELECT * FROM weather
ORDER BY city;
city
| temp_lo | temp_hi | prcp | date
---------------------+------------+-----------+-------+-----------------Hayward
|
37 |
54 |
| 1994-11-29
San Francisco |
43 |
57 |
0 | 1994-11-29
San Francisco |
46 |
50 | 0.25 | 1994-11-27

Trong v d ny, trt t sp xp c ch nh khng y , v v th bn c th c cc hng San


Francisco theo c 2 trt t. Nhng bn c th lun c c cc kt qu nh trn nu bn lm:
SELECT * FROM weather
ORDER BY city, temp_lo;

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 31/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Bn c th yu cu cc hng p bn b loi b khi kt qu ca mt truy vn:


SELECT DISTINCT city
FROM weather;
city
--------------Hayward
San Francisco
(2 rows)

Mt ln na y, trt t cc hng kt qu c th l khc nhau. Bn c th m bo cc kt qu


nht qun bng vic s dng cng mt lc c DISTINCT v ORDER BY2:
SELECT DISTINCT city
FROM weather
ORDER BY city;

2.6. Lin kt gia cc bng


Cho ti nay, cc truy vn ca chng ta ch truy cp ti 1 bng mt thi im. Cc truy vn c
th truy cp nhiu bng cng mt lc, hoc truy cp bng y ht theo mt cch thc m nhiu hng
ca bng ang c x l cng mt lc. Mt truy vn truy cp c nhiu hng ca cng hoc cc
bng khc nhau cng mt lc c gi l mt truy vn lin kt. V d, bn mun lit k tt c cc
bn ghi v thi tit cng vi a im ca thnh ph c lin quan. lm th, bn cn so snh ct
thnh ph (city) ca tng hng trong bng thi tit (weather) vi ct tn (name) ca tt c cc hng
trong bng cc thnh ph (cities), v chn cc cp cc hng ni m cc gi tr khp nhau.
Lu : y ch l mt m hnh khi nim. S lin kt thng c thc hin theo mt cch
thc c hiu qu hn so vi vic thc s so snh cp cc hng c kh nng, m iu ny l
khng nhn thy i vi ngi s dng.
iu ny c th c thc hin bng truy vn sau:
SELECT *
FROM weather, cities
WHERE city = name;
city
| temp_lo | temp_hi | prcp | date
| name
| location
---------------------+------------+-----------+-------+----------------+--------------------+-------------San Francisco |
46 |
50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
San Francisco |
43 |
57 |
0 | 1994-11-29 | San Francisco | (-194,53)
(2 rows)

Hy quan st 2 iu v tp cc kt qu:

Khng c hng kt qu no cho thnh ph Hayward. iu ny l v khng c khon u vo


no khp trong bng cc thnh ph cho Hayward, nn s lin kt b qua cc hng khng
khp nhau trong bng thi tit. Chng ta s thy ngay cch m iu ny c th c sa.

C 2 ct cha tn thnh ph . iu ny l ng v cc danh sch cc ct t cc bng thi

Trong mt s h thng c s d liu, bao gm c cc phin bn c ca PostgreSQL, s trin khai ca DISTINCT s t ng sp


xp cc hng v v th ORDER BY l khng cn thit. Nhng iu ny khng c tiu chun SQL yu cu, v PostgreSQL
hin hnh khng m bo rng DISTINCT lm cho cc hng c sp xp theo trt t c.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 32/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

tit v cc thnh ph c ghp li vi nhau. Trong thc t iu ny l khng mong mun,


nn bn c th s mun lit k cc ct u ra mt cch r rng hn l vic s dng du *:
SELECT city, temp_lo, temp_hi, prcp, date, location
FROM weather, cities
WHERE city = name;

Bi tp: C gng xc nh ng ngha ca truy vn ny khi mnh WHERE b b qua. V cc ct tt


c c cc tn khc nhau, nn trnh phn tch c php t ng thy c bng no chng thuc v.
Nu c cc tn ct trng nhau trong 2 bng th bn cn phi nh tnh cc tn ct ch ra ct
no bn ng , nh trong:
SELECT weather.city, weather.temp_lo, weather.temp_hi,
weather.prcp, weather.date, cities.location
FROM weather, cities
WHERE cities.name = weather.city;

c tha nhn rng ri cch thc tt nh tnh tt c cc tn ct trong truy vn lin kt, sao cho
truy vn s khng hng nu mt tn ct b p bn sau ny c thm vo mt trong cc bng.
Cc truy vn lin kt dng ti nay v th c xem l cng c th c vit dng la chn thay
th ny:
SELECT *
FROM weather INNER JOIN cities ON (weather.city = cities.name);

C php ny khng c s dng ph bin nh c php trn, nhng chng ti ch ra n y


gip bn hiu cc ch tip sau.
By gi chng ta s ch ra cch m chng ta c th c cc bn ghi c Hayward c a ngc vo.
Nhng g chng ta mun truy vn thc hin l qut bng thi tit v i vi mi hng tm
(cc) hng trng khp ca bng cc thnh ph (cities). Nu khng c hng no khp c tm thy
th chng ta mun mt s gi tr rng s c thay th cho cc ct ca bng cc thnh ph. Dng
truy vn ny c gi l lin kt vng ngoi. (Cc lin kt m chng ta tng thy ti nay l cc
lin kt vng trong). Lnh trng ging th ny:
SELECT *
FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name);
city
| temp_lo | temp_hi | prcp | date
| name
| location
---------------------+------------+-----------+-------+------------+------------------------+-------------Hayward
|
37 |
54 |
| 1994-11-29 |
|
San Francisco |
46 |
50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
San Francisco |
43 |
57 |
0 | 1994-11-29 | San Francisco | (-194,53)
(3 rows)

Truy vn ny c gi l lin kt vng ngoi bn tri v bng c nhc ti bn tri ca ton t


lin k s c tng trong s cc hng ca n u ra t nht mt ln, trong khi bng bn phi s ch
c cc hng u ra m khp vi mt s hng ca bng bn tri. Khi mt hng bng bn tri
u ra khng c s trng khp vi bng bn phi, th cc gi tr rng (null) s c thay th cho
cc ct ca bng bn phi.
Bi tp: Cng c cc lin kt vng ngoi bn phi v cc lin kt vng ngoi y . Hy c tm ra

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 33/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

xem chng lm c g.
Chng ta cng c th lin kt mt bng vi chnh n. iu ny c gi l t lin kt. V d, gi s
chng ta mun thy tt c cc bn ghi v thi tit nm trong di nhit cc bn ghi ca bng thi
tit khc. V th chng ta cn so snh cc ct temp_lo v temp_hi ca tng bng thi tit vi cc ct
temp_lo v temp_hi vi tt c cc hng khc ca bng thi tit. Chng ta c th lm iu ny bng
truy vn sau:
SELECT W1.city, W1.temp_lo AS low, W1.temp_hi AS high,
W2.city, W2.temp_lo AS low, W2.temp_hi AS high
FROM weather W1, weather W2
WHERE W1.temp_lo < W2.temp_lo
AND W1.temp_hi > W2.temp_hi;
city
| low | high | city
| low | high
---------------------+-----+-------+-------------------+-----+-----San Francisco | 43 |
57 | San Francisco | 46 | 50
Hayward
| 37 |
54 | San Francisco | 46 | 50
(2 rows)

y chng ta gn li nhn cho bng thi tit nh l W1 v W2 c kh nng phn bit c


pha bn tri v bn phi ca lin kt. Bn cng c th s dng cc dng tn hiu (aliase) trong
cc truy vn khc tit kim vic g, nh:
SELECT *
FROM weather w, cities c
WHERE w.city = c.name;

Bn s gp dng vit tt ny thng xuyn.

2.7. Cc hng tng hp


Ging nh hu ht cc sn phm c s d liu quan h khc, PostgreSQL h tr cc hm tng hp.
Mt hm tng hp tnh ton mt kt qu duy nht t nhiu hng u vo. V d, c cc tng hp
tnh ton nh count, sum, avg (average - trung bnh), max (maximum - ti a) v min (minimum - ti
thiu) i vi mt tp hp cc hng.
V d, chng ta c th tm nhit thp cao nht u vi:
SELECT max(temp_lo) FROM weather;
max
----46
(1 row)

Nu chng ta mun bit thnh ph (hoc cc thnh ph no ) xy ra iu trn, th ta c th th:


SELECT city FROM weather WHERE temp_lo = max(temp_lo); WRONG

nhng iu ny s khng lm vic v tng hp max khng th c s dng trong mnh WHERE.
(Hn ch ny tn ti v mnh WHERE xc nh cc hng no s c a vo trong tnh ton tng
hp; nn r rng n phi c nh gi trc khi cc hm tng hp c tnh ton). Tuy nhin,
thng th l trng hp truy vn c th c tuyn b li hon tt kt qu mong mun, y l

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 34/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

bng vic s dng mt truy vn con:


SELECT city FROM weather
WHERE temp_lo = (SELECT max(temp_lo) FROM weather);
city
--------------San Francisco
(1 row)

iu ny l OK v truy vn con l mt tnh ton c lp, n tnh tng hp ca ring n mt cch


tch bch vi nhng g ang xy ra trong truy vn vng ngoi.
Cc tng hp cng rt hu dng trong s kt hp vi cc mnh GROUP BY. V d, chng ta c th
c c nhit thp nht c quan st thy trong tng thnh ph vi:
SELECT city, max(temp_lo)
FROM weather
GROUP BY city;
city
| max
---------------------+-------Hayward
| 37
San Francisco | 46
(2 rows)

m n trao cho chng ta mt hng u ra cho mi thnh ph. Mi kt qu tng hp c tnh ton
i vi cc hng ca bng khp vi thnh ph . Chng ta c th lc cc hng c nhm li
bng vic s dng HAVING:
SELECT city, max(temp_lo)
FROM weather
GROUP BY city
HAVING max(temp_lo) < 40;
city
| max
---------------------+-------Hayward
| 37
(1 row)

n trao cho chng ta cc kt qu y ht ch cho cc thnh ph c tt c cc gi tr temp_lo thp hn


40. Cui cng, nu chng ta ch quan tm v cc thnh ph m cc tn bt u vi k t S, th
chng ta c th lm:
SELECT city, max(temp_lo)
FROM weather
WHERE city LIKE S%
GROUP BY city
HAVING max(temp_lo) < 40;

Ton t LIKE thc hin vic khp mu v c gii thch trong phn 9.7.
iu quan trng phi hiu s tng tc gia cc tng hp v cc mnh WHERE v HAVING ca
SQL. S khc bit c bn gia WHERE v HAVING l iu ny: WHERE chn cc hng u vo trc
khi cc nhm v cc tng hp c tnh ton (v th, n kim sot cc hng no i vo trong tnh
ton tng hp ), trong khi HAVING la chn cc hng ca nhm trc khi cc nhm v cc tng
hp c tnh ton. V th mnh WHERE phi khng bao gm cc hm tng hp; khng c

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 35/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ngha th s dng mt tng hp xc nh cc hng no s l cc u vo i vi cc tng hp


. Mt khc, mnh HAVING lun bao gm cc hm tng hp. (Ni mt cch cht ch, bn c
php vit mt mnh HAVING m khng s dng cc tng hp, nhng iu ny him khi hu dng.
iu kin tng t c th c s dng c hiu qu hn giai on ca WHERE).
Trong v d trc, chng ta c th p dng s hn ch tn ca thnh ph trong WHERE, v n khng
cn tng hp. iu ny c hiu qu hn so vi vic thm hn ch vo HAVING, v chng ta trnh
thc hin cc tnh ton tng hp v vic to nhm i vi tt c cc hng m khng kim tra c
vi WHERE.

2.8. Cp nht
Bn c th cp nht cc hng ang tn ti bng vic s dng lnh cp nht UPDATE. Gi s bn
pht hin ra vic c nhit tt c l lch 2 sau ngy 28/11. Bn c th sa cc d liu nh sau:
UPDATE weather
SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2
WHERE date > 1994-11-28;

Hy xem tnh trng mi ca d liu:


SELECT * FROM weather;
city
| temp_lo | temp_hi | prcp | date
---------------------+------------+-----------+-------+-----------------San Francisco |
46 |
50 | 0.25 | 1994-11-27
San Francisco |
41 |
55 |
0 | 1994-11-29
Hayward
|
35 |
52 |
| 1994-11-29
(3 rows)

2.9. Xa
Cc hng c th b xa khi mt bng bng vic s dng lnh xa DELETE. Gi s bn khng cn
quan tm ti thi tit ca Hayward na. Sau bn c th lm iu sau y xa cc hng
khi bng:
DELETE FROM weather WHERE city = Hayward;

Tt c cc bn ghi thi tit thuc v Hayward s b loi b.


SELECT * FROM weather;
city
| temp_lo | temp_hi | prcp | date
---------------------+-------------+------------+-------+----------------San Francisco |
46 |
50 | 0.25 | 1994-11-27
San Francisco |
41 |
55 |
0 | 1994-11-29
(2 rows)

Nn thn trng i vi cc tuyn b dng


DELETE FROM tablename;

Khng c mt s thn trng, DELETE s xa tt c cc hng khi bng c a ra , lm cho hng


s rng. H thng s khng hi khng nh trc khi lm iu ny!

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 36/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Chng 3. Cc tnh nng cao cp


3.1. Gii thiu
Trong chng trc chng ta cp ti nhng iu c bn ca vic s dng SQL lu tr v
truy cp cc d liu ca bn trong PostgreSQL. Chng ta by gi s tho lun mt s tnh nng cao
cp hn ca SQL m n gin ha qun l v ngn chn mt mt hoc hng cc d liu ca chng
ta. Cui cng, chng ta s xem mt s m rng ca PostgreSQL.
Chng ny s nhn c hi tham chiu ti cc v d c thy trong Chng 2 thay i hoc ci
tin chng, sao cho n s l hu dng c chng . Mt s v d t chng ny cng c th
c thy trong tp advanced.sql trong th mc ca sch ch dn. Tp ny cng cha mt s d liu
mu ti ln, n s khng c lp li y. (Tham chiu ti Phn 2.1 v cch s dng tp ).

3.2. Cc kiu nhn


Tham chiu ngc v cc truy vn trong Phn 2.6. Gi thit vic lit k kt hp cc bn ghi thi tit
v a im ca thnh ph l s quan tm c bit cho ng dng ca bn, nhng bn khng mun
g truy vn vo mi ln bn cn n. Bn c th to mt kiu nhn (view) i vi truy vn , n
trao mt ci tn cho truy vn m bn c th tham chiu ti nh mt bng thng thng:
CREATE VIEW myview AS
SELECT city, temp_lo, temp_hi, prcp, date, location
FROM weather, cities
WHERE city = name;
SELECT * FROM myview;

To s thng thong s dng cc kiu nhn l mt kha cnh chnh ca thit k tt c s d liu
SQL. Cc kiu nhn cho php bn ng gi cc chi tit cu trc cc bng ca bn, n c th thay i
khi ng dng ca bn tin ha, ng sau nhng giao din nht qun.
Cc kiu nhn c th c s dng trong hu ht bt k ch no mt bng thc t c th c s
dng. Vic xy dng cc kiu nhn da vo cc kiu nhn khc khng phi l ph bin.

3.3. Cc kha ngoi


Nh li cc bng thi tit v cc thnh ph t Chng 2. Xem xt vn sau: Bn mun chc chn
rng khng ai c th chn cc hng vo bng thi tit m khng c mt khon u vo khp trong
bng cc thnh ph. iu ny c gi l vic duy tr tnh ton vn tham chiu cc d liu ca bn.
Trong cc h thng c s d liu gin d th iu ny c th c trin khai (nu tt c) bng vic
trc ht nhn vo bng cc thnh ph kim tra xem liu mt bn ghi trng khp c tn ti hay
khng, v sau chn hoc t chi cc bn ghi mi ca bng thi tit. Tip cn ny c mt s vn
v l rt thun tin, nn PostgreSQL c th lm iu ny cho bn.
Khai bo mi v cc bng c th trng ging th ny:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 37/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

CREATE TABLE cities (


city varchar(80) primary key,
location point
);
CREATE TABLE weather (
city varchar(80) references cities(city),
temp_lo int,
temp_hi int,
prcp real,
date date
);

By gi c gng chn mt bn ghi hp l vo:


INSERT INTO weather VALUES (Berkeley, 45, 53, 0.0, 1994-11-28);
ERROR: insert or update on table "weather" violates foreign key constraint "weather_city_DETAIL: Key
(city)=(Berkeley) is not present in table "cities".

Hnh vi ca cc kha ngoi c th cui cng c tinh chnh cho ng dng ca bn. Chng ta s
khng i vt ra khi v d n gin ny trong sch ch dn ny, m ch tham chiu ti Chng 5
c thm thng tin. Vic lm cho s dng ng cc kha ngoi chc chn s ci thin cht lng
cc ng dng c s d liu ca bn, nn bn c khuyn khch mnh m hc v chng.

3.4. Cc giao dch


Cc giao dch l mt khi nim c bn ca tt c cc h thng c s d liu. im c bn ca mt
giao dch l n tp hp nhiu bc trong mt bc duy nht, mt hot ng hoc tt c hoc khng
c g xy ra. Cc tnh trng ngay lp tc gia cc bc l khng nhn thy i vi cc giao dch
hin hnh khc, v nu mt s hng hc xy ra m ngn cn giao dch hon tt, th khng c
bc no nh hng ti c s d liu c.
V d, hy cn nhc mt c s d liu trng m bao gm bng quyt ton cn bng thu chi cho cc
ti khon khc nhau ca ngi s dng, cng nh tng cn bng tin gi i vi cc chi nhnh. Gi
s l chng ta mun ghi li thanh ton ca 100.00 USD t ti khon ca Alice cho ti khon ca
Bob. Qu n gin, cc lnh SQL cho vic ny c th l:
UPDATE accounts SET balance = balance - 100.00
WHERE name = Alice;
UPDATE branches SET balance = balance - 100.00
WHERE name = (SELECT branch_name FROM accounts WHERE name = Alice);
UPDATE accounts SET balance = balance + 100.00
WHERE name = Bob;
UPDATE branches SET balance = balance + 100.00
WHERE name = (SELECT branch_name FROM accounts WHERE name = Bob);

Cc chi tit ca cc lnh l khng quan trng y; iu quan trng l c vi bn cp nht ring
r c lin quan hon tt iu ny hn l hot ng n gin. Cc nhn vin ngn hng ca chng
ta s mun c m bo rng tt c cc bn cp nht hoc xy ra, hoc khng iu g trong s
chng xy ra c. C l chc chn khng lm v mt s hng hc h thng gy ra trong vic Bob
nhn 100.00 USD s khng c ghi n t Alice. Alice c l khng thy mnh l mt khch hng
hnh phc nu c ta c ghi n m Bob khng nhn c. Chng ta cn mt s m bo rng

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 38/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

nu th g sai gia ng i vi hot ng , th khng c bc no c thc hin cho ti


lc s c hiu lc c. Vic nhm cc bn cp nht vo mt giao dch trao cho chng ta s m
bo ny. Mt giao dch c ni s l mt ht nhn: t quan im ca cc giao dch khc, n hoc
xy ra hon chnh hoc hon ton khng xy ra.
Chng ta cng mun mt s m bo rng mt khi mt giao dch c hon tt v c h thng
c s d liu tha nhn, th n qu thc c ghi li vnh vin v s khng b mt thm ch nu mt
s hng hc xy ra sau ngay lp tc. V d, nu chng ta ang ghi mt s rt tin ca Bob, th
chng ta khng mun bt k tnh hung no m s ghi n cho ti khon ca anh ta s bin mt v
mt s hng hc ngay sau khi anh ta i ra khi ca ngn hng. C s d liu ca mt giao dch m
bo rng tt c cc bn cp nht c mt giao dch thc hin b kha trong lu tr vnh cu (nh,
trn a) trc khi giao dch c ni l hon tt.
Mt c tnh quan trng khc ca cc c s d liu giao dch c lin quan mt thit vi khi nim
cc bn cp nht ht nhn: khi nhiu giao dch ang chy ng thi, mi giao dch nn c kh nng
thy nhng thay i khng hon chnh do nhng ngi khc thc hin. V d, nu mt giao dch
ang bn tnh tng ca cc bn quyt ton ca tt c cc chi nhnh, th n c th khng nn lm
iu a vo s ghi n t chi nhnh ca Alice m khng lm s cho n i vi chi nhnh ca
Bob, v ngc li cng khng nn. V th cc giao dch phi l hoc tt c - hoc khng c g,
khng ch v cc kha cnh hiu qu vnh cu ca chng trong c s d liu, m cn trong cc kha
cnh v tnh trc quan c th nhn thy c ca chng khi chng xy ra. Cc bn cp nht c
mt giao dch m thc hin cho ti nay l khng nhn thy i vi cc giao dch khc cho ti khi
giao dch hon tt, ngay lc tt c cc bn cp nht tr nn trc quan mt cch ng thi.
Trong PostgreSQL, mt giao dch c thit lp bng cc lnh SQL bao quanh giao dch vi cc
lnh bt u - BEGIN v thc hin COMMIT. V th giao dch ngn hng ca chng ta c l thc s
trng ging nh:
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = Alice;
-- etc etc
COMMIT;

Nu, gia ng ca giao dch, chng ta quyt nh chng ta khng mun thc hin (c th chng
ta ch lu rng bn quyt ton ca Alice l khng tch cc), th chng ta c th a ra lnh
ROLLBACK thay cho lnh COMMIT, v tt c cc bn cp nht ca chng ta cho ti lc s b hon.
PostgreSQL thc s i x vi tng lnh SQL nh ang c thc thi bn trong mt giao dch. Nu
bn khng a ra lnh BEGIN, th tng lnh ring r s c mt BEGIN v (nu thnh cng) COMMIT
c bao bc xung quanh n. Mt nhm cc lnh c BEGIN v COMMIT bao bc xung quanh i
khi c gi l mt khi giao dch.
Lu : Mt s th vin my trm a ra cc lnh BEGIN v COMMIT mt cch t ng, sao
cho bn c th c c hiu qu ca cc khi giao dch m khng phi hi. Hy kim tra ti
liu cho giao din m bn ang s dng.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 39/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

C kh nng kim sot cc lnh trong mt giao dch theo mt cch thc c trng tm hn bng
vic s dng cc im an ton. Cc im an ton cho php bn hy b mt cch c la chn cc
phn ca giao dch, trong khi thc hin c phn cn li. Sau vic xc nh mt im an ton vi
SAVEPOINT, bn c th, nu cn, quay tr li ti im an ton vi lnh ROLLBACK TO. Tt c
nhng thay i ca c s d liu giao dch gia vic xc nh im an ton v vic quay ngc li
v n s c hy b, nhng nhng thay i trc im an ton s c gi li.
Sau khi quay ngc tr li ti mt im an ton, n tip tc s c nhn din, sao cho bn c th
quay ngc tr li v n vi ln. Ngc li, nu bn chc chn bn s khng cn quay ngc tr v
mt im an ton c bit mt ln na, th n c th c gii phng, sao cho h thng c th gii
phng mt s ti nguyn. Hy nh trong u rng hoc vic thot ra hoc quay ngc tr v mt
im an ton s t ng thot ra khi tt c cc im an ton m tng c xc nh sau n.
Tt c iu ny ang xy ra bn trong khi giao dch, nn khng c th g l nhn thy c i vi
cc phin khc ca c s d liu. Khi v nu bn thc hin khi giao dch, cc hnh ng c thc
hin tr nn nhn thy c nh mt n v i vi cc phin khc, trong khi cc hnh ng c
quay ngc tr li s khng bao gi tr nn nhn thy c c.
Ghi nh c s d liu trng, gi thit chng ta ghi n 100.00 USD t ti khon ca Alice, v ghi c
cho ti khon ca Bob, s ch thy sau ny rng chng ta nn c ti khon tin cy ca Wally. Chng
ta c th lm iu ny bng vic s dng cc im an ton ging th ny:
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = Alice;
SAVEPOINT my_savepoint;
UPDATE accounts SET balance = balance + 100.00
WHERE name = Bob;
-- oops ... forget that and use Wallys account
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance = balance + 100.00
WHERE name = Wally;
COMMIT;

Tt nhin, v d ny l qu n gin, nhng c nhiu kh nng kim sot trong mt khi giao dch
thng qua s dng cc im an ton. Hn na, ROLLBACK TO ch l cch ginh li s kim sot
ca mt khi giao dch m c h thng t trong tnh trng b hng v mt li, ngn gn l
quay n ngc tr li hon ton v bt u li mt ln na.

3.5. Hm ca s
Mt hm ca s thc hin mt tnh ton qua mt tp hp cc hng ca bng m bng cch no
c lin quan ti hng hin hnh. iu ny c kh nng so snh c vi dng tnh ton m c th
c thc hin vi mt hm tng hp. Nhng khng ging nh cc hm tng hp thng thng, s
dng mt hm ca s khng lm cho cc hng tr nn b nhm thnh mt hng u ra duy nht cc hng vn gi li cc nh danh ring bit ca chng. pha ng sau, hm ca s c kh
nng truy cp nhiu hn l ch hng hin hnh ca kt qu truy vn .

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 40/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

y l mt v d ch ra cch so snh tng khon lng ca nhn vin vi lng trung bnh trong
phng ca anh hoc ch ta:
SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;
depname
| empno | salary | avg
---------------------+----------+---------+-------------------------------------develop
|
11 | 5200 | 5020.0000000000000000
develop
|
7 | 4200 | 5020.0000000000000000
develop
|
9 | 4500 | 5020.0000000000000000
develop
|
8 | 6000 | 5020.0000000000000000
develop
|
10 | 5200 | 5020.0000000000000000
personnel
|
5 | 3500 | 3700.0000000000000000
personnel
|
2 | 3900 | 3700.0000000000000000
sales
|
3 | 4800 | 4866.6666666666666667
sales
|
1 | 5000 | 4866.6666666666666667
sales
|
4 | 4800 | 4866.6666666666666667
(10 rows)

3 ct u ra u tin ti trc tip t bng lng ca nhn vin empsalary, v c mt hng u ra


cho tng hng trong bng . Ct th 4 i din cho lng trung bnh c ly ra t tt c cc hng
ca bng m c gi tr tn phng - depname y ht nh hng hin hnh. (y thc s l hm y ht
nh hm tng thng thng avg, nhng mnh OVER lm cho n c x l nh mt hm ca s
v c tnh ton xuyn khp mt tp hp thch hp cc hng).
Mt li gi hm ca s lun bao gm mt mnh OVER i sau tn v (cc) bin ca hm ca s
. y l, theo c php, nhng g phn bit n vi mt hm thng thng hoc mt hm tng hp.
Mnh OVER xc nh chnh xc cch m cc hng ca truy vn c chia tch cho vic x l ca
hm ca s. Danh sch PARTITION BY trong OVER ch nh vic phn chia cc hng thnh cc nhm,
hoc cc phn vng, m chia s cng cc gi tr ca (cc) biu thc PARTITION BY. i vi mi hng,
hm ca s c tnh ton khp cc hng m ri vo trong cng phn vng nh hng hin hnh.
D avg s sn sinh ra cng kt qu bt lun trt t m n x l cc hng ca phn vng ra sao,
th iu ny l khng ng i vi tt c cc hm ca s. Khi cn, bn c th kim sot trt t
bng vic s dng ORDER BY trong OVER. y l mt v d:
SELECT depname, empno, salary, rank() OVER (PARTITION BY depname ORDER BY salary DESC) FROM
depname
| empno | salary | rank
--------------------- +----------+---------+-----develop
|
8 | 6000 | 1
develop
|
10 | 5200 | 2
develop
|
11 | 5200 | 2
develop
|
9 | 4500 | 4
develop
|
7 | 4200 | 5
personnel
|
2 | 3900 | 1
personnel
|
5 | 3500 | 2
sales
|
1 | 5000 | 1
sales
|
4 | 4800 | 2
sales
|
3 | 4800 | 2
(10 rows)

Nh c ch ra y, hm xp hng - rank to ra mt hng s bn trong phn vng ca hng hin


hnh cho tng gi tr c nht ca ORDER BY, c mnh ORDER BY xc nh. rank khng cn

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 41/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

tham s r rng, v hnh vi ca n hon ton c xc nh bng mnh OVER.


Cc hng m mt hm ca s xem xt l cc hng ca bng o c to ra t mnh FROM ca
truy vn khi c cc mnh WHERE, GROUP BY v HAVING ca n lc, nu c. V d, mt hng b
loi b v n khng p ng c cc iu kin ca WHERE s c bt k hm ca s no nhn
thy. Mt truy vn c th bao gm nhiu hm ca s m ct lt cc d liu theo cc cch thc khc
nhau bng nhng mnh OVER khc nhau, nhng tt c chng hnh ng trong cng mt b su
tp cc hng c bng o ny xc nh.
Chng ta thy ri rng ORDER BY c th b b qua nu vic sp xp cc hng l khng quan trng.
Cng c kh nng b qua PARTITION BY, trong trng hp ch c mt phn vng c cha tt c
cc hng.
C mt khi nim quan trng khc c lin quan ti cc hm ca s: i vi tng hng, c mt tp
hp cc hng trong phn vng ca n c gi l khung ca s ca n. Nhiu (nhng khng phi
tt c) cc hm ca s hnh ng ch trong cc hng ca khung ca s, thay v ca ton b phn
vng . Mc nh, nu ORDER BY c cung cp th khung bao gm tt c cc hng t u ca
phn vng cho ti hng hin hnh, cng vi bt k hng theo sau no m ngang bng vi hng hin
hnh theo mnh ORDER BY. Khi ORDER BY b b qua th khung mc nh bao gm tt c cc hng
trong phn vng1. y l mt v d s dng tng:
SELECT salary, sum(salary) OVER () FROM empsalary;
salary | sum
----------+------5200 | 47100
5000 | 47100
3500 | 47100
4800 | 47100
3900 | 47100
4200 | 47100
4500 | 47100
4800 | 47100
6000 | 47100
5200 | 47100
(10 rows)

trn, khi khng c ORDER BY trong mnh OVER, th khung ca s l y ht nh phn vng ,
thiu PARTITION BY l bng tng th; ni cch khc, tng tng s c thc hin cho ton b bng v
v th chng ta c kt qu y ht cho tng hng u ra. Nhng nu chng ta b sung thm mt mnh
ORDER BY, th chng ta c cc kt qu rt khc nhau:
SELECT salary, sum(salary) OVER (ORDER BY salary) FROM empsalary;
salary | sum
----------+---------3500 | 3500
3900 | 7400
4200 | 11600
4500 | 16100
4800 | 25700

C nhng la chn xc nh khung ca s theo cc cch khc, nhng ti liu ch dn ny khng cp ti


chng. Xem Phn 4.2.8 c cc chi tit.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 42/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


4800
5000
5200
5200
6000

|
|
|
|
|

Xut bn nm 2013

25700
30700
41100
41100
47100

(10 rows)

y tng ny c thc hin t lng u tin (thp nht) cho ti hin hnh, bao gm c bt k
s p bn no ca lng hin hnh (lu cc kt qu cho cc lng b p bn).
Cc hm ca s c php ch trong danh sch SELECT v mnh ORDER BY ca truy vn .
Chng b cm u khc na, nh trong cc mnh GROUP BY, HAVING v WHERE. iu ny l
v chng, v logic, thc thi sau vic x l cc mnh . Hn na, cc hm ca s thc thi sau cc
hm tng hp thng thng. iu ny c ngha rng, l hp l a vo mt li gi hm tng hp
vo trong cc tham s ca mt hm ca s, nhng khng lm ngc li c.
Nu c mt nhu cu phi lc hoc to thnh nhm cc hng sau khi cc tnh ton ca s c thc
hin, th bn c th s dng mt la chn con (ph). V d:
SELECT depname, empno, salary, enroll_date
FROM
(SELECT depname, empno, salary, enroll_date,
rank() OVER (PARTITION BY depname ORDER BY salary DESC, empno) AS pos
FROM empsalary
) AS ss
WHERE pos < 3;

Truy vn trn ch a ra cc hng t truy vn vng trong c rank t hn 3.


Khi mt truy vn c lin quan ti nhiu hm ca s, c kh nng vit ra tng hm vi mt mnh
OVER, nhng iu ny l p bn v li - hng nu hnh vi to ca s y ht c mong mun i
vi vi hm. Thay vo , tng hnh vi to ca s c th c t tn trong mt mnh WINDOW
v sau c tham chiu trong OVER. V d:
SELECT sum(salary) OVER w, avg(salary) OVER w
FROM empsalary
WINDOW w AS (PARTITION BY depname ORDER BY salary DESC);

Chi tit hn v cc hm ca s c th thy trong Phn 4.2.8, Phn 9.19, Phn 7.2.4, v trang tham
chiu ca SELECT.

3.6. S k tha
S k tha l mt khi nim t cc c s d liu hng i tng. N m ra cc kh nng mi th
v ca thit k c s d liu.
Hy to 2 bng. Mt bng cc thnh ph - cities v mt bng cc th ph - capitals. Mt cch t
nhin, cc th ph cng l cc thnh ph, nn bn mun mt s cch trnh by cc th ph mt
cch n khi bn lit k tt c cc thnh ph. Nu bn thc s khn ngoan th bn c th sng to
mt s s ging th ny:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 43/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

CREATE TABLE capitals (


name text,
population real,
altitude int, -- (in ft)
state char(2)
);
CREATE TABLE non_capitals (
name text,
population real,
altitude int -- (in ft)
);
CREATE VIEW cities AS
SELECT name, population, altitude FROM capitals
UNION
SELECT name, population, altitude FROM non_capitals;

iu ny lm vic OK vi vic truy vn, nhng n tr nn xu x khi bn cn cp nht vi hng, v


mt iu.
Mt gii php tt hn l:
CREATE TABLE cities (
name text,
population real,
altitude int -- (in ft)
);
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);

Trong trng hp ny, mt hng ca bng cc th ph k tha tt c cc ct ( name, population, v


altitude) t bng cha ca n, bng cc thnh ph. Dng ca ct name l vn bn, mt dng bm sinh
ca PostgreSQL cho cc chui k t di cc bin. Cc th ph bang c mt ct di ra, state, ch
bang ca chng. Trong PostgreSQL, mt bng c th k tha t 0 hoc nhiu hn cc bng khc.
V d, truy vn sau y tm thy cc tn ca tt c cc thnh ph, bao gm c cc th ph ca cc
bang, m nm cao hn 500 feet:
SELECT name, altitude
FROM cities
WHERE altitude > 500;

n s tr v:
name
| altitude
---------------------+------------Las Vegas
| 2174
Mariposa
| 1953
Madison
| 845
(3 rows)

Mt khc, truy vn sau y tm thy tt c cc thnh ph m khng phi l cc th ph bang v nm


cao 500 feet hoc cao hn:
SELECT name, altitude
FROM ONLY cities
WHERE altitude > 500;

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 44/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

name
| altitude
---------------------+-----------Las Vegas
| 2174
Mariposa
| 1953
(2 rows)

y ONLY trc cities ch rng truy vn nn c chy ch i vi bng cities, v khng vi cc


bng bn di cities trong tn ti trt t k tha. Nhiu lnh m chng ti tho lun ri nh
SELECT, UPDATE, v DELETE h tr c php ONLY ny.
Lu : D s k tha thng l hu dng, n cn cha c tch hp vo vi cc hng duy
nht hoc cc kha ngoi, chng hn ch tnh hu dng ca n. Xem Phn 5.8 c thm
chi tit.

3.7. Kt lun
PostgreSQL c nhiu tnh nng khng c cp ti trong gii thiu ca sch ch dn ny, n
tng c hng ti nhng ngi s dng mi hn ca SQL. Cc tnh nng c tho lun chi
tit hn trong phn cn li ca sch ch dn ny.
Nu bn cm thy bn cn nhiu t liu gii thiu hn, xin hy thm website PostgreSQL2 c cc
ng lin kt ti nhiu ti nguyn hn.

http://www.postgresql.org/

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 45/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

II. Ngn ng SQL


Phn ny m t s dng ngn ng SQL trong PostgreSQL. Chng ta bt u vi vic m t c php
chung ca SQL, ri gii thch cch to ra cc cu trc lu tr d liu, cch a d liu vo
c s d liu, v cch truy vn n. Phn gia lit k cc dng v cc hm d liu c sn s
dng trong cc lnh SQL. Phn cn li cp ti vi kha cnh quan trng cho vic tinh chnh mt
c s d liu c hiu nng ti u.
Thng tin trong phn ny c sp xp sao cho ngi s dng mi c th i theo t u ch cui
c c mt s hiu bit y cc ch m khng phi tham chiu ti qu nhiu ln. Cc
chng c nh s l khp kn, sao cho nhng ngi s dng tin tin c th c c cc chng
mt cch ring r khi h chn. Thng tin trong phn ny c trnh by theo cch thc k chuyn
theo cc n v ch . Cc c gi tm kim mt m t hon chnh ca mt lnh c bit s xem
Phn VI.
Cc c gi ca phn ny s bit cch kt ni ti mt c s d liu PostgreSQL v a ra cc
lnh SQL. Cc c gi cha quen vi cc vn c khuyn khch c Phn I trc. Cc lnh
SQL c a vo mt cch in hnh bng vic s dng trnh u cui (terminal) tng tc psql
ca PostgreSQL, nhng cc chng trnh khc c chc nng tng t cng c th c s dng.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 46/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Chng 4. C php SQL


Chng ny m t c php ca SQL. N to thnh nn tng hiu cc chng sau m s i vo
chi tit v cch m cc lnh SQL c p dng xc nh v sa i cc d liu.
Chng ti cng khuyn co nhng ngi s dng m quen ri vi SQL c chng ny cn thn
v n c vi qui tc v khi nim c trin khai khng nht qun trong cc c s d liu SQL hoc
l c bit i vi PostgreSQL.

4.1. Cu trc t vng


u vo SQL bao gm mt s tun t cc lnh. Mt lnh c cu to t mt s tun t cc th
token, kt thc bng mt du chm phy (;). Kt thc ca dng u vo cng kt thc mt lnh.
Th token no l hp l ph thuc vo c php ca lnh c bit .
Mt th token c th l mt t kha, mt m nh danh, mt m nh danh trong ngoc (quoted
identifier), mt hng s, hoc mt biu tng k t c bit. Cc th token thng c cch nhau
bng cc du trng (khong trng, cc tab, dng mi), nhng s l khng cn nu khng c s ti
ngha (n thng ch l trng hp nu mt k t c bit lin k vi mt s dng th token khc).
V d, sau y l u vo SQL hp l (theo c php):
SELECT * FROM MY_TABLE;
UPDATE MY_TABLE SET A = 5;
INSERT INTO MY_TABLE VALUES (3, hi there);

y l s tun t ca 3 lnh, mi lnh mt dng (d iu ny khng l bt buc; hn 1 lnh c th


nm trn mt dng, v cc lnh c th c chia tch mt cch hu dng trn cc dng).
Hn na, cc ghi ch (bnh lun) c th xy ra u vo SQL. Chng khng phi l cc th token,
chng tng ng mt cch c hiu qu vi cc khong trng.
C php SQL khng tht nht qun i vi nhng g cc th token nhn din cc lnh, ton hng v
tham s. Vi th token u tin thng l tn lnh, nn trong v d trn chng ta thng c th ni
v mt lnh chn SELECT, mt lnh cp nht - UPDATE, v mt lnh chn - INSERT. Nhng v
d lnh UPDATE lun i hi mt th token SET xut hin mt v tr nht nh, v iu khc nhau
c bit ny ca INSERT cng i hi mt VALUES hon chnh. Cc qui tc c php chnh xc cho
tng lnh c m t Phn VI.

4.1.1. M nh danh v cc t kha


Cc th token nh SELECT, UPDATE, hoc VALUES trong v d trn l nhng v d v cc t kha,
l, cc t c mt ngha c nh trong ngn ng SQL. Cc th token MY_TABLE v A l nhng v d
v cc m nh danh. Chng xc nh cc tn bng, ct, hoc cc i tng khc ca c s d liu,
ph thuc vo lnh m chng s c s dng trong . V th chng i khi c gi n gin l
cc tn. Cc t kha v cc m nh danh c cng cu trc t vng, ngha l ngi ta khng th
bit liu mt th token c phi l mt m nh danh hay l mt t kha m khng cn bit ti ngn

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 47/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ng. Mt danh sch y cc t kha c th thy trong Ph lc C.


Cc m nh danh SQL v cc t kha phi bt u vi mt k t (a-z, nhng cng l cc k t vi
cc du c bit v cc k t khng phi l Latin) hoc mt du gch di (_). Cc k t tip sau
trong mt m nh danh hoc t kha c th l cc k t, cc du gch di, cc con s (0-9), hoc
cc du $. Lu rng cc du $ khng c php trong cc m nh danh theo k t ca tiu chun
SQL, nn s s dng ca chng c th tr v cc ng dng t kh chuyn hn. Tiu chun SQL s
khng xc nh mt t kha c cha cc ch s hoc bt u hoc kt thc vi mt du gch chn,
sao cho cc m nh danh ca dng ny l an ton i vi xung t c kh nng vi cc m rng
trong tng lai ca tiu chun .
H thng s dng khng nhiu hn NAMEDATALEN -1 byte i vi mt m nh danh; cc tn di
hn c th c vit trong cc lnh, nhng chng s b ct ngn bt. Mc nh, NAMEDATALEN l 64
byte so vi di ti a ca m nh danh l 63 byte. Nu gii hn ny l c vn , th n c th s
ny sinh bng vic thay i hng s NAMEDATALEN trong src/include/pg_config_manual.h.
Cc t kha v cc m nh danh khng nm trong du ngoc s phn bit ch hoa vi ch thng.
V th:
UPDATE MY_TABLE SET A = 5;

c th tng ng c vit nh l:
uPDaTE my_TabLE SeT a = 5;

Mt qui c thng c s dng l vit cc t kha theo ch hoa v cc tn theo ch thng,


ngha l:
UPDATE my_table SET a = 5;

C dng m nh danh th 2: m nh danh gii hn (delimited identifier) hoc m nh dng trong


ngoc (quoted identifier). N c hnh thnh bng vic km theo mt tun t ty cc k t trong
cc du ngoc kp ( ). Mt m nh danh gii hn lun l mt m nh danh, khng bao gi l mt
t kha. Nn select c th c s dng tham chiu ti mt ct hoc bng c tn l select,
trong khi mt select khng trong cc du ngoc kp c th c coi nh mt t kha v c th v
th c gi l mt li phn tch khi c s dng ni m mt tn bng hoc ct c mong
i. V d c th c vit vi cc m nh danh trong ngoc ging nh th ny:
UPDATE "my_table" SET "a" = 5;

Cc m nh danh trong ngoc c th cha bt k k t no, ngoi tr k t vi m 0. ( a vo


mt du ngc kp, hy vit 2 du ngc kp). iu ny cho php vic xy dng cc tn bng hoc
ct m nu khc i c th l khng th, nh tn c cha cc du trng hoc k hiu &. Gii hn
di vn p dng.
Mt bin th ca cc m nh danh nm trong du ngoc cho php bao gm cc k t Unicode thot
ly c cc im m ca chng xc nh. Cc bin th ny bt u vi U& (ch U hoa hoc thng
i sau l k hiu &) ngay trc khi m du ngoc kp, m khng c bt k ch trng no gia, v

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 48/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

d U&foo. (Lu l iu ny to ra mt s khng r rng vi ton t &. Hy s dng k t trng


xung quanh ton t trnh vn ny). Bn trong cc du ngoc, cc k t Unicode c th
c ch nh dng thot ly bng vic vit mt du cho ngc i sau l du cng (+), i sau l
mt s im m c 6 ch s theo h 16 (hexadecimal). V d, d liu ca m nh danh c th
c vit nh l
U&"d\0061t\+000061"

V d t tm thng hn sau y vit t ting Nga slon (con voi) theo cc k t Cyrillic:
U&"\0441\043B\043E\043D"

Nu mt k t thot khc vi du cho ngc c mong mun, th n c th c ch nh bng


vic s dng mnh UESCAPE sau chui , v d:
U&"d!0061t!+000061" UESCAPE !

K t thot c th l bt k k t no khc vi ch s theo h 16, du cng (+), du nhy n (' ),


du nhy kp (), hoc mt k t trng. Lu rng k t thot c vit trong du nhy n, khng
phi trong du nhy kp.
a vo k t thot trong m nh danh theo ngha en, hy vit n 2 ln.
C php thot Unicode ch lm vic khi m my ch l UTF8. Khi cc m my ch khc c s
dng, th ch cc im m trong di ASCII (ti \007F) c th c ch nh. C dng 4 ch s v 6
ch s c th c s dng ch nh cc cp thay th UTF16 son cc k t vi cc im m
ln hn U+FFFF, d tnh sn sng ca dng 6 ch s v mt k thut lm cho iu ny khng cn
thit. (Khi cc cp thay th c s dng khi m my ch l UTF8, trc ht chng c kt hp
trong mt im m duy nht m sau c m ha theo UTF-8).
Vic a vo du ngoc mt m nh danh cng lm cho n phn bin ch hoa v ch thng,
trong khi cc tn khng c a vo du ngoc lun c vit vi ch thng. V d, cc m nh
danh FOO, foo, v foo c xem l y ht nhau vi PostgreSQL, nhng Foo v FOO l khc
nhau so vi 3 ci v khc vi nhau. (Vic vit cc tn khng nm trong cc du ngoc theo ch
thng trong PostgreSQL l khng tng thch vi tiu chun SQL, tiu chun ni rng cc tn
khng trong du ngoc s c vit theo ch hoa. V th, foo s l tng ng vi FOO ch
khng tng ng vi foo theo tiu chun . Nu bn mun vit cc ng dng kh chuyn
c th bn c khuyn co lun a vo du ngoc mt tn c bit hoc khng bao gi a n
vo ngoc c).

4.1.2. Hng s
C 3 dng hng s m ch dng trong PostgreSQL: cc chui, cc chui bit v cc s. Cc hng
cng c th c ch nh vi cc dng n, chng c th cho php s trnh by li chnh xc hn v
c hiu qu hn bng vic x l ca h thng. Cc la chn thay th c tho lun trong cc
tiu phn bn di.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 49/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

4.1.2.1. Hng s chui (hng chui)

Mt hng chui trong SQL l mt s tun t ty cc k t nm trong cc du nhy n (' ), v d


'y l mt chui'. a vo mt k t du nhy n trong mt hng chui, hy vit 2 du nhy
n lin nhau, nh: 'Dianne'' horse' ('con nga ca Dianne'). Lu l iu ny khng l y ht nh
vi mt k t nhy kp ().
Hai hng chui ch c cch bit nhau bng du trng vi t nht mt dng mi s c ghp v
c i x mt cch c hiu lc dng nh chui tng c vit nh mt hng. V d:
SELECT foo
bar;

l tng ng vi:
SELECT foobar;

nhng
SELECT foo bar;

l c php khng hp l (Hnh vi kh k l ny c bit l i vi SQL; PostgreSQL tun theo tiu


chun).
4.1.2.2. Hng chui vi cc thot dng C

PostgreSQL cng chp nhn cc hng chui thot, chng l mt m rng i vi tiu chun SQL.
Mt hng chui thot c c trng bng vic vit k t E (ch hoa hoc ch thng) ngay trc
du nhy n, ngha l, E'foo'. (Khi tip tc mt hng chui thot xuyn khp cc dng, hy vit E
ch trc du nhy m u tin). Trong mt chui thot, mt k t cho ngc (\) bt u mt s
tun t thot cho ngc ging C, trong s kt hp ca du cho ngc v (cc) k t theo sau
th hin mt gi tr byte c bit, nh ch ra trong Bng 4-1.
Bng 4-1. Tun t thot ca du cho ngc
Tun t thot ca du cho ngc

Gii ngha

\b

du xa ngc (backspace)

\f

mu cp d liu (form feed)

\n

dng mi (newline)

\r

carriage return

\t

tab

\o, \oo, \ooo (o = 0 - 7)

gi tr byte theo h s 8 (octal byte value)

\xh, \xhh (h = 0 - 9, A - F)

gi tr byte theo h s 16 (hexadecimal byte value)

\uxxxx, \Uxxxxxxxx (x = 0 - 9, A - F)

gi tr k t Unicode 16 hoc 32 bit theo h s 16 (16 or 32-bit


hexadecimal Unicode character value).

Bt k k t no khc theo sau mt du cho ngc s c ly theo ngha en. V th, a vo


mt k t du cho ngc, hy vit 2 du cho ngc (\\). Hn na, du nhy n c th c a
vo trong mt chui thot bng vic vit \', b sung thm vo cch thc thng thng ca du nhy

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 50/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

p ().
L trch nhim ca bn rng nhng tun t theo byte m bn to ra, c bit khi s dng cc thot
theo cc h 8 hoc 16, to nn cc k t hp l trong vic m ha tp cc k t trn my ch. Khi
vic m ha my ch l UTF-8, th cc thot Unicode hoc c php thot Unicode cho la chn
thay th, nh trong Phn 4.1.2.3, s c s dng thay. (La chn thay th c th l vic m ha
UTF-8 bng tay v vit ra cc bytes, n c th l rt nng nhc).
C php thot Unicode lm vic y ch khi vic m ha my ch l UTF-8. Khi cc m ha
my ch khc c s dng, th ch cc im m trong di ASCII (ti \u007F) c th c ch nh.
C mu 4 ch s v 8 ch s c th c s dng ch nh cc cp thay th UTF-16 son ra
cc k t vi cc im m ln hn U+FFFF, d tnh sn sng ca mu 8 ch s, v mt k thut,
lm cho iu ny l khng cn thit. (Khi cc cp thay th c s dng khi vic m ha my ch
l UTF-8, th chng trc ht c kt hp trong mt im m duy nht m sau c m ha
theo UTF-8).
Thn trng
Nu tham s cu hnh standard_conforming_strings (cc chui tun th tiu chun)
m l tt (off), th PostgreSQL nhn cc thot du cho ngc theo c cc hng
chui thot v thng thng. y l s tng thch ngc vi hnh vi lch s, ni
m cc thot du cho ngc tng lun c tha nhn. D
standard_conforming_strings hin mc nh l tt, th mc nh ny s thay i
thnh bt (on) trong mt phin bn trong tng lai v s tun th cc tiu chun
c ci thin. Cc ng dng v th c khuyn khch chuyn i khi vic s
dng cc thot cho ngc. Nu bn cn s dng mt thot cho ngc th hin
mt k t c bit, hy vit hng chui vi mt ch E m bo n s c
iu khin cng mt cch nh trong cc phin bn trong tng lai.
B sung thm vo standard_conforming_strings, cc tham s cu hnh ca
escape_string_warning (cnh bo chui thot) v backslash_quote (du cho trong
ngoc) iu chnh i x ca cc du cho ngc trong cc hng chui.

K t vi m 0 khng th nm trong mt hng chui.


4.1.2.3. Hng chui vi cc thot Unicode

PostgreSQL cng h tr dng c php thot khc cho cc chui m cho php vic ch nh cc k t
Unicode ty bng im m. Mt hng chui thot Unicode bt u vi U& (U l ch hoa hoc
ch thng v theo sau l du v &) ngay trc khi m du nhy, m khng c bt k du trng
no gia, v d, U&'foo'. (Lu rng iu ny to ra mt s t m vi ton t &. Hy s dng
cc du trng xung quanh ton t trnh vn ny). Bn trong cc dy nhy, cc k t
Unicode c th c ch nh dng c thot bng vic vit mt du cho ngc i sau l s

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 51/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

im m 4 ch s theo h 16 hoc la chn ty mt du cho ngc i sau l mt du cng (+)


sau l mt s im m 6 ch s h 16. V d, 's liu' chui c th c vit nh l
U&d\0061t\+000061

V d t thng thng hn sau y vit t ting Nga slon (con voi) theo cc k t Cyrillic:
(U&\0441\043B\043E\043D)

Nu mt k t thot khc vi du cho ngc l mong mun, th n c th c ch nh bng vic


s dng mnh UESCAPE sau chui , v d:
U&d!0061t!+000061 UESCAPE !

K t thot c th l bt k k t n no khc vi mt ch s h 16, du cng, du nhy n, du


nhy kp hoc mt k t du trng.
C php thot Unicode ch lm vic khi m ha my ch l UTF-8. Khi cc m ha my ch khc
c s dng, th ch cc im m trong di ASCII (ti \007F) c th c ch nh. C 2 dng 4
ch s v 6 ch s u c th c s dng ch nh cc cp thay th UTF-16 son ra cc k
t vi cc im m ln hn so vi U+FFFF, d s sn sng ca mu 6 ch s, v mt k thut, lm
cho iu ny l khng cn thit. (Khi cc cp thay th c s dng khi m ha my ch l UTF-8,
th chng trc ht c kt hp vo trong im m duy nht m sau c m ha theo UTF-8).
Hn na, c php thot Unicode cho cc hng chui ch lm vic khi tham s cu hnh
(standard_conforming_strings) c bt. iu ny l v nu khc th c php ny c th gy ln ln
cho cc my trm m phn tch c php cc lnh SQL ti im m n c th dn ti cc s tim
SQL (SQL injections) v cc vn an ninh tng t. Nu tham s l tt (off), th c php ny s
b t chi vi mt thng ip li.
a vo k t thot trong chui theo ngha en, hy vit n 2 ln.
4.1.2.4. Hng chui trong cc du $

Trong khi c php tiu chun cho vic ch nh cc hng chui thng l thun tin, th n c th l
kh hiu khi cc chui mong mun c cha nhiu du nhy hoc du cho ngc, v tng du
phi c p bn. cho php cc truy vn c kh nng c c nhiu hn trong nhng tnh
hun nh vy, PostgreSQL a ra cch khc, gi l a vo trong cc du $, vit cc hng
chui. Mt hng chui trong cc du $ bao gm mt du $, mt th ty chn ca 0 hoc cc k
t, mt du $ na, mt s tun t ty cc k t to nn ni dung chui, mt du $, th y ht bt
u du $ , v mt du $. V d, y l 2 cch khc nhau th hin chui Dianne's horse bng
vic s dng cc du $:
$$Diannes horse$$
$SomeTag$Diannes horse$SomeTag$

Lu l bn trong chui c a vo cc du $, cc nhy n c th c s dng m khng cn


phi c thot. Qu thc, khng k t no bn trong mt chui c a vo cc du $ c thot
ra bao gi c: ni dung ca chui lun c vit theo ngha en. Cc du cho ngc khng phi l

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 52/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

c bit, v chng khng l cc du $, tr phi chng l mt phn ca mt s trng khp tun t vi


th m u.
C kh nng lng cc hng chui c a vo cc du $ bng vic chn cc th khc tng mc
lng. iu ny c s dng ph bin nht trong khi vit cc nh ngha hm. V d:
$function$
BEGIN
RETURN ($1 ~ $q$[\t\r\n\v\\]$q$);
END;
$function$

y, tun t $q$[\t\r\n\v\\]$q$ th hin mt chui theo ngha en c a vo trong cc du $ l


[\t\r\n\v\\], n s c tha nhn khi thn ca hm c PostgreSQL thc thi. Nhng v s tun t
khng khp vi du phn cch cc du $ vng ngoi $function$, nn ch mt s k t bn trong
hng cho ti nay nh l chui vng ngoi c quan tm.
Th, nu c, ca mt chui c a vo trong cc du $ tun theo cng cc qui c nh mt m
nh danh khng nm trong cc du, ngoi tr l n khng th c cha mt du $. Cc th l phn
bit ch hoa v ch thng, nn $tag$String content$tag$ l ng, nhng $TAG$String content$tag$
th khng.
Chui trong cc du $ m i theo mt t kha hoc m nh danh phi c tch bch khi n bng
du trng; nu khng th du phn cch ca du $ c th c coi nh mt phn ca m nh danh
i trc.
Vic a vo trong cc du $ khng phi l mt phn ca tiu chun SQL, nhng n thng l mt
cch thc thun tin vit cc hng chui phc tp hn l c php cc du nhy n tun th
chun. N c bit hu dng khi th hin cc hng chui bn trong cc hng khc, nh thng l
cn thit trong cc nh ngha hm th tc. Vi c php du nhy n, tng du cho ngc trong
v d trn c th phi c vit nh 4 du cho ngc, n c th c gim ti 2 du cho ngc
trong vic phn tch c php hng chui gc ban u, v sau gim v 1 du cho ngc khi hng
chui vng trong c ti phn tch c php trong qu trnh thc thi hm.
4.1.2.5. Hng chui bit

Cc hng chui bit trng ging nh cc hng chui thng thng vi mt k t B (ch hoa hoc
ch thng) ngay lp tc trc khi m ngoc (khng c cc du trng xen gia), nh, B'1001'. Cc
k t duy nht c php bn trong cc hng chui bit l 0 v 1.
Mt cch la chn, cc hng chui bit c th c ch nh trong k hiu theo h 16, bng vic s
dng mt k t X i u (ch thng hoc ch hoa), nh, X'1FF'. K hiu ny l tng ng vi
mt hng chui bit vi 4 ch s nh phn cho tng ch s h 16.
C 2 dng hng chui bit u c th c tip tc trn cc dng theo cng cch thc nh cc hng
chui thng thng. Vic a vo trong cc du $ khng th c s dng trong hng chui bit.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 53/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

4.1.2.6. Hng l s

Cc hng l s c chp nhn theo cc mu chung:


digits
digits.[digits][e[+-]digits]
[digits].digits[e[+-]digits]
digitse[+-]digits

trong cc ch s - digits l mt hoc nhiu hn cc ch s thp phn (t 0 n 9). t nht mt ch


s phi ng trc hoc sau du chm thp phn, nu mt du chm thp phn c s dng. t
nht mt ch s phi i theo du m (e), nu c mt du m hin din. Khng th c bt k du
trng hay cc k t no khc c nhng trong hng . Lu l bt k du cng hoc tr no
ng trc cng thc s khng c coi l mt phn ca hng s ; y l mt ton t c p
dng cho hng s.
Mt s v d v cc hng l s hp l:
42
3.5
4.
.001
5e2
1.925e-3

Mt hng l s khng bao gm du thp phn, cng khng s m ban u c gi thit l dng s
nguyn nu gi tr ca n khp theo dng s nguyn (32 bit); nu khng th n c gi thit s l
dng bigint nu gi tr ca n khp theo dng bigint (64 bit); nu khng th n c ly nh l dng
s numeric. Cc hng m c cc du thp phn v/hoc du m lun c gi thit t u l dng
s numeric.
Dng cc hng s d liu c ch nh ban u ch l im khi u cho cc thut ton qui nh
dng. Trong hu ht cc trng hp hng s c t ng p vo dng ph hp nht, ph thuc
vo ng cnh. Khi cn, bn c th p mt gi tr s s c bin dch nh mt dng d liu c th
bng vic a n ra. V d, bn c th p mt gi tr s c i x nh l dng real (float4) bng
vic vit:
REAL 1.23

-- kiu chui

1.23::REAL

-- kiu PostgreSQL (lch s)

Chng thc s ch l cc trng hp c bit ca cc k hiu a ra chung c tho lun tip sau.
4.1.2.7. Hng cc dng khc

Mt hng ca mt dng ty c th c a vo bng vic s dng bt k mt trong nhng k


hiu no sau y:
type string
string::type
CAST ( string AS type )

Vn bn ca hng chui c truyn ti th tc hon i u vo cho dng c tn l type. Kt qu


l mt hng dng c ch ra. S a ra dng r rng c th b b qua nu khng c s m m

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 54/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

nh i vi dng m hng phi l (v d, khi n c ch nh trc tip ti mt ct ca bng),


trong trng hp n t ng b p buc.
Hng chui c th c vit bng vic s dng hoc k hiu SQL thng thng hoc a vo trong
cc du $.
Cng c kh nng ch nh mt dng p buc bng vic s dng c php ging hm:
typename ( string )

nhng khng phi tt c cc tn dng c th c s dng theo cch ny; xem Phn 4.2.9 c
thm chi tit.
Cc c php gi hm v ::, CAST(), cng c th c s dng ch nh nhng hon i dng thi
gian chy (run-time) ca cc biu thc ty , nh c tho lun trong Phn 4.2.9. trnh s t
m v c php, th c php dng 'chui' - type string duy nht c th c s dng ch nh dng
hng n gin theo ngha en. Mt gii hn khc trong c php type string l n khng lm vic i
vi cc dng mng (array); hy s dng :: hoc CAST() ch nh dng ca mt hng mng.
C php CAST() tun th SQL. C php type string l mt s tng qut ha tiu chun : SQL ch
nh c php ny ch cho mt t dng d liu, nhng PostgreSQL cho php n i vi tt c cc
dng. C php vi :: l s dng theo lch s ca PostgreSQL, nh l c php gi hm.

4.1.3. Ton t
Tn ca mt ton t l mt s tun t cho ti
sau y:

NAMEDATALEN-1

k t (63 l mc nh) t danh sch

+-*/<>=~!@#%^&|?

Tuy nhin, c mt t gii hn trong cc tn ton t:


v /* khng th xut hin bt c u trong tn mt ton t, v chng s c coi nh l
bt u ca mt ch gii.

--

Tn ca mt ton t nhiu k t khng th kt thc du cng + hoc du tr -, tr phi tn


cng c t nht mt trong cc k t sau: ~ ! @ # % ^ & | ?
V d, @- l mt tn ton t c php, nhng *- th khng. Hn ch ny cho php
PostgreSQL phn tch c php cc truy vn tun th SQL m khng c cc khong trng
gia cc th token.

Khi lm vic vi cc tn ton t khng theo tiu chun SQL, bn s thng cn phi tch bch cc
ton t lin k bng cc du trng trnh s m m. V d, nu bn xc nh c mt ton t
mt ton hng bn tri c tn l @, th bn khng th vit X* @Y; bn phi vit X* @Y m bo
rng PostgreSQL c c n nh l 2 tn ton t ch khng phi l mt.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 55/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

4.1.4. K t c bit
Mt s k t m khng phi thao abc c mt ngha c bit v l khc vi vic l mt ton t.
Cc chi tit v s dng c th c thy v tr ni m yu t c php tng ng c m t. Phn
ny ch tn ti t vn cho s tn ti v tm tt cc mc tiu ca cc k t .

Du $ theo sau l cc ch s c s dng th hin mt tham s v tr trong thn ca mt


nh ngha hm hoc mt khai bo c chun b. Trong cc ng cnh khc th du $ c th
l mt phn ca mt m nh danh hoc mt hng chui trong cc du $.

Cc du ngoc n (() ) c ngha thng thng ca chng nhm cc biu thc v tng
cng quyn u tin trc. Trong mt s trng hp cc du ngoc n c yu cu nh
mt phn ca c php c nh ca mt lnh SQL c bit.

Cc du ngoc vung ([] ) c s dng la chn cc phn t ca mt mng. Xem Phn


8.14 c thm thng tin v cc mng.

Du phy (, ) c s dng trong mt s cu trc c php tch bch cc yu t ca mt


danh sch.

Du chm phy (; ) kt thc mt lnh SQL. N khng th xut hin bt k u trong mt


lnh, ngoi tr bn trong mt hng chui hoc m nh danh trong ngoc.

Du 2 chm (: ) c s dng chn cc lt ct t mng. (Xem Phn 8.14). Trong cc


bin th SQL nht nh (nh SQL nhng), du 2 chm c s dng cho cc tn bin tin t.

Du sao (* ) c s dng trong mt s ng cnh biu th tt c cc trng ca mt hng


ca bng hoc gi tr kt hp. N cng c mt ngha c bit khi c s dng nh bin
s ca mt hm tng hp, y l s tng hp khng i hi bt k tham s r rng no.

Du chm (. ) c s dng trong cc hng l s, v tch bit cc tn s , bng v ct.

4.1.5. Cc ch gii
Mt ch gii l mt tun t cc k t bt u vi 2 du gch ngang (--) v m rng cho ti cui
dng, nh:
-- y l mt ch gii SQL tiu chun

Nh mt s la chn, cc ch gii khi dng C c th c s dng:


/* multiline comment
* with nesting: /* nested block comment */
*/

trong ch gii bt u vi /* v m rng khp vi du */ na. Khi ch gii lng , nh


c ch nh trong tiu chun SQL nhng khng ging C, v th mt ngi c th a ra ch gii
cc khi m ln hn m c th cha cc ch gii khi ang tn ti.
Mt ch gii b loi b khi lung u vo trc phn tch c php tip v c du trng thay th
mt cch c hiu qu.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 56/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

4.1.6. Quyn u tin trc ca t vng


Bng 4-2 ch ra quyn u tin trc v tnh lin kt ca cc ton t trong PostgreSQL. Hu ht cc
ton t c cng quyn u tin trc v l lin kt bn tri. Quyn u tin trc v tnh lin kt ca
cc ton t c lin kt cht ch trong trnh phn tch c php. iu ny c th dn ti hnh vi
khng trc gic; v d cc ton t Boolean <and> c mt quyn u tin trc khc so vi cc ton
t Boolean <= and >=. Hn na, i khi bn s cn phi b sung thm cc du ngoc n khi s
dng cc t hp nh phn v cc ton t mt ton hng. V d:
SELECT 5 ! - 6;

s c phn tch nh l:
SELECT 5 ! (- 6);

v trnh phn tch c php khng c tng cho ti khi l qu mun nn du chm than ! c
xc nh nh l mt ton t hu t, khng phi l mt trung t. c c hnh vi mong mun
trong trng hp ny, bn phi vit:
SELECT (5 !) - 6;

y l ci gi phi tr cho tnh c th m rng.


Bng 4-2. Quyn u tin trc ca ton t (theo chiu thp dn)
Ton t/ yu t

Tnh lin kt

M t

tri (left)

phn cch tn bng/ct

::

tri

Dng cast theo kiu ca PostgreSQL

[]

tri

la chn phn t mng

phi (right)

cc du tr mt ton hng

tri

du m

*/%

tri

du nhn, chia v phn trm

+-

tri

du cng, du tr

IS

IS TRUE , IS FALSE , IS UNKNOWN , IS NULL


(L NG, L SAI, L KHNG BIT, L BNG 0)

ISNULL

kim th xem c l null

NOTNULL

kim th xem c l khng phi null

(any other - bt k g khc)

tri

tt c cc ton t khc bm sinh v do ngi s dng nh ngha

IN

thit lp quan h thnh vin

BETWEEN

nm trong di

OVERLAPS

chng ln theo khong thi gian

LIKE ILIKE SIMILAR

khp mu chui

<>

nh hn, ln hn

phi

bng nhau, ch nh

NOT

phi

ph nh theo logic

AND

tri

v theo logic

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 57/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Ton t/ yu t
OR

Tnh lin kt
tri

Xut bn nm 2013
M t

hoc theo logic

Lu rng cc qui nh u tin trc ca cc ton t cng p dng cho cc ton t do ngi s
dng nh ngha m cng c cng cc tn nh cc ton t c xy dng sn, c nhc ti trn.
V d, nu bn nh ngha mt ton t + cho mt s dng d liu ty bin th n s c cng u
tin trc nh ton t + c xy dng sn, bt k ca bn l th no.
Khi mt tn ton t iu kin theo mt s no c s dng trong c php ton t
OPERATOR, nh v d trong:
SELECT 3 OPERATOR(pg_catalog.+) 4;

th cu trc ca OPERATOR c ly c s u tin trc mc nh c ch ra trong Bng 4-2 cho


ton t bt k g khc. iu ny l ng bt k ton t c bit no xut hin trong OPERATOR().

4.2. Biu thc gi tr


Cc biu thc gi tr s c s dng trong cc ng cnh khc nhau, nh trong danh sch ch ca
lnh SELECT, khi cc gi tr ct mi trong INSERT hoc UPDATE hoc trong cc iu kin trong mt s
lnh. Kt qu ca mt biu thc gi tr i khi c gi l mt lng v hng, phn bit n vi
kt qu ca mt biu thc bng (n l mt bng). Cc biu thc gi tr v th cng c gi l cc
biu thc v hng (hoc thm ch n gin l cc biu thc). C php ca biu thc cho php tnh
ton cc gi tr t cc phn nguyn s bng vic s dng tnh ton s hc, logic, tp hp v cc hot
ng khc.
Mt biu thc gi tr l mt biu thc dng sau y:

Mt gi tr hng

Mt tham chiu ct

Mt tham chiu tham s v tr, trong thn ca nh ngha hm hoc khai bo c chun b

Mt biu thc c nh ch s di

Mt biu thc la chn trng

Mt vin dn ton t

Mt li gi hm

Mt biu thc tng hp

Mt li gi hm ca s

Mt dng pht hnh cast

Mt truy vn con v hng

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 58/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Mt cu trc mng

Mt cu trc hng

Biu thc gi tr khc trong cc du ngoc n (c s dng to nhm cc biu thc


con v ghi u tin trc)

B sung vo danh sch ny, c mt s cu trc m c th c phn loi nh mt biu thc nhng
khng tun theo bt k qui tc c php chung no. Chng thng c ng ngha ca mt hm hoc
ton t v c gii thch v tr ph hp trong Chng 9. Mt v d l mnh IS NULL.
Chng ta tho lun cc hng trong Phn 4.1.2. Cc phn sau y tho lun cc la chn cn li.

4.2.1. Cc tham chiu ct


Mt ct c th c tham chiu dng:
correlation.columnname

l tn ca mt bng (c kh nng iu kin vi mt tn s ), hoc mt tn hiu


(alias) i vi mt bng c xc nh bng mt mnh FROM. Tn correlation v du chm c
th c b qua nu tn ct l duy nht xuyn tt c cc bng ang c s dng trong truy vn
hin hnh. (Xem thm Chng 7).
correlation

4.2.2. Tham s v tr
Mt tham chiu tham s v tr c s dng chi ra mt gi tr c cung cp t bn ngoi cho
mt lnh SQL. Cc tham s c s dng trong cc nh ngha hm SQL v trong cc truy vn
c chun b. Mt s th vin my trm cng h tr vic ch nh cc gi tr d liu tch bit khi
chui lnh SQL, trong trng hp cc tham s c s dng tham chiu ti cc gi tr d liu
nm ngoi dng. Mu ca mt tham chiu tham s l:
$number

V d, hy xem xt nh ngha ca mt hm, dept, nh:


CREATE FUNCTION dept(text) RETURNS dept
AS $$ SELECT * FROM dept WHERE name = $1 $$
LANGUAGE SQL;

y $1 tham chiu ti gi tr ca i s hm u tin bt k khi no hm c gi.

4.2.3. Ch s di - Subscript
Nu mt biu thc c mt gi tr dng mng, th mt phn t c th ca gi tr mng c th
c trch xut bng vic vit
expression[subscript]

hoc nhiu phn t lin k (mt lt ct mng) c th c trch xut bng vic vit
expression[lower_subscript:upper_subscript]

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 59/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

( y, cc du ngoc vung [ ] c ngha l s xut hin theo ngha en). Mi


l mt biu thc, n phi c mt gi tr nguyn.

Xut bn nm 2013
subscript

bn thn n

Ni chung biu thc mng phi nm trong cc du ngoc n, nhng cc du ngoc n c th b


b qua khi biu thc s c vit theo ch s di ch l mt tham chiu ct hoc tham s v tr.
Hn na, nhiu ch s di c th c ghp khi mng gc ban u l a chiu. V d:
mytable.arraycolumn[4]
mytable.two_d_column[17][34]
$1[10:42]
(arrayfunction(a,b))[42]

Cc du ngoc n trong v d cui c yu cu. Xem phn 8.14 bit thm v cc mng.

4.2.4. Chn trng


Nu mt biu thc c mt gi tr dng tng hp (dng hng), th mt trng c bit ca hng
c th c trch xut bng cch vit
expression.fieldname

Ni chung biu thc hng phi nm trong cc du ngoc n, nhng cc du ngoc n c th b b


qua khi biu thc c chn t ch mt tham chiu bng hoc tham s v tr. V d:
mytable.mycolumn
$1.somecolumn
(rowfunction(a,b)).col3

(V th, mt tham chiu ct tiu chun thc s ch l mt trng hp c bit ca c php chn
trng). Mt trng hp c bit quan trng l vic trch xut mt trng t mt ct ca bng
dng tng hp:
(compositecol).somefield
(mytable.compositecol).somefield

Cc du ngoc n c yu cu y ch ra rng compositecol l mt tn ct ch khng phi l


tn bng, hoc rng mytable l mt tn bng ch khng phi l tn s trong trng hp th 2.

4.2.5. Vin dn ton t


C 3 kh nng c php cho mt s vin dn ton t:
expression operator expression
operator expression

(ton t trung t nh phn)

(ton t tin t mt ton hng)

expression operator (ton

t hu t mt ton hng)

trong th ton t operator i sau cc qui tc c php ca Phn 4.1.3, hoc l mt trong nhng t
kha AND, OR, v NOT, hoc l mt tn ton t iu kin dng:
OPERATOR(schema.operatorname)

Nhng ton t c bit no tn ti v liu chng c l mt ton hng hay nh phn s ph thuc vo
cc ton t no tng c h thng hoc ngi s dng nh ngha. Chng 9 m t cc ton t
c xy dng sn.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 60/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

4.2.6. Li gi hm
C php mt li gi hm l tn ca hm (c th iu kin vi mt tn s ), theo sau l danh
sch cc i s c a vo trong cc du ngoc n:
function_name ([expression [, expression ... ]] )

V d, th sau y tnh ton cn bc 2:


sqrt(2)

Danh sch cc hm xy dng sn l trong Chng 9. Cc hm khc c th c ngi s dng b


sung thm. Cc i s c th c cc tn c ty gn vo. Xem Phn 4.3 c thm cc chi tit.

4.2.7. Biu thc tng hp


Mt biu thc tng hp i din cho ng dng ca mt hm tng hp khp cc hng c mt truy
vn la chn. Mt hm tng hp lm gim nhiu u vo ti mt gi tr u vo duy nht, nh tng
hoc trung bnh cc u vo. C php ca mt biu thc tng hp l mt trong nhng th sau:
aggregate_name
aggregate_name
aggregate_name
aggregate_name

(expression [ , ... ] [ order_by_clause ] )


(ALL expression [ , ... ] [ order_by_clause ] )
(DISTINCT expression [ , ... ] [ order_by_clause ] )
(*)

trong aggregate_name l mt tng hp c nh ngha trc (c kh nng iu kin vi mt


tn s ), expression l bt k biu thc no m bn thn n khng cha mt biu thc tng hp
hoc mt li gi hm ca s, v order_by_clause l mt mnh ORDER BY ty chn nh c m t
bn di.
Mu ban u ca biu thc tng hp gi s tng hp mt ln cho tng hng u vo. Mu th 2 l
y ht nh mu u, v ALL l mc nh. Mu th 3 gi tng hp mt ln cho tng gi tr duy nht
ca biu thc (hoc tp hp duy nht cc gi tr, cho nhiu biu thc) c thy trong cc hng u
vo. Mu cui cng gi tng hp mt ln cho tng hng u vo; v khng c gi tr u vo c th
no c ch nh, n thng ch hu dng cho hm tng hp m count(*).
Hu ht cc hm tng hp b qua cc u vo null, nn cc hng trong mt hoc nhiu biu thc
hn c null s b b qua. iu ny c th c gi thit l ng, tr phi iu khc c ch nh,
cho tt c cc tng hp c xy dng sn.
V d, count(*) cho tng s cc hng u vo; count(f1) cho s cc hng u vo theo f1 khng l
null, v count b qua null; v count(distinct f1) cho s cc gi tr duy nht khng l null ca f1.
Thng thng, cc hng u vo c nui dng cho hm tng hp theo mt trt t khng c
ch nh trc. Trong nhiu trng hp iu ny khng l vn ; v d, min to ra kt qu y ht bt
k trt t no n nhn c cc u vo. Tuy nhin, mt s hm tng hp (nh array_agg v
string_agg) to ra cc kt qu ph thuc vo th t cc hng u vo. Khi s dng mt tng hp nh
vy, ty chn order_by_clause c th c s dng ch nh trt t mong mun. Ty chn
order_by_clause c c php y ht nh i vi mt mnh mc truy vn ORDER BY, nh c m t
trong Phn 7.5, ngoi tr l cc biu thc ca n lun ch l cc biu thc v khng th l cc tn

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 61/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ct u ra hoc cc con s. V d:
SELECT array_agg(a ORDER BY b DESC) FROM table;

Khi lm vic vi nhiu hm tng hp nhiu i s, lu l mnh


s tng hp. V d, hy vit th ny:

ORDER BY

i sau tt c cc i

SELECT string_agg(a, , ORDER BY a) FROM table;

khng vit th ny:


SELECT string_agg(a ORDER BY a, ,) FROM table; -- incorrect

Ci sau l ng v c php, nhng n th hin mt li gi ca mt hm tng hp mt i s duy


nht vi 2 kha ORDER BY (kha th 2 kh l v dng v n l mt hng).
Nu DISTINCT c ch nh thm vo mt ty chn order_by_clause, th tt c cc biu thc ORDER
BY phi khp vi cc i s thng thng ca tng hp ; l, bn khng th sp xp trong mt
biu thc m khng c a vo trong danh sch DISTINCT.
Lu : Kh nng ch nh c
rng ca PostgreSQL.

DISTINCT

ORDER BY

trong mt hm tng hp l mt m

Cc hm tng hp c xc nh trc c m t trong Phn 9.18. Cc hm tng hp khc c th


c ngi s dng b sung thm vo.
Mt biu thc tng hp ch c th xut hin trong danh sch kt qu hoc mnh HAVING ca mt
lnh SELECT. L cm k trong cc mnh khc, nh WHERE, v cc mnh c nh gi v
logic trc khi cc kt qu ca cc tng hp c hnh thnh.
Khi mt biu thc tng hp xut hin trong mt truy vn con (xem Phn 4.2.10 v Phn 9.20), th
tng hp thng c nh gi i vi cc hng ca truy vn ph . Nhng mt ngoi l xy ra
nu cc i s ca tng hp ch c cc bin mc vng ngoi: th tng hp sau thuc v
mc vng ngoi gn nht, v c nh gi i vi cc hng ca truy vn . Biu thc tng hp
nh mt tng th sau l mt tham chiu vng ngoi cho truy vn con m n xut hin trong ,
v hnh ng nh mt hng i vi bt k s nh gi no i vi truy vn con . Hn ch v vic
xut hin ny ch trong danh sch kt qu hoc mnh HAVING p dng vi lu i vi mc truy
vn m tng hp thuc v.

4.2.8. Li gi hm ca s
Mt li gi hm ca s i din cho ng dng ca mt hm dng tng hp i vi mt s phn ca
cc hng c mt truy vn la chn. Khng ging nh cc li gi hm tng hp thng thng,
iu ny khng b tri vo vic to nhm cc hng c la chn vo mt hng u ra duy nht tng hng vn gi l tch bit nhau u ra ca truy vn. Tuy nhin hm ca s c kh nng qut
tt c cc hng m c th l mt phn ca nhm cc hng hin hnh m tun theo c t to thnh
nhm (danh sch PARTITION BY) ca li gi hm ca s. C php ca mt li gi hm ca s l c
php nh sau:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 62/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

function_name ([expression [, expression ... ]]) OVER ( window_definition )


function_name ([expression [, expression ... ]]) OVER window_name
function_name ( * ) OVER ( window_definition )
function_name ( * ) OVER window_name

trong window_definition c c php:


[
[
[
[

existing_window_name ]
PARTITION BY expression [, ...] ]
ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]
frame_clause ]

v ty chn frame_clause c th l mt trong s


[ RANGE | ROWS ] frame_start
[ RANGE | ROWS ] BETWEEN frame_start AND frame_end

trong frame_start v frame_end c th l mt trong s


UNBOUNDED PRECEDING
value PRECEDING
CURRENT ROW
value FOLLOWING
UNBOUNDED FOLLOWING

y biu thc - expression th hin bt k biu thc gi tr no m bn thn n khng c cc li


gi hm ca s. Cc danh sch PARTITION BY v ORDER BY v c bn c cng c php v ng ngha y
ht nh cc mnh GROUP BY v ORDER BY ca ton b truy vn, ngoi tr l cc biu thc ca
chng lun ch l cc biu thc v khng th l cc tn ct u ra hoc cc con s. window_name l
mt tham chiu ti mt c t ca s c t tn c xc nh trong mnh WINDOW ca truy
vn. Cc c t ca s c t tn thng c tham chiu vi ch OVER window_name, nhng n
cng c kh nng vit tn mt ca s vo trong cc du ngoc n v sau cung cp ty cho
mt mnh sp xp v/hoc mnh khung (ca s c tham chiu phi khng c cc mnh
, nu chng c cung cp y). C php sau y tun theo cng cc qui tc y ht nh vic
sa i tn ca mt ca s ang tn ti bn trong mnh WINDOW; xem trang tham chiu SELECT
c thm cc chi tit.
ch nh tp hp cc hng to thnh khung ca s, i vi cc hm ca s m hnh
ng trong khung (frame) thay v ton b phn vng. Nu frame_end b b qua th cc mc nh l
cho hng hin hnh CURRENT ROW. Nhng hn ch l vic frame_start khng th l tun theo v gii
hn UNBOUNDED FOLLOWING, frame_end khng th l c trc khng gii hn UNBOUNDED
PRECEDING, v la chn frame_end khng th xut hin sm hn trong danh sch trn so vi la
chn frame_start - v d RANGE BETWEEN CURRENT ROW AND value PRECEDING l khng c php.
Ty chn to khung mc nh l RANGE UNBOUNDED PRECEDING, n l y ht nh RANGE BETWEEN
UNBOUNDED PRECEDING AND CURRENT ROW ; n thit lp khung tt c cc hng t phn vng
khi to qua im ngang hng cui cng ca hng hin hnh trong trt t ORDER BY (n c ngha l
tt c cc hng nu khng c ORDER BY). Ni chung, UNBOUNDED PRECEDING c ngha l khung
bt u vi hng u tin ca phn vng, v tng t UNBOUNDED FOLLOWING c ngha l khung kt
thc vi hng cui cng ca phn vng (bt k ch RANGE hay ROWS). Trong ch ROWS,
CURRENT ROW c ngha l khung bt u hoc kt thc vi hng hin hnh; nhng trong ch
RANGE th n c ngha l khung bt u v kt thc vi im ngang hng u tin hoc cui cng
frame_clause

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 63/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ca hng hin hnh theo trt t ORDER BY. Cc trng hp gi tr PRECEDING v gi tr FOLLOWING
hin ch c php trong ch ROWS. Chng chi ra rng khung bt u hoc kt thc vi hng m
c nhiu hng trc hoc sau hng hin hnh. Gi tr value phi l mt biu thc s nguyn khng
cha bt k bin, cc hm tng hp hoc cc hm ca s no. Gi tr phi khng l null hoc m;
nhng n c th l 0, khi chn bn thn hng hin hnh.
Cc hm ca s c xy dng sn c m t trong Bng 9-44. Cc hm ca s khc c th c
ngi s dng cho thm vo. Hn na, bt k hm tng hp c xy dng sn hay do ngi s
dng nh ngha cng c th c s dng nh mt hm ca s.
Cc c php s dng du * c s dng gi cc hm tng hp t tham s nh cc hm ca s,
v d count(*) OVER (PARTITION BY x ORDER BY y). * khng c s dng mt cch thng thng cho
cc hm ca s khng tng hp. Cc hm ca s tng hp, khng ging nh cc hm tng hp,
khng cho php DISTINCT hoc ORDER BY c s dng bn trong danh sch i s hm.
Cc li gi hm ca s ch c php trong danh sch SELECT v mnh ORDER BY ca truy vn.
Nhiu thng tin hn v cc hm ca s c th thy trong Phn 3.5, Phn 9.19 v Phn 7.2.4.

4.2.9. Cast dng


Mt cast dng ch nh mt s chuyn i t dng d liu ny sang dng d liu khc. PostgreSQL
chp nhn 2 c php tng ng nhau cho cc cast dng:
CAST ( expression AS type )
expression::type

C php ca CAST tun th SQL; c php vi :: l s dng theo lch s ca PostgreSQL.


Khi mt cast c p dng cho mt biu thc gi tr ca mt dng c bit, n th hin mt bin
i dng thi gian thc. Cast s ch thnh cng nu mt hot ng bin i dng ph hp tng c
xc nh. Lu iu ny l hi khc vi s dng cc cast vi cc hng, c ch ra Phn 4.1.2.7.
Mt cast c p dng cho mt hng chui t nhin th hin s ch nh trong ni b mt dng
i vi gi tr hng theo ngha en, v v th n s thnh cng i vi bt k dng no (nu cc ni
dung ca hng chui l c php u vo chp nhn c cho dng d liu ).
Mt cast dng r rng c th thng c lm m i nu khng c s m m nh i vi dng m
mt biu thc gi tr phi sinh ra (v d, khi n c ch nh ti mt ct ca bng); h thng s t
ng p dng mt cast dng trong cc trng hp nh vy. Tuy nhin, vic cast t ng ch c
thc hin cho cc cast c nh du OK to apply implicitly (OK p dng mt cch n)
trong cc catalog h thng. Cc cast khc phi c gi vi c php ca vic cast r rng. Hn ch
ny c mong i ngn chn s bin i gy ngc nhin khi c p dng mt cch m thm.
Cng c kh nng ch nh mt cast dng bng vic s dng mt c php ging hm:
typename ( expression )

Tuy nhin, iu ny ch lm vic cho cc dng m cc tn ca chng cng l hp l nh cc tn

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 64/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

hm. V d, chnh xc p double precision khng th c s dng theo cch ny, nhng th
tng t l float8 th c th. Hn na, cc tn interval, time v timestamp ch c th c s dng
theo cch thc ny nu chng nm trong cc du ngoc kp, v cc xung t v c php. V th, s
dng c php cast ging hm dn ti nhng s khng nht qun v c th nn trnh.
Lu : C php ging nh hm trong thc t ch l li gi hm. Khi mt trong 2 c php
cast tiu chun c s dng thc hin mt bin i thi gian thc, th n s gi trong
ni b mt hm c ng k thc hin s bin i . Theo qui c, cc hm bin i
c tn y ht nh dng u ra ca chng, v v th c php ging nh hm khng l g
hn mt li gi trc tip hm bin i nm bn di. R rng, iu ny l th g m mt
ng dng kh chuyn s da vo. c thm cc chi tit, xem CREATE CAST.

4.2.10. Truy vn con v hng


Mt truy vn con v hng l mt truy vn SELECT thng thng trong cc du ngoc n m tr v
chnh xc mt hng vi mt ct. (Xem Chng 7 c thng tin v vic vit cc truy vn). Truy
vn SELECT c thc thi v gi tr c tr v duy nht c s dng trong biu thc gi tr xung
quanh. L mt li nu s dng mt truy vn m tr v hn mt hng hoc hn mt ct nh mt truy
vn con v hng. (M nu, trong qu trnh thc thi c bit, truy vn con khng tr v hng no,
th khng c li; kt qu v hng c nhn nh l null). Truy vn con c th tham chiu ti cc
bin t truy vn xung quanh, n s hnh ng nh cc hng trong bt k nh gi no ca truy vn
con. Cng xem Phn 9.20 cho cc biu thc khc c lin quan ti cc truy vn con.
V d, th sau y tm kim dn s ca thnh ph ln nht trong tng bang:
SELECT name, (SELECT max(pop) FROM cities WHERE cities.state = states.name)
FROM states;

4.2.11. Cc cu trc mng


Mt cu trc mng l mt biu thc m xy dng mt gi tr mng bng vic s dng cc gi tr cho
cc phn t thnh vin ca n.
Mt cu trc mng n gin bao gm t kha ARRAY, mt du ngoc vung bn tri [, mt danh
sch cc biu thc (cch nhau bng du phy) cho cc gi tr phn t mng, v cui cng mt du
ngoc vung phi ]. V d:
SELECT ARRAY[1,2,3+4];
array
--------{1,2,7}
(1 row)

Mc nh, dng phn t mng l dng chung ca cc biu thc thnh phn, c xc nh bng vic
s dng cng cc qui tc y ht nh cc cu trc UNION hoc CASE (xem Phn 10.5). Bn c th vit
iu ny bng vic cast r rng cu trc mng ti dng mong mun, v d:
SELECT ARRAY[1,2,22.7]::integer[];
array

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 65/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

---------{1,2,23}
(1 row)

iu ny c hiu ng y ht nh vic cast tng biu thc ti dng phn t mng mt cch ring r.
c nhiu hn v vic cast, xem Phn 4.2.9.
Cc gi tr mng a chiu c th c xy dng bng vic lng cc cu trc mng. Trong cc cu
trc vng trong, t kha mng ARRAY c th b b qua. V d, iu ny to ra kt qu y ht:
SELECT ARRAY[ARRAY[1,2], ARRAY[3,4]];
array
--------------{{1,2},{3,4}}
(1 row)
SELECT ARRAY[[1,2],[3,4]];
array
--------------{{1,2},{3,4}}
(1 row)

V cc mng a chiu phi l hnh ch nht, nn cc cu trc vng trong mc y ht phi to ra cc


mng con c cc chiu y ht. Bt k cast no c p dng cho cu trc mng ARRAY vng ngoi
truyn ging mt cch t ng cho tt c cc cu trc vng trong.
Cc phn t cu trc mng a chiu c th l bt k th g c bt k mng no c dng ph hp
hn, khng ch mt cu trc mng con (sub-ARRAY). V d:
CREATE TABLE arr(f1 int[], f2 int[]);
INSERT INTO arr VALUES (ARRAY[[1,2],[3,4]], ARRAY[[5,6],[7,8]]);
SELECT ARRAY[f1, f2, {{9,10},{11,12}}::int[]] FROM arr;
array
-----------------------------------------------(1 row)

Bn c th xy dng mt mng rng, nhng v khng c kh nng c mt mng m khng c


dng no, nn bn phi cast r rng mng rng ca bn vo dng mong mun. V d:
SELECT ARRAY[]::integer[];
array
------{}
(1 row)

Cng c kh nng xy dng mt mng t cc kt qu ca mt truy vn con. dng ny, cu trc


mng c vit vi t kha ARRAY i theo sau l mt truy vn con nm trong cc du ngoc n
(khng phi cc du ngoc vung). V d:
SELECT ARRAY(SELECT oid FROM pg_proc WHERE proname LIKE bytea%);
?column?
------------------------------------------------------------{2011,1954,1948,1952,1951,1244,1950,2005,1949,1953,2006,31}
(1 row)

Truy vn con phi tr v mt ct duy nht. Mng kt qu mt chiu s c mt phn t cho tng
hng trong kt qu ca truy vn con, vi mt dng phn t khp vi dng ca ct u ra ca truy

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 66/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

vn con .
Ch s di ca mt gi tr mng c xy dng vi ARRAY lun bt u vi 1. c thm thng tin
v cc mng, xem Phn 8.14.

4.2.12. Cu trc hng


Mt cu trc hng l mt biu thc xy dng mt gi tr hng (cng c gi l mt gi tr tng
hp) bng vic s dng cc gi tr cho cc trng cc thnh phn ca n. Mt cu trc hng bao
gm t kha hng ROW, mt du ngoc n tri, khng hoc nhiu biu thc hn (cch nhau bng
cc du phy cho cc gi tr trng hng, v cui cng mt du ngoc n phi. V d:
SELECT ROW(1,2.5,this is a test);

T kha hng ROW l ty chn khi c nhiu hn mt biu thc trong danh sch.
Mt cu trc hng c th bao gm c php rowvalue.*, n s c m rng ti mt danh sch cc
phn t ca gi tr hng , ht nh xy ra khi c php .* c s dng mc nh ca mt danh
sch SELECT. V d, nu bng t c cc ct f1 v f2, nhng th ny l y ht:
SELECT ROW(t.*, 42) FROM t;
SELECT ROW(t.f1, t.f2, 42) FROM t;

Lu : Trc PostgreSQL phin bn 8.2, c php .* tng khng c m rng, v th vic


vit ROW(t.*, 42) to ra mt hng 2 trng m trng u tin ca n tng c gi tr hng
khc. Cch hnh x mi thng hu dng hn. Nu bn cn hnh x c cc gi tr hng
lng nhau, hy vit gi tr hng vng trong m khng c .*, v d ROW(t, 42).
Mc nh, gi tr c biu thc ROW to ra l dng bn ghi nc danh. Nu cn, n c th l cast
ti dng tng hp c t tn - hoc dng hng ca mt bng, hoc dng tng hp c to ra vi
CREATE TYPE AS . Mt cast r rng c th l cn thit trnh s m m. V d:
CREATE TABLE mytable(f1 int, f2 float, f3 text);
CREATE FUNCTION getf1(mytable) RETURNS int AS SELECT $1.f1 LANGUAGE SQL;
-- No cast needed since only one getf1() exists (Khng cast no cn thit v ch mt getf1() tn ti)
SELECT getf1(ROW(1,2.5,this is a test));
getf1
------1
(1 row)
CREATE TYPE myrowtype AS (f1 int, f2 text, f3 numeric);
CREATE FUNCTION getf1(myrowtype) RETURNS int AS SELECT $1.f1 LANGUAGE SQL;
-- Now we need a cast to indicate which function to call: (By gi chng ta cn mt cast ch nh hm
no gi:)
SELECT getf1(ROW(1,2.5,this is a test));
ERROR: function getf1(record) is not unique
SELECT getf1(ROW(1,2.5,this is a test)::mytable);
getf1

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 67/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

------1
(1 row)
SELECT getf1(CAST(ROW(11,this is a test,2.5) AS myrowtype));
getf1
------11
(1 row)

Cc cu trc hng c th c s dng xy dng cc gi tr tng hp s c lu tr trong mt


ct ca bng dng tng hp, hoc s c chuyn ti mt hm chp nhn mt tham s tng hp.
Hn na, c kh nng so snh 2 gi tr hng hoc kim th mt hng vi IS NULL hoc IS NOT NULL,
v d:
SELECT ROW(1,2.5,this is a test) = ROW(1, 3, not the same);
SELECT ROW(table.*) IS NULL FROM table; -- detect all-null rows

c thm chi tit, xem Phn 9.21. Cc cu trc hng cng c th c s dng trong s kt ni
vi cc truy vn con, nh c tho lun trong Phn 9.20.

4.2.13. Cc qui tc nh gi biu thc


Trt t nh gi cc biu thc con khng c xc nh. c bit, cc u vo ca mt ton t hoc
hm khng nht thit c nh gi t tri qua phi hoc theo bt k trt t c nh no khc.
Hn na, nu kt qu ca mt biu thc c th c xc nh bng s nh gi ch mt s phn ca
n, th cc biu thc con khc c th s khng c nh gi hon ton. V d, nu mt ngi vit:
SELECT true OR somefunc();

th somefunc() c th (c l) khng c gi hon ton. iu y ht c th l trng hp nu vit:


SELECT somefunc() OR true;

Lu rng iu ny khng l y ht nhau nh vic i ng tt t tri qua phi ca cc ton t


Boolean c thy trong mt s ngn ng lp trnh.
Nh l mt h qu, l khng khn ngoan s dng cc hm vi cc hiu ng ph nh mt phn
ca cc biu thc phc tp. c bit nguy him da vo cc hiu ng ph hoc trt t nh gi
trong cc mnh WHERE v HAVING, v cc mnh c ti x l mt cch rng ri nh mt
phn ca vic pht trin mt k hoch thc thi. Cc biu thc Boolean (kt hp ca AND /OR /NOT)
trong cc mnh c th c t chc li theo bt k cch g m lut s hc Boolean cho php.
Khi iu c bn p trt t nh gi, th mt cu trc CASE (xem Phn 9.16) c th c s dng.
V d, y l mt cch khng tin cy ca vic c gng trnh chia cho 0 trong mt mnh WHERE:
SELECT ... WHERE x > 0 AND y/x > 1.5;

Nhng iu ny l an ton:
SELECT ... WHERE CASE WHEN x > 0 THEN y/x > 1.5 ELSE false END;

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 68/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Mt cu trc CASE c s dng theo cch ny s nh bi cc c gng ti u ha, v th n nn ch


c thc hin khi cn thit. (Trong v d c bit ny, c th l tt hn t vn sang bn
bng vic thay vo vit y > 1.5*x).

4.3. Gi hm
PostgreSQL cho php cc hm c cc tham s c tn s c gi hoc bng k hiu v tr hoc k
hiu c tn. K hiu c tn l c bit hu dng cho cc hm c mt s lng ln cc tham s, v
n lm cho cc mi lin quan gia cc tham s v cc i s thc r rng v ng tin cy hn. Theo
k hiu v tr, mt li gi hm c vit vi cc gi tr i s ca n theo trt t y ht nh chng
c nh ngha trong khai bo hm. Theo k hiu c t tn, cc i s s c khp vi cc
tham s hm bng tn v c th c vit theo bt k trt t no.
Theo bt k k hiu no, th cc tham s m c cc gi tr mc nh c a ra trong khai bo hm
cng cn hon ton khng c vit trong li gi. Nhng iu ny c bit hu dng theo k hiu
c t tn, v bt k s kt hp cc tham s no cng c th b b qua; trong khi theo k hiu v
tr th cc tham s ch c th b b qua t phi qua tri.
PostgreSQL cng h tr k hiu pha trn, n kt hp k hiu v tr v c t tn. Trong trng
hp ny, cc tham s v tr c vit trc v cc tham s c t tn xut hin sau chng.
Cc v d sau s minh ha s s dng ca tt c 3 k hiu , s dng nh ngha hm sau:
CREATE FUNCTION concat_lower_or_upper(a text, b text, uppercase boolean DEFAULT false)
RETURNS text
AS
$$
SELECT CASE
WHEN $3 THEN UPPER($1 || || $2)
ELSE LOWER($1 || || $2)
END;
$$
LANGUAGE SQL IMMUTABLE STRICT;

Hm concat_lower_or_upper c 2 tham s bt buc, a v b. B sung thm, c mt tham s ty chn


ch hoa uppercase m mc nh l sai false. Cc u vo a v b s c ghp ni, v b p vo
hoc ch thng hoc ch hoa, ph thuc vo tham s uppercase. Cc chi tit cn li ca nh ngha
hm ny l khng quan trng y (xem Chng 35 c thm thng tin).

4.3.1. S dng k hiu v tr


K hiu v tr l c ch truyn thng cho vic truyn cc i s ti cc hm trong PostgreSQL. Mt
v d l:
SELECT concat_lower_or_upper(Hello, World, true);
concat_lower_or_upper
----------------------HELLO WORLD
(1 row)

Tt c cc i s c ch nh theo trt t. Kt qu l ch hoa v uppercase c ch nh l ng

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 69/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


true.

Xut bn nm 2013

V d khc l:

SELECT concat_lower_or_upper(Hello, World);


concat_lower_or_upper
----------------------hello world
(1 row)

y, tham s uppercase b b qua, nn n nhn gi tr mc nh ca n l sai - false, tr v ch


thng u ra. Theo k hiu v tr th cc i s c th b b qua t phi qua tri cho ti khi chng
c c cc mc nh.

4.3.2. S dng k hiu c t tn


Theo k hiu c t tn, tng tn i s c ch nh bng vic s dng := ngn cch n vi
biu thc i s. V d:
SELECT concat_lower_or_upper(a := Hello, b := World);
concat_lower_or_upper
----------------------hello world
(1 row)

Mt ln na, i s uppercase b b qua nn n c thit lp v false mt cch n. Mt u tin


ca s dng k hiu c t tn l cc i s c th c ch nh theo bt k trt t no, v d:
SELECT concat_lower_or_upper(a := Hello, b := World, uppercase := true);
concat_lower_or_upper
----------------------HELLO WORLD
(1 row)
SELECT concat_lower_or_upper(a := Hello, uppercase := true, b := World);
concat_lower_or_upper
----------------------HELLO WORLD
(1 row)

4.3.3. S dng k hiu pha trn


K hiu pha trn kt hp k hiu v tr v c t tn. Tuy nhin, nh c nhc ti, cc i s
c t tn khng th i trc cc i s v tr. V d:
SELECT concat_lower_or_upper(Hello, World, uppercase := true);
concat_lower_or_upper
----------------------HELLO WORLD
(1 row)

Trong truy vn trn, cc i s a v b c ch nh theo v tr, trong khi uppercase c ch nh


theo tn. Trong v d ny, iu b sung thm c t, ngoi tr ti liu. Vi mt hm phc tp
hn c nhiu tham s m c cc gi tr mc nh, th k hiu c t tn hoc pha trn c th tit
kim c nhiu vic vit v lm gim cc c hi sinh li.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 70/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Chng 5. nh ngha d liu


Chng ny cp ti cch to cc cu trc c s d liu m s lu tr cc d liu. Trong c s d
liu quan h, cc d liu th c lu tr trong cc bng, v th phn ln chng ny dnh cho vic
gii thch cch m cc bng s c to ra v c sa i nh th no v cc tnh nng no l sn
sng kim sot nhng d liu g c lu tr trong cc bng . Tip n, chng ta s tho lun
v cch m cc bng c th c t chc trong cc s , v cch m cc quyn u tin c th c
ch nh cho cc bng. Cui cng, chng ta s nhn nhanh vo cc tnh nng khc m c nh hng
ti lu tr c s d liu, nh tnh k tha, cc kiu nhn, cc hm, v cc trigger.

5.1. C bn v bng
Mt bng trong c s d liu quan h rt ging mt bng trn giy: n bao gm cc hng v cc
ct. S lng v th t cc ct l c nh, v tng ct u c tn. S hng l bin i - n phn nh
c bao nhiu d liu c lu tr thi im c a ra. SQL khng c bt k m bo no v
trt t ca cc hng trong mt bng. Khi mt bng c c, cc hng s xut hin theo mt trt t
khng c xc nh, tr phi vic sp xp c yu cu r rng. iu ny c cp ti trong
Chng 7. Hn na, SQL khng ch nh cc m nh danh duy nht cho cc hng, nn c kh nng
s c vi hng hon ton ging ht nh nhau trong mt bng. y l h qu ca m hnh ton hc
nm bn di SQL nhng thng l khng mong mun. Phn sau ca chng ny chng ta s xem
cch lm vic vi vn ny.
Tng ct u c mt dng d liu. Dng d liu rng buc tp hp cc gi tr c kh nng m c th
c s dng tnh ton. V d, mt ct c khai bo s l dng s th s khng chp nhn cc
chui vn bn ty , v cc d liu c lu tr trong mt ct nh vy c th c s dng cho cc
tnh ton ton hc. Ngc li, mt ct c khai bo dng chui k t s chp nhn hu ht bt
k dng d liu no nhng t n khng s dng c thc hin cc php tnh ton hc, d cc
hot ng khc nh ghp ni chui l sn sng.
PostgreSQL bao gm mt tp hp ln cc dng d liu c xy dng sn m ph hp cho nhiu
ng dng. Ngi s dng cng c th nh ngha cc dng d liu ca ring h. Hu ht cc dng
d liu c xy dng sn c cc tn v ng ngha r rng, nn chng ta s hon gii thch chi tit
cho Chng 8. Mt s dng d liu c s dng thng xuyn l s nguyn integer cho ton b
cc s, numeric cho cc s thp phn c th, text cho cc chui k t, date cho ngy thng, time cho
cc gi tr thi gian trong ngy v timestamp cho cc gi tr cha c ngy thng v thi gian.
to mt bng, bn s dng kho lo lnh c tn l to bng CREATE TABLE. Trong lnh ny bn
ch nh t nht mt tn cho bng mi, cc tn ca cc ct v dng d liu ca tng ct. V d:
CREATE TABLE my_first_table (
first_column text,
second_column integer
);

iu ny to ra mt bng c tn l my_first_table vi 2 ct. Ct u c tn l first_column v c dng


Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 71/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

d liu l text; ct th 2 c tn l second_column v dng s nguyn integer. Cc tn bng v ct


tun theo c php ca m nh danh trong Phn 4.1.1. Cc tn thng cng l cc m nh danh,
nhng c mt s ngoi l. Lu rng danh sch cc ct c tch bch nhau bng du phy v
c cc du ngoc n bao bc.
Tt nhin, v d trc c tr tnh nhiu. Thng thng, bn c l a ra cc ci tn cho cc
bng v cc ct ca bn m truyn t c dng d liu chng lu tr. Nn hy xem v d thc
tin hn:
CREATE TABLE products (
product_no integer,
name text,
price numeric
);

(Dng numeric c th lu tr cc thnh phn thp phn, in hnh nh l s tin).


Mo: Khi bn to ra nhiu bng c lin quan vi nhau, l khn ngoan chn mt mu t
tn nht qun cho cc bng v ct. V d, c mt la chn s dng cc danh t s t hoc s
nhiu cho cc tn bng, c 2 dng u c mt s nh l thuyt a thch.
C mt gii hn v s lng ct m mt bng c th c. Ph thuc vo cc dng ct, n vo khong
t 250 cho ti 1600. Tuy nhin, vic xc nh mt bng vi bt k s lng ct no gn vi cc con
s l v dng cao v thng l mt thit k ng ng.
Nu bn khng cn cn mt bng na, bn c th loi b n bng vic s dng lnh b bng DROP
TABLE. V d:
DROP TABLE my_first_table;
DROP TABLE products;

Vic c b mt bng khng tn ti l mt li. D vy, l ph bin trong cc tp script SQL c


gng mt cch v iu kin b tng bng trc khi to ra n, b qua bt k thng ip li no, sao
cho script lm vic bt k bng c hay khng tn ti. (Nu bn thch, bn c th s dng bin
b bng nu tn ti DROP TABLE IF EXISTS trnh cc thng ip li, nhng iu ny khng phi l
tiu chun SQL).
Nu bn cn sa i mt bng m tn ti ri, xem Phn 5.5 sau trong chng ny.
Vi cc cng c c tho lun cho ti nay, bn c th hon ton to ra c cc bng hot ng
y . Phn cn li ca chng ny quan tm ti vic b sung thm cc tnh nng cho nh ngha
bng m bo tnh ton vn d liu, an ninnh hoc s thun tin. Nu bn hng hi in cc d
liu vo bng by gi th bn c th b qua Chng 6 v c phn cn li ca chng ny sau.

5.2. Cc gi tr mc nh
Mt ct c th c ch nh mt gi tr mc nh. Khi mt hng mi c to ra v khng gi tr
no c ch nh cho mt s ct, th cc ct s c in vi cc gi tr mc nh tng ng vi
chng. Mt lnh iu khin d liu cng c th yu cu r rng l mt ct s c thit lp vi gi
tr mc nh ca n, khng cn bit gi tr l g. (Cc chi tit v cc lnh iu khin d liu nm
Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 72/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Chng 6).
Nu khng gi tr mc nh no c khai bo r rng, th gi tr mc nh l gi tr null. iu ny
thng c ngha v mt gi tr null c th c xem xt trnh by cc d liu khng bit.
Trong nh ngha mt bng, cc gi tr mc nh c th c lit k sau dng d liu ct. V d:
CREATE TABLE products (
product_no integer,
name text,
price numeric DEFAULT 9.99
);

Gi tr mc nh c th l mt biu thc, n s c nh gi bt k khi no gi tr mc nh c


chn vo (khng phi khi no bng c to ra). Mt v d ph bin l i vi mt ct timestamp
c mt mc nh ca du thi gian hin hnh CURRENT_TIMESTAMP, sao cho n c thit lp thi gian
khi chn hng vo. V d ph bin khc ang to ra mt s tun t cho tng hng. Trong
PostgreSQL iu ny thng c thc hin bng mt s th ging nh:
CREATE TABLE products (
product_no integer DEFAULT nextval(products_product_no_seq),
...
);

trong hm nextval() cung cp cc gi tr thnh cng t mt i tng tun t (xem Phn 9.15).
i s ny l ph bin c c s tc k c bit cho n.
CREATE TABLE products (
product_no SERIAL,
...
);

Tc k tun t SERIAL c tho lun xa hn Phn 8.1.4.

5.3. Rng buc


Cc dng d liu l cch gii hn kiu d liu c th c lu tr trong mt bng. Tuy nhin, i
vi nhiu ng dng, s rng buc m chng a ra l qu km. V d, mt ct cha gi mt sn
phm c l ch nn c cc gi tr dng. Nhng khng c dng d liu tiu chun no chp nhn ch
cc s dng c. Vn khc nh bn c th mun rng buc cc d liu ca ct vi lu v cc
ct v hng khc. V d, trong mt bng c thng tin sn phm, s ch nn c mt hng cho tng s
lng sn phm.
V iu ny, SQL cho php bn nh ngha cc rng buc trong cc ct v bng. Cc rng buc cho
bn s kim sot cng ln cng tt theo bn mun i vi cc d liu trong cc bng ca bn. Nu
mt ngi s dng nh lu tr cc d liu trong mt ct m c th vi phm mt rng buc, th li
s ny sinh. iu ny p dng thm ch nu gi tr ti t nh ngha gi tr mc nh.

5.3.1. Rng buc kim tra


Mt rng buc kim tra l dng rng buc ph bin nht. N cho php bn ch nh rng gi tr

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 73/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

trong mt ct nht nh phi tha mn mt biu thc Boolean (gi tr ng true). V d, yu


cu cc gi thnh sn phm phi dng, bn c th s dng:
CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0)
);

Nh bn thy, nh ngha rng buc ti sau dng d liu, ht nh cc nh ngha gi tr mc nh.


Cc gi tr v cc rng buc mc nh c th c lit k theo bt k trt t no. Mt rng buc
kim tra bao gm t kha kim tra CHECK theo sau l mt biu thc trong cc du ngoc n. Biu
thc rng buc kim tra s c lin quan ti ct c rng buc, nu khng th rng buc c th
cng s khng c nhiu ngha.
Bn cng c th trao cho rng buc mt ci tn. iu ny lm r thm cho cc thng ip li v
cho php bn tham chiu ti rng buc khi bn cn thay i n. C php l:
CREATE TABLE products (
product_no integer,
name text,
price numeric CONSTRAINT positive_price CHECK (price > 0)
);

V th, ch nh mt rng buc c tn, hy s dng t kha CONSTRAINT theo sau l mt m nh


danh, theo sau na l nh ngha rng buc . (Nu bn khng ch nh tn mt rng buc theo
cch ny, th h thng chn mt tn cho bn).
Mt rng buc kim tra cng c th tham chiu ti vi ct. Hy ni bn lu tr mt gi thng
thng v mt gi c trit khu, v bn mun m bo rng gi trit khu l thp hn so vi gi
thng thng.
CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0),
discounted_price numeric CHECK (discounted_price > 0),
CHECK (price > discounted_price)
);

Hai rng buc u tin s trng quen. Rng buc th 3 s dng mt c php mi. N khng c
gn vo ct c th no, thay vo n xut hin nh mt khon ring bit trong danh sch ct c
cch nhau bng du phy. Cc nh ngha ct v cc nh ngha rng buc c th c lit k
theo trt t pha trn.
Chng ti ni rng 2 rng buc u tin l cc rng buc ct, trong khi rng buc th 3 l mt rng
buc bng v n c vit tch bit vi bt k nh ngha ct no. Cc rng buc ct cng c th
c vit nh cc rng buc bng, trong khi ngc li c kh nng l khng cn thit, v mt rng
buc ct c cho l tham chiu ti ch ct m n c gn ti. (PostgreSQL khng p tun th
qui tc , nhng bn nn tun theo n nu bn mun cc nh ngha bng ca bn lm vic c
vi cc h thng bng khc). V d trn cng c th c vit l:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 74/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

CREATE TABLE products (


product_no integer,
name text,
price numeric,
CHECK (price > 0),
discounted_price numeric,
CHECK (discounted_price > 0),
CHECK (price > discounted_price)
);

hoc thm ch:


CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0),
discounted_price numeric,
CHECK (discounted_price > 0 AND price > discounted_price)
);

iu ch l vn s thch.
Cc tn c th c ch nh cho cc rng buc bng theo cch y ht nh cc rng buc ct:
CREATE TABLE products (
product_no integer,
name text,
price numeric,
CHECK (price > 0),
discounted_price numeric,
CHECK (discounted_price > 0),
CONSTRAINT valid_discount CHECK (price > discounted_price)
);

ng lu rng mt rng buc kim tra c tha mn nu biu thc kim tra nh gi thnh gi
tr ng hoc null. V hu ht cc biu thc s nh gi v gi tr null nu bt k ton hng no l
null, chng s khng ngn cn cc gi tr null trong cc ct b rng buc. m bo rng mt ct
khng c cc gi tr null, th cc rng buc khng null (not null) c m t trong phn tip sau c
th c s dng.

5.3.2. Rng buc khng null


Mt rng buc khng null n gin ch nh rng mt ct phi khng gi thit gi tr null. V d:
CREATE TABLE products (
product_no integer NOT NULL,
name text NOT NULL,
price numeric
);

Mt rng buc khng null lun c vit nh mt rng buc ct. Mt rng buc khng null, v
chc nng, tng ng vi vic to ra mt rng buc kim tra CHECK (column_name IS NOT NULL),
nhng trong PostgreSQL vic to ra mt rng buc r rng khng null l hiu qu hn. Yu im l
bn khng th trao cc tn r rng cho cc rng buc khng null c to ra theo cch ny.
Tt nhin, mt ct c th c nhiu hn mt rng buc. Hy vit cc rng buc tng ci mt, ci ny
sau ci kia:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 75/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

CREATE TABLE products (


product_no integer NOT NULL,
name text NOT NULL,
price numeric NOT NULL CHECK (price > 0)
);

Trt t khng l vn . Khng nht thit phi xc nh vi trt t no cc rng buc c kim tra.
Rng buc NOT NULL c mt s nghch o: rng buc NULL. iu ny khng c ngha l ct phi l
null, m c th chc chn l v dng. Thay vo , iu ny n gin chn hnh vi mc nh m ct
c th l null. Rng buc NULL khng th hin trong tiu chun SQL v khng nn s dng trong
cc ng dng kh chuyn. (N ch c a vo PostgreSQL tng thch c vi mt s h
thng c s d liu khc). Tuy nhin, mt s ngi s dng, thch iu ny v n lm d dng
hon i rng buc trong tp script.
V d, bn c th bt u vi:
CREATE TABLE products (
product_no integer NULL,
name text NULL,
price numeric NULL
);

v sau chn t kha NOT vo bt k u bn mun.


Mo: Trong hu ht cc thit k c s d liu, a s cc ct s c nh du l khng null.

5.3.3. Rng buc c nht


Cc rng buc c nht m bo rng cc d liu c trong mt ct hoc mt nhm cc ct l c
nht vi lu ti tt c cc hng trong bng. C php l:
CREATE TABLE products (
product_no integer UNIQUE,
name text,
price numeric
);

khi c vit nh mt rng buc ct, v:


CREATE TABLE products (
product_no integer,
name text,
price numeric,
UNIQUE (product_no)
);

khi c vit nh mt rng buc bng.


Nu mt rng buc c nht tham chiu ti mt nhm cc ct, th cc ct c lit k v c
tch bit nhau bng cc du phy:
CREATE TABLE example (
a integer,
b integer,
c integer,
UNIQUE (a, c)
);

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 76/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

iu ny ch nh rng s kt hp cc gi tr trong cc ct c ch nh l c nht xuyn khp


ton b bng, d bt k mt trong s cc ct no cn khng (v thng s khng) l c nht.
Bn c th ch nh tn ca ring bn cho mt rng buc c nht, theo cch thng thng:
CREATE TABLE products (
product_no integer CONSTRAINT must_be_different UNIQUE,
name text,
price numeric
);

Vic b sung thm mt rng buc c nht s t ng to ra mt ch s B-tree c nht trong ct


hoc nhm cc ct c s dng trong rng buc .
Ni chung, mt rng buc c nht b vi phm khi c hn mt hng trong bng ni m cc gi tr
ca tt c cc ct c a vo trong rng buc l bng nh nhau. Tuy nhin, 2 gi tr null
khng c xem l bng nhau trong so snh ny. iu c ngha l thm ch trong s hin din
ca mt rng buc c nht th vn c kh nng lu tr cc hng p bn m c mt gi tr null
trong t nht mt trong cc ct b rng buc. Hnh vi ny khng nh i vi tiu chun SQL, nhng
chng ta c nghe rng cc c s d liu SQL khc c th khng tun theo qui tc ny. V th hy
thn trng khi pht trin cc ng dng m c nh s l kh chuyn.

5.3.4. Kha ch
V mt k thut, mt rng buc kha ch (Primary Key) n gin l mt s kt hp ca mt rng
buc c nht v mt rng buc khng null. V th, 2 nh ngha bng sau y chp nhn cc d
liu ht nhau:
CREATE TABLE products (
product_no integer UNIQUE NOT NULL,
name text,
price numeric
);
CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric
);

Cc kha ch cng c th rng buc nhiu hn mt ct; c php l tng t nh i vi cc rng


buc c nht:
CREATE TABLE example (
a integer,
b integer,
c integer,
PRIMARY KEY (a, c)
);

Mt kha ch ch nh rng mt ct hoc nhm cc ct c th c s dng nh mt m nh danh


c nht cho cc hng trong bng. (y l h qu trc tip ca nh ngha mt kha ch. Lu l
mt rng buc c nht s khng, t bn thn n, cung cp mt m nh danh c nht v n khng
loi tr cc gi tr null). iu ny l hu dng c cho cc mc ch lm ti liu v cho cc ng dng

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 77/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

my trm. V d, mt ng dng giao din ha cho ngi s dng GUI m cho php sa i cc
gi tr hng c kh nng cn bit kha ch ca mt bng c kh nng xc nh mt cch c nht
cc hng.
B sung thm vo mt kha ch s t ng to ra mt ch s B-tree c nht trong ct hoc nhm
cc ct c s dng trong kha ch .
Mt bng c th c nhiu nht mt kha ch. (C th l bt k s no trong cc rng buc c nht
v khng null, v chc nng, n l iu y ht, nhng ch mt c th c xc nh nh l kha ch).
L thuyt c s d liu quan h ch ra rng mi bng phi c mt kha ch. Qui tc ny khng b
PostgreSQL p tun th, nhng thng tt nht phi tun theo n.

5.3.5. Kha ngoi


Mt rng buc kha ngoi (Foreign Key) ch nh rng cc gi tr trong mt ct (hoc mt nhm
cc ct) phi khp vi cc gi tr xut hin trong mt s hng ca bng khc. Chng ta ni iu ny
duy tr tnh ton vn tham chiu gia 2 bng c lin quan.
Ni bn c bng sn phm (product) m chng ta s dng vi ln ri:
CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric
);

Hy cng gi thit bn c mt bng lu tr cc n hng ca cc sn phm . Chng ta mun m


bo rng bng cc n hng ch cha cc n hng ca cc sn phm m thc s tn ti. V th
chng ta nh ngha mt rng buc kha ngoi trong bng cc n hng m tham chiu ti bng cc
sn phm:
CREATE TABLE orders (
order_id integer PRIMARY KEY,
product_no integer REFERENCES products (product_no),
quantity integer
);

By gi khng c kh nng to cc n hng vi cc khon


bng cc sn phm.

product_no

m khng xut hin trong

Chng ta ni rng trong tnh hung ny th bng cc n hng l bng tham chiu v bng cc sn
phm l bng c tham chiu ti. Tng t, c cc ct tham chiu v ct c tham chiu ti.
Bn cng c th rt gn lnh trn thnh:
CREATE TABLE orders (
order_id integer PRIMARY KEY,
product_no integer REFERENCES products,
quantity integer
);

v thiu mt danh sch ct th kha ch ca bng c tham chiu s c s dng nh l (cc) ct


c tham chiu.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 78/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Mt kha ch cng c th rng buc v tham chiu ti mt nhm cc ct. Nh thng l, n sau
cn phi c vit dng rng buc bng. y l mt v d c php c tr tnh trc:
CREATE TABLE t1 (
a integer PRIMARY KEY,
b integer,
c integer,
FOREIGN KEY (b, c) REFERENCES other_table (c1, c2)
);

Tt nhin, s lng v dng cc ct b rng buc cn phi khp vi s lng v dng ca cc ct


c tham chiu.
Bn c th ch nh tn ca ring bn cho mt rng buc kha ngoi, theo cch thng thng.
Mt bng c th gm nhiu hn mt rng buc kha ngoi. iu ny c s dng trin khai cc
mi quan h nhiu - nhiu gia cc bng. Ni bn c cc bng v cc sn phm v cc n hng,
nhng by gi bn mun cho php mt n hng c kh nng c nhiu sn phm (m cu trc
trn khng cho php). Bn c th s dng cu trc bng ny:
CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric
);
CREATE TABLE orders (
order_id integer PRIMARY KEY,
shipping_address text,
...
);
CREATE TABLE order_items (
product_no integer REFERENCES products,
order_id integer REFERENCES orders,
quantity integer,
PRIMARY KEY (product_no, order_id)
);

Lu rng kha ch chng ln vi cc kha ngoi trong bng cui cng.


Chng ta bit rng cc kha ngoi khng cho php to cc n hng m khng c lin quan ti bt
k sn phm no.
Nhng iu g s xy ra nu mt sn phm b loi b sau khi mt n hng c to ra m tham
chiu ti n? SQL cng cho php bn iu khin iu . Bng trc gic, chng ta c vi la chn:

Khng cho php xa mt sn phm c tham chiu

Cng xa c cc n hng

Th g na y?

minh ha iu ny, hy trin khai chnh sch sau trong v d v mi quan h nhiu - nhiu
trn: khi ai mun loi b mt sn phm m vn cn c tham chiu ti t mt n hng (thng
qua order_items), chng ta khng cho php iu ny. Nu ai loi b mt n hng, cc khon ca
n hng cng s b loi b:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 79/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

CREATE TABLE products (


product_no integer PRIMARY KEY,
name text,
price numeric
);
CREATE TABLE orders (
order_id integer PRIMARY KEY,
shipping_address text,
...
);
CREATE TABLE order_items (
product_no integer REFERENCES products ON DELETE RESTRICT,
order_id integer REFERENCES orders ON DELETE CASCADE,
quantity integer,
PRIMARY KEY (product_no, order_id)
);

Vic hn ch v xa theo kiu thc nc (cascade) l 2 la chn ph bin nht. RESTRICT ngn cn
s xa mt hng c tham chiu. NO ACTION c ngha l nu bt k cc hng tham chiu no vn
cn tn ti khi rng buc c kim tra, th mt li s ny sinh; y l hnh vi mc nh nu bn
khng ch nh bt k iu g. (S khc bit c bn gia 2 la chn l NO ACTION cho php s
kim tra s c tr hon cho ti sau trong giao dch, trong khi RESTRICT th khng). CASCADE ch
nh rng khi mt hng c tham chiu b xa, th (cc) hng tham chiu ti n cng s t ng b
xa. C 2 la chn khc: SET NULL v SET DEFAULT. Chng lm cho cc ct tham chiu s c thit
lp v null hoc v cc gi tr mc nh, mt cch tng ng, khi hng c tham chiu b xa. Lu
rng chng khng tha th cho bn i vi vic quan st thy bt k cc rng buc no. V d, nu
mt hnh ng ch nh SET DEFAULT nhng gi tr mc nh c th khng lm tha mn kha ngoi,
th hnh ng s hng.
Tng t nh vi ON DELETE cng c ON UPDATE m n c gi ra khi mt ct c tham chiu
c thay i (c cp nht). Cc hnh ng c kh nng l y ht nh nhau.
V mt lnh DELETE mt hng khi bng c tham chiu hoc mt lnh UPDATE ca mt ct c
tham chiu s i hi mt s qut bng tham chiu i vi cc hng khp vi gi tr c , nn
thng mt tng tt l nh ch s cho cc ct tham chiu. V iu ny khng lun l cn thit,
v c nhiu s la chn c sn v cch nh ch s, s khai bo mt rng buc kha ngoi khng
t ng to ra mt ch s trong cc ct tham chiu.
Nhiu thng tin hn v vic cp nht v xa d liu c trong Chng 6.
Cui cng, chng ta nn lu rng mt kha ngoi phi tham chiu ti cc ct m hoc l mt
kha ch hoc to thnh mt rng buc c nht. Nu kha ngoi tham chiu ti mt rng buc
c nht, th s c mt s kh nng b sung lin quan ti vic cc gi tr null s khp c nh th
no. Chng s c gii thch trong ti liu tham chiu ca lnh to bng CREATE TABLE.

5.3.6. Rng buc loi tr


Cc rng buc loi tr m bo rng nu bt k 2 hng no c so snh trong cc ct c bit hoc

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 80/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

cc biu thc c s dng cc ton t c bit, th t nht mt trong cc so snh ton t s tr v


sai hoc null.
C php l:
CREATE TABLE circles (
c circle,
EXCLUDE USING gist (c WITH &&)
);

Xem thm CREATE TABLE ... CONSTRAINT ... EXCLUDE c thm chi tit.
Vic b sung thm mt rng buc loi tr s t ng to ra mt ch s ca dng c ch nh trong
khai bo rng buc .

5.4. Ct h thng
Mi bng c vi ct h thng c h thng nh ngha theo mt cch n. V th, cc tn khng
th c s dng nh l tn cc ct do ngi s dng nh ngha. (Lu rng nhng hn ch l
tch bch vi vic liu tn c l mt t kha hay khng; a vo ngoc mt ci tn s khng cho
php bn thot khi nhng gii hn ). Bn thc s khng cn lo ngi v cc ct ; ch bit
chng c tn ti.
oid

M nh danh i tng (ID i tng) ca mt hng. Ct ny ch c trnh by nu bng


c to ra bng vic s dng WITH OIDS, hoc nu bin cu hnh default_with_oids
c thit lp khi . Ct ny l oid dng (tn y ht nh ct); xem Phn 8.16 c thm
thng tin v dng .
tableoid

OID ca bng c cha hng ny. Ct ny c bit thun tin cho cc truy vn m chn t cc
tn ti trt t cp bc tha k (xem Phn 5.8), v khng c n, kh ni mt hng ti t
bng ring r no. tableoid c th c kt ni i vi ct oid ca pg_class c c tn
bng.
xmin

S nh danh (ID giao dch) ca giao dch chn cho phin bn hng. (Mt phin bn hng l
tnh trng mt hng ring r; tng cp nht ca mt hng to ra mt phin bn hng mi cho
hng logic y ht).
cmin

M nh danh lnh (bt u t 0) trong giao dch chn.


xmax

S nh danh (ID giao dch) ca giao dch xa, hoc 0 cho mt phin bn hng b xa. C
kh nng i vi ct ny s l khng bng 0 trong mt phin bn hng nhn thy c. iu
thng ch ra rng giao dch xa cn cha c thc hin, hoc mt s xa c nh

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 81/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

c hon ngc li.


cmax

M nh dng lnh trong giao dch xa, hoc 0.


ctid

V tr vt l ca phin bn hng trong bng ca n. Lu rng d ctid c th c s dng


nh v phin bn hng rt nhanh, mt ctid s thay i nu n c cp nht hoc lot b
bng VACUUM FULL. V th ctid l v dng nh mt m nh danh hng trong di hn. OID,
hoc thm ch tt hn mt s th t do ngi s dng nh ngha, s c s dng xc
nh cc hng logic.
Cc OID l cc lng 32 bit v c ch nh t mt con tnh theo b rng duy nht. Trong mt c
s d liu ln hoc sng di lu, c kh nng i vi con tnh bc xung quanh. K t y, l
thc t ti gi thit rng cc OID l c nht, tr phi bn nm ly cc bc m bo rng y
chnh l vn . Nu bn cn xc nh cc hng trong mt bng, vic s dng mt b pht tun t
c khuyn co mnh m. Tuy nhin, cc OID cng c th c s dng, min l mt t phng
b sung c thc hin:

Rng buc c nht s c to ra trong ct OID ca tng bng m theo OID s c s


dng xc nh cc hng. Khi mt rng buc c nht nh vy (hoc ch s c nht) tn
ti, th h thng chm sc khng phi to ra mt OID khp vi mt hng ang tn ti sn
ri. (Tt nhin, iu ny ch c th nu bng cha t hn 232 (4 t) hng, v trong thc t
kch c bng tt hn nu nh hn th nhiu, hoc hiu nng c th b nh hng).

Cc OID s khng bao gi c gi thit l c nht xuyn khp cc bng; hy s dng s


kt hp ca tableoid v OID hng nu bn cn mt m nh danh c s d liu rng ln.

Tt nhin, cc bng theo yu cu phi c to ra bng


WITHOUT OIDS l mc nh.

WITH OIDS.

T PostgreSQL 8.1,

Cc m nh danh ca giao dch cng l cc lng 32 bit. Trong mt c s d liu sng di lu th


c kh nng cho cc ID giao dch phi bc xung quanh. y khng phi l mt vn nghim
trng, bit rng c cc th tc duy tr ph hp; xem Chng 23 c thm chi tit. Tuy nhin, iu
l khng khn ngoan, ph thuc vo s c nht ca cc ID giao dch v lu di (hn 1 t
giao dch).
Cc m nh danh lnh cng l cc lng 32 bit. iu ny to ra mt gii hn cng 2 32 (4 t) lnh
SQL trong mt giao dch duy nht. Trong thc t gii hn ny khng l vn - lu rng gii hn
ny l trong s cc lnh SQL, khng phi trong s cc hng c x l. Hn na, nh t
PostgreSQL 8.3, ch cc lnh m thc s sa i cc ni dung ca c s d liu s s dng mt m
nh danh lnh.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 82/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

5.5. Sa i bng
Khi bn to mt bng v bn nhn thy rng bn to mt sai lm, hoc cc yu cu ca ng dng
thay i, bn c th b bng v to n li. Nhng iu ny khng phi l mt la chn thun tin
nu bng c in cc d liu ri, hoc nu bng c cc i tng c s d liu khc
tham chiu ti (v d mt rng buc kha ngoi). V th PostgreSQL cung cp mt h cc lnh
tin hnh cc sa i i vi cc bng ang tn ti. Lu l iu ny, v mt khi nim, l khc vi
vic ty bin cc d liu nm trong bng : y chng ta c quan tm trong vic ty bin nh
ngha, hoc cu trc ca bng.
Bn c th:

Thm cc ct

Loi b cc ct

Thm cc rng buc

Loi b cc rng buc

Thay i cc gi tr mc nh

Thay i cc dng d liu ct

i tn cc ct

i tn cc bng

Tt c cc hnh ng c thc hin bng vic s dng lnh ALTER TABLE, trang tham chiu ca
n c cc chi tit vt ra khi nhng g c nu y.

5.5.1. Thm ct
thm mt ct, hy s dng mt lnh ging nh:
ALTER TABLE products ADD COLUMN description text;

(Sa bng sn phm v thm ct vn bn m t)

Ct mi ban u c in vi gi tr mc nh bt k th no c a ra (null nu bn khng ch


nh mt mnh mc nh DEFAULT).
Bn cng c th nh ngha cc rng buc trong ct cng mt lc, bng vic s dng c php thng
thng:
ALTER TABLE products ADD COLUMN description text CHECK (description <> );

Trong thc t tt c cc la chn c th c p dng cho mt m t ct trong CREATE TABLE c th


c s dng y. Tuy nhin hy nh trong u rng gi tr mc nh phi tha mn cc rng
buc c a ra, hoc lnh ADD s hng. Nh mt la chn, bn c th thm cc rng buc sau
(xem bn di) sau khi bn in vo ct mi mt cch ng n.
Mo: Vic thm mt ct vi mc nh i hi vic cp nht tng hng ca bng ( lu gi

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 83/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

gi tr ct mi). Tuy nhin, nu khng mc nh no c ch nh, th PostgreSQL c kh


nng tnh s cp nht vt l. V th nu bn nh in y ct vi cc gi tr hu ht khng
mc nh, th tt nht hy thm ct vi khng mc nh, hy chn cc gi tr ng bng vic
s dng UPDATE, v sau thm bt k mc nh mong mun no nh c m t di.

5.5.2. Loi b ct
loi b mt ct, hy s dng mt lnh ging nh l:
ALTER TABLE products DROP COLUMN description;

Bt k d liu no tng c trong ct s bin mt. Cc rng buc bng c lin quan ti ct cng s b
xa nt. Tuy nhin, nu ct c mt rng buc kha ngoi ca mt bng khc tham chiu ti,
th PostgreSQL s khng loi b mt cch m thm rng buc . Bn c th cho php vic loi b
bt k th g m ph thuc vo ct bng vic thm vo CASCADE:
ALTER TABLE products DROP COLUMN description CASCADE;

Xem Phn 5.11 c s m t c ch chung ng sau iu ny.

5.5.3. Thm rng buc


thm mt rng buc, c php rng buc bng c s dng. V d:
ALTER TABLE products ADD CHECK (name <> );
ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no);
ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;

thm mt rng buc khng null, m n khng th c vit nh mt rng buc bng, hy s
dng c php ny:
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;

Rng buc s c kim tra ngay lp tc, nn d liu ca bng phi lm tha mn rng buc
trc khi n c th c thm vo.

5.5.4. Loi b rng buc


loi b mt rng buc th bn cn bit tn ca n. Nu bn cho n mt ci tn th iu l
d dng. Nu khng th h thng ch nh mt tn c sinh ra, m bn cn tm ra n. Lnh psql
\d tablename c th l hu ch y; cc giao din khc c th cng cung cp mt cch thc kim
tra cc chi tit bng. Lnh l:
ALTER TABLE products DROP CONSTRAINT some_name;

(Nu bn ang lm vic vi mt tn rng buc c sinh ra nh l $2, ng qun rng bn s cn


a n vo cc du ngoc kp lm cho n thnh mt m nh danh hp l).
Nh vi vic loi b mt ct, bn cn phi thm CASCADE nu bn mun loi b mt rng buc m
th g khc ph thuc vo n. Mt v d l vic mt rng buc kha ngoi ph thuc vo mt
rng buc kha ch hoc c nht trong (cc) ct c tham chiu.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 84/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

iu ny lm vic y ht i vi tt c cc dng rng buc ngoi tr cc rng buc khng null.


loi b mt rng buc khng null, hy s dng:
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;

(Nh li rng cc rng buc khng null khng c cc tn).

5.5.5. Thay i gi tr mc nh ca ct
thit lp mt mc nh mi cho mt ct, hy s dng mt lnh nh:
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;

Lu rng iu ny khng tc ng ti bt k hng ang tn ti no trong bng, n ch lm thay


i mc nh i vi cc lnh chn INSERT trong tng lai.
loi b bt k gi tr mc nh no, hy s dng:
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;

iu ny c hiu qu y ht nh vic thit lp mc nh v null. Nh l mt h qu, y khng phi


l mt li loi b mt mc nh trong mt gi tr mc nh tng khng c nh ngha, v
mc nh l gi tr null n.

5.5.6. Thay i dng d liu ca mt ct


chuyn i mt ct ti mt dng d liu khc, hy s dng lnh sau:
ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);

iu ny s ch thnh cng nu tng khon u vo ang tn ti trong ct c th c chuyn i


sang dng mi bng mt cast n. Nu mt s bin i phc tp hn l cn thit, th bn c th thm
mt mnh USING m ch nh cch tnh ton cc gi tr mi t gi tr c.
PostgreSQL s c gng bin i gi tr mc nh ca ct (nu c) sang dng mi , cng nh bt
k rng buc no c lin quan ti ct . Nhng nhng bin i c th hng, hoc c th to ra
cc kt qu gy ngc nhin. Thng tt nht hy loi b bt k rng buc no trong ct trc khi
ty bin dng ca n, v sau thm tr li cc rng buc c sa i ph hp sau.

5.5.7. i tn ct
i tn mt ct:
ALTER TABLE products RENAME COLUMN product_no TO product_number;

5.5.8. i tn bng
i tn bng:
ALTER TABLE products RENAME TO items;

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 85/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

5.6. Cc quyn u tin


Khi bn to mt i tng c s d liu, bn tr thnh ch ca n. Mc nh, ch ngi ch ca
mt i tng mi c th lm bt k iu g vi i tng . cho php nhng ngi s dng
khc s dng n, cc quyn u tin phi c trao. (Tuy nhin, nhng ngi s dng m c thuc
tnh siu ngi s dng - superuser lun c th truy cp bt k i tng no).
C vi quyn u tin khc nhau:

SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES,

v USAGE. Cc quyn u tin c p dng cho


mt i tng c bit s khc nhau, ph thuc vo dng i tng (bng, hm, ). c thng
tin hon chnh v cc dng quyn u tin khc nhau c PostgreSQL h tr, hy tham kho trang
tham chiu trao quyn GRANT. Cc phn v cc chng sau y cng s ch cho bn cch m cc
quyn u tin c s dng.
TRIGGER, CREATE, CONNECT, TEMPORARY, EXECUTE,

Quyn sa i hoc ph hy mt i tng lun l quyn ca ch ngi ch.


Lu : thay i ngi ch ca mt bng, ch s, s tun t hoc kiu nhn, hy s dng
lnh ty bin bng ALTER TABLE. C cc lnh ALTER tng ng cho cc dng i tng khc.
ch nh cc quyn u tin, lnh GRANT c s dng. V d, nu joe l mt ngi s dng ang
tn ti, v accounts (cc ti khon) l mt bng ang tn ti, th quyn u tin cp nht bng
c th c trao bng:
GRANT UPDATE ON accounts TO joe;

Vic vit ALL vo ch ca mt quyn u tin c bit trao tt c cc quyn u tin l ph hp cho
dng i tng .
Tn ca ngi s dng c bit PUBLIC c th c s dng trao mt quyn u tin cho tng
ngi s dng trong h thng. Hn na, cc vai tr nhm c th c thit lp gip qun l
cc quyn u tin khi c nhiu ngi s dng ca mt c s d liu - xem cc chi tit Chng 20.
thu hi mt quyn u tin, hy s dng lnh thu hi REVOKE c tn thch hp:
REVOKE ALL ON accounts FROM PUBLIC;

Cc quyn u tin c bit ca ngi ch i tng (nh, quyn thc hin DROP, GRANT, REVOKE,
) lun l n khi l ngi ch, v khng th c trao hoc b thu hi. Nhng ngi ch i tng
c th chn thu hi cc quyn u tin thng thng ca anh ta, v d lm cho mt bng ch
c i vi bn thn anh ta cng nh nhng ngi khc.
Thng thng, ch ngi ch i tng (hoc mt siu ngi s dng superuser) c th trao hoc
thu hi cc quyn u tin i vi mt i tng. Tuy nhin, c kh nng trao mt quyn u tin
vi la chn trao, n trao cho ngi nhn quyn ti lt trao n cho nhng ngi khc. Nu
la chn trao b thu hi sau th tt c nhng ai nhn c quyn u tin t ngi nhn
(mt cch trc tip hoc thng qua mt chui cc cuc trao) s mt quyn u tin . Cc chi tit
thm c trong cc trang tham chiu ca GRANT v REVOKE.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 86/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

5.7. S (schema)
Mt b c s d liu PostgreSQL bao gm mt hoc nhiu c s d liu c tn. Nhng ngi s
dng v cc nhm ngi s dng c chia s qua ton b b, nhng khng d liu no khc c
chia s qua cc c s d liu. Bt k kt ni my trm ti my ch no c a ra cng ch c th
truy cp c cc d liu trong mt c s d liu duy nht, c s d liu c ch nh theo yu
cu kt ni.
Lu : Ngi s dng ca mt b my khng nht thit phi c quyn u tin truy cp
bt k c s d liu no trong b my . Vic chia s cc tn ngi s dng c ngha l
khng th c nhng ngi s dng khc c t tn, v d, joe trong 2 c s d liu trong
cng mt b my; nhng h thng c th c thit lp cu hnh cho php joe truy cp ti
ch mt s c s d liu .
Mt c s d liu bao gm mt hoc nhiu s , ti lt chng bao gm cc bng. Cc s cng
bao gm cc dng khc cc i tng c tn, bao gm cc dng d liu, cc hm v cc ton t.
Tn i tng y ht c th c s dng trong cc s khc nhau m khng c xung t; v d, c
schema1 v myschema u c th c cc bng c tn l mytable. Khng ging nh cc c s d liu,
cc s khng c tch bch nhau mt cch cng nhc: mt ngi s dng c th truy cp cc
i tng trong bt k s no trong c s d liu m anh ta c kt ni ti, nu anh ta c cc
quyn u tin lm th.
C vi l do v sao mt ngi c th mun s dng cc s :

cho php nhiu ngi s dng dng mt c s d liu m khng quy ry ln nhau.

t chc cc i tng c s d liu trong cc nhm logic lm cho chng c kh nng


qun l c nhiu hn.

Cc ng dng ca bn th 3 c th c t vo cc s tch bch nhau sao cho chng


khng xung t vi cc tn ca cc i tng khc.

Cc s l tng t vi cc th mc mc h iu hnh, ngoi tr l cc s khng th lng


nhau c.

5.7.1. To s
to mt s , hy s dng lnh to s CREATE SCHEMA. Hy t tn cho s theo bn.
V d:
CREATE SCHEMA myschema;

to hoc truy cp cc i tng trong mt s , hy vit mt ci tn iu kin c cu to


t tn s v tn bng c cch nhau bng mt du chm:
schema.table

iu ny lm vic bt k u m tn mt bng c mong i, bao gm c cc lnh sa i bng

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 87/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

v cc lnh truy cp d liu c tho lun trong cc chng sau. (V s khc trit chng ti s ch
ni v cc bng, nhng cc tng y ht p dng cho cc dng khc cc i tng c tn, nh cc
dng v cc hm).
Thc s, thm ch c php thng thng hn
database.schema.table

c th cng c s dng, nhng hin ti iu ny ch cho s tun th chnh thng vi tiu chun
SQL. Nu bn vit mt tn c s d liu, n phi l tn nh c s d liu bn c kt ni ti.
V th to mt bng trong mt s mi, hy s dng:
CREATE TABLE myschema.mytable (
...
);

b mt s nu n rng (tt c cc i tng trong n b b), hy s dng:


DROP SCHEMA myschema CASCADE;

b mt s bao gm tt c cc i tng bn trong, hy s dng:


DROP SCHEMA myschema CASCADE;

Xem Phn 5.11 c m t c ch chung ng sau iu ny.


Thng th bn s mun to mt s m ai khc l ch (v iu ny l mt trong cc cch thc
hn ch cc hot ng ca nhng ngi s dng ca bn i vi cc khng gian tn c nh
ngha tt). C php cho iu l:
CREATE SCHEMA schemaname AUTHORIZATION username;

Bn c th thm ch b qua tn s , trong trng hp th tn s s l y ht nh tn ca


ngi s dng. Xem Phn 5.7.6 bit cch m iu ny c th l hu dng.
Cc tn s bt u vi
s dng to ra.

pg_

c dnh cho cc mc ch ca h thng v khng th c ngi

5.7.2. S cng khai


Trong cc phn trc chng ta to ra cc bng m khng c vic ch nh bt k tn s no.
Mc nh th cc bng nh vy (v cc i tng khc) t ng c t vo trong s c tn l
public (cng cng). Tng c s d liu mi u c mt s . V th, th sau l tng ng:
CREATE TABLE products ( ... );

v
CREATE TABLE public.products ( ... );

5.7.3. ng tm kim s
Cc ci tn c iu kin l nng nhc vit, v thng tt nht l khng vit mt tn s c
th no vo cc ng dng c. V th cc bng thng c cc tn khng iu kin tham chiu

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 88/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ti, n bao gm ch tn bng. H thng xc nh bng no l c ngha bng cch i theo mt ng


tm kim, n l mt danh sch cc s tra cu. Bng khp u tin trong ng tm kim c
ly l mt bng mong mun. Nu khng c s trng khp no trong ng tm kim, th mt li
c bo, thm ch nu cc tn bng trng khp tn ti trong cc s khc trong c s d liu .
S u tin c tn trong ng tm kim c gi l s hin hnh. Bn cnh l s u tin
c tm thy, n cng l s m trong cc bng mi s c to ra nu lnh to bng CREATE
TABLE khng ch nh mt tn s .
ch ra ng tm kim hin hnh, hy s dng lnh sau y:
SHOW search_path;

Trong thit lp mc nh th iu ny tr v:
search_path
-------------"$user",public

Yu t u tin ch ra rng mt s vi tn cng y ht nh ca ngi s dng hin hnh s c


tm. Nu khng c s no nh vy tn ti, th khon u vo b b qua. Yu t th 2 tham
chiu ti s cng khai m chng ta thy ri.
S u trong ng tm kim m tn ti l v tr mc nh cho vic to cc i tng mi. l
l do gii thch v sao theo mc nh th cc i tng s c to ra trong s cng khai. Khi cc
i tng c tham chiu theo bt k ng cnh no m khng c s nh phm cht s (sa i
bng, sa i d liu, hoc cc lnh truy vn) th ng tm kim c i ngang cho ti khi mt i
tng trng khp c tm thy. V th, theo cu hnh mc nh, bt k s truy cp khng tiu
chun no cng ch c th tham chiu ti s cng khai m thi.
t s mi ca chng ta vo ng , chng ta s dng:
SET search_path TO myschema,public;

(Chng ta b qua $user y v chng ta cha cn ngay i vi n). V sau chng ta c th truy
cp bng m khng c s nh phm cht s :
DROP TABLE mytable;

Hn na, v myschema l yu t u tin trong ng , nn cc i tng mi c th theo mc


nh c to ra trong n.
Chng ta cng c th vit:
SET search_path TO myschema;

Sau chng ta khng cn c c s truy cp ti s cng khai m khng c s nh phm cht


r rng na. Khng c g c bit v s cng khai ngoi tr l n tn ti theo mc nh. N cng
c th b b i.
Xem Phn 9.23 c cch cch thc khc iu khin ng tm kim s .
ng tm kim lm vic theo y ht cch i vi cc tn dng d liu, cc tn hm v cc tn ton

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 89/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

t nh n lm i vi cc tn bng. Nu bn cn vit mt tn ton t iu kin trong mt biu


thc, th c mt cch c bit: bn phi vit
OPERATOR(schema.operator)

iu ny l cn thit trnh s m m v c php. Mt v d:


SELECT 3 OPERATOR(pg_catalog.+) 4;

Trong thc t ngi ta thng da vo ng tm kim i vi cc ton t, v th khng phi vit


bt k iu g qu xu x nh th.

5.7.4. S v quyn u tin


Mc nh, ngi s dng khng th truy cp bt k i tng no trong cc s m h khng l
ch. cho php iu , ngi ch s phi trao quyn u tin s dng USAGE trong s .
cho php nhng ngi s dng dng cc i tng trong s , cc quyn u tin b sung c
th cn phi c trao, ph hp vi d n.
Mt ngi s dng cng c th c php to ra cc i tng trong s ca ai khc. cho
php iu , quyn u tin CREATE trong s cn phi c trao. Lu l theo mc nh, tng
ngi c cc quyn u tin CREATE v USAGE trong s cng khai public. iu ny cho php tt c
nhng ngi s dng m c kh nng kt ni ti mt c s d liu c a ra to cc i tng
trong s public ca mnh. Nu bn khng mun cho php iu , th bn c th thu hi quyn
u tin :
REVOKE CREATE ON SCHEMA public FROM PUBLIC;

(Public (Cng khai) u tin trong s , bn ghi public c ngha l tng ngi s dng.
Theo ngha u tin th n l mt m nh danh, theo ngha th 2 th n l mt t kha, v th vit
ch hoa hay ch thng l khc nhau; hy nh li cc ch dn t Phn 4.1.1).

5.7.5. S catalog h thng


B sung thm vo cc s public v do ngi s dng to ra, tng c s d liu bao gm mt s
pg_catalog, n bao gm cc bng h thng v tt c cc dng d liu v cc ton t c xy
dng sn. pg_catalog lun l phn c hiu qu ca ng tm kim. Nu n khng c t tn mt
cch r rng trong ng th n s c tm kim n trc khi tm kim cc s ca ng .
iu ny m bo rng cc tn c xy dng sn s lun c kh nng tm thy c. Tuy nhin,
bn c th r rng t pg_catalog cui ng tm kim ca bn nu bn thch cc tn do ngi s
dng nh ngha ghi ln cc tn c xy dng sn.
Trong PostgreSQL phin bn trc 7.3, cc tn bng bt u bng pg_ were c gi li. iu ny
khng cn ng na: bn c th to mt tn bng nh vy nu bn mun, trong bt k th g khng
phi h thng. Tuy nhin, tt nht hy tip tc trnh cc tn nh vy, m bo rng bn s khng
chu mt xung t nu c phin bn trong tng lai nh ngha mt bng h thng c tn y ht nh
bng ca bn. (Vi ng tm kim mc nh, mt tham chiu khng iu kin ti tn bng ca

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 90/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

bn c th sau c gii quyt nh l bng h thng). Cc bng h thng s tip tc tun theo
qui c c cc tn bt u vi pg_, sao cho chng s khng xung t vi cc tn bng ca ngi s
dng khng iu kin, min l nhng ngi s dng trnh tin t pg_.

5.7.6. S dng cc mu
Cc s c th c s dng t chc cc d liu ca bn theo nhiu cch. C mt t cc mu
s dng c khuyn co v d dng c cu hnh mc nh h tr.

Nu bn khng to ra bt k s no th sau tt c nhng ngi s dng truy cp n s


cng khai. iu ny khuyn khch tnh hung ni m cc s hon ton khng sn
sng. Thit lp ny ch yu c khuyn co khi ch c mt ngi s dng duy nht hoc
mt t ngi s dng cng tc trong mt c s d liu. Thit lp ny cng cho php bin i
trn tru t th gii tha nhn khng s .

Bn c th to mt s cho tng ngi s dng vi cng tn nh ngi s dng . Hy


nh li rng ng tm kim mc nh vi $user, n gii quyt cho tn ngi s dng . V
th nu tng ngi s dng c mt s ring r, th h truy cp cc s ring ca h
theo mc nh.
Nu bn s dng thit lp ny th bn cng c th mun thu hi s truy cp ti s cng
khai (hoc b n cng), sao cho nhng ngi s dng thc s c rng buc vi cc s
ca ring h.

ci t cc ng dng c chia s (cc bng c tng ngi s dng, cc hm b sung


c cc bn th 3 cung cp, ), t chng vo cc s ring r. Hy nh phi trao cc
quyn u tin ph hp cho php nhng ngi s dng khc truy cp chng. Nhng ngi
s dng c th sau tham chiu ti cc i tng b sung thm bng vic kim tra
phm cht cc tn vi mt tn s , hoc h c th t cc s b sung thm vo
ng tm kim ca h, khi h chn.

5.7.7. Tnh kh chuyn


Theo tiu chun SQL, k hiu cc i tng trong cng s c lm ch bi nhng ngi s
dng khc nhau khng tn ti. Hn na, mt s trin khai khng cho php bn to cc s m c
mt tn khc vi tn ca ngi ch ca h. Trong thc t, cc khi nim v s v ngi s dng
gn nh l tng ng trong mt h thng c s d liu m trin khai h tr ch s c bn
c ch nh theo tiu chun. V th, nhiu ngi s dng coi cc tn c iu kin gn nh bao
gm username.tablename. y l cch m PostgreSQL s hnh x c hiu lc nu bn to mt s
cho tng ngi s dng.
Hn na, khng c khi nim mt s public theo tiu chun SQL. Tun th ti a i vi tiu
chun , bn khng nn s dng (c l thm ch loi b) s public .
Tt nhin, mt s h thng c s d liu SQL c th khng trin khai cc s hon ton, hoc

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 91/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

cung cp s h tr khng gian tn bng vic cho php (c th c gii hn) s truy cp lin cc c s
d liu. Nu bn cn lm vic vi cc h thng , th tnh kh chuyn cc i c th t c bng
vic hon ton khng s dng cc s .

5.8. K tha
PostgreSQL trin khai s k tha bng, n c th l cng c hu dng cho cc nh thit k bng.
(SQL:1999 v sau ny nh ngha mt tnh nng k tha dng, n khc theo nhiu kha cnh vi cc
tnh nng c m t y).
Hy bt u vi mt v d: gi s chng ta ang c gng xy dng mt m hnh d liu cho cc
thnh ph. Tng bang c nhiu thnh ph, nhng ch c mt th ph. Chng ta mun c kh nng
nhanh chng truy xut thnh ph th ph cho bt k bang c bit no. iu ny c th c thc
hin bng vic to ra 2 bng, mt cho cc th ph bang v mt cho cc thnh ph m khng phi l
cc th ph. Tuy nhin, iu g xy ra khi chng ta mun yu cu cc d liu v mt thnh ph, bt
k liu n c l th ph hay khng? Tnh nng k tha c th gip gii quyt vn ny. Chng ta
nh ngha cc bng th ph - capitals sao cho n k tha t bng cc thnh ph - cities:
CREATE TABLE cities (
name text,
population float,
altitude int -- in feet
);
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);

Trong trng hp ny, bng capitals k tha tt c cc ct ca bng cha ca n, bng


ph bang cng c mt ct thm ra, ct bang - state, m ch ra bang ca chng.

cities.

Cc th

Trong PostgreSQL, mt bng c th k tha t 0 hoc nhiu bng khc, v mt truy vn c th tham
chiu hoc tt c cc hng ca mt bng, hoc tt c cc hng ca mt bng cng vi tt c cc
bng con ca n. Hnh vi sau l mc nh. V d, truy vn sau y tm cc tn ca tt c cc thnh
ph, bao gm c cc th ph bang, m nm mt cao hn 500 feet:
SELECT name, altitude
FROM cities
WHERE altitude > 500;

a ra cc d liu mu t sch ch dn PostgreSQL (xem Phn 2.1), iu ny tr v:


name
| altitude
---------------------+---------Las Vegas
| 2174
Mariposa
| 1953
Madison
| 845

Mt khc, truy vn sau y tm tt c cc thnh ph m khng phi l cc th ph bang v nm


mt cao hn 500 feet:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 92/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

SELECT name, altitude


FROM ONLY cities
WHERE altitude > 500;
name
| altitude
---------------------+---------Las Vegas
| 2174
Mariposa
| 1953

y t kha ONLY ch rng truy vn ch nn p dng cho bng cities, v khng cho bt k bng no
bn di cities trong tn ti trt t k tha . Nhiu lnh m chng ta tho lun ri - SELECT,
UPDATE v DELETE - h tr cho t kha ONLY.
Bn cng c th vit tn bng vi mt ci ui * ch nh r rng rng cc bng con c bao gm:
SELECT name, altitude
FROM cities*
WHERE altitude > 500;

Vic vit * l khng cn thit, v hnh vi ny l mc nh (tr phi bn thay i thit lp ca ty


chn cu hnh sql_inheritance). Tuy nhin vic vit * c th l hu dng nhn mnh rng cc
bng b sung s c tm kim.
Trong mt s trng hp bn c th mun bit bng no mt hng c bit l t ra. C mt ct
h thng gi l tableoid trong tng bng m c th ni cho bn bng gc gc:
SELECT c.tableoid, c.name, c.altitude
FROM cities c
WHERE c.altitude > 500;

n tr v:
tableoid | name
| altitude
-----------+-------------------+---------139793 | Las Vegas
| 2174
139793 | Mariposa
| 1953
139798 | Madison
| 845

(Nu bn c gng ti to v d ny, th bn s c kh nng c cc s OID khc nhau). Bng vic


thc hin lin kt vi pg_class bn c th thy cc tn bng thc s:
SELECT p.relname, c.name, c.altitude
FROM cities c, pg_class p
WHERE c.altitude > 500 AND c.tableoid = p.oid;

n tr v:
relname | name
| altitude
------------+------------------+-----------cities
| Las Vegas
| 2174
cities
| Mariposa
| 1953
capitals | Madison
| 845

S k tha khng t ng truyn ging cc d liu t cc lnh INSERT hoc COPY ti cc bng khc
trong tn ti trt t k tha. Trong v d ca chng ta, lnh INSERT sau y s hng:
INSERT INTO cities (name, population, altitude, state)
VALUES (New York, NULL, NULL, NY);

Chng ta c th hy vng rng cc d liu c th bng cch no c nh tuyn ti bng capitals,


nhng iu ny khng xy ra: INSERT lun chn vo chnh xc bng c ch nh. Trong mt s
trng hp c kh nng ti nh tuyn s chn bng vic s dng mt qui tc (xem Chng 37).

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 93/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Tuy nhin iu khng gip c i vi trng hp trn v bng cities khng cha ct state, v
v th lnh s b t chi trc khi qui tc c th c p dng.
Tt c cc rng buc kim tra v cc rng buc khng null trong mt bng cha t ng c cc
con ca n k tha. Cc dng rng buc khc (cc rng buc c nht, kha ch v kha ngoi)
khng c k tha.
Mt bng c th k tha t nhiu hn 1 bng cha, trong trng hp n c s hp nht cc ct
c cc bng cha nh ngha. Bt k ct no c khai bo trong nh ngha ca bng con cng s
c b sung vo . Nu tn ct y ht xut hin trong nhiu bng cha, hoc trong c mt bng cha
v nh ngha ca bng con, th cc ct c trn sao cho ch c mt ct nh vy trong bng
con. c trn, cc ct phi c cng cc dng d liu, nu khng th mt li s pht sinh. Ct
c trn s c cc bn sao ca tt c cc rng buc kim tra ti t bt k mt trong s cc nh
ngha ct no m n t ti, v s c nh du l khng null.
S k tha bng in hnh c thit lp khi bng con c to ra, bng vic s dng mnh k
tha INHERITS ca lnh to bng CREATE TABLE. Nh mt s la chn, mt bng m c xc nh
ri theo mt cch tng thch c th c mt mi quan h cha mi c b sung vo, bng vic s
dng phng n INHERIT ca ALTER TABLE. lm iu ny th bng con mi phi a vo ri cc
ct vi cng tn v dng nh cc ct ca bng cha. N cng phi a vo cc rng buc kim tra
vi cc tn y ht v cc biu thc kim tra nh cc biu thc ca bng cha. Tng t mt lin kt
k tha c th b loi b khi mt bng con bng vic s dng phng n NO INHERIT ca ALTER
TABLE. Vic b sung v loi b ng cc lin kt k tha ging th ny c th l hu dng khi mi
quan h k tha ang c s dng cho vic phn vng bng (xem Phn 5.9).
Mt cch thun tin to mt bng tng thch m sau s c lm thnh mt bng con mi l
s dng mnh LIKE trong CREATE TABLE. iu ny to ra mt bng mi vi cc ct y ht nh bng
ngun. Nu c bt k rng buc CHECK no c nh ngha trong bng ngun, th ty chn
INCLUDING CONSTRAINTS i vi LIKE s c ch nh, khi bng con mi phi c cc rng buc
khp vi bng cha c cho l tng thch.
Mt bng cha khng th b b trong khi bt k bng con no ca n vn cn. Cc ct hoc cc rng
buc kim tra ca cc bng con u khng th b b hoc c ty bin nu chng c k tha t
bt k bng cha no. Nu bn mun loi b mt bng v tt c cc con chu ca n, mt cch d
dng b bng cha vi ty chn CASCADE.
s nhn ging bt k s thay i no trong cc nh ngha d liu ct v cc rng
buc kim tra xung tn ti trt t k tha. Mt ln na, vic b cc ct m b ph thuc vo cc
bng khc ch c kh nng khi s dng ty chn CASCADE. ALTER TABLE tun theo cng cc qui tc
i vi vic trn v t chi cc ct p bn m p dng trong qu trnh CREATE TABLE.
ALTER TABLE

Lu cch m cc quyn truy cp bng c iu khin. Vic truy vn mt bng cha c th t ng


truy cp cc d liu trong cc bng con m khng c vic kim tra quyn u tin truy cp tip. iu
ny gi li s xut hin m d liu l (cng) c trong bng cha. Tuy nhin, vic truy cp cc bng

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 94/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

con mt cch trc tip l khng t ng c php v c th i hi cc quyn u tin xa hn phi


c trao.

5.8.1. Cc vn cn tn ti
Lu rng khng phi tt c cc lnh SQL c kh nng lm vic trong cc tn ti trt t k tha. Cc
lnh m c s dng cho vic truy vn d liu, sa i d liu hoc sa i s (nh, SELECT,
UPDATE, DELETE, hu ht cc phng n ca ALTER TABLE, nhng khng INSERT hoc ALTER TABLE ...
RENAME) thng mc nh a vo cc bng con v h tr k hiu ONLY loi b chng. Cc lnh
m thc hin duy tr v tinh chnh c s d liu (nh, REINDEX, VACUUM) thng ch lm vic vi
cc bng ring r, vt l v khng h tr vic lp i vi cc tn ti trt t k tha. Hnh vi tng
ng ca tng lnh ring r c lm thnh ti liu trong trang tham chiu ca n (Tham chiu I,
Cc lnh SQL).
Hn ch nghim trng ca tnh nng k tha l cc ch s (bao gm c cc rng buc c nht) v
cc rng buc kha ngoi ch p dng cho cc bng n, khng cho cc bng con k tha. iu ny
l ng cho c bn tham chiu v bn c tham chiu ca mt rng buc kha ngoi. V th v v
d trn:

Nu chng ta khai bo cities.name s l UNIQUE hoc mt PRIMARY KEY, th iu ny c th


khng dng bng capitals khi vic c cc hng vi cc tn p bn cc hng trong bng
cities. V cc hng p bn c th mc nh ch ra trong cc truy vn t bng cities. Trong
thc t, mc nh bng capitals c th khng c rng buc c nht no c, v v th c th
bao gm nhiu hng vi cng tn. Bn c th thm mt rng buc c nht vo bng
capitals, nhng iu ny c th khng ngn c s p bn khi so snh vi bng cities.

Tng t, nu chng ta tng phi ch nh rng cities.name REFERENCES (THAM CHIU)


ti mt s bng khc, th rng buc ny c th khng t ng nhn ging cho bng capitals.
Trong trng hp ny bn c th khc phc n bng vic thm bng tay cng y ht rng
buc REFERENCES ti bng capitals.

Vic ch nh rng ct ca bng khc REFERENCES cities(name) c th cho php bng khc
rng buc cc tn thnh ph, nhng khng rng buc c cc tn th ph. Khng c s
khc phc tt cho trng hp ny.

Nhng ph thuc c th s c sa trong mt s phin bn trong tng lai, nhng trong khi
ch i th s ch ng k l cn thit trong vic quyt nh liu s k tha c l hu dng hay
khng cho ng dng ca bn.

5.9. Phn vng


PostgreSQL h tr vic phn vng ca bng c bn. Phn ny m t v sao v bng cch no
trin khai vic phn vng nh mt phn ca thit k c s d liu ca bn.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 95/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

5.9.1. Tng quan


Vic phn vng tham chiu ti vic chia tch nhng g v logic l mt bng ln thnh cc mu nh
hn v mt vt l. Vic phn vng c th cung cp vi li ch:

Hiu nng truy vn c th c ci thin ng k trong nhng tnh hung nht nh, c bit
khi hu ht cc hng c truy cp nhiu ca bng l trong mt phn vng duy nht hoc
mt s lng nh cc phn vng. Vic phn vng thay th cho vic dn dt cc ct ch s,
lm gim kch thc ch s v lm cho c kh nng hn i vi cc phn c s dng
nhiu ca cc ch s ph hp trong b nh.

Khi cc truy vn hoc cc cp nht truy cp mt s phn trm ln i vi mt phn vng


duy nht, hiu nng c th c ci thin bng vic tn dng s qut tun t phn vng
thay v s dng mt ch s v c truy cp ngu nhin b phn tn khp ton b bng.

Cc ti v cc s xa theo b c th c hon tt bng vic thm hoc bt cc phn vng,


nu yu cu c k hoch trong thit k phn vng. ALTER TABLE NO INHERIT v DROP
TABLE c 2 u nhanh hn nhiu so vi mt hot ng theo b. Cc lnh cng hon ton
trnh c chi ph tng VACUUM sinh ra v mt b cc lnh DELETE.

Cc d liu him khi c s dng c th c chuyn i sang cc phng tin lu tr r


hn v chm hn.

Nhng li ch s thng ng k ch khi mt bng c th nu khc i th rt ln. im chnh xc m


mt bng s c li t vic phn vng ph thuc vo ng dng, d mt qui tc ngn tay ci l
kch c ca bng s vt qu b nh vt l ca my ch c s d liu.
Hin hnh, PostgreSQL h tr vic phn vng thng qua s k tha ca bng. Tng phn vng phi
c to ra nh mt bng con ca mt bng cha duy nht. Bn thn bng cha thng l rng; n tn
ti ch th hin ton b tp d liu. Bn nn quen vi s k tha (xem Phn 5.8) trc khi c
gng thit lp vic phn vng.
Cc mu sau ca vic phn vng c th c trin khai trong PostgreSQL:
Phn vng theo khong
Bng c phn vng thnh cc khong c mt ct hoc tp hp cc ct kha xc nh,
khng c s chng ln gia cc khong gi tr c ch nh cho cc phn vng khc. V d
mt ngi c th phn vng theo cc khong ngy thng, hoc theo cc khong ca cc m
nh danh i vi cc i tng nghip v
Phn vng lit k
Bng c phn vng bng vic lit k r rng cc gi tr ch cht no xut hin trong tng
phn vng .

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 96/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

5.9.2. Trin khai phn vng


thit lp mt bng c phn vng, hy lm nhng iu sau:
1. To bng ch (master), t tt c cc phn vng s k tha.
Bng ny s khng cha d liu. Khng nh ngha bt k rng buc kim tra no trong
bng ny, tr phi bn c nh chng s c p dng y ht cho tt c cc phn vng.
Khng c ngha trong vic nh ngha bt k ch s hoc hng s c nht no trong n.
2. To vi bng con m tng bng k tha t bng ch. Thng thng, cc bng s khng
thm bt k ct no vo tp hp c k tha t bng ch.
Chng ta s tham chiu ti cc bng con nh l cc phn vng, d chng theo mi cch l
nhng bng PostgreSQL thng thng.
3. Thm cc rng buc bng vo cc bng phn vng nh ngha cc gi tr kha c php
trong tng phn vng.
Cc v d in hnh c th l:
CCHECK ( x = 1 )
CHECK ( county IN ( Oxfordshire, Buckinghamshire, Warwickshire ))
CHECK ( outletID >= 100 AND outletID < 200 )

Hy chc chn cc rng buc m bo rng khng c s chng ln gia cc gi tr kha


c php trong cc phn khc nhau. Mt sai st ph bin l thit lp di cc rng buc
ging nh:
CHECK ( outletID BETWEEN 100 AND 200 )
CHECK ( outletID BETWEEN 200 AND 300 )

iu ny l sai v khng r phn vng no gi tr kha 200 nm trong .


Lu l khng c s khc bit trong c php gia vic phn vng theo khong v phn
vng lit k; nhng khi nim ch l din t.
4. i vi tng phn vng, hy to mt ch s trong (cc) ct kha, cng nh bt k cc ch s
khc m bn c th mun. (Ch s chnh khng nht thit l kht khe, m trong hu ht cc
kch bn l hu dng. Nu bn nh cho cc gi tr kha l c nht th bn nn lun to
mt rng buc c nht hoc kha ch cho tng phn vng).
5. Nh mt s la chn, hy nh ngha mt trigger hoc qui tc ti nh tuyn cc d liu
c chn vo bng ch ti phn vng ph hp.
6. Hy m bo tham s cu hnh constraint_exclusion khng b v hiu ha trong
postgresql.conf. Nu l th, cc truy vn s khng c ti u ha nh mong i.
V d, gi s chng ta ang xy dng mt c s d liu cho mt cng ty lm kem ln. Cng ty o
cc nhit lc cao im mi ngy cng nh lng kem bn trong tng vng. V nguyn tc,
chng ta mun mt bng ging nh:
CREATE TABLE measurement (
city_id int not null,

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 97/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

logdate date not null,


peaktemp int,
unitsales int
);

Chng ta bit rng hu ht cc truy vn s truy cp ch cc d liu ca tun, thng, qu trc, v s


dng chnh bng ny s l chun b cho cc bo co trc tuyn qun l. gim s lng cc
d liu c m cn phi c lu tr, chng ti quyt nh ch gi cc d liu 3 nm gn y nht.
Vo u mi thng chng ti s loi b cc d liu ca thng c nht.
Trong tnh hung ny chng ta c th s dng vic phn vng gip chng ta p ng c tt c
cc yu cu khc nhau ca chng ta i vi nhng o m cho bng. Tun theo cc bc c phc
ha trn, vic phn vng c th c thit lp nh sau:
1. Bng ch l bng o m, c khai bo chnh xc nh trn.
2. Tip theo chng ta to mt phn vng cho tng thng hot ng:
CREATE
CREATE
...
CREATE
CREATE
CREATE

TABLE measurement_y2006m02 ( ) INHERITS (measurement);


TABLE measurement_y2006m03 ( ) INHERITS (measurement);
TABLE measurement_y2007m11 ( ) INHERITS (measurement);
TABLE measurement_y2007m12 ( ) INHERITS (measurement);
TABLE measurement_y2008m01 ( ) INHERITS (measurement);

Mi trong s cc phn vng l cc bng hon chnh theo quyn ca ring chng, nhng
chng k tha cc nh ngha ca chng t bng o m.
iu ny gii quyt mt trong nhng vn ca chng ta: xa cc d liu c. Mi thng, tt
c iu chng ta s cn phi lm l thc hin mt lnh b bng DROP TABLE trong bng con
c nht v to ra mt bng con mi cho cc d liu ca thng mi.
3. Chng ta phi a ra cc rng buc bng khng chng ln. Thay v ch to cc bng phn
vng nh trn, script to bng thc s s l:
CREATE TABLE measurement_y2006m02 (
CHECK ( logdate >= DATE 2006-02-01
) INHERITS (measurement);
CREATE TABLE measurement_y2006m03 (
CHECK ( logdate >= DATE 2006-03-01
) INHERITS (measurement);
...
CREATE TABLE measurement_y2007m11 (
CHECK ( logdate >= DATE 2007-11-01
) INHERITS (measurement);
CREATE TABLE measurement_y2007m12 (
CHECK ( logdate >= DATE 2007-12-01
) INHERITS (measurement);
CREATE TABLE measurement_y2008m01 (
CHECK ( logdate >= DATE 2008-01-01
) INHERITS (measurement);

AND logdate < DATE 2006-03-01 )


AND logdate < DATE 2006-04-01 )

AND logdate < DATE 2007-12-01 )


AND logdate < DATE 2008-01-01 )
AND logdate < DATE 2008-02-01 )

4. Chng ta c l cng cn cc ch s trong cc ct kha:


CREATE INDEX measurement_y2006m02_logdate ON measurement_y2006m02 (logdate);
CREATE INDEX measurement_y2006m03_logdate ON measurement_y2006m03 (logdate);
...
CREATE INDEX measurement_y2007m11_logdate ON measurement_y2007m11 (logdate);

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 98/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

CREATE INDEX measurement_y2007m12_logdate ON measurement_y2007m12 (logdate);


CREATE INDEX measurement_y2008m01_logdate ON measurement_y2008m01 (logdate);

Chng ta chn khng thm cc ch s na vo thi im ny.


5. Chng ta mun ng dng ca chng ta s c kh nng ni INSERT INTO measurement v
c cc d liu c ti nh tuyn vo trong bng phn vng ph hp. Chng ta c th dn
xp bng vic gn mt hm trigger ph hp ti bng ch.
CREATE OR REPLACE FUNCTION measurement_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO measurement_y2008m01 VALUES (NEW.*);
RETURN NULL;
END;
$$
LANGUAGE plpgsql;

Sau khi to hm , chng ta to mt trigger gi hm trigger :


CREATE TRIGGER insert_measurement_trigger
BEFORE INSERT ON measurement
FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger();

Chng ta phi ti nh ngha hm trigger mi thng sao cho n lun ch ti phn vng hin
hnh. Tuy nhin, nh ngha trigger khng cn phi c cp nht.
Chng ta c th mun chn cc d liu v my ch t ng nh v phn vng vo hng
no m s c thm vo. Chng ta c th lm iu ny bng mt hm trigger phc tp hn,
v d:
CREATE OR REPLACE FUNCTION measurement_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
IF ( NEW.logdate >= DATE 2006-02-01 AND
NEW.logdate < DATE 2006-03-01 ) THEN
INSERT INTO measurement_y2006m02 VALUES (NEW.*);
ELSIF ( NEW.logdate >= DATE 2006-03-01 AND
NEW.logdate < DATE 2006-04-01 ) THEN
INSERT INTO measurement_y2006m03 VALUES (NEW.*);
...
ELSIF ( NEW.logdate >= DATE 2008-01-01 AND
NEW.logdate < DATE 2008-02-01 ) THEN
INSERT INTO measurement_y2008m01 VALUES (NEW.*);
ELSE
RAISE EXCEPTION Date out of range. Fix the measurement_insert_trigger()
function!;
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;

nh ngha trigger l y ht nh trc. Lu rng tng kim th


buc kim tra CHECK cho phn vng ca n.

IF

phi chnh xc khp vi rng

Trong khi hm ny l phc tp hn so vi trng hp thng duy nht, th khng cn phi c cp


nht thng xuyn, v cc nhnh c th c thm vo trc khi cn thit.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 99/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Lu : Trong thc t c th l tt nht kim tra phn vng mi nht trc, nu hu ht


cc v chn i vo phn vng . n gin, chng ti ch ra cc kim th trigger theo
cng trt t nh trong cc phn khc ca v d ny.
Nh chng ta c th thy, mt s phn vng phc tp c th i hi mt s lng cc DDL ng
k. Trong v d trn chng ta c th ang to ra mt phn vng mi mi thng, nn c l l khn
ngoan vit mt script m to ra DDL theo yu cu mt cch t ng.

5.9.3. Qun l phn vng


Thng thng tp hp cc phn vng c thit lp khi vic nh ngha bng ban u khng c
nh s l tnh. L ph bin mun loi b cc phn vng cc d liu c v nh k thm cc phn
vng mi cho cc d liu mi. Mt trong nhng u im quan trng nht ca vic phn vng chnh
xc l n cho php iu ny nu khc i s l tc v au n phi c thc hin gn nh cng mt
lc bng vic iu khin bng tay cu trc phn vng, thay v vic loi b mt cch vt l lng ln
cc d liu.
Ty chn n gin nht cho vic loi b cc d liu c n gin l b phn vng m khng cn cn
thit na:
DROP TABLE measurement_y2006m02;

iu ny c th xa rt nhanh hng triu bn ghi v n khng phi xa ring l tng bn ghi.


La chn khc thng c u tin l loi b phn vng t bng c phn vng nhng gi li s
truy cp ti n nh l mt bng theo quyn ca ring n:
ALTER TABLE measurement_y2006m02 NO INHERIT measurement;

iu ny cho php cc hot ng xa hn s c thc hin trong c s d liu trc khi n b b.


V d, y thng l thi im hu dng sao lu cc d liu bng lnh COPY, pg_dump hoc cc
cng c tng t. C l cng l thi im hu dng tng hp d liu trong cc nh dng nh
hn, thc hin nhng iu khin d liu khc, hoc chy cc bo co. Tng t chng ta c th
thm mt phn vng mi iu khin cc d liu mi. Chng ta c th to mt phn vng rng
trong bng c phn vng ht nh cc phn vng ban u c to ra trn:
CREATE TABLE measurement_y2008m02 (
CHECK ( logdate >= DATE 2008-02-01 AND logdate < DATE 2008-03-01 )
) INHERITS (measurement);

Nh mt la chn, i lc l thun tin hn to ra bng mi bn ngoi cu trc phn vng , v


lm cho n thnh mt phn vng ph hp hn sau ny. iu ny cho php cc d liu s c ti
ln, c kim tra v c bin i trc khi n xut hin trong bng c phn vng:
CREATE TABLE measurement_y2008m02
(LIKE measurement INCLUDING DEFAULTS INCLUDING CONSTRAINTS);
ALTER TABLE measurement_y2008m02 ADD CONSTRAINT y2008m02
CHECK ( logdate >= DATE 2008-02-01 AND logdate < DATE 2008-03-01 );
\copy measurement_y2008m02 from measurement_y2008m02
-- possibly some other data preparation work (c kh nng mt s cng vic chun b d liu khc)
ALTER TABLE measurement_y2008m02 INHERIT measurement;

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 100/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

5.9.4. Loi tr rng buc v phn vng


Loi tr rng buc l mt k thut ti u ha truy vn m ci thin hiu nng cho cc bng c
phn vng c nh ngha theo cch thc c m t trn. Nh mt v d:
SET constraint_exclusion = on;
SELECT count(*) FROM measurement WHERE logdate >= DATE 2008-01-01;

Khng c s loi tr rng buc, th truy vn trn c th qut tng trong cc phn vng ca bng
o m. Vi s loi tr rng buc c kch hot, trnh hoch nh (planner) s xem xt cc rng
buc ca tng phn vng v c gng chng minh rng phn vng cn khng c qut v n c th
khng c bt k hng no p ng c mnh WHERE ca truy vn . Khi trnh hoch nh c
th chng minh c iu ny, n loi tr phn vng khi k hoch truy vn.
Bn c th s dng lnh EXPLAIN ch ra s khc bit gia mt k hoch vi constraint_exclusion
c bt (kch hot) v mt k hoch m n b tt (gii hot). Mt k hoch in hnh khng c
ti u ha cho dng thit lp ny ca bng l:
SET constraint_exclusion = off;
EXPLAIN SELECT count(*) FROM measurement WHERE logdate >= DATE 2008-01-01;
QUERY PLAN
----------------------------------------------------------------------------------------------Aggregate (cost=158.66..158.68 rows=1 width=0)
-> Append (cost=0.00..151.88 rows=2715 width=0)
-> Seq Scan on measurement (cost=0.00..30.38 rows=543 width=0)
Filter: (logdate >= 2008-01-01::date)
-> Seq Scan on measurement_y2006m02 measurement (cost=0.00..30.38
width=Filter: (logdate >= 2008-01-01::date)
-> Seq Scan on measurement_y2006m03 measurement (cost=0.00..30.38
width=Filter: (logdate >= 2008-01-01::date)
...
-> Seq Scan on measurement_y2007m12 measurement (cost=0.00..30.38
width=Filter: (logdate >= 2008-01-01::date)
-> Seq Scan on measurement_y2008m01 measurement (cost=0.00..30.38
width=Filter: (logdate >= 2008-01-01::date)

rows=543
rows=543
rows=543
rows=543

Mt s hoc tt c cc phn vng c th s dng cc v qut ch s thay v cc v qut tun t ton


b bng, nhng im mu cht y l hon ton khng cn phi qut cc phn vng c hn tr
li cho truy vn ny. Khi chng ta kch hot loi tr rng buc, chng ta c mt k hoch r hn
ng k m s a ra cu tr li y ht:
SET constraint_exclusion = on;
EXPLAIN SELECT count(*) FROM measurement WHERE logdate >= DATE 2008-01-01;
QUERY PLAN
----------------------------------------------------------------------------------------------Aggregate (cost=63.47..63.48 rows=1 width=0)
-> Append (cost=0.00..60.75 rows=1086 width=0)
-> Seq Scan on measurement (cost=0.00..30.38 rows=543 width=0)
Filter: (logdate >= 2008-01-01::date)
-> Seq Scan on measurement_y2008m01 measurement (cost=0.00..30.38 rows=543
width=Filter: (logdate >= 2008-01-01::date)

Lu rng s loi tr rng buc ch c dn dt bng cc rng buc kim tra CHECK, khng bng
s hin din ca cc ch s. V th khng cn thit phi nh ngha cc ch s trong cc ct kha.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 101/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Liu mt ch s c cn phi c to ra cho mt phn vng c a ra hay khng s ph thuc


vo vic liu bn c mong i rng cc truy vn qut phn vng s, ni chung, qut mt phn
ln phn vng hay ch mt phn vng con. Mt ch s s hu dng trong trng hp sau nhng
khng trong trng hp trc.
Thit lp mc nh (v c khuyn co) ca constraint_exclusion thng hoc khng bt (on)
cng khng tt (off), nhng mt thit lp trung gian c gi l partition, n lm cho k thut s
ch c p dng cho cc truy vn m c kh nng s lm vic c trong cc bng c phn
vng. Thit lp bt (on) lm cho trnh hoch nh kim tra cc rng buc CHECK trong tt c cc truy
vn, thm ch c cc truy vn n gin m kh c th c li.

5.9.5. Phng php phn vng khc


Mt tip cn khc ti nh tuyn cc v chn vo bng phn vng ph hp l thit lp cc qui
tc, thay v mt trigger, trong bng ch. V d:
CREATE RULE measurement_insert_y2006m02 AS
ON INSERT TO measurement WHERE
( logdate >= DATE 2006-02-01 AND logdate < DATE 2006-03-01 )
DO INSTEAD
INSERT INTO measurement_y2006m02 VALUES (NEW.*);
...
CREATE RULE measurement_insert_y2008m01 AS
ON INSERT TO measurement WHERE
( logdate >= DATE 2008-01-01 AND logdate < DATE 2008-02-01 )
DO INSTEAD
INSERT INTO measurement_y2008m01 VALUES (NEW.*);

Mt qui tc c chi ph tng nhiu hn ng k so vi mt trigger, nhng tng chi ph c tr mt


ln theo tng truy vn thay v mt ln theo tng hng, nn phng php ny c th l c u th cho
nhng tnh hung chn theo b. Tuy nhin, trong hu ht cc trng hp, phng php trigger s
a ra hiu nng tt hn.
Hy hiu rng lnh COPY s b qua cc qui tc. Nu bn mun s dng COPY chn d liu, th bn
s cn phi sao chp vo bng phn vng ng thay v vo bng ch. COPY s t trigger, nn bn c
th s dng n bnh thng nu bn s dng tip cn trigger.
Nhc im khc ca tip cn qui tc ny l khng c cch thc n gin no p mt li nu tp
hp cc qui tc khng bao trm ngy thng chn; ngy thng s m thm i vo bng ch.
Vic phn vng cng c th c dn xp bng vic s dng mt kiu nhn
tha bng. V d,

UNION ALL,

thay v k

CREATE VIEW measurement AS


SELECT * FROM measurement_y2006m02
UNION ALL SELECT * FROM measurement_y2006m03
...
UNION ALL SELECT * FROM measurement_y2007m11
UNION ALL SELECT * FROM measurement_y2007m12
UNION ALL SELECT * FROM measurement_y2008m01;

Tuy nhin, s cn thit phi ti to kiu nhn s thm mt bc na vo vic b sung v loi b cc

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 102/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

phn vng ring r ca tp hp d liu. Trong thc t phng php ny c t iu khuyn co n


so vi vic s dng s k tha.

5.9.6. Cc vn cn tn ti
Cc vn cn tn ti sau y p dng cho cc bng c phn vng:

Khng c cch no kim tra tt c cc rng buc CHECK c l loi tr ln nhau hay khng.
L an ton hn to m m sinh ra cc phn vng v to ra v/hoc sa i cc i tng
c lin quan so vi vit tng th bng tay.

Cc s ch ra y gi thit rng (cc) ct kha phn vng ca mt hng khng bao gi


thay i, hoc t nht khng thay i yu cu n phi chuyn ti phn vng khc. Mt
lnh UPDATE c nh thc hin iu s hng v cc rng buc CHECK. Nu bn cn iu
khin cc trng hp nh vy, th bn c th t cc trigger cp nht ph hp trong cc bng
phn vng , nhng n qun l cu trc phc tp hn nhiu.

Nu bn ang s dng bng tay cc lnh VACUUM hoc ANALYZE, ng qun rng bn cn
chy chng trong tng phn vng mt cch ring r. Mt lnh ging nh:
ANALYZE measurement;

s ch x l bng ch.
Cc vn cn tn ti sau y p dng cho s loi tr cc rng buc:

Loi tr rng buc ch lm vic khi mnh WHERE ca truy vn c cc rng buc. Mt truy
vn c tham s s khng c ti u ha, v trnh hoch nh khng th bit cc phn vng
no gi tr tham s c th chn lc chy. V cng l do , cc hm n nh nh
CURRENT_DATE phi c trnh.

Hy gi cho vic phn vng cc rng buc l n gin, nu khng th trnh hoch nh c
th khng c kh nng chng minh rng cc phn vng khng cn phi c thm ving.
Hy s dng cc iu kin ngang bng n gin cho vic phn vng theo lit k, hoc cc
kim th khong n gin cho vic phn vng theo khong, nh c minh ha trong cc v
d trc. Mt qui tc ngn tay ci tt l vic phn vng cc rng buc nn ch bao gm
nhng so snh ca vic phn vng (cc) ct vi cc hng s bng vic s dng cc ton t
nh ch s c theo Btree.

Tt c cc rng buc trong tt c cc phn vng ca bng ch c kim tra trong qu trnh
loi tr rng buc, sao cho cc s phn vng ln c kh nng lm gia tng thi gian ln k
hoch truy vn mt cch ng k. Vic phn vng bng vic s dng cc k thut s lm
vic tt vi, c l, hng trm phn vng; khng c s dng nhiu ngn phn vng.

5.10. i tng c s d liu khc


Cc bng l cc i tng trng tm trong cu trc mt c s d liu quan h, v chng lu tr cc

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 103/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

d liu ca bn. Nhng chng khng ch l cc i tng m tn ti trong mt c s d liu. Nhiu


dng i tng khc c th c to ra s dng v qun l cc d liu c hiu qu v thun tin
hn. Chng khng c tho lun trong chng ny, nhng chng ti cho bn mt danh sch y
bn nhn bit c v nhng g c kh nng:
Cc kiu nhn

Cc hm v ton t

Cc dng v min d liu

Cc trigger v cc qui tc vit li


Thng tin chi tit v cc ch c trong Phn V.

5.11. Theo di s ph thuc


Khi bn to cc cu trc c s d liu phc tp c lin quan ti nhiu bng vi cc rng buc kha
ngoi, kiu nhn, trigger, hm, , bn ngm to ra mt mng cc ph thuc gia cc i tng .
V d, mt bng vi mt rng buc kha ngoi ph thuc vo bng m n tham chiu.
m bo tnh ton vn ca ton b cu trc c s d liu, PostgreSQL chc chn l bn khng
th b cc i tng m cc i tng khc cn ph thuc vo. V d, vic nh b bng cc sn
phm m chng ta xem xt trong Phn 5.3.5, vi bng cc n hng ph thuc vo n, c th to
ra mt thng ip li nh th ny:
DROP TABLE products;
NOTICE: constraint orders_product_no_fkey on table orders depends on table products
ERROR: cannot drop table products because other objects depend on it
HINT: Use DROP ... CASCADE to drop the dependent objects too.

Thng ip li c mt gi hu dng: nu bn khng mun lm phin vic xa tt c cc i tng


ph thuc mt cc ring r, bn c th chy:
DROP TABLE products CASCADE;

v tt c cc i tng ph thuc s b loi b. Trong trng hp ny n khng loi b bng orders,


n ch loi b rng buc kha ngoi. (nu bn mun kim tra xem DROP ... CASCADE s lm c g,
hy chy DROP m khng c CASCADE v c cc thng ip lu NOTICE).
Tt c cc lnh DROP trong PostgreSQL h tr vic ch nh CASCADE. Tt nhin, bn cht t nhin
ca cc ph thuc c kh nng l khc nhau vi dng i tng. Bn cng c th vit RESTRICT thay
v CASCADE c c hnh vi mc nh, n l ngn chn vic b cc i tng m cc i
tng khc cn ph thuc vo.
Lu : Theo tiu chun SQL, vic ch nh hoc RESTRICT hoc CASCADE c yu cu.
Khng h thng c s d liu no thc s bt tun theo qui tc , nhng liu hnh vi mc
nh l RESTRICT hay CASCADE s l khc nhau vi cc h thng khc nhau.
Lu : Cc ph thuc rng buc kha ngoi v cc ph thuc ct lin tc t PostgreSQL

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 104/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

phin bn trc 7.3 s khng c duy tr hoc to ra trong qu trnh nng cp. Tt c cc
dng ph thuc khc s c to ra mt cch ph hp trong mt bn nng cp t c s d
liu trc 7.3.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 105/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Chng 6. iu khin d liu


Chng trc tho lun cch to ra cc bng v cc cu trc khc lu tr d liu ca bn. By
gi ti lc in d liu vo cc bng. Chng ny cp ti cch chn, cp nht v xa cc d
liu ca bng. Chng sau chng ny cui cng s gii thch cch trch xut d liu bn lu t c
s d liu.

6.1. Chn d liu


Khi mt bng c to ra, n khng c d liu. iu u tin phi lm trc khi mt c s d liu
c th c s dng nhiu l chn d liu vo. D liu, v khi nim, c chn vo tng hng mt
theo thi gian. Tt nhin bn cng c th chn nhiu hn mt hng, nhng khng c cch no
chn t hn mt hng c. Thm ch nu bn bit ch mt s gi tr ct, th mt hng hon chnh phi
c to ra.
to ra mt hng mi, hy s dng lnh chn INSERT. Lnh ny i hi tn bng v cc gi tr
ct. V d, hy xem xt bng cc sn phm t Chng 5:
CREATE TABLE products (
product_no integer,
name text,
price numeric
);

Mt lnh v d chn mt hng c th l:


INSERT INTO products VALUES (1, Cheese, 9.99);

Cc gi tr d liu c lit k theo trt t trong cc ct xut hin trong bng, cch nhau bng
cc du phy.
Thng thng, cc gi tr d liu s l cc hng, nhng cc biu thc v hng cng c php. C
php trn c nhc im l bn cn bit th t ca cc ct trong bng. trnh iu ny bn
cng c th lit k cc ct mt cch r rng. V d, c 2 lnh sau c cng hiu qu nh lnh trn:
INSERT INTO products (product_no, name, price) VALUES (1, Cheese, 9.99);
INSERT INTO products (name, price, product_no) VALUES (Cheese, 9.99, 1);

Nhiu ngi s dng coi n l thc tin tt lun lit k cc tn ct.


Nu bn khng c cc gi tr cho tt c cc ct, th bn c th b qua mt s chng. Trong trng
hp , cc ct s c in vi cc gi tr mc nh. V d:
INSERT INTO products (product_no, name) VALUES (1, Cheese);
INSERT INTO products VALUES (1, Cheese);

Mu th 2 l mt m rng ca PostgreSQL. N in cc ct t tri qua vi cng nhiu gi tr cng


tt, v phn cn li s c mc nh.
lm r, bn cng c th yu cu cc gi tr mc nh mt cch r rng, cho cc ct ring r hoc
cho ton b hng:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 106/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

INSERT INTO products (product_no, name, price) VALUES (1, Cheese, DEFAULT);
INSERT INTO products DEFAULT VALUES;

Bn c th chn nhiu hng trong mt lnh duy nht;


INSERT INTO products (product_no, name, price) VALUES
(1, Cheese, 9.99),
(2, Bread, 1.99),
(3, Milk, 2.99);

Mo: Khi chn nhiu d liu cng mt lc, xem xt s dng lnh COPY. Khng mm do
nh lnh INSERT, nhng l c hiu qu hn. Hy tham chiu ti Phn 14.4 c thm thng
tin v vic ci thin hiu nng ti theo b.

6.2. Cp nht d liu


Sa i cc d liu c ri trong c s d liu c tham chiu ti nh l vic cp nht. Bn c
th cp nht cc hng ring r, tt c cc hng trong mt bng, hoc mt tp con ca tt c cc hng.
Tng ct c th c cp nht mt cch ring r; cc ct khc s khng b nh hng.
cp nht cc hng ang tn ti, hy s dng lnh cp nht UPDATE. Lnh ny i hi 3 mu tin:
1. Tn bng v ct cp nht
2. Gi tr mi ca ct
3. (Cc) hng no cp nht
Nh li t Chng 5 rng SQL, ni chung, khng cung cp mt m nh danh c nht cho cc
hng. V th khng lun c kh nng ch nh trc tip hng no cp nht. Thay vo , bn
ch nh cc iu kin no mt hng phi p ng c cp nht. Ch nu bn c mt kha ch
trong bng (c lp vi vic liu bn khai bo n hay cha) c th bn cp mt cch tin cy
cc hng ring r bng vic chn mt iu kin m trng khp vi kha ch. Cc cng c truy cp
c s d liu ha da vo thc t ny cho php bn cp nht cc hng mt cch ring r.
V d, lnh ny cp nht tt c cc sn phm m c gi l 5 s c gi ln l 10:
UPDATE products SET price = 10 WHERE price = 5;

iu ny c th lm cho 0, 1 hoc nhiu hng s c cp nht. Khng l li c gng mt cp


nht m khng khp vi hng no c.
Hy nhn vo lnh mt cch chi tit. Trc ht l t kha UPDATE theo sau l tn bng. Thng
thng, tn bng c th c iu kin nh l s , nu khng th n c tra trong ng dn.
Cnh t kha SET i theo sau l tn ct, mt du bng (=), v gi tr ct mi. Gi tr ct mi c
th l bt k biu thc v hng no, khng ch l mt hng s. V d, nu bn mun nng gi
thnh ca tt c cc sn phm ln 10% th bn c th s dng:
UPDATE products SET price = price * 1.10;

Nh bn thy, biu thc cho gi tr mi c th tham chiu ti (cc) gi tr ang tn ti trong hng.
Chng ta cng li mnh WHERE. Nu n b b qua, th c ngha l tt c cc hng trong bng

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 107/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

c cp nht. Nu n hin din, th ch nhng hng no m khp vi iu kin WHERE s c cp


nht. Lu rng du bng trong mnh SET l mt ch nh trong khi du hiu trong mnh
WHERE l mt so snh, nhng iu ny khng to ra bt k s t m no. Tt nhin, iu kin
WHERE khng phi l mt kim th v s ngang bng nhau. Nhiu ton t khc cng sn sng (xem
Chng 9). Nhng biu thc cn phi nh gi theo mt kt qu Boolean.
Bn c th cp nht nhiu hn mt ct trong mt lnh
nh trong mnh SET. V d:

UPDATE

bng vic lit k nhiu hn mt ch

UPDATE mytable SET a = 5, b = 3, c = 1 WHERE a > 0;

6.3. Xa d liu
Cho ti nay chng ta gii thch cch thm d liu vo cc bng v cch thay i d liu.
iu cn li l tho lun cch loi b d liu m khng cn cn thit na. Ht nh vic thm d
liu ch c kh nng trong ton b cc hng, bn ch c th loi b ton b cc hng khi mt bng.
Trong phn trc chng ta gii thch rng SQL khng a ra cch thc trc tip cp ti cc
hng ring r. V th, vic loi b cc hng ch c th c thc hin bng vic ch nh cc iu
kin m cc hng s c loi b phi trng khp. Nu bn c mt kha ch trong bng th bn c
th ch nh hng chnh xc. Nhng bn cng c th loi b nhm cc hng khp vi mt iu kin,
hoc bn c th loi b tt c cc hng trong mt bng cng mt ln.
Bn hy s dng lnh xa DELETE loi b cc hng; c php rt tng t nh vi lnh UPDATE.
V d, loi b tt c cc hng khi bng cc sn phm m c gi l 10, hy s dng:
DELETE FROM products WHERE price = 10;

Nu bn n gin vit:
DELETE FROM products;

th tt c cc hng trong bng s b xa! Vn cn li l ca lp trnh vin.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 108/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Chng 7. Truy vn
Cc chng trc gii thch cch to cc bng, cch in y d liu cho chng, v cch
iu khin cc d liu . By gi chng ta cui cng tho lun cch truy xut d liu t c
s d liu.

7.1. Tng quan


Qui trnh ca vic truy xut hoc lnh truy xut (retrieve) d liu t mt c s d liu c gi
l mt truy vn (query). Trong SQL th lnh SELECT c s dng ch nh cc truy vn. C php
thng thng ca lnh SELECT l
[WITH with_queries] SELECT select_list FROM table_expression [sort_specification]

Cc phn sau y m t cc chi tit ca danh sch chn, biu thc ca bng, v c t cc kiu. Cc
truy vn WITH c cp cui cng v chng l mt tnh nng cao cp.
Mt dng truy vn n gin c dng:
SELECT * FROM table1;

Gi thit rng c mt bng c tn l table1, th lnh ny c th truy xut tt c cc hng v tt c cc


ct t table1. (Phng php truy xut ph thuc vo ng dng my trm. V d, chng trnh psql
vi hin th mt bng dng ASCII trn mn hnh, trong khi cc th vin my trm s a ra cc hm
truy xut cc gi tr ring r t kt qu ca truy vn ). c t ca danh sch chn * ngha l tt
c cc ct m biu thc bng ngu nhin a ra. Mt danh sch chn cng c th chn mt tp con
ca cc ct c sn hoc thc hin cc tnh ton bng vic s dng cc ct. V d, nu table1 c cc
ct c tn l a, b, v c (v c l cc tn khc na) th bn c th lm truy vn sau:
SELECT a, b + c FROM table1;

(gi thit rng a, b v c l dng d liu s). Xem Phn 7.3 c thm cc chi tit.
l mt dng biu thc bng n gin: n ch c mt bng. Ni chung, cc biu thc
bng c th l cc cu trc phc tp ca cc bng c bn, cc ghp ni lin kt v cc truy vn con.
Nhng bn cng c th b qua ton b biu thc bng v s dng lnh SELECT nh mt my tnh:
FROM table1

SELECT 3 * 4;

iu ny l hu dng hn nu cc biu thc trong danh sch chn tr v cc kt qu khc nhau. V


d, bn c th gi mt hm theo cch ny:
SELECT random();

7.2. Biu thc bng


Mt biu thc bng tnh ton mt bng. Biu thc bng bao gm mt mnh FROM m ty chn i
theo l cc mnh WHERE, GROUP BY, v HAVING. Cc biu thc bng thng thng n gin tham
chiu ti mt bng trn a, mt ci gi l bng c s, nhng nhiu biu thc phc tp hn c th

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 109/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

c s dng sa i hoc kt hp cc bng c s theo cc cch thc khc nhau.


Cc mnh ty chn WHERE, GROUP BY,v HAVING trong biu thc bng ch nh mt ng ti
cc bin i k tip nhau c thc hin trong bng c dn xut trong mnh FROM. Tt c
nhng bin i to ra mt bng o cung cp cc hng m c truyn ti danh sch chn tnh
ton cc hng u ra ca truy vn.

7.2.1. Mnh FROM


Mnh FROM xut pht t mt hoc nhiu bng c a ra theo mt danh sch tham chiu cc
bng cch bit nhau bng du phy.
FROM table_reference [, table_reference [, ...]]

Mt tham chiu bng c th l mt tn bng (c kh nng l s iu kin), hoc mt bng dn


xut nh mt truy vn con, mt lin kt bng hoc cc t hp phc tp ca chng. Nu nhiu hn
mt tham chiu bng c lit k trong mnh FROM th chng c lin kt cho (xem bn di)
to thnh bng trung gian o m c th sau tun theo nhng bin i ca cc mnh WHERE,
GROUP BY, v HAVING v cui cng l kt qu ca ton b biu thc bng.
Khi mt tham chiu bng gi tn mt bng l cha ca tn ti trt t k tha ca mt bng, th t kha
ONLY i trc tn bng . Tuy nhin, tham chiu ch to ra cc ct m xut hin trong bng c
tn - bt k ct no c b sung trong cc bng con cng s b b qua.
Thay v vit ONLY trc tn bng, bn c th vit * sau tn bng ch nh mt cch r rng
rng cc bng con c a vo. Vic vit * l khng nht thit v hnh vi l mc nh (tr
phi bn thay i thit lp la chn cu hnh ca sql_inheritance). Tuy nhin vic vit * c th l
hu dng nhn mnh rng cc bng b sung thm s c tm kim.
7.2.1.1. Bng kt ni

Mt bng c kt ni l mt bng c dn xut t 2 bng khc (thc hoc c dn xut) theo


cc qui tc ca dng kt ni c bit, vng ngoi, v cc lin kt cho l sn sng.
Cc dng lin kt
Lin kt cho
T1 CROSS JOIN T2

i vi tng s kt hp c kh nng ca cc hng t T1 v T2 (nh, mt sn phm Cartesian


[ cc]), bng c kt ni s c mt hng gm tt c cc ct trong T1 theo sau l tt c
cc ct trong T2. Nu cc bng c N v M hng mt cch tng ng, th bng c lin kt s
c N * M hng.
FROM T1 CROSS JOIN T2 is equivalent to FROM T1, T2 . It is also equivalent to FROM T1
INNER JOIN T2 ON TRUE (see below).

Cc lin kt c iu kin

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 110/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 ON boolean_expression


T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 USING ( join column list )
T1 NATURAL { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2

Cc t vng trong INNER v vng ngoi OUTER l ty chn trong tt c cc mu.


mc nh; LEFT, RIGHT, v FULL ng mt lin kt vng ngoi.

INNER

iu kin lin kt c ch nh trong mnh ON hoc USING, hoc n vi t NATURAL.


iu kin lin kt xc nh cc hng no t 2 bng ngun c xem l khp, nh c
gii thch chi tit bn di.
Mnh ON l dng iu kin lin kt chung nht: n ly mt biu thc gi tr Boolean ca
dng y ht nh c s dng trong mnh WHERE. Mt cp cc hng t T1 v T2 khp nu
biu thc ON nh gi l ng i vi chng.
l k hiu tc k: n ly mt danh sch cc tn ct cch nhau bng mt du phy m
cc bng c lin kt phi c, ni chung, v to nn mt iu kin lin kt ch nh s
ngang bng ca tng trong cc cp cc ct . Hn na, u ra ca JOIN USING c mt ct
cho tng trong cc cp ngang bng ca cc ct u vo, theo sau l cc ct cn li t tng
bng. V th, USING (a, b, c) l tng ng vi ON (t1.a = t2.a AND t1.b = t2.b AND t1.c =
t2.c) vi ngoi l l nu ON c s dng th s l 2 ct a, b, v c trong kt qu, trong vi
USING s ch l mt ca tng bng (v chng s xut hin trc nu SELECT * c s dng).
Cui cng, NATURAL l mt dng tc k ca USING: n hnh thnh mt danh sch USING bao
gm tt c cc tn ct xut hin trong c 2 bng u vo. Nh vi USING, cc ct ch xut
hin mt ln trong bng u ra.
USING

Cc dng c kh nng ca lin kt iu kin l:


INNER JOIN (Lin kt bn trong)

i vi tng hng R1 ca bng T1, bng c lin kt c mt hng cho tng hng trong
bng T2 tha mn iu kin lin kt vi R1.
LEFT OUTER JOIN (Lin kt tri bn ngoi)

Trc tin, mt lin kt bn trong c thc hin. Sau , i vi tng hng trong T1 m
khng lm tha mn iu kin lin kt vi bt k hng no trong T2, th mt hng c lin
kt c thm vo vi cc gi tr null trong cc ct ca T2.
RIGHT OUTER JOIN (Lin kt phi bn ngoi)

Trc tin, mt lin kt bn trong c thc hin. Sau , i vi tng hng trong T2 m
khng lm tha mn iu kin lin kt vi bt k hng no trong T1, th mt hng c lin
kt c thm vo vi cc gi tr null trong cc ct ca T1.
FULL OUTER JOIN (Lin kt y bn ngoi)

Trc ht, mt lin kt bn trong c thc hin. Sau , i vi tng hng trong T1 m
khng lm tha mn iu kin lin kt vi bt k hng no trong T2, th mt hng c lin
kt c thm vo vi cc gi tr null trong cc ct T2. Hn na, i vi tng hng ca T2

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 111/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

m khng lm tha mn iu kin lin kt vi bt k hng no trong T1, th mt hng c


lin kt vi cc gi tr null trong cc ct T1 s c thm vo.
Cc lin kt ca tt c cc dng c th c ni thnh chui cng nhau hoc c lng: c T1 v T2
u c th l cc bng c lin kt. Cc du ngoc n c th c s dng xung quanh cc mnh
JOIN kim sot trt t lin kt. Thiu cc du ngoc n th cc mnh JOIN lng nhau t tri
qua phi.
t iu ny cng nhau, gi thit chng ta c cc bng t1:
num | name
------+-----1|a
2|b
3|c

t2:

num | value
------+------1 | xxx
3 | yyy
5 | zzz

sau chng ta c cc kt qu sau cho cc lin kt khc nhau:


=> SELECT * FROM t1 CROSS JOIN t2;

num | name | num | value


------+--------+-------+---------1|
a|
1 | xxx
1|
a|
3 | yyy
1|
a|
5 | zzz
2|
b|
1 | xxx
2|
b|
3 | yyy
2|
b|
5 | zzz
3|
c|
1 | xxx
3|
c|
3 | yyy
3|
c|
5 | zzz
(9 rows)
=> SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num;

num | name | num | value


------+--------+-------+---------1|
a|
1 | xxx
3|
c|
3 | yyy
(2 rows)
=> SELECT * FROM t1 INNER JOIN t2 USING (num);

num | name | value


------+--------+---------1|
a | xxx
3|
c | yyy
(2 rows)
=> SELECT * FROM t1 NATURAL INNER JOIN t2;

num | name | value


------+---------+---------1|
a | xxx
3|
c | yyy
(2 rows)
=> SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num;

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 112/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

num | name | num | value


-----+--------+-------+---------1|
a|
1 | xxx
2|
b|
|
3|
c|
3 | yyy
(3 rows)
=> SELECT * FROM t1 LEFT JOIN t2 USING (num);

num | name | value


------+--------+---------1|
a | xxx
2|
b|
3|
c | yyy
(3 rows)
=> SELECT * FROM t1 RIGHT JOIN t2 ON t1.num = t2.num;

num | name | num | value


-----+--------+-------+---------1|
a|
1 | xxx
3|
c|
3 | yyy
|
|
5 | zzz
(3 rows)
=> SELECT * FROM t1 FULL JOIN t2 ON t1.num = t2.num;

num | name | num | value


------+--------+-------+---------1|
a|
1 | xxx
2|
b|
|
3|
c|
3 | yyy
|
|
5 | zzz
(4 rows)

iu kin lin kt c ch nh vi
ti lin kt .

ON

cng c th c cc iu kin m khng lin quan trc tip

iu ny c th chng minh l hu dng i vi mt s truy vn nhng cn phi c suy ngh cn


thn. V d:
=> SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num AND t2.value = xxx;

num | name | num | value


------+--------+-------+---------1|
a|
1 | xxx
2|
b|
|
3|
c|
|
(3 rows)

Lu rng vic t ra hn ch trong mnh WHERE to ra mt kt qu khc:


=> SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num WHERE t2.value = xxx;

num | name | num | value


------+--------+-------+---------1|
a|
1 | xxx
(1 row)

iu ny l v mt hn ch c t trong mnh ON c x l trc lin kt, trong khi mt hn


ch c t trong mnh WHERE c x l sau lin kt.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 113/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

7.2.1.2. Tn hiu ca bng v ct

Mt tn tm thi c th c trao cho cc bng v cc tham chiu bng phc tp c s dng


cho cc tham chiu ti bng dn xut trong phn cn li ca truy vn. iu ny c gi l mt tn
hiu (alias) ca mt bng.
to tn hiu ca mt bng, hy vit
FROM table_reference AS alias

hoc
FROM table_reference alias

T kha AS l nhiu ty chn, alias c th l bt k m nh danh no.


ng dng in hnh ca cc tn hiu bng l ch nh cc m nh danh ngn cho cc tn bng
di gi cho cc mnh lin kt d c. V d:
SELECT * FROM some_very_long_table_name s JOIN another_fairly_long_name a ON s.id = a.num;

Tn hiu tr thnh tn mi ca tham chiu bng cho ti nay nh truy vn hin hnh c quan tm
- khng c php tham chiu ti bng bng tn gc bt k u khc trong truy vn . V th,
iu ny l khng hp l:
SELECT * FROM my_table AS m WHERE my_table.a > 5; --

sai

Cc tn hiu ca bng ch yu l v s thun tin, nhng l cn thit s dng chng khi lin kt
mt bng ti bn thn n, nh:
SELECT * FROM people AS mother JOIN people AS child ON mother.id = child.mother_id;

Hn na, mt tn hiu c yu cu nu tham chiu bng l mt truy vn con (xem Phn 7.2.1.3).
Cc du ngoc n s c s dng gii quyt nhng t m. Trong v d sau, lnh u tin ch
nh tn hiu b cho s xut hin th 2 ca my_table, nhng lnh th 2 ch nh tn hiu cho kt qu
ca lin kt:
SELECT * FROM my_table AS a CROSS JOIN my_table AS b ...
SELECT * FROM (my_table AS a CROSS JOIN my_table) AS b ...

Dng khc to tn hiu a ra cc tn tm thi cho cc ct ca bng, cng nh bn thn bng:


FROM table_reference [AS] alias ( column1 [, column2 [, ...]] )

Nu t tn hiu ct hn c ch nh so vi bng thc t c cc ct, th cc ct cn li s khng


c i tn. C php ny c bit hu dng cho cc lin kt t thn hoc cc truy vn con.
Khi mt tn hiu c p dng cho u ra ca mt mnh lin kt
gc trong JOIN. V d:

JOIN,

th tn hiu n i (cc) tn

SELECT a.* FROM my_table AS a JOIN your_table AS b ON ...

l SQL hp l, nhng:
SELECT a.* FROM (my_table AS a JOIN your_table AS b ON ...) AS c

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 114/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

l khng hp l; tn hiu bng a l khng nhn thy c bn ngoi tn hiu c.


7.2.1.3. Truy vn con

Cc truy vn con (hoc ph) ch nh mt bng dn xut phi nm trong cc du ngoc n v phi
c ch nh cho mt tn hiu bng. (Xem Phn 7.2.1.2). V d:
FROM (SELECT * FROM table1) AS alias_name

V d ny l tng ng vi FROM table1 AS alias_name. Cc trng hp th v hn, chng khng


th c gim v mt lin kt thng, lm ny sinh truy vn con c lin quan ti vic to nhm
hoc tng hp.
Mt truy vn con cng c th l mt danh sch cc gi tr VALUES:
FROM (VALUES (anne, smith), (bob, jones), (joe, blow))
AS names(first, last)

Mt ln na, mt tn hiu bng c yu cu. Vic ch nh cc tn hiu cho cc ct ca danh sch


VALUES l ty chn, nhng l thc tin tt. c thm thng tin, xem Phn 7.7.
7.2.1.4. Hm bng

Cc hm bng l cc hm to ra mt tp hp cc hng, c lm hoc t cc dng d liu c bn


(cc dng v hng) hoc cc dng d liu tng hp (cc hng ca bng). Chng c s dng
ging nh mt bng, kiu nhn hoc truy vn con trong mnh FROM ca mt truy vn. Cc ct
c cc hm bng tr v c th c a vo trong cc mnh SELECT, JOIN, hoc WHERE theo
cch thc y ht nh mt bng, kiu nhn hoc ct ca truy vn con.
Nu mt hm bng tr v mt dng d liu c bn, th tn ct kt qu duy nht s khp vi tn hm.
Nu hm tr v mt dng tng hp, th cc ct kt qu c cc tn y ht nh cc thuc tnh ring r
ca dng .
Mt hm bng c th c gn tn hiu trong mnh FROM, nhng n cng c th khng c tn
hiu. Nu mt hm c s dng trong mnh FROM khng c tn hiu, th tn hm c s dng
nh l tn bng kt qu. Mt s v d:
CREATE TABLE foo (fooid int, foosubid int, fooname text);
CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$
SELECT * FROM foo WHERE fooid = $1;
$$ LANGUAGE SQL;
SELECT * FROM getfoo(1) AS t1;
SELECT * FROM foo
WHERE foosubid IN
(
SELECT foosubid
FROM getfoo(foo.fooid) z
WHERE z.fooid = foo.fooid
);
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo(1);
SELECT * FROM vw_getfoo;

Trong mt s trng hp, l hu dng nh ngha cc hm bng m c th tr v cc tp hp cc

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 115/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ct khc nhau, ph thuc vo cch m chng c gi. h tr iu ny, hm bng c th c


khai bo nh l vic tr v dng gi (pseudotype) record. Khi mt hm nh vy c s dng trong
mt truy vn, cu trc hng c mong i phi c ch nh trong bn thn truy vn , sao cho
h thng c th bit cch phn tch c php v ln k hoch cho truy vn. Hy xem xt v d ny:
SELECT *
FROM dblink(dbname=mydb, SELECT proname, prosrc FROM pg_proc)
AS t1(proname name, prosrc text)
WHERE proname LIKE bytea%;

Hm dblink thc thi mt truy vn xa (xem contrib/dblink). N c khai bo tr v record v n


c l c s dng cho bt k dng truy vn no. Tp hp cc ct thc s phi c ch nh trong
vic gi truy vn sao cho trnh phn tch c php bit c, v d, * s m rng ci g.

7.2.2. Mnh WHERE


C php ca mnh WHERE l
WHERE search_condition

trong
boolean.

search_condition

l bt k biu thc gi tr no (xem Phn 4.2) m tr v mt gi tr dng

Sau khi x l mnh FROM, mi hng ca bng o dn xut c kim tra i vi iu kin tm
kim. Nu kt qu ca iu kin l ng, th hng c gi trong bng u ra, nu khng (nh,
nu kt qu l sai hoc null) th s b b. iu kin tm kim thng tham chiu t nht ti mt ct
ca bng c to ra trong mnh FROM; iu ny khng b yu cu, nhng nu khng th mnh
WHERE s kh l v dng.
Lu : iu kin lin kt ca mt lin kt vng trong c th c vit hoc trong mnh
WHERE hoc trong mnh JOIN. V d, cc biu thc bng sau l tng ng:
FROM a, b WHERE a.id = b.id AND b.val > 5

v:
FROM a INNER JOIN b ON (a.id = b.id) WHERE b.val > 5

hoc thm ch c th:


FROM a NATURAL JOIN b WHERE b.val > 5

Ci no trong s ny bn s dng ch l vn chn kiu. C php JOIN trong mnh FROM


c l khng kh chuyn c nh vi cc h qun tr c s d liu SQL khc, thm ch d
n l theo tiu chun SQL. i vi cc lin kt bn ngoi th khng c s la chn: chng
phi c thc hin theo mnh FROM. Mnh ON hoc USING ca lin kt vng ngoi l
khng tng ng vi iu kin WHERE, v n cho kt qu l s b sung cc hng (i vi
cc hng u vo khng khp) cng nh s loi b cc hng trong kt qu cui cng.
y l mt s v d ca cc mnh WHERE:
SELECT ... FROM fdt WHERE c1 > 5
SELECT ... FROM fdt WHERE c1 IN (1, 2, 3)

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 116/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


SELECT
SELECT
SELECT
SELECT

...
...
...
...

FROM
FROM
FROM
FROM

fdt
fdt
fdt
fdt

WHERE
WHERE
WHERE
WHERE

Xut bn nm 2013

c1 IN (SELECT c1 FROM t2)


c1 IN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10)
c1 BETWEEN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10) AND 100
EXISTS (SELECT c1 FROM t2 WHERE c2 > fdt.c1)

l bng dn xut trong mnh FROM. Cc hng m khng p ng c iu kin tm kim ca


mnh WHERE b loi b khi fdt. Lu s dng cc truy vn con v hng nh cc biu thc gi
tr. Ht nh bt k truy vn no khc, cc truy vn con c th s dng cc biu thc bng phc tp.
Cng lu cch m fdt c tham chiu trong cc truy vn con. Vic nh phm cht c1 nh fdt.c1
ch nht thit nu c1 cng l tn ca mt ct trong bng u vo dn xut ca truy vn con. Nhng
vic nh phm cht tn ct b sung thm s r rng minh bch thm ch khi n l khng cn thit.
V d ny ch ra cch m ct nu phm vi ca mt truy vn vng ngoi m rng trong cc truy vn
vng trong ca n.
fdt

7.2.3. Cc mnh GROUP BY v HAVING


Sau khi i qua b lc WHERE, bng u vo dn xut c th tun theo vic to nhm, bng vic s
dng mnh GROUP BY, v loi b cc hng ca nhm bng vic s dng mnh HAVING.
SELECT select_list
FROM ...
[WHERE ...]
GROUP BY grouping_column_reference [, grouping_column_reference]...

Mnh GROUP BY c s dng to nhm cng cc hng trong mt bng m c cng y ht cc


gi tr trong tt c cc ct c lit k. Trt t theo cc ct c lit k khng l vn . Hiu
ng l kt hp tng tp hp cc hng c cng cc gi tr vo trong mt hng ca nhm m i
din cho tt c cc hng trong nhm . iu ny c thc hin loi b s d tha u ra
v/hoc tnh ton cc tng m p dng cho cc nhm .
V d:
=> SELECT * FROM test1;

x |y
---+--a|3
c|2
b|5
a|1
(4 rows)
=> SELECT x FROM test1 GROUP BY x;

x
--a
b
c
(3 rows)

Trong truy vn th 2, chng ta c th khng vit SELECT * FROM test1 GROUP BY x, v khng c
gi tr duy nht cho ct y m c th c lin kt vi tng nhm. Cc ct c nhm c th c tham
chiu trong danh sch chn v chng c mt gi tr duy nht trong tng nhm.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 117/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Ni chung, nu mt bng c nhm, th cc ct m khng c lit k trong GROUP BY khng th


c tham chiu ngoi tr trong cc biu thc tng hp. Mt v d vi cc biu thc tng hp l:
=> SELECT x, sum(y) FROM test1 GROUP BY x;

x | sum
---+----a|4
b|5
c|2
(3 rows)

y tng (sum) l mt hm tng hp m tnh mt gi tr duy nht i vi ton b nhm. Thng


tin nhiu hn v cc hm tng hp c sn c th thy trong Phn 9.18.
Mo: Vic to nhm m khng c cc biu thc tng hp tnh ton c hiu qu tp hp cc
gi tr c nht trong mt ct. iu ny cng c th t c bng vic s dng mnh
DISTINCT (xem Phn 7.3.3).
y l mt v d khc: n tnh ton tng tin bn hng cho tng sn phm (thay v tng tin bn
hng ca tt c cc sn phm):
SELECT product_id, p.name, (sum(s.units) * p.price) AS sales
FROM products p LEFT JOIN sales s USING (product_id)
GROUP BY product_id, p.name, p.price;

Trong v d ny, cc ct product_id, p.name, v p.price phi nm trong mnh GROUP BY v chng
c tham chiu trong danh sch chn ca truy vn. (Ph thuc vo cch m bng cc sn phm
c thit lp, tn v gi c th hon ton ph thuc vo m ID sn phm, nn vic to cc nhm
b sung c th v l thuyt l khng cn thit, d iu ny khng c trin khai). Ct s.units khng
phi nm trong danh sch GROUP BY v n ch c s dng trong mt biu thc tng hp (sum(...) ),
n th hin tin bn hng ca mt sn phm. i vi tng sn phm, truy vn tr v mt hng
tng tt c tin bn hng ca sn phm .
Trong SQL kht khe, GROUP BY ch c th nhm theo cc ct ca bng ngun nhng PostgreSQL
m rng iu ny cng cho php GROUP BY i vi nhm theo cc ct trong danh sch chn.
Vic nhm theo cc biu thc gi tr thay v cc tn ct n gin cng c php.
Nu mt bng tng c nhm bng vic s dng GROUP BY, nhng ch cc nhm nht nh c
quan tm, th mnh HAVING c th c s dng, rt ging mt mnh WHERE, loi b cc
nhm khi kt qu . C php l:
SELECT select_list FROM ... [WHERE ...] GROUP BY ... HAVING boolean_expression

Cc biu thc trong mnh HAVING c th tham chiu ti c cc biu thc c nhm v cc biu
thc khng c nhm (chng nht thit lin quan ti mt hm tng hp). V d:
=> SELECT x, sum(y) FROM test1 GROUP BY x HAVING sum(y) > 3;

x | sum
---+----a|4
b|5
(2 rows)

=> SELECT x, sum(y) FROM test1 GROUP BY x HAVING x < c;

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 118/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

x | sum
---+----a|4
b|5
(2 rows)

Mt ln na, mt v d thc tin hn:


SELECT product_id, p.name, (sum(s.units) * (p.price - p.cost)) AS profit
FROM products p LEFT JOIN sales s USING (product_id)
WHERE s.date > CURRENT_DATE - INTERVAL 4 weeks
GROUP BY product_id, p.name, p.price, p.cost
HAVING sum(p.price * s.units) > 5000;

Trong v d trn, mnh WHERE ang chn cc hng theo mt ct m khng c nhm (biu
thc ch ng cho cc bn hng trong 4 tun cui), trong khi mnh HAVING hn ch u ra i vi
cc nhm vi tng lng bn hng hn 5.000. Lu rng cc biu thc tng hp khng nht thit
cn phi l y ht trong tt c cc phn ca truy vn.
Nu mt truy vn gm cc li gi hm tng hp, nhng khng c mnh GROUP BY, th vic nhm
vn xy ra; kt qu l mt hng nhm duy nht (hoc c l khng hng no c, nu hng duy nht
sau b HAVING loi b). Y ht l ng nu n c mnh HAVING, thm ch khng c bt k li
gi hm tng hp no hoc mnh GROUP BY no.

7.2.4. X l hm ca s
Nu truy vn c bt k hm ca s no (xem Phn 3.5, Phn 9.19 v Phn 4.2.8), th cc hm
c nh gi sau bt k vic to nhm, tng hp v lc HAVING no c thc hin. l, nu
truy vn s dng bt k tng hp GROUP BY hoc HAVING no th cc hng c cc hm ca s xem
l cc hng ca nhm thay v cc hng ca bng gc t FROM /WHERE.
Khi nhiu hm ca s c s dng, tt c cc hm ca s, v mt c php tng ng vi cc
mnh PARTITION BY v ORDER BY trong cc nh ngha ca s c m bo s c nh gi
theo mt s truyn d liu duy nht. V th chng s thy cng y ht vic sp xp trt t, thm ch
nu ORDER BY khng xc nh mt cch duy nht mt trt t. Tuy nhin, khng m bo no c
thc hin i vi s nh gi cc hm c cc c t khc nhau v PARTITION BY hoc ORDER BY.
(Trong cc trng hp nh vy mt bc sp xp in hnh c yu cu gia cc vic truyn cc
nh gi hm ca s, v s sp xp khng c m bo gi li trt t cc hng m ORDER BY
ca n coi nh l tng ng).
Hin hnh, cc hm ca s lun yu cu cc d liu trc khi c sp xp, v v th u ra ca
truy vn s c trt t theo cch ny hay cch khc ca cc mnh PARTITION BY /ORDER BY i vi
cc hm ca s. Tuy nhin, khng c khuyn co da vo iu ny. Hy s dng mt mnh
ORDER BY mc nh r rng nu bn mun chc chn cc kt qu c sp xp theo mt cch thc
c bit.

7.3. Danh sch chn


Nh c ch ra trong phn trc, biu thc bng trong lnh

SELECT

to ra mt bng o trung gian

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 119/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

bng vic c kh nng kt hp cc bng, cc kiu nhn, vic loi b cc hng, vic to nhm,
Bng ny cui cng c truyn ti cho vic x l bng danh sch chn. Danh sch chn xc nh
cc ct no ca bng trung gian thc s s l u ra.

7.3.1. Cc khon ca danh sch chn


Dng n gin nht ca danh sch chn l * m n a ra tt c cc ct m biu thc bng to ra.
Nu khng, mt danh sch chn l mt danh sch cc biu thc gi tr cch nhau bng du phy
(nh c xc nh trong Phn 4.2). V d, n c th l mt danh sch cc tn ct:
SELECT a, b, c FROM ...

Cc tn ct a, b, v c hoc l cc tn thc ca cc ct ca cc bng c tham chiu trong mnh


FROM, hoc l cc tn hiu c a ra cho chng nh c gii thch trong Phn 7.2.1.2. Khng
gian tn sn sng trong danh sch chn l y ht nh trong mnh WHERE, tr phi vic to nhm
c s dng, trong trng hp n l y ht nh mnh HAVING.
Nu hn mt bng c mt ct vi tn y ht, th tn bng cng phi c a ra, nh trong:
SELECT tbl1.a, tbl2.a, tbl1.b FROM ...

Khi lm vic vi nhiu bng, cng c th hu dng yu cu tt c cc ct ca mt bng c bit:


SELECT tbl1.*, tbl2.a FROM ..

(Xem thm Phn 7.2.2).


Nu mt biu thc gi tr ty chn c s dng trong danh sch chn, theo nguyn tc, n b sung
thm mt ct o mi vo bng c tr v . Biu thc gi tr c nh gi mi ln cho tng
hng kt qu, vi cc gi tr hng c thay th cho bt k tham chiu ct no. Nhng biu thc
trong danh sch chn khng phi tham chiu ti bt k ct no trong biu thc bng ca mnh
FROM; chng c th l cc biu thc tnh s hc cc hng s, v d th.

7.3.2. Nhn ct
Cc khon u vo trong danh sch chn c th l cc tn c ch nh cho vic x l sau, nh
s dng trong mt mnh ORDER BY hoc hin th i vi ng dng my trm. V d:
SELECT a AS value, b + c AS sum FROM ...

Nu khng c tn ct u ra no c ch nh bng vic s dng AS, th h thng ch nh mt tn


ct mc nh. i vi cc tham chiu ct n gin, y l tn ca ct c tham chiu. i vi cc
li gi hm, y l tn ca hm. i vi cc biu thc phc tp, h thng s sinh ra tn chung.
T kha AS l ty chn, nhng ch nu tn ct mi khng khp vi bt k t kha PostgreSQL no
(xem Ph lc C). trnh mt s trng khp ngu nhin vi mt t kha, bn c th a vo trong
cc du ngoc kp tn ct . V d, VALUE l mt t kha, nn iu ny khng lm vic:
SELECT a value, b + c AS sum FROM ...

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 120/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

nhng iu ny th lm vic:
SELECT a "value", b + c AS sum FROM ...

bo v chng li vic c thm cc t kha c kh nng trong tng lai, c khuyn co rng
bn lun hoc vit AS hoc cho vo trong ngoc kp tn ct u ra.
Lu : Vic t tn cc ct u ra y l khc so vi c lm trong mnh FROM (xem
Phn 7.2.1.2). C kh nng i tn ct y ht 2 ln, nhng tn c ch nh trong danh
sch chn l tn m s c chuyn i.

7.3.3. Khc bit - DISTINCT


Sau khi danh sch chn c x l, bng kt qu c th ty tun theo s loi tr cc hng p
bn. T kha DISTINCT c vit trc tip sau SELECT ch nh iu ny:
SELECT DISTINCT select_list ...

(Thay v DISTINCT, t kha ALL c th c s dng ch nh hnh vi mc nh ca vic gi li tt


c cc hng).
R rng, 2 hng c xem l phn bit r rng nu chng khc nhau t nht 1 gi tr ct. Cc gi tr
null c coi l bng nhau trong so snh ny.
Nh mt s la chn, mt biu thc ty c th xc nh cc hng no s c coi l phn bit:
SELECT DISTINCT ON (expression [, expression ...]) select_list ...

Biu thc y l mt biu thc gi tr ty chn c nh gi cho tt c cc hng. Mt tp hp


cc hng theo tt c cc biu thc l bng nhau c xem l p bn, v ch hng u tin ca
tp hp c sp xp trong cc ct m bo vic sp xp trt t c nht hoc cc hng i
n c s lc DISTINCT. (Vic x l DISTINCT ON xy ra sau vic sp xp ORDER BY).
Mnh DISTINCT ON khng phi l mt phn ca tiu chun SQL v i khi c xem l kiu ti
t v bn cht t nhin trung gian tim tng cc kt qu ca n. Vi vic s dng thn trng mnh
GROUP BY v cc truy vn ph trong FROM, cu trc ny c th trnh c, nhng n thng l
la chn thun tin nht.

7.4. Kt hp cc truy vn
Cc kt qu ca 2 truy vn c th c kt hp bng vic s dng s kt hp tp hp cc hot ng,
s giao nhau v s khc nhau.
C php l
query1 UNION [ALL] query2
query1 INTERSECT [ALL] query2
query1 EXCEPT [ALL] query2

v query2 l cc truy vn c th s dng bt k tnh nng no c tho lun cho ti thi


im ny. Tp hp cc hot ng cng c th c lng nhau v xu thnh chui, v d
query1

query1 UNION query2 UNION query3

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 121/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

n c thc thi nh:


(query1 UNION query2) UNION query3

ni thm mt cch hiu qu kt qu ca query2 cho kt qu ca query1 (d khng c s m


bo no rng iu ny l trt t theo cc hng thc s c tr v). Hn na, n loi b cc hng
p bn khi kt qu ca n, theo cch y ht nh DISTINCT, tr phi UNION ALL c s dng.
UNION

tr v tt c cc hng nm trong kt qu ca query1 v trong kt qu ca


bn cc hng b loi tr, tr phi INTERSECT ALL c s dng.
INTERSECT

query2.

tr v tt c cc hng nm trong kt qu ca query1 nhng khng nm trong kt qu ca


query2. (iu ny i khi c gi l s khc bit gia 2 truy vn). Mt ln na, cc p bn b loi
tr, tr phi EXCEPT ALL c s dng.
EXCEPT

tnh ton s kt hp, s giao nhau hoc s khc nhau ca 2 truy vn, 2 truy vn phi l
tng thch kt hp, c ngha l chng tr v s ct y ht v cc ct tng ng c cc dng d
liu tng thch, nh c m t trong Phn 10.5.

7.5. Sp xp hng
Sau khi mt truy vn sn sinh ra mt bng u ra (sau khi danh sch chn c x l), n c th
c sp xp ty . Nu vic sp xp khng c chn, th cc hng s c tr v theo mt trt t
khng c ch nh. Trt t thc s trong trng hp s ph thuc vo cc dng qut v lin kt
v trt t trn a, nhng n phi khng c da vo. Mt trt t sp xp u ra c bit ch c th
c m bo nu bc sp xp c chn r rng.
Mnh ORDER BY ch nh trt t sp xp:
SELECT select_list
FROM table_expression
ORDER BY sort_expression1 [ASC | DESC] [NULLS { FIRST | LAST }]
[, sort_expression2 [ASC | DESC] [NULLS { FIRST | LAST }] ...]

(Cc) biu thc sp xp c th l bt k biu thc no c th l hp l trong danh sch chn ca


truy vn. Mt v d l:
SELECT a, b FROM table1 ORDER BY a + b, c;

Khi nhiu hn mt biu thc c ch nh, cc gi tr sau s c s dng sp xp cc hng


bng nhau theo cc gi tr trc . Mi biu thc c th c ng sau mt t kha ty chn ASC
hoc DESC thit lp hng sp xp tng hoc gim. Trt t ASC l mc nh. Trt t tng t cc
gi tr nh hn trc, ni m nh hn c xc nh theo ton t nh hn (<). Tng t, trt t
gim c xc nh vi ton t ln hn (>)1.
Cc la chn NULLS FIRST v NULLS LAST c th c s dng xc nh liu cc null c xut hin
1

Thc s, PostgreSQL s dng lp ton t mc nh B-tree cho dng d liu ca biu thc xc nh trt t sp
xp ASC v DESC. Theo qui c, cc dng d liu s c thit lp sao cho cc ton t < and > tng ng vi trt
t sp xp ny, nhng mt nh thit k dng d liu do ngi s dng nh ngha c th chn lm th g khc.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 122/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

trc hay sau cc gi tr khng null trong trt t sp xp hay khng. Mc nh, cc gi tr null sp
xp dng nh ln hn so vi bt k gi tr khng null (non-null) no; l, NULLS FIRST l mc
nh cho trt t DESC, nu khc th l NULLS LAST.
Lu rng cc la chn sp xp trt t c xem l c lp i vi tng ct sp xp. V d ORDER
BY x, y DESC c ngha l ORDER BY x ASC, y DESC, n khng l y ht nh ORDER BY x DESC, y DESC.
Mt sort_expression cng c th l nhn ct hoc s ca mt ct u ra, nh trong:
SELECT a + b AS sum, c FROM table1 ORDER BY sum;
SELECT a, max(b) FROM table1 GROUP BY a ORDER BY 1;

c 2 cch u sp xp theo ct u ra u tin. Lu rng tn mt ct u ra phi ng mt


mnh, l, n khng th c s dng trong mt biu thc - v d, iu ny l khng ng:
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- wrong

Hn ch ny c thc hin lm gim s t m. Vn c s t m nu mt khon ORDER BY l


mt tn n gin c th khp hoc mt tn ct u ra hoc mt ct t biu thc bng. Ct u ra
c s dng trong cc trng hp nh vy. iu ny ch c th gy ra s lng tng nu bn s
dng AS i tn mt ct u ra khp vi mt s tn ct ca bng khc.
c th c p dng cho kt qu ca mt s kt hp UNION, INTERSECT, v EXCEPT, nhng
trong trng hp ny n ch c php sp xp theo cc tn hoc cc s ct u ra, khng theo cc
biu thc.
ORDER BY

7.6. LIMIT v OFFSET


LIMIT

v OFFSET cho php truy xut ch mt phn cc hng c phn cn li ca truy vn to ra:

SELECT select_list
FROM table_expression
[ ORDER BY ... ]
[ LIMIT { number | ALL } ] [ OFFSET number ]

Nu mt s tnh ton hn ch c a ra, khng nhiu hn vic nhiu hng s c tr v (nhng


c th l t hn, nu bn thn truy vn c t hng hn). LIMIT ALL l y ht nh vic b qua mnh
LIMIT.
ni b qua nhiu hng trc khi bt u tr v cc hng. OFFSET 0 l y ht nh vic b
qua mnh OFFSET, v LIMIT NULL l y ht nh vic b qua mnh LIMIT. Nu c OFFSET v LIMIT
u xut hin, th cc hng OFFSET c b qua trc khi bt u tnh cc hng LIMIT s c tr v.
OFFSET

Khi s dng LIMIT, iu quan trng phi s dng mt mnh ORDER BY m rng buc cc hng kt
qu vo mt trt t c nht. Nu khng th bn s c mt tp con cc hng ca truy vn mt
cch khng th on trc c. Bn c th c yu cu t 10-20 hng, nhng 10-20 theo trt t
sp xp no? Trt t sp xp l khng r, tr phi bn ch nh ORDER BY.
Trnh ti u ha truy vn tnh ti LIMIT khi to cc k hoch truy vn, nn bn rt c kh nng c cc
k hoch khc nhau (c cc trt t hng khc nhau) ph thuc vo nhng g bn trao cho LIMIT v
OFFSET. V th, vic s dng cc gi tr khc nhau ca LIMIT/OFFSET chn cc tp con khc nhau

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 123/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

kt qu ca mt truy vn s a ra cc kt qu khng nht qun, tr phi bn p tun th mt trt t


sp xp cc kt qu c kh nng on trc c vi ORDER BY. y khng phi l mt li; n l
mt h qu k tha ca thc t rng SQL khng ha hn phn phi cc kt qu ca mt truy vn
theo bt k trt t c bit no, tr phi ORDER BY c s dng rng buc trt t .
Cc hng b mnh OFFSET b qua vn phi c tnh ton bn trong my ch; v th mt
ln c l l khng hiu qu.

OFFSET

7.7. Danh sch gi tr


a ra mt cch thc to mt bng cc hng s m c th c s dng trong mt truy
vn m thc s khng phi to ra v a d liu vo mt bng trn a. C php l:
VALUES

VALUES ( expression [, ...] ) [, ...]

Tng danh sch cc biu thc trong cc du ngoc n sinh ra mt hng trong bng. Cc danh sch
tt c phi c cng y ht s cc phn t (nh, s ct trong bng), v cc khon u vo tng ng
trong tng danh sch phi c cc dng d liu tng thch. Dng d liu thc s c ch nh cho
tng ct kt qu c xc nh bng vic s dng cc qui tc y ht nh i vi UNION (xem Phn
10.5). Nh mt v d:
VALUES (1, one), (2, two), (3, three);

s tr v mt bng c 2 ct v 3 hng. N tng ng mt cch c hiu lc vi:


SELECT 1 AS column1, one AS column2
UNION ALL
SELECT 2, two
UNION ALL
SELECT 3, three;

Mc nh, PostgreSQL ch nh cc tn column1, column2, cho cc ct ca bng VALUES. Cc tn


ct khng c tiu chun SQL ch nh v cc h c s d liu khc nhau lm khc nhau, nn
thng l tt hn ghi cc tn mc nh vi danh sch cc tn hiu ca mt bng.
V c php, theo sau VALUES c cc danh sch biu thc c i x tng ng vi:
SELECT select_list FROM table_expression

v c th xut hin bt c u m mt SELECT c th. V d, bn c th s dng n nh mt phn


ca mt UNION, hoc gn mt sort_specification (ORDER BY, LIMIT, v/hoc OFFSET) cho n. VALUES
c s dng ph bin nht nh l ngun d liu trong lnh INSERT, v tip sau ph bin nht nh
mt truy vn con.
c thm thng tin, xem VALUES.

7.8. Truy vn vi WITH (Biu thc bng chung)


a ra mt cch thc vit cc truy vn con s dng trong mt truy vn SELECT ln hn.
Cc truy vn con, chng thng c tham chiu ti nh l cc Biu thc Bng Chung - CTE
(Common Table Expressions), c th c xem nh vic nh ngha cc bng tm thi ang tn ti
WITH

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 124/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ch v truy vn ny. Ngi ta s dng tnh nng ny l chia cc truy vn phc tp thnh cc phn
n gin hn. Mt v d l:
WITH regional_sales AS (
SELECT region, SUM(amount) AS total_sales
FROM orders
GROUP BY region
), top_regions AS (
SELECT region
FROM regional_sales
WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales)
)
SELECT region,
product,
SUM(quantity) AS product_units,
SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;

n hin th tng bn hng theo tng sn phm ch trong cc khu vc bn hng hng u. V d ny
c th c vit m khng c WITH, nhng chng ta c th cn ti 2 mc lng nhau cc lnh
SELECT con. D dng hn tun theo cch ny.
Trnh sa i ty chn RECURSIVE lm thay i WITH t ch s thun tin v c php trong mt tnh
nng hon thnh cc iu m nu khc i th khng c kh nng trong SQL tiu chun. S dng
RECURSIVE, mt truy vn WITH c th tham chiu ti u ra ca ring n. Mt v d rt n gin l
truy vn ny tnh tng cc s nguyn t 1 ti 100:
WITH RECURSIVE t(n) AS (
VALUES (1)
UNION ALL
SELECT n+1 FROM t WHERE n < 100
)
SELECT sum(n) FROM t;

Dng chung ca mt truy vn qui WITH lun l mt khon khng qui, ri UNION (hoc UNION
ALL), ri mt khon qui, ni m ch khon qui c th c mt tham chiu ti u ra ca ring
truy vn . Mt truy vn nh vy c thc thi nh sau:
nh gi truy vn qui
1. Hy nh gi khon khng qui. i vi UNION (nhng khng vi UNION ALL), hy b cc
hng p bn. Hy a vo tt c cc hng cn li trong kt qu ca truy vn qui, v
cng t chng vo mt bng lm vic tm thi.
2. Min l bng lm vic khng rng, hy lp li cc bc:
a) nh gi khon qui, thay th cc ni dung ca bng lm vic i vi t tham chiu
qui. i vi UNION (nhng khng vi UNION ALL), hy b cc hng p bn v cc hng
p bt k hng kt qu no trc . a vo tt c cc hng cn li vo trong kt qu
ca truy vn qui, v cng t chng vo mt bng trung gian tm.
b) Thay th cc ni dung ca bng lm vic bng cc ni dung ca bng trung gian, ri lm

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 125/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

rng bng trung gian.


Lu : Ni mt cch nghim ngt, qui trnh ny l lp i lp li khng phi s qui, m
RECURSIVE l thut ng c y ban cc tiu chun SQL la chn.
Trong v d trn, bng lm vic ch c 1 hng duy nht trong tng bc, v n ly cc gi tr t 1
n 100 theo cc bc k tip. Trong bc th 100, khng c u ra no v mnh WHERE, v v
th truy vn kt thc.
Cc truy vn qui thng c s dng lm vic vi cc d liu k tha hoc c cu trc hnh
cy. Mt v d hu dng l truy vn ny thy tt c cc phn con trc tip v gin tip ca mt sn
phm, bit rng ch mt bng ch ra c nhng chn thm ngay tc th:
WITH RECURSIVE included_parts(sub_part, part, quantity) AS (
SELECT sub_part, part, quantity FROM parts WHERE part = our_product
UNION ALL
SELECT p.sub_part, p.part, p.quantity
FROM included_parts pr, parts p
WHERE p.part = pr.sub_part
)
SELECT sub_part, SUM(quantity) as total_quantity
FROM included_parts
GROUP BY sub_part

Khi lm vic vi cc truy vn qui, iu quan trng phi chc chn rng phn qui ca truy vn
cui cng s khng tr v b s liu, nu khng th truy vn s lp v tn. i khi, vic s dng
UNION thay cho UNION ALL c th hon tt c iu ny bng vic b cc hng m p bn cc
hng u ra trc . Tuy nhin, thng th mt chu k khng lin quan ti cc hng u ra m
hon ton p bn: c th l cn thit kim tra ch mt hoc mt t cc trng thy liu im y
ht c t c trc hay khng. Phng php tiu chun cho vic iu khin cc tnh hung nh
vy l tnh ton bt k mng gi tr no c thm ving ri. V d, xem xt truy vn sau y
tm kim ha mt bng bng vic s dng mt trng lin kt:
WITH RECURSIVE search_graph(id, link, data, depth) AS (
SELECT g.id, g.link, g.data, 1
FROM graph g
UNION ALL
SELECT g.id, g.link, g.data, sg.depth + 1
FROM graph g, search_graph sg
WHERE g.id = sg.link
)
SELECT * FROM search_graph;

Truy vn ny s lp nu cc mi quan h lin kt c cc chu k. V chng ta yu cu mt u ra


su, nn ch vic thay i UNION ALL thnh UNION cng c th khng loi tr c vic lp. Thay
vo chng ta cn nhn thc c liu chng ta ti c hng y ht mt ln na hay cha
trong khi tun theo mt ng cc lin kt c bit. Chng ta thm 2 ct path v cycle vo truy vn
lp - d hng:

WITH RECURSIVE search_graph(id, link, data, depth, path, cycle) AS (

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 126/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

SELECT g.id, g.link, g.data, 1,


ARRAY[g.id],
false
FROM graph g
UNION ALL
SELECT g.id, g.link, g.data, sg.depth + 1,
path || g.id,
g.id = ANY(path)
FROM graph g, search_graph sg
WHERE g.id = sg.link AND NOT cycle
)
SELECT * FROM search_graph;

Ngoi vic ngn cc chu k, gi tr mng thng hu dng theo quyn ca ring n nh vic i
din cho ng (path) c ly vi ti c bt k hng c bit no.
Trong trng hp chung ni m nhiu hn mt trng cn phi c kim tra nhn thc c
mt chu k, hy s dng mt mng cc hng. V d, nu chng ta cn so snh cc trng f1 v f2:
WITH RECURSIVE search_graph(id, link, data, depth, path, cycle) AS (
SELECT g.id, g.link, g.data, 1,
ARRAY[ROW(g.f1, g.f2)],
false
FROM graph g
UNION ALL
SELECT g.id, g.link, g.data, sg.depth + 1,
path || ROW(g.f1, g.f2),
ROW(g.f1, g.f2) = ANY(path)
FROM graph g, search_graph sg
WHERE g.id = sg.link AND NOT cycle
)
SELECT * FROM search_graph;

Mo: B qua c php ROW() trong trng hp chung ni m ch mt trng cn phi c


kim tra nhn ra c mt chu k. iu ny cho php mt mng n gin hn l mt
mng dng tng hp s c s dng, ginh c s hiu qu.
Mo: Thut ton nh gi truy vn qui to ra u ra ca n theo trt t tm kim theo
rng trc. Bn c th hin th cc kt qu theo trt t tm kim su trc bng cch lm
cho truy vn vng ngoi ORDER BY thnh mt ct ng (path) c xy theo cch ny.
Mt mo hu dng cho vic kim th cc truy vn khi bn khng chc chn nu chng c th lp l
hy t mt LIMIT vo truy vn cha. V d, truy vn ny c th lp bt tn m khng c LIMIT:
WITH RECURSIVE t(n) AS (
SELECT 1
UNION ALL
SELECT n+1 FROM t
)
SELECT n FROM t LIMIT 100;

iu ny lm vic v s trin khai PostgreSQL ch nh gi cng nhiu hng ca mt truy vn WITH


nh thc s c truy vn cha ly. S dng mo ny trong sn xut khng c khuyn co, v cc
h thng khc c th lm vic khc nhau. Hn na, n thc s khng lm vic nu bn truy vn
vng ngoi sp xp cc kt qu truy vn qui hoc lin kt chng vi mt s bng khc.
Mt c tnh hu dng ca cc truy vn WITH l chng ch c nh gi mt ln cho tng s thc

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 127/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

thi ca truy vn cha, thm ch nu chng c tham chiu ti nhiu hn mt ln i vi truy vn


cha hoc cc truy vn anh em WITH. V th, nhng tnh ton t gi cn thit nhiu ni c th
c t trong mt truy vn WITH trnh cng vic d tha. ng dng c kh nng khc l
ngn nga nhiu nh gi cc hm khng mong mun vi cc hiu ng ph. Tuy nhin, mt kia ca
ng xu ny l trnh ti u ha t c kh nng hn y nhng hn ch t truy vn cha xung vo
trong mt truy vn WITH so vi mt truy vn con (ph) thng thng. Vi truy vn WITH thng s
c nh gi nh c nu, m khng p cc hng m truy vn cha c th b sau . (M, nh
c nhc ti trn, s nh gi c th dng sm nu (cc) tham chiu cho truy vn ch i hi
mt s lng hn ch cc hng).

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 128/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Chng 8. Dng d liu


PostgreSQL c mt tp hp giu c cc dng d liu bm sinh sn c cho ngi s dng. Ngi s
dng c th thm cc dng mi cho PostgreSQL bng vic s dng lnh to dng CREATE TYPE.
Bng 8-1 ch ra tt c cc dng d liu mc ch chung c xy dng sn. Hu ht cc tn la
chn thay th c lit k trong ct Aliases (Cc tn hiu) l cc tn c PostgreSQL s dng
ni b v cc l do lch s. Hn na, mt s dng khng c tn thnh hoc c s dng ni b
l sn sng, nhng khng c lit k y.
Bng 8-1. Cc dng d liu
Tn

Tn hiu

M t

bigint

int8

s nguyn 8 byte c k

bigserial

serial8

s nguyn 8 byte t ng tng

bit [ (n) ]

chui bit di c nh

bit varying [ (n) ]

varbit

chui bit di bin i

boolean

bool

Boolean logic (ng/sai - true/false)

box

hp ch nht trn mt mt phng

bytea

d liu nh phn (mng theo byte)

character varying [ (n)]

varchar [ (n) ]

chui k t di bin i

character [ (n) ]

char [ (n) ]

chui k t di c nh

cidr

a ch mng IPv4 hoc IPv6

circle

mch trn mt phng

date

ngy thng theo lch (nm, thng, ngy)

double precision

float8

inet
integer

s cc chm ng chnh xc p (8 byte)


a ch my ch theo IPv4 hoc IPv6

int, int4

s nguyn 4 byte c k

interval [ fields ] [(p) ]

khong thi gian

line

ng v cc trn mt mt phng

lseg

on thng trn mt phng

macaddr

a ch MAC (Kim sot Truy cp Phng tin - Media Access


Control)

money

lng hin hnh

numeric [ (p, s) ]

decimal [ (p, s) ] s chnh xc ca chnh xc c kh nng chn c

path

ng a l trn mt phng

point

im a l trn mt phng

polygon

ng a l khp kn trn mt phng

real

float4

im chm ng chnh xc duy nht (4 byte)

smallint

int2

s nguyn 2 byte c k

serial

serial4

s nguyn 4 byte t ng tng

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 129/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Tn

Tn hiu

Xut bn nm 2013
M t

text

chui k t di bin i

time [ (p) ] [ without


time zone ]

thi gian trong ngy (khng c vng thi gian)

time [ (p) ] with time


zone

timetz

timestamp [ (p) ] [
without time zone ]
timestamp [ (p) ] with
time zone

thi gian trong ngy, c vng thi gian


ngy thng v thi gian (khng c vng thi gian)

timestamptz

ngy thng v thi gian, c vng thi gian

tsquery

truy vn tm kim vn bn

tsvector

ti liu tm kim vn bn

txid_snapshot

hnh chp ID giao dch mc ngi s dng

uuid

m nh danh c nht vn nng

xml

d liu XML

Tnh tng thch: Cc dng sau y (hoc s nh vn ca chng) c SQL ch nh:


bigint, bit, bit varying, boolean, char, character varying, character, varchar, date, double precision, integer,

(c hoc khng c vng thi gian),

interval, numeric, decimal, real, smallint, time

timestamp

(c

hoc khng c vng thi gian), xml.


Mi dng d liu c mt trnh by bn ngoi c cc hm u vo v u ra ca n xc nh.
Nhiu trong s cc dng c xy dng sn c cc nh dng bn ngoi r rng. Tuy nhin, vi
dng cng l c nht i vi PostgreSQL, nh cc ng a l, hoc c vi nh dng c kh
nng, nh cc dng ngy thng v thi gian. Mt s hm u vo v u ra khng nghch o c,
nh, kt qu ca hm u ra c th mt chnh xc khi c so snh vi u vo gc ban u.

8.1. Dng s
Cc dng s bao gm cc s nguyn 2, 4 v 8 byte, cc s du chm ng 4 v 8 byte, v cc s
thp phn chnh xc c kh nng chn c. Bng 8-2 lit k cc dng c sn.
Bng 8-2. Cc dng s
Tn

Kch c lu tr

M t

Di

smallint

2 bytes

s nguyn dy nh

-32768 ti +32767

integer

4 bytes

la chn in hnh cho s nguyn

-2147483648 ti +2147483647

bigint

8 bytes

s nguyn dy ln

- 9223372036854775808 ti
9223372036854775807

decimal

variable

chnh xc, chnh xc do ngi s dng khng gii hn


ch nh

numeric

variable

chnh xc, chnh xc do ngi s dng khng gii hn


ch nh

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 130/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Tn

Kch c lu tr

Xut bn nm 2013

M t

Di

real

4 bytes

khng chnh xc, chnh xc bin i

chnh xc 6 ch s thp phn

double precision

8 bytes

khng chnh xc, chnh xc bin i

chnh xc 15 ch s thp phn

serial

4 bytes

s nguyn t ng tng

1 ti 2147483647

bigserial

8 bytes

s nguyn t ng tng ln

1 ti 9223372036854775807

C php ca cc hng i vi cc dng s c m t trong Phn 4.1.2. Cc dng s c mt tp hp


y cc ton t v cc hm i s tng ng. Tham chiu ti Chng 9 c thm thng tin.
Cc phn sau y m t cc dng mt cch chi tit.

8.1.1. Dng s nguyn


Cc dng v lu tr ton b cc s, l, cc s khng c cc thnh phn thp phn, ca cc dy
khc nhau. Nhng c gng lu tr cc gi tr bn ngoi ca dy c php s gy ra mt li.
Dng integer l la chn chung, khi n a ra s cn bng tt nht gia dy, kch c lu tr v hiu
nng. Dng smallint thng ch c s dng nu khng gian a khan him. Dng bigint ch nn
c s dng nu dy integer l khng , v ci sau l nhanh hn chc chn.
Trn cc h iu hnh rt ti thiu th dng bigint c th khng chy tt c, v n da vo s h
tr ca trnh bin dch cho cc s nguyn 8 byte. Trn cc my nh vy, bigint hnh ng y ht nh
integer, nhng vn ly 8 byte lu tr. (Chng ti khng bit v bt k nn tng hin i no c vn
ny).
SQL ch ch nh cc dng s nguyn integer (hoc int), smallint v bigint. Cc tn dng int2, int4, v
int8 l cc m rng, chng cng c mt s h c s d liu SQL s dng.

8.1.2. S chnh xc ty
Dng numeric c th lu tr cc s ti 1.000 ch s chnh xc v thc hin cc tnh ton mt cch
chnh xc. c bit c khuyn co cho vic lu tr cc lng tin v cc lng khc ni m tnh
chnh xc c yu cu. Tuy nhin, tnh ton s hc trn cc gi tr numeric l rt chm so vi cc
dng s nguyn, hoc vi cc dng du chm ng c m t trong phn sau.
Chng ta s dng cc khi nim sau bn di: Phm vi ca mt numeric l s tnh ton cc ch s
thp phn trong phn phn s, bn phi ca du thp phn. chnh xc ca numeric l tnh tng
ca cc ch s c ngha trong ton b s , l, s cc ch s c 2 pha ca du thp phn. V
th s 23.5141 c chnh xc ca 6 v thang s 4. Cc s nguyn c th c coi l c thang s 0.
C chnh xc ti a v thang ti a ca mt ct
ct dng numeric, hy s dng c php:

numeric

c th c cu hnh. khai bo mt

NUMERIC(precision, scale)

chnh xc phi l dng, thang 0 hoc dng. Nh mt s la chn:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 131/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

NUMERIC(precision)

chn mt thang 0. Ch nh:


NUMERIC

khng vi bt k chnh xc hoc thang no to ra mt ct trong cc gi tr ca bt k chnh


xc v thang no cng c th c lu tr, cho ti gii hn trin khai v chnh xc. Mt ct dng
ny s khng p cc gi tr u vo ti bt k thang c bit no, trong khi cc ct numeric vi mt
thang c khai bo s p cc gi tr u vo ti thang . (Tiu chun SQL i hi mt thang 0
mc nh, nh, p ti chnh xc l s nguyn. Chng ta thy iu ny hi v dng. Nu bn c
quan tm v tnh kh chuyn, hy lun ch nh chnh xc v thang mt cch r rng).
Nu thang ca mt gi tr c lu tr l ln hn so vi thang c khai bo ca ct, th h thng
s lm trn gi tr ti s cc ch s thp phn c ch nh. Sau , nu s cc ch s v bn tri
ca du chm thp phn vt qu chnh xc c khai bo tr i thang c khai bo, th mt
li s ny sinh.
Cc gi tr s c lu tr mt cch vt l khng vi bt k cc s 0 tha no u hoc sau. V
th, chnh xc v thang c khai bo ca mt ct l ti a, khng phi l nhng phn b c
nh. (Theo ngha ny th dng numeric l kh ging vi varchar(n) hn l char(n)). Yu cu lu tr
thc t l 2 byte cho tng nhm 4 ch s thp phn, cng vi 5 ti 8 byte tng th.
B sung thm vo cc gi tr s thng thng, dng cho php gi tr c bit NaN, ngha l khng
phi l mt s. Bt k hot ng no trong NaN cng cho ra NaN khc. Khi vit gi tr ny nh mt
hng trong lnh SQL, bn phi t cc du nhy xung quanh n, v d UPDATE table SET x = NaN.
u vo, chui NaN c tha nhn theo mt cch thc khng phn bit ch hoa ch thng.
Lu : Trong hu ht cc trin khai ca khi nim khng phi l mt s, NaN khng c
xem l ngang bng vi bt k gi tr s khc no (bao gm c NaN). cho php cc gi tr
numeric s c sp xp v s dng trong cc ch s da vo cy, PostgreSQL i x vi cc
gi tr NaN ngang bng nh nhau, v ln hn so vi tt c cc gi tr khng l NaN.
Cc dng decimal v numeric l tng ng nhau. C 2 dng l mt phn ca tiu chun SQL.

8.1.3. Dng du chm ng


Cc dng d liu real v double precision l khng chnh xc, cc dng s c chnh xc bin i.
Trong thc t, cc dng thng l cc trin khai ca tiu chun 754 ca IEEE cho S hc Chm
Thp phn Nh phn - Binary Floating Point Arithmetic ( chnh xc n v p, mt cch tng
ng), mc m trnh x l nm bn di, h iu hnh v trnh bin dch h tr n.
Khng chnh xc c ngha l mt s gi tr khng th chuyn i c chnh xc sang nh dng ni
b v c lu tr nh l nhng xp x gn ng, sao cho vic lu tr v truy xut mt gi tr c
th ch ra kh khc nhau. vic qun l cc li v cch m chng nhn ging thng qua cc tnh
ton l ch ca ton b mt nhnh khoa hc ton hc v my tnh v s khng c tho lun
y, ngoi tr cc im sau y:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 132/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Nu bn yu cu lu tr cc tnh ton chnh xc (nh i vi cc ti khon tin t), hy s


dng dng numeric.

Nu bn mun thc hin cc tnh ton phc tp vi cc dng v bt k iu g quan trng,


c bit nu bn da vo hnh vi nht nh trong cc trng hp bin (v cc, trn di), th
bn nn nh gi s trin khai mt cch cn thn.

So snh 2 gi tr chm thp phn cho s bng nhau c th khng phi lc no cng lm vic
c nh mong i.

Trong hu ht cc nn tng, dng real c mt di t nht l 1E-37 ti 1E+37 vi chnh xc t nht


6 ch s thp phn. Dng double precision thng c mt di khong 1E-307 ti 1E+308 vi
chnh xc t nht 15 ch s. Cc gi tr m l qu ln hoc qu nh s gy ra mt li. Vic lm trn
c th din ra nu chnh xc ca mt s u vo l qu cao. Cc s qu gn ti 0 m khng th
hin c s khc bit vi 0 s gy ra li trn di.
B sung vo cc gi tr s thng thng, cc dng du chm thp phn c vi gi tr c bit:
Infinity
-Infinity
NaN

Chng th hin cc gi tr v cc, m v cc v khng phi l s c bit ca IEEE 754, mt


cch tng ng.
(Trn mt my th tnh ton s hc du chm thp phn khng tun theo IEEE 754, cc gi tr c
th s khng lm vic nh mong i). Khi vit cc gi tr nh cc hng s trong mt lnh SQL,
bn phi t cc du nhy xung quanh chng, v d UPDATE table SET x = Infinity. u vo, cc
chui c nhn theo cch phn bit ch hoa v ch thng.
Lu : IEEE 754 ch nh rng NaN s khng so snh ngang bng vi bt k gi tr im
chm thp phn no (bao gm c NaN). cho php cc gi tr im chm thp phn c
sp xp v c s dng trong cc ch s da vo cy, PostgreSQL i x vi cc gi tr NaN
ngang bng nhau, v ln hn tt c cc gi tr khng phi l NaN.
PostgreSQL cng h tr cc k hiu tiu chun SQL float v float(p) cho vic ch nh cc dng s
khng chnh xc. y, p ch nh chnh xc ti thiu chp nhn c theo cc ch s nh phn.
PostgreSQL chp nhn float(1) ti float(24) khi la chn dng real, trong khi float(25) ti float(53) la
chn double precision. Cc gi tr ca p nm ngoi di c php s dn ti mt li. float vi khng
c chnh xc c ch nh s c ly ng double precision.
Lu : Trc phin bn PostgreSQL 7.4, chnh xc trong float(p) c ly ng
qu nhiu cc s thp phn. iu ny c sa khp vi tiu chun SQL, n ch nh
rng chnh xc c o m theo ch s nh phn. Gi thit l real v double precision c
chnh xc 24 v 53 bit trong phn nh tr mt cch tng ng l ng cho nhng trin khai
du chm thp phn theo tiu chun IEEE. Trn cc nn tng khng phi ca IEEE th n c
th khc mt cht, nhng n gin th cc di y ht ca p s c s dng trong tt c cc

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 133/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

nn tng.

8.1.4. Dng tun t (Serial)


Cc dng d liu serial v bigserial khng phi l cc dng ng, m ch l s thun tin k hiu cho
vic to ra cc ct m nh danh duy nht (tng t nh tnh cht t ng tng AUTO_INCREMENT
c mt s c s d liu khc h tr). Trong trin khai hin hnh, vic ch nh:
CREATE TABLE tablename (
colname SERIAL
);

is equivalent to specifying:

CREATE SEQUENCE tablename_colname_seq;


CREATE TABLE tablename (
colname integer NOT NULL DEFAULT nextval(tablename_colname_seq)
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

v th, chng ta to ra mt ct s nguyn v dn xp cho cc gi tr mc nh ca n s c


ch nh t mt my to s tun t. Mt rng buc NOT NULL c p dng m bo rng mt gi
tr null khng th c chn vo. (Trong hu ht cc trng hp bn cng c th mun gn mt
rng buc UNIQUE hoc PRIMARY KEY ngn nga cc gi tr p bn khi b chn vo ngu nhin,
nhng iu ny l khng t ng). Cui cng, s tun t c nh du nh l c s hu
bi ct, sao cho n s b b i nu ct hoc bng b b i.
Lu : Trc bn PostgreSQL 7.3, serial ng l UNIQUE. iu ny khng cn t ng na.
Nu bn mun mt ct tun t c mt rng buc c nht hoc s l mt kha ch, th by
gi n phi c ch nh, ht nh bt k dng d liu no khc.
chn gi tr tip sau ca tun t vo ct serial, hy ch nh rng ct serial s c ch nh
gi tr mc nh ca n. iu ny c th c thc hin hoc bng vic loi b ct khi danh sch
cc ct trong lnh INSERT, hoc thng qua s dng t kha DEFAULT.
Cc tn dng serial v serial4 l tng ng nhau: c 2 to ra cc ct integer. Cc tn dng bigserial
v serial8 lm vic theo cch y ht, ngoi tr l chng to ra mt ct bigint. bigserial s c s dng
nu bn bit s dng trc hn 231 m nh dng qua vng i ca bng.
S tun t c to ra cho mt ct serial c b t ng khi ct ch b b. Bn c th b s tun
t m khng b ct, nhng iu ny s p loi b biu thc mc nh ca ct.

8.2. Dng tin t


Dng tin t lu tr mt lng tin t vi mt chnh xc thp phn c nh; xem Bng 8-3.
chnh xc thp phn c thit lp lc_monetary ca c s d liu xc nh. u vo c chp
nhn trong cc nh dng khc nhau, bao gm c cc hng s nguyn v du chm thp phn, cng
nh vic nh dng tin t thng thng, nh '$1.000.00'. u ra thng mu sau nhng ph
thuc vo min a phng. Cc gi tr s khng nm trong ngoc c th c chuyn i sang
money bng vic chuyn gi tr s sang text v sau money, v d:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 134/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

SELECT 1234::text::money;

Khng c con ng n gin lm ngc li theo mt cch thc c lp vi mt min a


phng, y l vic bin mt gi tr money thnh mt dng s. Nu bn bit k hiu tin t v du
phn cch hng ngn th bn c th s dng regexp_replace():
SELECT regexp_replace(52093.89::money::text, [$,], , g)::numeric;

V u ra ca dng d liu ny l phn bit theo min a phng, n c th khng lm vic ti


cc d liu tin t money vo trong mt c s d liu m c mt thit lp khc ca lc_monetary.
trnh cc vn , trc khi phc hi mt ng trong mt c s d liu mi, hy chc chn
lc_monetary c gi tr y ht hoc tng t nh trong c s d liu m c ng ng.
Bng 8-3. Cc dng tin t
Tn
money

Kch c lu tr
8 bytes

M t
lng tin

Di
- 92233720368547758.08 ti +92233720368547758.07

8.3. Dng k t
Bng 8-4. Cc dng k t
Tn

M t

character varying(n) , varchar(n)

di bin i vi hn ch

character(n) , char(n)

di c nh, c lt bng k t trng

text

di khng hn ch v bin i

Bng 8-4 ch ra cc dng k t mc ch chung trong PostgreSQL.


SQL xc nh 2 dng k t ban u: character varying(n) v character(n), trong n l mt s nguyn
dng. C 2 dng c th lu tr cc chui cho ti n k t (khng phi cc byte) di. Mt c
gng lu tr mt chui di hn trong mt ct ca cc dng s gy ra mt li, tr phi cc k t
vt qu tt c u l cc khong trng, trong trng hp chui s b ct ngn v di cc i.
(y l mt ngoi l kh k l c tiu chun SQL yu cu). Nu chui s c lu tr l ngn
hn so vi di c khai bo, th cc gi tr ca dng character s c lt bng cc k t trng;
cc gi tr ca dng character varying n gin s lu tr chui ngn hn.
Nu mt chui a ra r rng mt gi tr ti character varying(n) hoc character(n), th gi tr di qu
s b ct v n k t m khng lm sinh ra mt li. (iu ny cng c tiu chun SQL yu cu).
Cc k hiu varchar(n) v char(n) l cc tn hiu cho varying(n) v character(n), mt cch tng ng.
character khng c di ch nh l tng ng vi character(1). Nu character varying c s
dng m khng c ch nh di, th dng chp nhn cc chui kch c bt k. Ci sau l mt
m rng ca PostgreSQL.
Hn na, PostgreSQL a ra dng

text,

n lu tr cc chui di bt k. D dng

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

text

l khng

Trang 135/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

theo tiu chun SQL, th vi h qun tr c s d liu SQL khc cng c n.


Cc gi tr dng character v mt vt l c lt vi cc k t trng ti rng n c ch nh, v
c lu tr v c hin th theo cch . Tuy nhin, cc k t trng lt c i x ng k
theo ng ngha. Cc k t trng i sau ui khng c khi so snh 2 gi tr dng character, v
chng s b loi b khi chuyn i mt gi tr character sang mt gi tr ca cc dng chui khc.
Lu rng cc k t trng ui l ng k v ng ngha trong cc gi tr character varying v text.
Yu cu lu tr cho mt chui ngn (ti 126 byte) l 1 byte cng vi chui thc t , n bao gm
vic lt k t trng trong trng hp ca character. Cc chui di hn c 4 byte tng th thay v 1.
Cc chui di c h thng nn mt cch t ng, nn yu cu vt l trn a c th t hn. Cc
gi tr rt di cng c lu tr trong cc bng nn sao cho chng khng can thip vi s truy cp
nhanh ti cc gi tr ct ngn hn. Trong mi trng hp, chui k t c kh nng di nht m c
th c lu tr l khong 1 GB. (Gi tr cc i s c php cho n trong khai bo dng d liu l
t hn th. C l l hu dng thay i iu ny v vi nhng m ha k t nhiu byte th s cc
k t v cc byte c th hon ton khc nhau. Nu bn mun lu tr cc chui di m khng c gii
hn trn c th, hy s dng text hoc character varying m khng c ch nh di, thay v to
mt gii hn di ty ).
Mo: Khng c s khc bit hiu nng gia 3 dng , ngoi tr khong trng lu tr gia
tng khi s dng dng c lt bng k t trng, v mt t cc chu k d tha ca CPU
kim tra di khi vic lu tr trong mt ct b rng buc v di. Trong khi character(n)
c cc u th hiu nng trong mt s h thng c s d liu khc, th khng c u th nh
vy trong PostgreSQL; trong thc t character(n) thng l chm nht trong 3 dng v cc chi
ph lu tr b sung ca n. Trong hu ht cc tnh hung, nn thay bng vic s dng text
hoc character varying.
Tham chiu ti Phn 4.1.2.1 c thng tin v c php cc hng chui, v ti Chng 9 c
thng tin v cc ton t v cc hm c sn. Tp hp cc k t c s d liu xc nh tp hp cc k
t c s dng lu tr cc gi tr vn bn; c thm thng tin v s h tr tp hp cc k t,
hy tham chiu ti Phn 22.2.
V d 8-1. S dng cc dng k t
CREATE TABLE test1 (a character(4));
INSERT INTO test1 VALUES (ok);
SELECT a, char_length(a) FROM test1; --

a
| char_length
------+------------ok | 2

CREATE TABLE test2 (b varchar(5));


INSERT INTO test2 VALUES (ok);
INSERT INTO test2 VALUES (good );
INSERT INTO test2 VALUES (too long);
ERROR: value too long for type character varying(5)

INSERT INTO test2 VALUES (too long::varchar(5)); -- explicit truncation


SELECT b, char_length(b) FROM test2;

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 136/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

b
| char_length
------------ +------------ok
|2
good
|5
too l
1

|5

Hm char_length c tho lun trong Phn 9.4.

C 2 dng k t di c nh khc trong PostgreSQL, c ch ra trong Bng 8-5. Dng name ch


tn ti cho vic lu tr cc m nh danh trong cc catalog h thng ni b v khng c nh
s dng i vi ngi s dng thng thng. Chiu di ca n hin c xc nh nh l 64 byte
(63 k t dng c cng vi k t kt thc) nhng s c tham chiu bng vic s dng hng
NAMEDATALEN trong m ngun C. di ny c thit lp vo thi im bin dch (v v th c
kh nng tinh chnh c cho cc s dng c bit); di cc i mc nh c th thay i trong
mt phin bn trong tng lai. Dng char (lu cc du ngoc kp) l khc vi char(1) theo n
ch s dng mt byte lu tr. N c s dng ni b trong cc catalog h thng nh mt dng
m lit k n gin.
Bng 8-5. Cc dng k t c bit
Tn

Kch c lu tr

M t

"char"

1 byte

dng ni b 1 byte

name

64 bytes

dng ni b cho cc tn i tng

8.4. Dng d liu nh phn


Dng d liu bytea cho php lu tr cc chui nh phn; xem Bng 8-6.
Bng 8-6. Cc dng d liu nh phn
Tn
bytea

Kch c lu tr
1 hoc 4 byte cng vi chui nh phn thc t

M t
chui nh phn di bin i

Chui nh phn l mt s tun t ca b tng 8 bit mt (hoc cc byte). Cc chui nh phn c


phn bit vi cc chui k t theo 2 cch. Trc ht, cc chui nh phn c bit cho php lu tr
cc byte gi tr 0 v cc byte khc khng in c (thng l, cc byte bn ngoi dy 32 ti 126).
Cc chui k t khng cho php cc byte 0, v cng khng cho php bt k gi tr byte no khc v
cc tun t ca cc gi tr byte m khng hp l theo b m k t c chn ca c s d liu. Th
2, cc hot ng trong cc chui nh phn x l cc byte thc s, trong khi vic x l cc chui k
t ph thuc vo cc thit lp theo min a phng. Ngn gn, cc chui nh phn l ph hp cho
vic lu tr cc d liu m ngi lp trnh ngh nh cc byte th, trong khi cc chui k t l ph
hp cho vic lu tr vn bn.
Dng bytea h tr 2 nh dng bn ngoi cho u vo v u ra: nh dng thot (escape) theo
lch s ca PostgreSQL, v nh dng hex. C 2 chng u lun c chp nhn u vo. nh

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 137/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

dng u ra ph thuc vo tham s cu hnh bytea_output; mc nh l hex. (Lu rng nh dng


hex c gii thiu trong PostgreSQL 9.0; cc phin bn sm v mt s cng c khng hiu n).
Tiu chun SQL xc nh mt dng chui nh phn khc, gi l BLOB hoc BINARY LARGE OBJECT.
nh dng u vo l khc vi bytea, nhng cc hm v ton t c cung cp hu ht nh nhau.

8.4.1. nh dng bytea hex


nh dng hex m ha cc d liu nh phn nh l 2 ch s h 16 (hexadecimal) cho 1 byte, ng
k nht l phn u. Ton b chui c i u bng tun t \x (phn bit n vi nh dng thot).
Trong mt s ng cnh, du cho ngc ban u c th cn phi c thot bng vic vit n 2 ln,
trong cc trng hp y ht theo cc du cho ngc phi c p bn nh dng thot; cc
chi tit bn di. Cc ch s theo h 16 c th hoc ch hoa hoc ch thng, v du trng c
php gia cc cp ch s (nhng khng nm trong mt cp ch s cng khng nm u \x tun
t). nh dng hex l tng thch vi mt di rng ln cc ng dng v cc giao thc bn ngoi, v
n c xu hng s l nhanh hn chuyn i hn l nh dng thot, nn vic s dng n c u
tin. V d:
SELECT E\\xDEADBEEF;

8.4.2. nh dng thot bytea


nh dng thot (escape) l nh dng truyn thng ca PostgreSQL i vi dng bytea. N ly
tip cn th hin mt chui nh phn nh mt s tun t cc k t ASCII, trong khi chuyn i cc
byte m khng th c th hin nh mt k t ASCII trong cc tun t thot c bit. Nu, t quan
im ng dng vic th hin cc byte nh cc k t l c ngha, th sau s th hin ny c th
l thun tin. Nhng trong thc t thng lng tng v n a ra s khc bit gia cc chui nh
phn v cc chui k t, v c c ch thot c bit c chn l th g kh s dng. V th
nh dng ny c l nn c trnh i vi hu ht cc ng dng mi.
Khi vo cc d liu bytea trong nh dng thot, cc byte ca cc gi tr nht nh phi c thot,
trong khi tt c cc gi tr byte c th c thot. Ni chung, thot mt byte, hy chuyn i n
thnh gi tr byte 3 k t s ca n v t trc n bng mt du cho ngc (hoc 2 du cho
ngc, nu vic vit gi tr nh mt hng bng vic s dng c php chui thot). Bn thn du
cho ngc (byte gi tr 92) c th nh mt la chn c th hin bng 2 du cho ngc. Bng 87 ch ra cc k t phi c thot, v a ra cc tun t thot la chn thay th nhng ni p
dng c.
Bng 8-7. Cc byte thot hng bytea
Gi tr byte
thp phn

M t

Trnh by u vo
c thot

V d

Trnh by
u ra

zero octet

E\\000

SELECT E\\000::bytea;

\000

39

nhy n

hoc E\\047

SELECT E\::bytea;

92

du cho ngc

E\\\\ hoc E\\134

SELECT E\\\\::bytea;

\\

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 138/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Gi tr byte
thp phn
0 ti 31 v
127 ti 255

M t

Xut bn nm 2013

Trnh by u vo
c thot

B 8 bit (byte) khng in c

E\\xxx (gi tr h 8)

V d
SELECT E\\001::bytea;

Trnh by
u ra
\001

Yu cu thot cc byte khng in c khc nhau, ph thuc vo cc thit lp min a phng.


Trong mt s trng hp bn c th i m vn li chng khng c thot. Lu l kt qu
trong tng trong s cc v d trong Bng 8-7 chnh xc l mt byte di, thm ch d trnh by
u ra i khi hn mt k t.
L do nhiu du cho ngc c yu cu, nh c ch ra trong Bng 8-7, l mt chui u vo
c vit nh mt hng chui phi truyn qua 2 pha phn tch c php trong my ch PostgreSQL.
Du cho ngc u tin ca tng i c hiu nh l mt k t thot bng trnh phn tch c
php hng chui (gi thit c php chui thot c s dng) v v th c s dng, li du
cho ngc th 2 ca i. (Cc chui trong cc du $ c th c s dng trnh mc thot ny).
Du cho ngc cn li sau c cc hm u vo bytea nhn nh l vic khi u hoc mt gi
tr byte 3 ch s, hoc vic thot du cho ngc khc. V d, mt hng chui truyn qua ti
my ch nh l E\\001 tr thnh \001 sau khi truyn qua trnh phn tch c php chui thot. \001
sau c gi ti hm u vo bytea, ni m n c chuyn i thnh mt byte duy nht vi
mt gi tr thp phn ca 1. Lu l k t nhy n khng c bytea i x c bit, nn n tun
theo cc qui tc cho cc hng chui. (Xem Phn 4.1.2.1.).
Cc byte bytea i khi c thot khi c u ra. Ni chung, mi byte khng in c c chuyn
i thnh gi tr byte 3 ch s tng ng v i trc vi mt du cho ngc. Hu ht cc byte
in c c trnh by bng s trnh by tiu chun ca chng trong tp k t my trm. Byte vi
gi tr thp phn 92 (du cho ngc) c p bn u ra. Cc chi tit trong Bng 8-8.
Bng 8-8. Cc byte thot u ra bytea
Gi tr byte
thp phn
92

M t
du cho ngc

Trnh by u ra c
thot

V d

Kt qu
u ra

\\

SELECT E\\134::bytea;

\\

0 ti 31 v 127 cc byte khng in c


ti 255

\xxx (gi tr h 8)

SELECT E\\001::bytea;

\001

32 ti 126

i din b k t my trm

SELECT E\\176::bytea;

cc byte in c

Ph thuc vo mt tin (front end) i vi PostgreSQL m bn s dng, bn c th c cng vic b


sung lm trong cc chui thot v khng thot bytea. V d, bn c th cng phi thot cc
ng nui v vn chuyn ngc tr v nu giao din ca bn t ng dch chng.

8.5. Dng Date/Time (Ngy thng/Thi gian)


PostgreSQL h tr mt tp hp y cc dng d liu v thi gian, nh trong Bng 8-9. Cc hot

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 139/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ng sn sng trong cc dng d liu c m t trong Phn 9.9.


Bng 8-9. Cc dng ngy thng/thi gian
Tn
timestamp [(p) ]
[without time zone ]

Kch c
lu tr

M t

Gi tr thp

Gi tr cao

Gii php

8 bytes

c ngy thng v thi gian


(khng c vng thi gian)

4713 BC

294276 AD

1 microsecond
/ 14 ch s

timestamp [(p) ] with 8 bytes


time zone

c ngy thng v thi gian,


c vng thi gian

4713 BC

294276 AD

1 microsecond
/ 14 ch s

date

4 bytes

ngy thng (khng c thi


gian ca ngy)

4713 BC

5874897 AD

1 ngy

time [ (p) ] [without


time zone ]

8 bytes

thi gian ca ngy (khng c 00:00:00


ngy thng)

24:00:00

1 microsecond
/ 14 ch s

time [ (p) ] with time


zone

12 bytes

ch c thi gian ca ngy, c 00:00:00+1459


vng thi gian

24:00:00-1459

1
microsecond /
14 ch s

interval [fields ][(p) ] 12 bytes

khong thi gian

-178000000 nm 178000000 nm

1 microsecond
/ 14 ch s

Lu : Tiu chun SQL yu cu l vit ch timestamp th s tng ng vi timestamp without


time zone, v PostgreSQL trung thnh vi hnh vi . (Cc phin bn trc 7.3 i x vi
n nh l timestamp with time zone).
v interval chp nhn mt gi tr vi chnh xc ty chn p, n ch nh s cc ch
s thp phn cn c gi trong trng giy. Mc nh, khng c rng buc r rng no v
chnh xc. Di c php ca p l t 0 ti 6 cho cc dng timestamp v interval.
time, timestamp

Lu : Khi cc gi tr timestamp c lu tr nh l cc s nguyn 8 byte (hin l mc nh),


th chnh xc microsecond (micro giy) l sn sng i vi ton b di cc d liu. Khi
cc gi tr timestamp c lu gi nh l cc s du chm thp phn chnh xc p (la
chn bin dch thi gian i nghch), th gii hn chnh xc c hiu qu c th t hn 6,
cc gi tr timestamp c lu tr nh l giy trc hoc sau na m 2000-01-01. Khi cc
gi tr timestamp c trin khai bng vic s dng cc s du chm thp phn, th chnh
xc microsecond s t c cho cc ngy thng trong mt t nm ca 2000-01-01, nhng
chnh xc gim cho ngy thng xa hn. Lu rng vic s dng datetimes du chm thp
phn cho php mt di rng ln hn cc gi tr timestamp s c trnh by nhiu hn so vi
trn: t 4713 BC cho ti 5874897 AD.
La chn bin dch thi gian y ht cng xc nh liu cc gi tr time v interval c c lu
tr nh l cc s du chm thp phn hay cc s nguyn 8 byte hay khng. Trong trng
hp du chm thp phn, cc gi tr interval ln s gim chnh xc khi kch c ca khong
(interval) gia tng.
i vi cc dng time, di c php ca p l t 0 ti 6 khi lu tr s nguyn 8 byte c s dng,

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 140/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

hoc t 0 ti 10 khi lu tr du thp phn c s dng.


Dng interval c mt la chn b sung hn ch tp hp cc trng c lu tr bng vic vit
mt trong cc cch sau:
YEAR
MONTH
DAY
HOUR
MINUTE
SECOND
YEAR TO MONTH
DAY TO HOUR
DAY TO MINUTE
DAY TO SECOND
HOUR TO MINUTE
HOUR TO SECOND
MINUTE TO SECOND

Lu l nu c fields v p c ch nh, th
ch cho cc giy.

fields

phi bao gm

SECOND,

v chnh xc p dng

Dng thi gian vi vng thi gian (time with time zone) c tiu chun SQL xc nh, nhng nh
ngha a ra cc c tnh dn ti s hu dng ng ng. Trong hu ht cc trng hp, s kt hp
ca date, time, timestamp without time zone v timestamp with time zone s a ra mt di hon
chnh chc nng ngy thng/thi gian c bt k ng dng no yu cu.
Cc dng abstime v reltime l cc dng c chnh xc thp hn v c s dng trong ni b.
Bn khng c khuyn khch s dng cc dng trong cc ng dng; cc dng ni b c th
bin mt trong mt phin bn trong tng lai.

8.5.1. u vo ngy thng/thi gian


u vo ngy thng v thi gian c chp nhn trong hu ht bt k nh dng hp l no, bao
gm c ISO 8601, tng thch SQL, POSTGRES truyn thng v cc dnh dng khc. i vi mt
s nh dng, trt t ngy, thng v nm trong u vo ngy thng l khng xc nh v c s h tr
cho vic xc nh trt t c mong i ca cc trng . Thit lp tham s DateStyle v MDY
chn thng-ngy-nm, DMY chn ngy-thng-nm, hoc YDM chn nm-thng-ngy.
PostgreSQL mm do hn trong vic iu khin u vo ngy thng/thi gian so vi tiu chun
SQL yu cu. Xem Ph lc B c cc qui tc chnh xc phn tch c php u vo ngy thng/thi
gian v cho cc trng vn bn c tha nhn bao gm thng, ngy ca tun v vng thi gian.
Nh rng bt k u vo hng ngy thng hoc thi gian no cng cn phi c a vo cc nhy
n, ging nh cc chui vn bn. Hy tham chiu ti Phn 4.1.2.7 c thm thng tin. SQL yu
cu c php sau:
type [ (p) ] value

trong p l mt c t chnh xc ty chn a ra s cc ch s thp phn trong trng giy


seconds. chnh xc c th c ch nh cho cc dng time, timestamp v interval. Cc gi tr
c php c nhc ti trn. Nu khng c chnh xc no c ch nh trong mt c t
Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 141/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

hng, th n mc nh cho chnh xc ca gi tr hng .


8.5.1.1. Ngy thng

Bng 8-10 ch mt s u vo c kh nng cho dng ngy thng date.


Bng 8-10. u vo ngy thng
V d

M t

1999-01-08

ISO 8601; Ngy 8 thng 1 mi ch (nh dng c khuyn co)

January 8, 1999

mp m trong mi ch u vo dng ngy thng datestyle

1/8/1999

Ngy 8 thng 1 theo ch MDY; ngy 1 thng 8 theo ch DMY

1/18/1999

Ngy 18 thng 1 theo ch MDY; b t chi trong cc ch khc

01/02/03

Ngy 2 thng 1 nm 2003 theo ch MDY, ngy 1 thng 2 nm 2003 theo ch DMY; ngy 3
thng 2 nm 2001 theo ch YMD

1999-Jan-08

Ngy 8 thng 1 trong bt k ch no

Jan-08-1999

Ngy 8 thng 1 trong bt k ch no

08-Jan-1999

Ngy 8 thng 1 trong bt k ch no

99-Jan-08

Ngy 8 thng 1 theo YMD, cn li th li

08-Jan-99

Ngy 8 thng 1, ngoi tr c li theo ch YMD

Jan-08-99

Ngy 8 thng 1, ngoi tr c li theo ch YMD

19990108

ISO 8601; ngy 8 thng 1 nm 1999 theo bt k ch no

990108

ISO 8601; ngy 8 thng 1 nm 1999 theo bt k ch no

1999.008

nm v ngy ca nm

J2451187

ngy theo lch Julian

January 8, 99 BC

Nm 99 BC

8.5.1.2. Thi gian

Cc dng thi gian ca ngy (time-of-day) l time [ (p) ] without


zone. time l tng ng mt mnh vi time without time zone.

time zone

time [ (p) ] with time

u vo hp l cho cc dng bao gm thi gian ca ngy theo sau l mt vng thi gian ty
chn. (Xem Bng 8-11 v Bng 8-12). Nu mt vng thi gian c ch nh u vo cho time
without time zone, th n m thm c b qua. Bn cng c th ch nh mt ngy thng nhng n
s b b qua, ngoi tr khi bn s dng mt tn vng thi gian c lin quan ti mt qui tc tit kim
nh sng ban ngy nh America/New_York. Trong trng hp ny vic ch nh ngy thng c yu
cu xc nh liu tiu chun hoc thi gian tit kim nh sng ban ngy c c p dng hay
khng. S b tr vng thi gian ph hp c ghi nhn trong gi tr time with time zone.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 142/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Bng 8-11. u vo thi gian


V d

M t

04:05:06.789

ISO 8601

04:05:06

ISO 8601

04:05

ISO 8601

040506

ISO 8601

04:05 AM

ht nh 04:05; AM khng nh hng ti gi tr

04:05 PM

ht nh 16:05; gi u vo phi l <= 12

04:05:06.789-8

ISO 8601

04:05:06-08:00

ISO 8601

04:05-08:00

ISO 8601

040506-08

ISO 8601

04:05:06 PST

vng thi gian c ch nh vit tt

2003-04-12 04:05:06 America/New_York

vng thi gian c tn y ch nh

Bng 8-12. u vo vng thi gian


V d

M t

PST

Vit tt (cho thi gian tiu chun Thi Bnh dng)

America/New_York

Tn y ca vng thi gian

PST8PDT

c t vng thi gian kiu POSIX

-8:00

ISO-8601 phn b cho PST

-800

ISO-8601 phn b cho PST

-8

ISO-8601 phn b cho PST

zulu

Vit tt kiu qun s cho UTC

Dng ngn gn ca zulu

Tham kho Phn 8.5.3 c thm thng tin v cch ch nh cc vng thi gian.
8.5.1.3. Du thi gian

u vo hp l cho cc dng du thi gian cu to t s ghp mt ngy thng v mt thi gian, theo
sau l mt vng thi gian ty chn, theo sau l mt la chn AD hoc BC. (Nh mt la chn,
AD/BC c th xut hin trc vng thi gian, nhng y khng l trt t c u tin). V th:
1999-01-08 04:05:06

v
1999-01-08 04:05:06 -8:00

l cc gi tr hp l, chng tun theo tiu chun ISO 8601. Hn na, nh dng chung:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 143/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

January 8 04:05:06 1999 PST

c h tr.
Tiu chun SQL phn bit cc hng timestamp without time zone v timestamp with time zone bng
s hin din ca mt biu tng du + hoc - v b tr vng thi gian sau thi gian . V th,
theo tiu chun,
TIMESTAMP 2004-10-19 10:23:54

l mt timestamp without time zone, trong khi


TIMESTAMP 2004-10-19 10:23:54+02

l mt timestamp with time zone. PostgreSQL khng bao gi kim tra ni dung ca mt chui hng
trc khi xc nh dng ca n, v v th s i x vi c 2 trn nh l timestamp without time
zone. m bo rng mt hng c i x nh l timestamp with time zone, hy trao cho n dng
r rng ng:
TIMESTAMP WITH TIME ZONE 2004-10-19 10:23:54+02

Trong mt hng m tng c xc nh s l timestamp without time zone, PostgreSQL s m thm


b qua bt k ch nh vng thi gian no. l, gi tr kt qu c dn xut t cc trng ngy
thng/thi gian gi tr u vo, v khng c tinh chnh cho vng thi gian.
i vi timestamp with time zone, gi tr ban u c lu tr lun l theo Thi gian c iu
phi Vn nng - UTC (Universal Coordinated Time), theo truyn thng c bit ti nh l Gi
mt tri GMT (Greenwich Mean Time). Mt gi tr u vo c mt vng thi gian r rng c
ch nh c chuyn i thnh UTC bng vic s dng b tr ph hp cho vng thi gian . Nu
khng vng no c cng b trong chui u vo, th c gi thit s l trong vng thi gian
c tham s vng thi gian (timezone) ca h thng ch nh, v c chuyn i thnh UTC
bng vic s dng b tr cho vng timezone.
Khi mt gi tr timestamp with time zone l u ra, n lun c chuyn i t UTC sang vng
timezone hin hnh, v c hin th nh l thi gian a phng theo vng . xem thi gian
trong vng thi gian khc, hoc thay i timezone hoc s dng cu trc AT TIME ZONE (xem Phn
9.9.3).
Nhng bin i gia timestamp without time zone v timestamp with time zone thng gi thit rng
gi tr timestamp without time zone s c ly hoc c a ra nh l timezone thi gian a
phng. Mt vng thi gian khc c th c ch nh cho s bin i bng vic s dng AT
TIME ZONE.
8.5.1.4. Gi tr c bit

PostgreSQL h tr vi gi tr u vo ngy thng/thi gian c bit v s tin li, nh c nu


Bng 8-13. Gi tr infinity v -infinity c trnh by c bit bn trong h thng v s c hin th
khng thay i; nhng nhng gi tr khc n gin l nhng tc k s c bin i thnh cc gi
tr ngy thng/thi gian thng thng khi c. (c bit, now v cc chui c lin quan c
Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 144/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

chuyn i thnh mt gi tr thi gian c bit ngay khi chng c c). Tt c cc gi tr cn


phi c a vo cc nhy n khi c s dng nh nhng hng s trong cc lnh SQL.
Bng 8-13. Cc u vo ngy thng/thi gian c bit
Chui u vo

Cc dng hp l

M t

epoch

date , timestamp

1970-01-01 00:00:00+00 (thi gian 0 theo h thng Unix)

infinity

date , timestamp

chm hn tt c cc du thi gian khc

-infinity

date , timestamp

sm hn tt c cc du thi gian khc

now

date , time , timestamp

thi gian bt u giao dch hin hnh

today

date , timestamp

na m hm nay

tomorrow

date , timestamp

na m ngy mai

yesterday

date , timestamp

na m hm qua

allballs

time

00:00:00.00 UTC

Cc hm tng thch SQL sau y cng c th c s dng ginh c gi tr thi gian hin
hnh i vi dng d liu tng ng: CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP,
LOCALTIME, LOCALTIMESTAMP. 4 dng sau chp nhn mt c t chnh xc phn giy ty chn.
(Xem Phn 9.9.4). Lu chng l cc hm SQL v khng c tha nhn trong cc chui u vo
d liu.

8.5.2. u ra ngay thng/thi gian


nh dng u ra ca cc dng ngy thng/thi gian c th c thit lp cho 1 trong 4 dng ISO
8601, SQL (Ingres), POSTGRES truyn thng (nh dng d liu Unix), hoc German (c). Mc
nh l nh dng ISO. (Tiu chun SQL yu cu s dng nh dng ISO 8601. Tn ca nh dng
u ra SQL l mt s vic lch s). Bng 8-14 ch cc v d ca tng dng u ra. u ra ca cc
dng date v time tt nhin ch l phn ngy thng hoc thi gian tun theo cc v d c a ra.
Bng 8-14. Cc kiu u ra ngy thng/thi gian
c t kiu

M t

V d

ISO

tiu chun ISO 8601/SQL

1997-12-17 07:37:16-08

SQL

kiu truyn thng

12/17/1997 07:37:16.00 PST

POSTGRES

kiu gc ban u

Wed Dec 17 07:37:16 1997 PST

German

kiu vng

17.12.1997 07:37:16.00 PST

Trong cc kiu SQL v POSTGRES, ngy xut hin trc thng nu trt t trng DMY tng c
ch nh, nu khc th thng s xut hin trc ngy. (Xem Phn 8.5.1 bit cch iu ny thit lp
cng nh hng ti s nhn bit cc gi tr u vo). Bng 8-15 ch ra mt v d.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 145/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Bng 8-15. Cc bin i trt t ngy thng


Thit lp datestyle

Trt t u vo

u ra

SQL, DMY

day/month/year

17/12/1997 15:37:16.00 CET

SQL, MDY

month/day/year

12/17/1997 07:37:16.00 PST

Postgres, DMY

day/month/year

Wed 17 Dec 07:37:16 1997 PST

Cc kiu ngy thng/thi gian c th c ngi s dng chn bng lnh SET datestyle, tham s
DateStyle trong tp cu hnh postgresql.conf, hoc bin mi trng PGDATESTYLE trn my ch hoc
my trm. Hm nh dng to_char (xem Phn 9.8) cng sn sng nh mt cch thc mm do hn
nh dng kt qu u ra ngy thng/thi gian.

8.5.3. Vng thi gian


Cc vng thi gian, v cc qui c vng thi gian chu nh hng bi cc quyt nh chnh tr, ch
khng ch ca a l tri t. Vng thi gian trn th gii tr thnh th g c tiu chun ha
vo nhng nng 1990, nhng tip tc hng i vi nhng thay i ty , c bit v cc qui nh
tit kim nh sng ban ngy. PostgreSQL s dng c s d liu vng thi gian c s dng rng
ri i vi thng tin v cc qui tc vng thi gian theo lch s. i vi thi gian trong tng lai, gi
thit l cc qui tc c bit ti mi nht cho mt vng thi gian c a ra s tip tc c quan
st v hn nh trong tng lai.
Nhng c gng xy dng PostgreSQL tng thch c vi cc nh ngha tiu chun SQL s
dng in hnh. Tuy nhin, tiu chun SQL c mt s pha trn k l cc dng v kh nng ca d
liu ngy thng v thi gian. C 2 vn r rng l:

D dng date khng th c mt vng thi gian c lin quan, th dng time li c th. Cc
vng trong th gii thc c t ngha, tr phi c lin quan ti ngy thng cng nh thi
gian, v s b tr c th khc nhau trong nm vi cc bin thi gian tit kim nh sng ban
ngy.

Vng thi gian mc nh c ch nh nh mt b tr s khng i i vi UTC. V th


khng c kh nng thch nghi cho thi gian tit kim nh sng ban ngy khi thc hin
tnh ton s hc cho ngy thng/thi gian khp cc bin DST.

gii quyt cc kh khn , chng ti khuyn co s dng cc dng ngy thng/thi gian c
cha c ngy thng v thi gian khi s dng cc vng thi gian. Chng ti khng khuyn co s
dng dng time with time zone (d n c PostgreSQL h tr cho cc ng dng c trc ri v
v s thun tin vi tiu chun SQL). PostgreSQL gi thit vng thi gian bn a ca bn cho bt
k dng no ch cha ngy thng hoc thi gian.
Tt c cc ngy thng v thi gian m vng thi gian hiu c s c lu ni b trong UTC.
Chng c chuyn i sang thi gian bn a trong vng c tham s cu hnh timezone ch nh
trc khi c hin th cho my khch.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 146/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

PostgreSQL cho php bn ch nh cc vng thi gian 3 dng khc nhau:

Tn vng thi gian y , v d America/New_York. Cc tn vng thi gian c tha


nhn s c lit k trong kiu nhn pg_timezone_names (xem Phn 45.60). PostgreSQL s
dng d liu vng thi gian c s dng rng ri zoneinfo cho mc ch ny, nn cc tn y
ht cng c nhiu phn mm khc hiu c.

Mt vit tt vng thi gian, v d PST. Mt c t nh vy ch xc nh mt b tr c bit


t UTC, ngc li vi cc tn vng thi gian y c th cng ng mt tp hp cc qui
tc ngy thng bin i (transitiondate) ca vic tit kim nh sng ban ngy. Nhng vit tt
c tha nhn c lit k trong kiu nhn pg_timezone_abbrevs (xem Phn 45.59). Bn
khng th thit lp cc tham s cu hnh timezone hoc log_timezone thnh mt s vit tt
vng thi gian, nhng bn c th s dng nhng vit tt trong cc gi tr u vo ngy
thng/thi gian v vi ton t AT TIME ZONE.

B sung thm vo cc tn v cc vit tt vng thi gian, PostgreSQL s chp nhn cc c t


vng thi gian dng POSIX i vi dng STDoffset hoc STDoffsetDST, trong STD l mt
vit tt vng tit kim nh sng ban ngy ty chn, c gi thit thay cho mt gi trc s
b tr c a ra. V d, nu EST5EDT cn cha l mt tn vng c tha nhn, th c th
c chp nhn v c th, v chc nng, tng ng vi thi gian B ng nc M
(United State East Coast time). Khi mt tn vng tit kim nh sng ban ngy l hin din,
c gi thit s c s dng theo cng cc qui tc bin i tit kim nh sng ban ngy
c s dng khon u vo posixrules ca c s d liu vng thi gian zoneinfo. Trong
mt ci t PostgreSQL tiu chun, posixrules l ht nh US/Eastern, sao cho cc c t vng
thi gian dng POSIX tun theo cc qui nh tit kim nh sng ban ngy ca M. Nu cn,
bn c th tinh chnh hnh vi ny bng vic thay th tp posixrules.

Ngn gn, y l s khc bit gia nhng vit tt v cc tn y : cc vit tt lun i din cho
mt s b tr c nh t UTC, trong khi hu ht cc tn y ng mt qui nh thi gian a
phng v tit kim nh sng ban ngy, v v th c 2 b tr c kh nng theo UTC.
Bn c th lo rng tnh nng vng thi gian dng POSIX c th m thm dn ti vic chp nhn cc
u vo gi to, v khng c s kim tra v tnh hp l ca cc t vit tt vng thi gian. V d, SET
TIMEZONE TO FOOBAR0 s lm vic, lm cho h thng s dng mt cch c hiu qu hn l s vit
tt k d khc thng theo UTC.
Mt vn khc phi nh trong u l theo cc tn vng thi gian POSIX, cc phn b dng c
s dng cho cc v tr pha ty ca Greenwich. nhng ni khc, PostgreSQL tun theo qui c
chun ISO 8601 m cc phn b vng thi gian dng l pha ng ca Greenwich.
Trong mi trng hp, cc tn vng thi gian c tha nhn l phn bit ch hoa v ch thng.
(y l s thay i vi cc phin bn PostgreSQL trc 8.2, n tng l phn bit ch hoa v ch
thng trong mt s ng cnh ny nhng li khng trong cc ng cnh khc). Cc tn y v cc
tn vit tt u khng c gn cng vo my ch; chng c c t cc tp cu hnh c lu tr

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 147/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

trong .../share/timezone/ v .../share/timezonesets/ ca th mc ci t (xem Phn B.3).


Tham s cu hnh vng thi gian c th c thit lp trong tp postgresql.conf, hoc trong bt k
cch thc tiu chun no khc c m t trong Chng 18. Cng c vi cch thc c bit thit
lp n:

Nu vng thi gian khng c ch nh trong postgresql.conf hoc nh mt la chn dng


lnh ca mt my ch, th my ch s c gng s dng gi tr bin mi trng TZ nh l
vng thi gian mc nh. Nu TZ khng c nh ngha hoc khng phi l bt k tn no
ca vng thi gian c bit ti i vi PostgreSQL, th my ch s c gng xc nh vng
thi gian mc nh ca h iu hnh bng vic kim tra hnh vi ca hm localtime() ca th
vin C. Vng thi gian mc nh c la chn nh l s trng khp gn nht trong cc
vng thi gian ca PostgreSQL. (Cc qui tc cng c s dng chn gi tr mc
nh ca log_timezone, nu khng c ch nh).

Lnh SET TIME ZONE ca SQL thit lp vng thi gian cho phin lm vic. y l mt la
chn thay th ni SET TIMEZONE TO vi mt c php tng thch c t ca SQL.

Bin mi trng PGTZ c libpq cc my trm s dng gi i mt lnh


ti my ch khi c kt ni.

SET TIME ZONE

8.5.4. u vo khong
Cc gi tr khong interval c th c vit bng vic s dng c php rm r sau:
[@] quantity unit [quantity unit...] [direction]

trong

quantity

l mt s (c kh nng c k hiu);

unit

microsecond, millisecond, second,

(micro giy, milli giy, giy, pht,


gi, ngy, tun, thng, nm, thp nin, th k, ngn nm), hoc nhng ch vit tt hoc s nhiu ca
cc n v ; direction c th l ago hoc rng. K hiu @ () l nhiu ty chn. S lng cc n
v khc c b sung vo mt cch n vi vic tnh ti cc du hiu ph hp. T ago ph nh tt
c cc trng . C php ny cng c s dng cho u ra ca khong, nu IntervalStyle c
thit lp cho postgres_verbose.
minute, hour, day, week, month, year, decade, century, millennium

S lng cc ngy, gi, pht v giy c th c ch nh m khng c nhng nh du n v r


rng. V d, '1 12:59:10' c c y ht nh '1 ngy 12 gi 59 pht 10 giy'. Hn na, mt s kt
hp ca cc nm v thng c th c ch nh vi mt du gch ni; v d '200-10' c c y ht
nh '200 nm 10 thng'. (Cc dng ngn gn trong thc t ch l cc dng c tiu chun SQL
cho php, v c s dng cho u ra khi IntervalStyle c thit lp theo sql_standard).
Cc gi tr khong cng c th c vit nh cc vng thi gian theo ISO 8601, bng vic s dng
hoc nh dng vi cc b ch nh ca tiu chun phn 4.4.3.2 hoc nh dng la chn thay
th ca phn 4.4.3.3. nh dng vi cc b ch nh trng ging th ny:
P quantity unit [ quantity unit ...] [ T [ quantity unit ...]]

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 148/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Chui phi bt u vi mt ch P, v c th c c ch T m gii thiu cc n v thi gian ca


ngy time-of-day. Nhng ch vit tt n v c sn c a ra trong Bng 8-16. Cc n v c th
b b qua, v c th c ch nh theo bt k trt t no, nhng cc n v nh hn so vi mt
ngy phi xut hin sau ch T. c bit, ngha ca ch M ph thuc vo vic liu n l ng
trc hay sau ch T.
Bng 8-16. Cc ch vit tt n v khong theo ISO 8601
Vit tt

Ngha ting Anh

Years

Months

Weeks

Days

Hours

Minutes

Seconds

Ngha ting Vit

Nm

Thng

Tun

Ngy

Gi

Pht

Giy

Theo nh dng la chn thay th:


P [ years-months-days ] [ T hours:minutes:seconds ]

chui phi bt u bng ch P, v mt ch T tch cc phn ngy thng v thi gian ca khong
. Cc gi tr c a ra nh l cc s tng t vi ngy thng theo ISO 8601.
Khi vit mt hng khong vi mt c t cc trng fields, hoc khi ch nh mt chui cho mt ct
khong m c xc nh vi mt c t fields, ngha ca s lng khng c nh du ph
thuc vo fields. V d INTERVAL 1 YEAR c c nh l 1 nm, trong khi INTERVAL 1 c ngha l 1
giy. Hn na, cc gi tr trng bn phi ca trng c ngha nht c c t fields cho
php s b loi b mt cch m thm. V d, vit INTERVAL 1 day 2:03:04 HOUR TO MINUTE s c kt
qu loi b trng giy, nhng khng loi b trng ngy.
Theo tiu chun SQL th tt c cc trng ca mt gi tr khong phi c du y ht, nn mt du m
u s p dng cho tt c cc trng; v d du m trong hng khong '-1 2:03:04' s p dng cho
c cc ngy v cc phn gi/pht/giy. PostgreSQL cho php cc trng c cc du khc nhau, v
theo truyn thng i x vi tng trng theo s trnh by theo ng cnh nh c k hiu mt cch
c lp, sao cho phn gi/pht/giy c xem l dng trong v d ny. Nu IntervalStyle c thit
lp cho sql_standard th mt du u c coi l s p dng cho tt c cc trng (m ch khi
khng c du b sung no xut hin). Nu khng th din gii theo truyn thng ca PostgreSQL s
c s dng. trnh s nhm ln, c khuyn co gn mt du r rng cho tng trng nu c
bt k trng no l m.
V ni b, cc gi tr interval c lu tr nh l cc thng, ngy v giy. iu ny c lm v s
ngy trong thng l khc nhau, v mt ngy c th c 23 hoc 25 gi nu s chnh sa thi gian tit
kim nh sng ban ngy c lin quan. Cc trng thng v ngy l s nguyn, trong khi trng giy
c th l phn s. V cc khong thng c to ra t cc chui hng hoc t php tr timestamp,
nn phng php lu tr ny lm vic tt trong hu ht cc trng hp. Cc hm justify_days v
justify_hours l sn sng cho vic chnh sa ngy v gi m trn khi di thng thng ca chng.
nh dng u vo di dng, v trong mt s trng ca cc nh dng u vo gn cht hn, cc
gi tr trng c th c cc phn thp phn; v d '1.5 week' hoc '01:02:03.45'. u vo nh vy

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 149/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

c chuyn i thnh s lng ph hp ca cc thng, ngy v giy lu tr. Khi iu ny c


th gy ra mt s thp phn ca cc thng hoc ngy, phn thp phn c b sung vo cc trng
theo trt t thp hn bng vic s dng cc yu t chuyn i 1 thng = 30 ngy v 1 ngy = 24 gi.
V d '1.5 month' ('1.5 thng') tr thnh 1 thng v 15 ngy. Ch cc giy s lun c ch ra nh l
phn l u ra.
Bng 8-17 ch mt s v d u vo interval hp l.
Bng 8-17. u vo khong
V d

M t

1-2

nh dng tiu chun SQL: 1 nm 2 thng

3 4:05:06

nh dng tiu chun SQL: 3 ngy 4 gi 5 pht 6 giy

1 year 2 months 3 days 4 hours 5 minutes 6 seconds

nh dng PostgreSQL truyn thng: 1 nm 2 thng 3 ngy 4


gi 5 pht 6 giy

P1Y2M3DT4H5M6S

ISO 8601 nh dng c b ch nh: ngha ht nh trn

P0001-02-03T04:05:06

ISO 8601 nh dng ty chn: ngha ht nh trn

8.5.5. u ra khong
nh dng u ra ca dng khong c th c thit lp v mt trong 4 dng sql_standard, postgres,
postgres_verbose hoc iso_8601, bng vic s dng lnh SET intervalstyle. Mc nh l nh dng
postgres. Bng 8-18 ch cc v d ca tng dng u ra.
Dng sql_standard to u ra m tun th vi c t tiu chun SQL cho cc chui hng khong, nu
gi tr khong p ng c nhng hn ch ca tiu chun (hoc ch nm-thng hoc ch ngy-thi
gian, khng pha trn cc thnh phn dng v m). Nu khng u ra s trng ging nh mt chui
hng tiu chun nm-thng i theo sau l mt chui hng ngy-thi gian, vi cc du r rng c
thm vo trnh nhm ln cc khong du b pha trn.
u ra dng postgres khp vi u ra cc phin bn PostgreSQL trc 8.4 khi m tham s
DateStyle c thit lp theo ISO.
u ra ca dng postgres_verbose khp vi u ra ca cc phin bn PostgreSQL trc 8.4 khi tham
s DateStyle tng c thit lp cho u ra khng theo ISO.
u ra ca dng iso_8601 khp vi nh dng c cc b ch nh c m t phn 4.4.3.2 ca
tiu chun ISO 8601.
Bng 8-18 Cc v d dng u ra khong
c t dng

Khong nm-thng

Khong ngy-thi gian

Khong pha trn

sql_standard

1-2

3 4:05:06

-1-2 +3 -4:05:06

postgres

1 nm 2 thng

3 ngy 04:05:06

-1 nm -2 thng +3 ngy -04:05:06

postgres_verbose @

1 nm 2 thng

@ 3 ngy 4 gi 5 pht 6 giy

@ 1 nm 2 thng -3 ngy 4 gi 5
pht 6 giy trc

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 150/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


c t dng
iso_8601

Khong nm-thng
P1Y2M

Khong ngy-thi gian


P3DT4H5M6S

Xut bn nm 2013
Khong pha trn
P-1Y-2M3DT-4H-5M-6S

8.5.6. Chi tit bn trong


PostgreSQL s dng ngy Julian cho tt c cc tnh ton ngy thng/thi gian. iu ny c c
im hu dng i vi cc ngy tnh ton ng t nm 4713 BC cho ti xa trong tng lai, bng
vic s dng gi thit rng di ca nm l 365.2425 ngy.
Nhng chuyn i ngy trc th k 19 lm cho vic c l th v, nhng khng nht qun
m bo vic lp trnh trong trnh iu khin ngy thng/thi gian.

8.6. Dng boolean


PostgreSQL cung cp dng boolean theo tiu chun SQL; xem Bng 8-19. Dng boolean c th c 1
trong ch 2 trng thi: true (ng) hoc false (sai). Trng thi th 3, unknown (khng
bit), c th hin bng gi tr null theo SQL.
Bng 8-19. Dng d liu boolean
Tn
boolean

Kch c lu tr
1 byte

M t
trng thi ng hoc sai

Cc gi tr hng hp l i vi trng thi true l:


TRUE
t
true
y
yes
on
1

i vi trng thi false, cc gi tr sau y c th c s dng:


FALSE
f
false
n
no
off
0

Du trng u hoc sau s b b qua, v khng phn bit ch hoa v ch thng. Cc t kha
TRUE v FALSE c u tin (tun theo SQL) s dng.
V d 8-2 ch ra rng cc gi tr boolean l cc u ra s dng cc k t t v f.
V d 8-2. S dng dng boolean
CREATE TABLE test1 (a boolean, b text);

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 151/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

INSERT INTO test1 VALUES (TRUE, sic est);


INSERT INTO test1 VALUES (FALSE, non est);
SELECT * FROM test1;
a|b
---+--------t | sic est
f | non est
SELECT * FROM test1 WHERE a;
a|b
---+--------t | sic est

8.7. Cc dng nh s
Cc dng nh s (enum) l cc dng d liu bao gm mt tp hp cc gi tr tnh, c sp xp
theo trt t. Chng l tng ng vi cc dng enum c h tr trong mt s ngn ng lp trnh.
Mt v d dng enum c th l cc ngy ca tun, hoc mt tp hp cc gi tr trng thi cho mt
mu d liu.

8.7.1. Khai bo cc dng nh s


Cc dng nh s c to ra bng vic s dng lnh to dng CREATE TYPE, v d:
CREATE TYPE mood AS ENUM (sad, ok, happy);

Mt khi c to ra, dng enum c th c s dng trong cc nh ngha bng hoc hm ging ht
nh bt k dng no khc:
CREATE TYPE mood AS ENUM (sad, ok, happy);
CREATE TABLE person (
name text,
current_mood mood
);
INSERT INTO person VALUES (Moe, happy);
SELECT * FROM person WHERE current_mood = happy;
name | current_mood
--------+-------------Moe | happy
(1 row)

8.7.2. Xp th t
Vic xp th t cc gi tr trong mt dng enum l trt t theo cc gi tr c lit k khi dng
c to ra. Tt c cc ton t so snh tiu chun v cc hm tng hp c lin quan c h
tr cho enum. V d:
INSERT INTO person VALUES (Larry, sad);
INSERT INTO person VALUES (Curly, ok);
SELECT * FROM person WHERE current_mood > sad;

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 152/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

name | current_mood
--------+-------------Moe | happy
Curly | ok
(2 rows)
SELECT * FROM person WHERE current_mood > sad ORDER BY current_mood;
name | current_mood
--------+-------------Curly | ok
Moe | happy
(2 rows)
SELECT name
FROM person
WHERE current_mood = (SELECT MIN(current_mood) FROM person);
name
------Larry
(1 row)

8.7.3. An ton dng


Mi dng d liu lit k l tch bch nhau v khng th c so snh vi cc dng c lit k
khc. Xem v d ny:
CREATE TYPE happiness AS ENUM (happy, very happy, ecstatic);
CREATE TABLE holidays (
num_weeks integer,
happiness happiness
);
INSERT INTO holidays(num_weeks,happiness) VALUES (4, happy);
INSERT INTO holidays(num_weeks,happiness) VALUES (6, very happy);
INSERT INTO holidays(num_weeks,happiness) VALUES (8, ecstatic);
INSERT INTO holidays(num_weeks,happiness) VALUES (2, sad);
ERROR: invalid input value for enum happiness: "sad"
SELECT person.name, holidays.num_weeks FROM person, holidays
WHERE person.current_mood = holidays.happiness;
ERROR: operator does not exist: mood = happiness

Nu bn thc s cn lm th g ging iu , th bn c th hoc vit mt ton t ty bin hoc


thm cc cast r rng vo truy vn ca bn:
SELECT person.name, holidays.num_weeks FROM person, holidays
WHERE person.current_mood::text = holidays.happiness::text;
name | num_weeks
--------+----------Moe | 4
(1 row)

8.7.4. Cc chi tit trin khai


Mt gi tr enum chim 4 byte trn a. di ca mt nhn vn bn gi tr enum c gii hn
bng thit lp NAMEDATALEN c bin dch trong PostgreSQL; theo xy dng tiu chun th iu
ny c ngha l nhiu nht 63 byte.
Cc nhn enum phn bit ch hoa v ch thng, nn 'happy' l khng ging vi 'HAPPY'. K t

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 153/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

trng trong cc nhn cng l c ngha.


Cc bn dch t cc gi tr enum ni b sang cc nhn vn bn c gi trong catalog h thng
pg_enum. Vic truy vn catalog ny trc tip c th l hu dng.

8.8. Dng a l
Cc dng d liu a l th hin cc i tng khng gian 2 chiu. Bng 8-20 ch ra cc dng a l
c sn trong PostgreSQL. Dng c bn nht, im, to nn c s cho tt c cc dng khc.
Bng 8-20. Cc dng a l
Tn

Kch c lu tr

Trnh by

M t

point (im)

16 bytes

im trn mt mt phng

(x,y)

line (ng thng)

32 bytes

ng v tn (c trin khai khng y )

((x1,y1),(x2,y2))

lseg (on thng)

32 bytes

on thng c gii hn

((x1,y1),(x2,y2))

box (hp)

32 bytes

Hp ch nht

((x1,y1),(x2,y2))

path (ng)

16+16n bytes

ng khp kn (tng t nh a gic)

((x1,y1),...)

path (ng)

16+16n bytes

ng m

[(x1,y1),...]

polygon (a gic)

40+16n bytes

a gic (tng t nh ng khp kn)

((x1,y1),...)

circle (ng trn)

24 bytes

ng trn

<(x,y),r> (tm v bn knh)

Mt tp hp giu c cc hm v ton t l sn c thc thi cc hot ng a l khc nhau nh


chia t l, tnh tin, xoay v xc nh cc im giao ct. Chng c gii thch trong Phn 9.11.

8.8.1. im
Cc im l khi xy dng 2 chiu c bn cho cc dng a l. Cc gi tr dng
bng vic s dng cc c php sau:

point

c ch nh

(x,y)
x,y

trong x v y l cc ta tng ng, nh cc s c cc du thp phn.


Cc im l u ra c s dng c php u tin.

8.8.2. Cc on thng
Cc on thng (lseg) c trnh by theo cp cc im. Cc gi tr dng
vic s dng bt k c php no sau y:

lseg

c ch nh bng

[ ( x1 , y1 ) , ( x2 , y2 ) ]
( ( x1 , y1 ) , ( x2 , y2 ) )
( x1 , y1 ) , ( x2 , y2 )
x1 , y1 , x2 , y2

trong (x1,y1) v (x2,y2) l cc im cui ca on thng .

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 154/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Cc on thng l u ra c s dng c php u.

8.8.3. Cc hp
Cc hp c th hin bng cp cc im m chng nm cc gc i din ca hp . Cc gi tr
dng box c ch nh bng vic s dng bt k c php no sau y:
( ( x1 , y1 ) , ( x2 , y2 ) )
( x1 , y1 ) , ( x2 , y2 )
x1 , y1 , x2 , y2

trong (x1,y1) v (x2,y2) l bt k 2 gc i din no ca hp .


Cc hp l cc kt qu u ra c s dng c php th 2.
Bt k 2 gc i din nhau no cng c th c cung cp u vo, nhng cc gi tr s c ti
lp trt t nh cn thit lu tr cc gc phi trn v tri di, theo trt t .

8.8.4. ng
Cc ng c cc danh sch cc im kt ni th hin. Cc ng c th l m, ni m cc im
u v cui trong danh sch c xem l khng ni vi nhau, hoc ng, ni m cc im u v
cui c thy c ni vi nhau.
Cc gi tr dng path c ch nh bng vic s dng bt k c php no sau y:
[ ( x1 , y1 ) , ... , ( xn , yn ) ]
( ( x1 , y1 ) , ... , ( xn , yn ) )
( x1 , y1 ) , ... , ( xn , yn )
( x1 , y1 , ... , xn , yn )
x1 , y1 , ... , xn , yn

trong cc im l cc im cui ca cc on thng to nn ng . Cc ngoc vung ([]) ch


mt ng m, trong khi cc ngoc n (()) ch mt ng khp kn. Khi cc du ngoc n vng
ngoi cng b b qua, nh trong cc c php th 3 v 5, th mt ng khp kn c gi thit.
Cc ng l u ra c s dng c php 1 hoc 2 mt cch ph hp.

8.8.5. a gic
Cc a gic c cc danh sch cc im (cc nh ca a gic) th hin. Cc a gic rt ging vi
cc ng khp kn, nhng c lu gi khc v c tp cc th tc h tr ring ca chng.
Cc gi tr dng polygon c ch nh bng vic s dng bt k c php no sau y:
( ( x1 , y1 ) , ... , ( xn , yn ) )
( x1 , y1 ) , ... , ( xn , yn )
( x1 , y1 , ... , xn , yn )
x1 , y1 , ... , xn , yn

trong cc im l cc im cui ca cc on thng to nn ng bao ca a gic .


Cc a gic l u ra c s dng c php s 1.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 155/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

8.8.6. ng trn
Cc ng trn c mt im tm v bn knh th hin. Cc gi tr dng
vic s dng bt k c php no sau y:

circle

c ch nh bng

<(x,y),r>
((x,y),r)
(x,y),r
x,y,r

trong (x,y) l tm v r l bn knh ca ng trn.


Cc ng trn l u ra c s dng c php s 1.

8.9. Dng a ch mng


PostgreSQL a ra cc dng d liu lu tr cc a ch IPv4, IPv6 v MAC, nh c nu trong
Bng 8-21. L tt hn s dng cc dng thay v cc dng vn bn th lu tr cc a ch
mng, v cc dng a ra vic kim tra li u vo v cc ton t v hm chuyn bit (xem Phn
9.12).
Bng 8-21. Cc dng a ch mng
Tn

Kch c lu tr

M t

cidr

7 hoc 19 bytes

Cc mng IPv4 v IPv6

inet

7 hoc 19 bytes

Cc my ch v cc mng IPv4 v IPv6

macaddr

6 bytes

Cc a ch MAC

Khi sp xp cc dng d liu inet hoc cidr, cc a ch IPv4 s lun sp xp trc cc a ch IPv6,
bao gm c cc a ch IPv4 c gi hoc c nh x ti cc a ch IPv6, nh ::10.2.3.4 hoc
::ffff:10.4.3.2.

8.9.1. inet
Dng inet gi mt a ch my ch IPv4 hoc IPv6, v mng con (subnet) ca n mt cch ty chn,
tt c trong mt trng. Mng con c th hin bng s cc bit a ch mng th hin trong a
ch my ch (mt n mng [netmask]). Nu mt n mng l 32 bit v a ch l IPv4, th gi
tr khng ch mt mng con, m ch l mt my ch (host) duy nht. Trong IPv6, di a ch
l 128 bit, nn 128 bit ch nh mt a ch my ch duy nht. Lu l nu bn mun chp nhn ch
cc mng, th bn nn s dng dng cidr hn l dng inet.
nh dng u vo cho dng ny l address/y trong address l mt a ch IPv4 hoc IPv6 v y l
s cc bit trong mt n mng . Nu phn /y khng c, th mt n mng l 32 bit cho IPv4 v 128
bit cho IPv6, nn gi tr ch th hin mt my ch host duy nht. hin th, phn /y c nn
nu mt n mng ch nh mt my ch host duy nht.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 156/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

8.9.2. cidr
Dng cidr gi mt c t mng IPv4 hoc IPv6. Cc nh dng u vo v u ra tun theo cc qui
c nh tuyn Min Internet Khng c lp (Classless Internet Domain Routing). nh dng
cho vic ch nh cc mng l address/y trong address l mng c th hin nh mt a ch
IPv4 hoc IPv6, v y l s cc bit trong mt n mng. Nu y b b qua, th n c tnh bng vic s
dng nhng gi thit t h thng nh s mng lp c hn, ngoi tr n s t nht l ln
bao gm tt c cc byte c vit u vo. L mt li ch nh mt a ch mng m c cc bit
c thit lp bn phi ca mt n mng c ch nh.
Bng 8-22 ch mt s v d.
Bng 8-22. Cc v d u vo dng cidr
u vo cidr

u ra cidr

abbrev(cidr)

192.168.100.128/25

192.168.100.128/25

192.168.100.128/25

192.168/24

192.168.0.0/24

192.168.0/24

192.168/25

192.168.0.0/25

192.168.0.0/25

192.168.1

192.168.1.0/24

192.168.1/24

192.168

192.168.0.0/24

192.168.0/24

128.1

128.1.0.0/16

128.1/16

128

128.0.0.0/16

128.0/16

128.1.2

128.1.2.0/24

128.1.2/24

10.1.2

10.1.2.0/24

10.1.2/24

10.1

10.1.0.0/16

10.1/16

10

10.0.0.0/8

10/8

10.1.2.3/32

10.1.2.3/32

10.1.2.3/32

2001:4f8:3:ba::/64

2001:4f8:3:ba::/64

2001:4f8:3:ba::/64

2001:4f8:3:ba:2e0:81ff:fe22:d1f1

/2102081:4f8:3:ba:2e0:81ff:fe22:d1f1

/2102081:4f8:3:ba:2e0:81ff:fe22:d1f1

::ffff:1.2.3.0/120

::ffff:1.2.3.0/120

::ffff:1.2.3/120

::ffff:1.2.3.0/128

::ffff:1.2.3.0/128

::ffff:1.2.3.0/128

8.9.3. inet so vi cidr


S khc bit c bn gia cc dng d liu inet v cidr l inet chp nhn cc gi tr vi cc bit khng
bng 0 bn phi ca mt n mng, trong khi cidr th khng.
Mo: Nu bn khng thch nh dng u ra i vi cc gi tr
hm host, text v abbrev.

inet

hoc

cidr,

hy th cc

8.9.4. macaddr
Dng

macaddr

lu tr cc a ch MAC, c bit, v d, t cc a ch phn cng card mng

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 157/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Ethernet (d cc a ch MAC c s dng cho c nhng mc ch khc na). u vo c chp


nhn trong cc nh dng sau:
08:00:2b:01:02:03
08-00-2b-01-02-03
08002b:010203
08002b-010203
0800.2b01.0203
08002b010203

Cc v d tt c c th ch nh cng y ht a ch. Ch hoa v ch thng c chp nhn cho


cc k t s t a ti f. u ra lun l mu c ch ra u tin.
Tiu chun 802-2001 ca IEEE ch nh mu c ch ra th 2 (vi cc du ni) nh mu hp
chun cho cc a ch MAC, v ch nh mu u tin (vi cc du 2 chm) nh l k hiu bit
nghch o, sao cho 08-00-2b-01-02-03 = 01:00:4D:08:04:0C. Qui c ny ngy nay b b qua
mt cch rng ri, v ch ph hp cho cc giao thc mng li thi (nh Token Ring).
PostgreSQL khng a ra iu khon no cho s nghch o cc bit, v tt c cc nh dng c
chp nhn s dng trt t LSB hp chun.
4 nh dng u vo cn li khng phi l mt phn ca bt k tiu chun no.

8.10. Dng chui bit


Cc chui bit l cc chui cc s 1 v 0. Chng c th c s dng lu tr hoc trc quan ha
cc mt n bit. C 2 dng bit theo SQL: bit(n) v bit varying(n), trong bit n l s nguyn dng.
D liu dng bit phi khp chnh xc vi di n; s l mt li c gng lu tr cc chui bit
ngn hn hoc di hn. D liu bit varying l di bin ph thuc vo di cc i n; cc chui
di hn s b t chi. Vic vit bit m khng c mt di l tng ng vi bit(1), trong khi bit
varying khng c ch nh di c ngha l di khng gii hn.
Lu : Nu mt ngi r rng a ra mt gi tr chui bit cho bit(n), th n s b ct bt hoc
c m thm s 0 vo bn phi tr thnh chnh xc n bit, khng ny sinh mt li no.
Tng t, nu mt ngi a ra r rng mt gi tr chui bit cho bit varying(n), th n s b ct
bt bn phi nu n ln hn n bit.
Hy tham chiu ti Phn 4.1.2.5 c thng tin v c php ca cc hng chui bit. Cc ton t
logic v bit v cc hm iu khin chui l c sn; xem Phn 9.6.
V d 8-3. S dng cc dng chui bit
CREATE TABLE test (a BIT(3), b BIT VARYING(5));
INSERT INTO test VALUES (B101, B00);
INSERT INTO test VALUES (B10, B101);
ERROR: bit string length 2 does not match type bit(3)

INSERT INTO test VALUES (B10::bit(3), B101);


SELECT * FROM test;
a|b
-----+------101 | 00
100 | 101

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 158/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Mt gi tr chui bit i hi 1 byte cho tng nhm 8 bit, cng 5 hoc 8 byte tng th ph thuc vo
di ca chui (nhng cc gi tr di c th c nn hoc c dch chuyn vt ra khi
dng, nh c gii thch Phn 8.3 cho cc chui k t).

8.11. Dng tm kim vn bn


PostgreSQL cung cp 2 dng d liu c thit k h tr tm kim ton vn, n l hot ng tm
kim qua mt b su tp cc ti liu ngn ng t nhin nh v cc ti liu m trng khp tt
nht vi mt truy vn. Dng tsvector th hin mt ti liu dng c ti u ha cho tm kim vn
bn; dng tsquery th hin tng t nh mt truy vn vn bn. Chng 12 a ra mt gii thch chi
tit c s ny, v Phn 9.13 tm tt cc hm v ton t c lin quan.

8.11.1. tsvector
Mt gi tr tsvector l mt danh sch c sp xp cc t v khc bit nhau, chng l cc t c
bnh thng ha trn cc bin th khc nhau ca cng t y ht (xem Chng 12 c cc chi
tit). Vic sp xp v loi b p bn c thc hin t ng u vo, nh trong v d ny:
SELECT a fat cat sat on a mat and ate a fat rat::tsvector;
tsvector
---------------------------------------------------a and ate cat fat mat on rat sat

th hin cc t v vi cc du trng hoc cc du chm ngt, hy a chng vo cc du nhy:


SELECT $$the lexeme contains spaces$$::tsvector;
tsvector
------------------------------------------ contains lexeme spaces the

(Chng ta s dng cc hng chui c a vo cc du $ trong v d ny v v d tip sau trnh


s nhm ln phi p bn cc du nhy trong cc hng ). Cc du cho ngc v du nhy nhng
phi c p bn:
SELECT $$the lexeme Joes contains a quote$$::tsvector;
tsvector
-----------------------------------------------Joes a contains lexeme quote the

Mt cch ty chn, cc v tr s nguyn c th c gn vo cc t v:


SELECT a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12::tsvector;
tsvector
------------------------------------------------------------------------------a:1,6,10 and:8 ate:9 cat:3 fat:2,11 mat:7 on:5 rat:12 sat:4

Mt v tr thng ch ra v tr t ngun gc trong ti liu. Thng tin v tr c th c s dng cho


vic xp hng s tim cn. Cc gi tr v tr c th tri t 1 ti 16383; cc s ln hn c thit lp
m thm ti 16383. Cc v tr p bn i vi cng t v s b loi b.
Cc t v c cc v tr sau c th c gn nhn vi mt trng s, n c th l A, B, C hoc D. D

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 159/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

l mc nh v v th khng c hin th u ra:


SELECT a:1A fat:2B,4C cat:5D::tsvector;
tsvector
---------------------------a:1A cat:5 fat:2B,4C

Cc trng s thng c s dng phn nh cu trc ti liu, v d bng vic to cc t u


khc vi cc t ca thn ti liu. Cc hm xp hng tm kim vn bn c th ch nh cc u tin
khc nhau cho cc du trng s khc nhau.
iu quan trng phi hiu rng bn thn dng tsvector khng thc hin bt k s bnh thng ha
no; n gi thit cc t c a ra c bnh thng ha ph hp cho ng dng. V d:
select The Fat Rats::tsvector;
tsvector
-------------------Fat Rats The

i vi cc ng dng tm kim vn bn ting Anh th cc t trn c th c xem l khng c


bnh thng ha, nhng tsvector khng quan tm. Vn bn ti liu th thng s c chuyn qua
to_tsvector bnh thng ha cc t ph hp cho vic tm kim:
SELECT to_tsvector(english, The Fat Rats);
to_tsvector
----------------fat:2 rat:3

Mt ln na, xem Chng 12 c thm chi tit.

8.11.2. tsquery
Mt gi tr

lu tr cc t v s c tm kim, v kt hp chng vi cc ton t Boolean


(AND), | (OR) v ! (NOT). Cc du ngoc n c th c s dng p to nhm cc ton t:
tsquery

&

SELECT fat & rat::tsquery;


tsquery
--------------fat & rat
SELECT fat & (rat | cat)::tsquery;
tsquery
--------------------------fat & ( rat | cat )
SELECT fat & rat & ! cat::tsquery;
tsquery
-----------------------fat & rat & !cat

Khng c cc du ngoc n, ! (NOT) rng buc cht ch nht, v

& (AND)

rng buc cht ch hn

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 160/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

so vi | (OR).
Mt cch ty chn, cc t v trong mt tsquery c th c gn nhn vi mt hoc nhiu hn cc k
t trng s, hn ch chng trng khp ch cc t v ca tsvector vi cc trng s trng khp:
SELECT fat:ab & cat::tsquery;
tsquery
-----------------fat:AB & cat

Hn na, cc t v trong mt tsquery c th c gn nhn bng * ch nh s khp tin t:


SELECT super:*::tsquery;
tsquery
----------super:*

Truy vn ny s khp vi bt k t no trong mt tsvector m bt u vi super.


Cc qui tc to du ngoc cho cc t v l y ht nh c m t trc cho cc t v trong
tsvector; v, nh vi tsvector, bt k s bnh thng ha cc t no theo yu cu cng phi c
thc hin trc khi chuyn i sang dng tsquery.
Hm to_tsquery l thun tin cho vic thc thi s bnh thng ha nh vy:
SELECT to_tsquery(Fat:ab & Cats);
to_tsquery
-----------------fat:AB & cat

130

8.12. Dng UUID


Dng d liu uuid lu tr cc m nh danh duy nht vn nng - UUID (Universally Unique
Identifier) nh c RFC 4122, ISO/IEC 9834-8:2005, v cc tiu chun lin quan xc nh. (Mt
s h thng tham chiu ti dng d liu ny nh mt m nh danh duy nht tng th, hoc GUID
[Global Unique Identifier]). M nh danh ny l mt lng 128 bit c mt thut ton sinh ra v
c chn lm cho n khng c chc rng m nh danh y ht s c bt k ai khc sinh ra
trong v tr c bit ti bng vic s dng thut ton y ht. V th, i vi cc h thng phn tn,
cc m nh danh a ra mt m bo v tnh duy nht tt hn so vi cc b sinh tun t, chng
ch l duy nht trong mt c s d liu n nht.
Mt UUID c vit nh mt s tun t ca cc k t s h 16 ch thng, trong vi nhm c
cch nhau bng du ni, c bit mt nhm 8 k t s theo sau l 3 nhm vi 4 k t s ri li theo
sau l 1 nhm vi 12 k t s, tng cng 32 k t s i din cho 128 bit. Mt v d ca mt UUID
dng tiu chun ny l:
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11

PostgreSQL cng chp nhn cc mu la chn thay th sau cho u vo: s dng cc k t s ch
hoa, nh dng tiu chun trong cc du ngoc nhn, b qua mt s du gch ngang, b sung thm
Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 161/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

mt du gch ngang sau bt k nhm 4 k t s no. Cc v d l:


A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11
{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}
a0eebc999c0b4ef8bb6d6bb9bd380a11
a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11
{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}

u ra lun trong dng tiu chun.


PostgreSQL cung cp cc hm lu tr v so snh cho cc UUID, nhng c s d liu li khng bao
gm bt k hm no cho vic sinh cc UUID, v khng thut ton n nht no ph hp tt cho mi
ng dng. Module contrib contrib/uuid-ossp cung cp cc hm trin khai vi thut ton tiu chun.
Nh mt s la chn, cc UUID c th c sinh ra t cc ng dng hoc cc th vin khc b thu
hi thng qua mt hm pha my ch.

8.13. Dng XML


Dng d liu xml c th c s dng lu tr cc d liu XML. u im ca n so vi vic lu
tr cc d liu XML trong mt trng vn bn l n kim tra cc gi tr u vo v s thit lp tt,
v c cc hm h tr tin hnh cc hot ng dng an ton trong n; xem Phn 9.14. Vic s
dng d liu ny i hi s ci t phi c xy dng vi configure with-libxml.
Dng xml c th lu tr cc ti liu c thit lp tt, c c tiu chun XML nh ngha,
cng nh cc phn mnh ni dung c xc nh bng s a ra XMLDecl? content trong tiu
chun XML. i th, iu ny c ngha l cc phn mnh ni dung c th c hn mt nt k t
hoc yu t mc nh. Biu thc xmlvalue IS DOCUMENT c th c s dng nh gi liu mt gi
tr nht nh xml c l mt ti liu y hay ch l mt phn on ni dung.

8.13.1. To gi tr XML
to mt gi tr dng xml t cc d liu k t, hy s dng hm xmlparse:
XMLPARSE ( { DOCUMENT | CONTENT } value)

Cc v d:
XMLPARSE (DOCUMENT <?xml version="1.0"?><book><title>Manual</title><chapter>...</chapter></
XMLPARSE (CONTENT abc<foo>bar</foo><bar>foo</bar>)

Trong khi y ch l cch bin i cc chui k t thnh cc gi tr XML theo tiu chun SQL,
th cc c php c th PostgreSQL l:
xml <foo>bar</foo>
<foo>bar</foo>::xml

cng c th c s dng.
Dng xml khng kim tra hp l cc gi tr u vo i vi mt khai bo dng ti liu - DTD
(Document Type Declaration), thm ch khi gi tr u vo ch nh mt DTD. Hin cng khng c
s h tr no c xy dng sn cho vic kim tra hp l i vi cc ngn ng s khc XML
nh XML Schema.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 162/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Thao tc ngc li, vic to ra mt gi tr chui k t t xml, hy s dng hm xmlserialize:


XMLSERIALIZE ( { DOCUMENT | CONTENT } value AS type )

dng c th l character, character varying hoc text (hoc mt tn hiu cho mt trong s ). Mt
ln na, theo tiu chun SQL, y ch l cch bin i gia dng xml v cc dng k t, nhng
PostgreSQL cng cho php bn n gin a ra gi tr .
Khi mt gi tr chui k t c a ra hoc t dng xml m khng i qua XMLPARSE hoc
XMLSERIALIZE, mt cch tng ng, th s la chn ca DOCUMENT so vi CONTENT c xc nh
bng tham s cu hnh phin lm vic ca la chn XML, n c th c thit lp bng vic s
dng lnh tiu chun:
SET XML OPTION { DOCUMENT | CONTENT };

hoc c php ging PostgreSQL hn


SET xmloption TO { DOCUMENT | CONTENT };

Mc nh l CONTENT, nn tt c cc dng d liu XML u c php.


Lu : Vi vic thit lp la chn XML mc nh, bn khng th trc tip a ra cc chui
k t ti dng xml nu chng cha mt khai bo dng ti liu, v nh ngha on ni dung
XML khng chp nhn chng. Nu bn cn lm th, hoc hy s dng XMLPARSE hoc thay
i la chn XML.

8.13.2. iu khin vic m ha


Cn phi cn thn khi lm vic vi nhiu vic m ha k t trn my trm, my ch v trong cc d
liu XML c truyn qua chng. Khi s dng ch vn bn truyn cc truy vn ti my ch
v cc kt qu truy vn ti my trm (m l ch thng thng), PostgreSQL chuyn i tt c
cc d liu k t c truyn gia my trm v my ch v ngc li ti vic m ha k t ca u
tng ng; xem Phn 22.2. iu ny bao gm cc trnh din chui cc gi tr XML, nh trong cc
v d trn. iu ny c th thng thng c ngha l cc khai bo vic m ha c trong cc d
liu XML c th tr thnh khng hp l khi cc d liu k t c chuyn i sang vic m ha
trong khi truyn gia my trm v my ch, v khai bo m ha c nhng khng c thay i.
vt qua hnh vi ny, cc khai bo m ha c trong cc chui k t c trnh din cho u vo
i vi dng xml s b b qua, v ni dung c gi thit s trong m ha my ch hin hnh. H
qu l, i vi vic x l ng, cc chui k t ca d liu XML phi c gi t my trm ang
trong m ha my trm hin hnh. L trch nhim ca my trm hoc bin i cc ti liu sang
m ha my trm trc khi gi chng ti my ch, hoc tinh chnh vic m ha my trm mt cch
ph hp. u ra, cc gi tr ca dng xml s khng c khai bo m ha, v cc my trm s gi
thit tt c cc d liu l trong vic m ha my trm hin hnh.
Khi s dng ch nh phn truyn cc tham s truy vn ti my ch v cc kt qu truy vn
ngc v my trm, khng bin i tp hp k t no c thc hin, nn tnh hung l khc.
Trong trng hp ny, mt khai bo m ha trong d liu XML s c quan st thy, v nu n l

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 163/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

khng c, th d liu s c gi thit UTF-8 (nh c tiu chun XML yu cu; lu l


PostgreSQL khng h tr UTF-16). u ra, d liu s c mt khai bo m ha ch nh m ha
my trm, tr phi m ha my trm l UTF-8, trong trng hp n s b b qua.
Khng cn phi ni, vic x l d liu XML vi PostgreSQL s t li hng v hiu qu hn nu m
ha d liu XML, m ha my trm v m ha my ch l y ht nhau. V d liu XML c x l
ni b trong UTF-8, cc tnh ton s hiu qu nht nu m ha my ch l UTF-8.
Thn trng
Mt s hm c lin quan ti XML c th khng lm vic hon ton trong cc d
liu khng phi ASCII khi m ha my ch khng phi l UTF-8. iu ny c
bit ti nh l mt vn c bit i vi xpath().

8.13.3. Truy cp cc gi tr XML


Dng d liu xml l khng bnh thng theo n khng cung cp bt k ton t so snh no. iu
ny l v khng c ton t so snh hu dng vn nng v c xc nh tt no cho d liu XML.
Mt hu qu ca iu ny l bn khng th truy xut cc hng bng vic so snh mt ct xml vi
mt gi tr tm kim. Cc gi tr XML v th s thng c i vi mt trng kha ring r nh
mt ID. Mt gii php la chn thay th cho vic so snh cc gi tr XML l phi bin i chng
thnh cc chui k t trc, nhng lu l s so snh cc chui k t c t iu phi lm vi mt
phng php so snh XML hu dng.
V khng c cc ton t so snh cho dng d liu xml, khng c kh nng to mt ch s trc tip
trong mt ct dng ny. Nu cc tm kim nhanh trong d liu XML l mong mun, th nhng khc
phc c kh nng b sung bng vic a ra biu thc cho mt dng chui k t v nh ch s n,
hoc nh ch s mt biu thc Xpath. Tt nhin, truy vn thc s c th phi c tinh chnh
tm kim theo biu thc c nh ch s .
Chc nng tm kim vn bn trong PostgreSQL cng c th c s dng tng nhanh cc tm
kim ti liu ton vn cc d liu XML. Tuy nhin, s h tr x l cn thit cn cha sn sng
trong phn phi PostgreSQL.

8.14. Mng
PostgreSQL cho php cc ct ca mt bng c xc nh nh l cc mng a chiu di bin
thin. Cc mng dng c bn c xy dng sn hoc do ngi s dng nh ngha, hoc dng tng
hp c th c to ra. Cc mng ca cc min cn cha c h tr.

8.14.1. Khai bo dng mng


minh ha s dng cc dng mng, chng ta to bng ny:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 164/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

CREATE TABLE sal_emp (


name text,
pay_by_quarter integer[],
schedule text[][]
);

Nh c ch ra, mt dng d liu mng c t tn bng vic ni thm cc du ngoc vung ([])
vo tn cc phn t mng ca dng d liu . Lnh trn s to mt bng c tn l sal_emp vi
mt ct dng text (name), mt mng mt chiu dng s nguyn integer (pay_by_quarter - tr theo
qu), n th hin lng nhn vin theo qu, v mt mng vn bn (schedule - lch) 2 chiu, n th
hin lch tun ca nhn vin .
C php i vi CREATE TABLE cho php kch c chnh xc ca cc mng s c ch nh, v d:
CREATE TABLE tictactoe (
squares integer[3][3]
);

Tuy nhin, s trin khai hin hnh b qua bt k cc gii hn kch c mng c cung cp no,
ngha l, hnh vi l y ht nh i vi cc mng di khng c ch nh.
Trin khai hin hnh cng khng p tun th s chiu c khai bo. Cc mng ca mt dng yu
t c bit tt c c xem xt l dng y ht, bt chp kch c hoc s chiu. V th, vic khai bo
kch c hoc s lng chiu ca mng trong lnh to bng CREATE TABLE n gin l ti liu; n
khng tc ng ti hnh vi trong thi gian thc.
Mt c php la chn thay th tun th tiu chun SQL bng vic s dng t kha mng
th c s dng cho cc mng 1 chiu. pay_by_quarter c th c nh ngha nh l:

ARRAY,

pay_by_quarter integer ARRAY[4],

Hoc, nu khng kch c mng no c ch nh:


pay_by_quarter integer ARRAY,

Tuy nhin, nh trc, PostgreSQL khng p tun th hn ch kch c trong bt k trng hp no.

8.14.2. u vo gi tr mng
vit mt gi tr mng nh mt hng theo ngha en, hy a cc gi tr phn t vo trong cc
du ngoc nhn v tch bch chng bng du phy. (Nu bn bit C, th iu ny khng ging c
php ca C v cc cu trc khi to). Bn c th t cc du ngoc kp xung quanh bt k gi tr
phn t mng no, v phi lm th nu n c cha cc du phy hoc cc du ngoc nhn. (Chi tit
hn xut hin bn di). V th, nh dng chung ca mt hng mng l nh sau:
{ val1 delim val2 delim ... }

trong delim l k t phn cch cho dng ny, nh c ghi li trong khon u vo its pg_type.
Trong s cc dng d liu tiu chun c cung cp trong phn phi ca PostgreSQL, tt c u s
dng du phy (,), ngoi tr dng hp box m n s dng mt du chm phy (;). Tng gi tr val
hoc l mt hng s ca dng phn t mng, hoc l mt mng ph. V d ca mt hng mng l:
{{1,2,3},{4,5,6},{7,8,9}}

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 165/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Hng ny l mt mng 2 chiu, 3x3, bao gm 3 mng ph cc s nguyn.


thit lp mt phn t ca mt hng mng thnh NULL, hy vit NULL cho gi tr phn t . (bt
k ch hoa hay ch thng cho NULL ). Nu bn mun mt gi tr chui thc s NULL, th bn
phi t xung quanh n cc du ngoc kp.
(Cc dng hng mng thc s ch l mt trng hp c bit ca cc hng dng chung c tho
lun trong Phn 4.1.2.7. Hng ban u c i x nh mt chui v c truyn ti th tc bin
i u vo ca mng. Mt c t dng r rng c th l cn thit).
By gi chng ta c th ch ra mt s lnh chn INSERT:
INSERT INTO sal_emp
VALUES (Bill,
{10000, 10000, 10000, 10000},
{{"meeting", "lunch"}, {"training", "presentation"}});
INSERT INTO sal_emp
VALUES (Carol,
{20000, 25000, 25000, 25000},
{{"breakfast", "consulting"}, {"meeting", "lunch"}});

Kt qu ca 2 lnh chn trc trng ging th ny:


SELECT * FROM sal_emp;
name | pay_by_quarter
| schedule
----------+------------------------------------------+------------------------------------------------------------Bill
| {10000,10000,10000,10000} | {{meeting,lunch},{training,presentation}}
Carol | {20000,25000,25000,25000} | {{breakfast,consulting},{meeting,lunch}}
(2 rows)

Cc mng a chiu phi c s trng khp m rng cho tng chiu. Mt s khng trng khp gy ra
mt li, v d:
INSERT INTO sal_emp
VALUES (Bill,
{10000, 10000, 10000, 10000},
{{"meeting", "lunch"}, {"meeting"}});
ERROR: multidimensional arrays must have array expressions with matching dimensions

C php cu trc mng ARRAY cng c th c s dng:


INSERT INTO sal_emp
VALUES (Bill,
ARRAY[10000, 10000, 10000, 10000],
ARRAY[[meeting, lunch], [training, presentation]]);
INSERT INTO sal_emp
VALUES (Carol,
ARRAY[20000, 25000, 25000, 25000],
ARRAY[[breakfast, consulting], [meeting, lunch]]);

Lu rng cc phn t mng l cc hng hoc cc biu thc SQL thng thng; v d, cc hng
chui s nm trong cc du ngoc n, thay v trong cc du ngoc kp nh chng c th trong
mt hng mng. C php cu trc mng ARRAY c tho lun chi tit hn trong Phn 4.2.11.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 166/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

8.14.3. Truy cp mng


By gi, chng ta c th chy mt s truy vn trong bng. Trc ht, chng ta ch ra cch truy
cp mt phn t duy nht ca mt mng. Truy vn ny truy xut cc tn ca cc nhn vin m
lng (pay) ca h b thay i trong qu II:
SELECT name FROM sal_emp WHERE pay_by_quarter[1] <> pay_by_quarter[2];
name
------Carol
(1 row)

Cc s ch s di ca mng c vit bn trong cc du ngoc vung. Mc nh th PostgreSQL s


dng mt qui c nh s mt c s cho cc mng, l, mt mng ca n phn t bt u bng
array[1] v kt thc bng array[n].
Truy vn ny truy xut lng qu III ca tt c cc nhn vin:
SELECT pay_by_quarter[3] FROM sal_emp;
pay_by_quarter
---------------10000
25000
(2 rows)

Chng ta cng c th truy cp ty cc lt ct ch nht ca mt mng, hoc mng ph. Mt lt ct


mng c biu hin bng vic vit lower-bound:upper-bound cho mt hoc nhiu chiu ca mng. V
d, truy vn ny truy xut khon u tin trong thi gian biu ca Bill cho 2 ngy u ca tun:
SELECT schedule[1:2][1:1] FROM sal_emp WHERE name = Bill;
schedule
-----------------------{{meeting},{training}}
(1 row)

Nu bt k chiu no c vit nh mt lt ct, ngha l bao gm mt du 2 chm, th tt c cc


chiu c i x nh l cc lt ct. Bt k chiu no m ch c mt s duy nht (khng c du 2
chm) s c i x nh ang t 1 ti s c ch nh. V d, [2] c i x nh l [1:2], nh
trong v d ny:
SELECT schedule[1:2][2] FROM sal_emp WHERE name = Bill;
schedule
------------------------------------------{{meeting,lunch},{training,presentation}}
(1 row)

trnh ln ln vi trng hp khng c lt ct, tt nht hy s dng c php lt ct cho tt c cc


chiu, ngha l, [1:2][1:1], not [2][1:1].
Mt biu thc ch s di s tr v null nu hoc bn thn mng hoc bt k biu thc ch s di
no m l null. Hn na, null c tr v nu mt ch s di nm ngoi cc gii hn mng (trng
hp ny khng sinh ra li). V d, nu thi gian biu hin hnh c cc chiu [1:3][1:2] th vic tham

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 167/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

chiu ti schedule[3][3] s l NULL. Tng t, mt tham chiu mng vi s cc ch s di sai


cng cho null hn l mt li.
Mt biu thc lt ct mng cng c th cho null nu bn thn mng hoc bt k biu thc ch s
di no l null. Tuy nhin, trong cc trng hp khc nh vic chn mt lt ct mng m hon
ton nm ngoi cc gii hn mng hin hnh, mt biu thc lt ct c mt mng rng (0 chiu) thay
v null. (iu ny khng khp vi hnh vi khng lt ct v c thc hin v cc l do lch s). Nu
lt ct c yu cu mt phn chn ln cc gii hn ca mng, th n m thm b gim xung ti
ch vng chng ln thay v tr v null.
Cc chiu hin hnh ca bt k gi tr mng no cng c th c truy xut vi hm array_dims:
SELECT array_dims(schedule) FROM sal_emp WHERE name = Carol;
array_dims
--------------[1:2][1:2]
(1 row)

to ra mt kt qu vn bn text, n l tin li cho mi ngi c nhng c l khng


tin cho cc chng trnh. Cc chiu cng c th c truy xut bng array_upper and array_lower,
n tr v gii hn cao hn hoc thp hn mt chiu mng c ch nh, mt cch tng ng:
array_dims

SELECT array_upper(schedule, 1) FROM sal_emp WHERE name = Carol;


array_upper
---------------2
(1 row)
array_length

s tr v di ca chiu mng c ch nh:

SELECT array_length(schedule, 1) FROM sal_emp WHERE name = Carol;


array_length
-------------2
(1 row)

8.14.4. Sa i mng
Mt gi tr mng c th c thay th hon ton:
UPDATE sal_emp SET pay_by_quarter = {25000,25000,27000,27000}
WHERE name = Carol;

Hoc s dng c php biu thc mng ARRAY:


UPDATE sal_emp SET pay_by_quarter = ARRAY[25000,25000,27000,27000]
WHERE name = Carol;

Mt mng cng c th c cp nht mt phn t duy nht:


UPDATE sal_emp SET pay_by_quarter[4] = 15000
WHERE name = Bill;

hoc c cp nht trong mt lt ct:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 168/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

UPDATE sal_emp SET pay_by_quarter[1:2] = {27000,27000}


WHERE name = Carol;

Mt gi tr mng c lu tr c th c m rng bng vic ch nh ti cc phn t cn cha


hin din. Bt k v tr no gia chng trc hin din v cc phn t c ch nh mi cng s
c in bng null. V d, nu mng myarray hin c 4 phn t, th n s c 6 phn t sau mt cp
nht m ch nh ti myarray[6]; myarray[5] s c cha null. Hin hnh, s m rng theo cch thc
ny ch c php i vi cc mng 1 chiu, khng cho cc mng nhiu chiu.
S ch nh c ch s di cho php to cc mng khng s dng cc ch s di da vo 1. V d
mt ngi c th ch nh ti myarray[-2:7] to mt mng vi cc gi tr ch s di t -2 ti 7.
Cc gi tr mng mi cng c th c cu trc bng vic s dng ton t ghp ni, ||:
SELECT ARRAY[1,2] || ARRAY[3,4];
?column?
----------{1,2,3,4}
(1 row)
SELECT ARRAY[5,6] || ARRAY[[1,2],[3,4]];
?column?
--------------------{{5,6},{1,2},{3,4}}
(1 row)

Ton t ghp ni cho php mt phn t duy nht s c y vo u hoc cui mt mng 1 chiu.
N cng chp nhn 2 mng N chiu, hoc mt mng N chiu v mt mng N+1 chiu.
Khi mt phn t duy nht c y vo hoc u hoc cui ca mt mng 1 chiu, th kt qu l
mt mng vi ch s di gii hn thp hn y ht nh ton hng ca mng. V d:
SELECT array_dims(1 || [0:1]={2,3}::int[]);
array_dims
-----------[0:2]
(1 row)
SELECT array_dims(ARRAY[1,2] || 3);
array_dims
-----------[1:3]
(1 row)

Khi 2 mng vi s chiu bng nhau c ghp ni, th kt qu vn l ch s di gii hn thp hn


ca chiu bn ngoi ton hng bn tay tri. Kt qu l mt mng bao gm mi phn t ca ton
hng bn tay tri ri theo sau l mi phn t ca ton hng bn tay phi. V d:
SELECT array_dims(ARRAY[1,2] || ARRAY[3,4,5]);
array_dims
-----------[1:5]
(1 row)

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 169/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

SELECT array_dims(ARRAY[[1,2],[3,4]] || ARRAY[[5,6],[7,8],[9,0]]);


array_dims
-----------[1:5][1:2]
(1 row)

Khi mt mng N chiu c y vo u hoc cui ca mt mng N+1 chiu, th kt qu l tng


t nh trng hp mng cc phn t trn. Tng mng ph N chiu v c bn l phn t ca chiu
bn ngoi mng N+1 chiu. v d:
SELECT array_dims(ARRAY[1,2] || ARRAY[[3,4],[5,6]]);
array_dims
-----------[1:3][1:2]
(1 row)

Mt mng cng c th c cu thnh bng vic s dng cc hm array_prepend, array_append hoc


array_cat. 2 hm u ch h tr cc mng 1 chiu, nhng array_cat h tr cc mng nhiu chiu. Lu
l ton t ghp ni c tho lun trn c u tin hn l s dng trc tip cc hm .
Trn thc t, cc hm trc ht tn ti s dng trong vic trin khai ton t ghp ni. Tuy
nhin, chng c th l trc tip hu dng trong vic to cc ghp ni do ngi s dng nh ngha.
Mt s v d:
SELECT array_prepend(1, ARRAY[2,3]);
array_prepend
--------------{1,2,3}
(1 row)
SELECT array_append(ARRAY[1,2], 3);
array_append
-------------{1,2,3}
(1 row)
SELECT array_cat(ARRAY[1,2], ARRAY[3,4]);
array_cat
----------{1,2,3,4}
(1 row)
SELECT array_cat(ARRAY[[1,2],[3,4]], ARRAY[5,6]);
array_cat
--------------------{{1,2},{3,4},{5,6}}
(1 row)
SELECT array_cat(ARRAY[5,6], ARRAY[[1,2],[3,4]]);
array_cat
--------------------{{5,6},{1,2},{3,4}}

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 170/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

8.14.5. Tm kim trong mng


tm mt gi tr trong mt mng, mi gi tr phi c kim tra. iu ny c th c thc hin
bng tay, nu bn bit kch c mng. V d:
SELECT * FROM sal_emp WHERE pay_by_quarter[1] = 10000 OR
pay_by_quarter[2] = 10000 OR
pay_by_quarter[3] = 10000 OR
pay_by_quarter[4] = 10000;

Tuy nhin, iu ny nhanh chng tr nn nng nhc cho nhng mng ln, v khng hu dng nu
khng bit kch c ca mng. Mt phng php thay th c m t trong Phn 9.21. Truy vn
trn c th c thay th bng:
SELECT * FROM sal_emp WHERE 10000 = ANY (pay_by_quarter);

Hn na, bn c th thy cc hng ni m mng c tt c cc gi tr bng 10.000 vi:


SELECT * FROM sal_emp WHERE 10000 = ALL (pay_by_quarter);

Nh mt la chn, hm generate_subscripts c th c s dng. V d:


SELECT * FROM
(SELECT pay_by_quarter,
generate_subscripts(pay_by_quarter, 1) AS s
FROM sal_emp) AS foo
WHERE pay_by_quarter[s] = 10000;

Hm ny c m t trong Bng 9-46.


Mo: Cc mng khng phi l cc tp hp; vic tm kim cc phn t mng c bit c th
l du hiu ca s thit k sai c s d liu. Hy xem xt s dng mt bng ring bit vi
mt hng cho tng khon m c th l mt phn t mng. iu ny s l d dng hn tm
kim, v c kh nng co dn tt hn i vi mt s lng ln cc phn t.

8.14.6. C php u vo v u ra ca mng


Miu t bn ngoi bng vn bn ca mt gi tr mng bao gm cc khon c bin dch theo cc
qui tc qui c ca I/O cho dng phn t mng, cng vi s trang tr ch ra cu trc mng. S trang
tr bao gm cc du ngoc nhn ({and}) xung quanh gi tr mng cng vi cc k t phn
cch gia cc khon lin k nhau. K t phn cch thng l mt du phy (,) nhng c th l th
g khc: c xc nh bng vic thit lp typdelim cho dng phn t mng. Trong s cc dng
d liu tiu chun c phn phi PostgreSQL cung cp, tt c s dng mt du phy, ngoi tr
dng hp box, n s dng mt du chm phy (;). Trong mt mng nhiu chiu, tng chiu (hng,
mt phng, khi lp phng, ) c mc cc du ngoc nhn ca ring n, v cc du phn cch
phi c vit gia cc thc th c cng mc trong cc du ngoc nhn lin k nhau.
Th tc u vo ca mng s t cc du ngoc kp xung quanh cc gi tr phn t nu chng l cc
chui rng, cha cc du ngoc nhn, cc k t phn cch, cc du ngoc kp, cc du cho ngc
hoc cc k t trng, hoc khp vi t NULL. Cc du ngoc kp v cc du cho ngc c
nhng trong cc gi tr phn t s c thot bng du cho ngc. i vi cc dng d liu s th an
ton gi thit rng cc du ngoc n s khng bao gi xut hin, nhng i vi cc dng d liu

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 171/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

vn bn th s c chun b vt qua c hoc s tn ti hoc s thiu vng cc du ngoc.


Mc nh, gi tr ch s gii hn thp hn ca mt chiu ca mng c thit lp v 1. trnh by
cc mng vi cc gii hn thp hn khc, th cc dy ch s di ca mng c th c ch nh r
rng trc khi vit cc ni dung ca mng. S trang tr ny bao gm cc du ngoc vung ([]) xung
quanh tng gii hn thp hn v cao hn chiu ca mng, vi mt k t du phn cch du 2 chm
(:) gia. S trang tr chiu ca mng c theo sau vi mt du bng (=). V d:
SELECT f1[1][-2][3] AS e1, f1[1][-1][5] AS e2
FROM (SELECT [1:1][-2:-1][3:5]={{{1,2,3},{4,5,6}}}::int[] AS f1) AS ss;
e1 | e2
----+---1|6
(1 row)

Th tc u ra ca mng s bao gm cc chiu r rng trong kt qu ca n ch khi c mt hoc


nhiu hn cc gii hn khc vi nhau.
Nu gi tr c vit cho mt phn t l NULL (trong bt k trng hp no), th phn t s
c ly l NULL. S hin din ca bt k du ngoc hoc du cho ngc no cng v hiu ha
iu ny v cho php gi tr chui ca hng NULL s c a vo. Hn na, v tnh tng thch
ngc vi cc phin bn PostgreSQL trc 8.2, tham s cu hnh array_nulls c th s c tt off
p nhn NULL nh l NULL.
Nh c ch ra trc , khi vit mt gi tr mng th bn c th s dng cc du ngoc kp xung
quanh bt k phn t mng ring r no. Bn phi lm th nu gi tr phn t c th nu khc s
lm lng tng cho trnh phn tch gi tr mng. V d, cc phn t cha cc du ngoc nhn, cc du
phy (hoc k t phn cch dng d liu), cc du ngoc kp, cc du cho ngc hoc cc k t
trng trc hoc sau phi c a vo trong ngoc kp. Cc chui rng v chui trng t NULL
cng phi c a vo ngoc. t mt du ngoc kp hoc du cho ngc vo trong mt gi
tr phn t mng trong du ngoc, hy s dng c php chui thot v t trc n mt du cho
ngc. Nh mt s la chn, bn c th trnh cc du ngoc v s dng thot du cho ngc
bo v tt c cc k t d liu m c th nu khc s c ly nh l c php mng.
Bn c th thm du trng trc mt du ngoc nhn tri hoc sau mt du ngoc nhn phi. Bn
cng c th thm du trng trc hoc sau bt k khon chui ring r no. Trong tt c cc trng
hp th du trng s b b qua. Tuy nhin, du trng trong cc phn t trong cc du ngoc kp,
hoc c bao quanh c 2 pha vi cc k t khng trng ca mt phn t, s khng b b qua.
Lu : Hy nh rng nhng g bn vit trong mt lnh SQL trc ht s c bin dch nh
mt hng chui, v sau nh mt mng. iu ny lm gp i s lng cc du cho
ngc bn cn. V d, chn mt gi tr mng vn bn c cha mt du cho ngc v
mt du ngoc kp, bn cn phi vit:
INSERT ... VALUES (E{"\\\\","\\""});

Trnh x l chui thot loi b mt mc cc du cho ngc, sao cho nhng g ti trong

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 172/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

trnh phn tch gi tr bt k no ca mng trong cng ging nh {"\\","\""}. i li, cc chui
i vi th tc u vo dng d liu vn bn text s tr thnh \ v " mt cch tng ng.
(Nu chng ta tng lm vic vi mt dng d liu m th tc u vo ca n cng i x
vi cc du cho ngc mt cch c bit, v d bytea, th chng ta c th cn ti 8 du cho
ngc trong lnh c c mt du cho ngc trong phn t mng c lu tr). Vic
a vo cc du $ (xem Phn 4.1.2.4) c th c s dng trnh nhu cu phi nhn i
cc du cho ngc.
Mo: C php cu trc mng ARRAY (xem Phn 4.2.11) thng d hn lm vic so vi c
php hng mng khi vit cc gi tr mng trong cc lnh SQL. Trong ARRAY, cc gi tr phn
t ring r c vit theo cch y ht m chng c th c vit khi khng l cc thnh vin
ca mt mng.

8.15. Dng tng hp


Mt dng tng hp i din cho cu trc ca mt hng hoc bn ghi; v c bn n ch l mt danh
sch cc tn trng v cc dng d liu ca chng. PostgreSQL cho php cc dng tng hp c
s dng theo nhiu cch thc m cc dng n gin c th c s dng. V d, mt ct ca mt
bng c th c khai bo l mt dng tng hp.

8.15.1. Khai bo dng tng hp


y l 2 v d nh ngha cc dng tng hp:
CREATE TYPE complex AS (
r double precision,
i double precision
);
CREATE TYPE inventory_item AS (
name text,
supplier_id integer,
price numeric
);

C php c th so snh c vi lnh to bng CREATE TABLE, ngoi tr ch cc tn v dng ca


trng c th c ch nh; khng rng buc no (nh NOT NULL) c th c a vo. Lu l
t kha AS l c bn; khng c n, h thng s ngh l mt dng khc ca lnh to dng CREATE
TYPE, v bn s c cc li c php k l.
Khi xc nh c cc dng, chng ta c th s dng chng to cc bng:
CREATE TABLE on_hand (
item inventory_item,
count integer
);
INSERT INTO on_hand VALUES (ROW(fuzzy dice, 42, 1.99), 1000);

hoc cc hm:
CREATE FUNCTION price_extension(inventory_item, integer) RETURNS numeric

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 173/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

AS SELECT $1.price * $2 LANGUAGE SQL;


SELECT price_extension(item, 10) FROM on_hand;

Bt k khi no bn to mt bng, mt dng tng hp cng c t ng to ra, vi tn y ht nh


bng , i din cho dng hng ca bng. V d, ta ni:
CREATE TABLE inventory_item (
name text,
supplier_id integer REFERENCES suppliers,
price numeric CHECK (price > 0)
);

ri sau dng tng hp y ht inventory_item c ch ra trn c th ti nh l mt bn thnh


phm, v c th c s dng ht nh trn. Tuy nhin hy lu mt hn ch quan trng ca trin
khai hin hnh: v khng rng buc no c lin quan ti mt dng tng hp, cc rng buc c ch
ra trong nh ngha bng khng p dng c cho cc gi tr ca dng tng hp bn ngoi bng .
(Cch gii quyt mt phn l hy s dng cc dng min nh cc thnh vin ca dng tng hp).

8.15.2. u vo gi tr tng hp
vit mt gi tr tng hp nh mt hng s theo ngha en, hy a cc gi tr ca trng vo
cc du ngoc n v phn cch chng bng cc du phy. Bn c th t cc du ngoc kp xung
quanh bt k gi tr trng no, v phi lm th nu n c cha cc du phy hoc cc du ngoc
n. (Chi tit hn xem bn di). V th, nh dng chung ca mt hng tng hp l nh sau:
( val1 , val2 , ... )

Mt v d l:
("fuzzy dice",42,1.99)

m c th l mt gi tr hp l ca dng inventory_item c xc nh trn. lm cho mt trng


l NULL, hy khng vit cc k t no c trong v tr ca n trong danh sch. V d, hng ny ch
nh mt NULL cho trng th 3:
("fuzzy dice",42,)

Nu bn mun mt chui rng hn l NULL, hy vit cc du ngoc kp:


("",42,)

y trng u tin l mt chui rng khng NULL, trng th 3 l NULL.


(Cc hng thc s ch l mt trng hp c bit ca cc hng dng chung c tho lun trong
Phn 4.1.2.7. Hng ban u c i x nh l mt chui v c truyn ti th tc qui c u
vo dng tng hp. Mt c t dng r rng c th l cn thit).
C php biu thc hng ROW cng c th c s dng to ra cc gi tr tng hp. Trong hu ht
cc trng hp iu ny c cho l n gin hn s dng so vi c php hng chui v bn
khng phi lo lng v nhiu lp cc du ngoc. Chng ti s dng phng php ny trn:
ROW(fuzzy dice, 42, 1.99)
ROW(, 42, NULL)

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 174/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

T kha hng ROW thc s l ty chn min l bn c nhiu hn 1 trng trong biu thc, sao cho
chng c th n gin ha thnh:
(fuzzy dice, 42, 1.99)
(, 42, NULL)

C php biu thc hng ROW c tho lun chi tit hn trong Phn 4.2.12.

8.15.3. Truy cp dng tng hp


truy cp mt trng ca mt ct tng hp, mt ngi vit mt du chm v tn trng , ging
ht nh vic chn mt trng t mt tn bng. Trn thc t, n rt ging vic chn t mt tn bng
m bn thng phi s dng cc du ngoc n gi cho khi nhm cho trnh phn tch. V d,
bn c th th chn mt s trng ph t bng v d on_hand ca chng ti vi th g ging nh:
SELECT item.name FROM on_hand WHERE item.price > 9.99;

iu ny s khng lm vic v tn khon item c ly l tn ca mt bng, khng phi tn ca mt


ct ca bng on_hand, theo cc qui nh c php ca SQL. Bn phi vit n nh th ny:
SELECT (item).name FROM on_hand WHERE (item).price > 9.99;

hoc nu bn vn cn phi s dng tn bng (v d trong mt truy vn nhiu bng), nh:


SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;

By gi i tng trong du ngoc n c din gii trc tip nh mt tham chiu ti ct


sau trng con (subfield) c th c la chn t .

item,

Tng t cc vn c php p dng bt k khi no bn chn mt trng t mt gi tr tng hp.


V d, la chn mt trng t kt qu ca mt hm m tr v mt gi tr tng hp, bn c th
cn vit th g ging nh:
SELECT (my_func(...)).field FROM ...

Khng c cc du ngoc n tha, iu ny s lm sinh ra mt li c php.

8.15.4. Sa i dng tng hp


y l mt s v d v c php ph hp cho vic chn v cp nht cc ct tng hp.
Trc ht, vic chn hoc cp nht ton b mt ct:
INSERT INTO mytab (complex_col) VALUES((1.1,2.2));
UPDATE mytab SET complex_col = ROW(1.1,2.2) WHERE ...;

V d u b qua hng ROW, v d 2 s dng n; chng ta c th thc hin n bt k cch no.


Chng ta c th cp nht mt trng ph ring r ca mt ct tng hp:
UPDATE mytab SET complex_col.r = (complex_col).r + 1 WHERE ...;

Lu y rng chng ta khng cn (v qu thc khng th) t cc du ngoc n xung quanh


tn ct xut hin ch sau SET, nhng chng ta cn cc du ngoc n khi tham chiu ti ct y ht
trong biu thc bn phi ca du bng.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 175/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

V chng ta cng c th ch nh cc trng ph nh l cc ch cho lnh chn INSERT:


INSERT INTO mytab (complex_col.r, complex_col.i) VALUES(1.1, 2.2);

Chng ta khng cung cp cc gi tr cho tt c cc trng ph ca ct, cc trng ph cn li c


th c in vi cc gi tr null.

8.15.5 C php u v v ra ca dng tng hp


S trnh by ngoi bng vn bn ca mt gi tr tng hp bao gm cc khon s c bin dch theo
cc qui tc qui c cho cc dng trng ring r, cng vi s trang tr m ch ra cu trc tng hp
. Trang tr bao gm cc du ngoc n (( )) xung quanh ton b gi tr , cng vi du phy (, )
gia cc khon lin k. Du trng bn ngoi cc du ngoc n s b b qua, nhng bn trong cc
du ngoc n th n c xem nh l mt phn ca gi tr trng , v c th c hoc khng ph
thuc ng k vo cc qui tc qui c u vo cho dng d liu trng. V d, trong
( 42)

th du trng s b b qua nu dng ca trng l s nguyn, nhng s khng b qua nu dng


trng l vn bn text.
Nh c ch ra trc , khi vit mt gi tr tng hp bn c th vit cc du ngoc kp xung
quanh bt k gi tr trng ring r no. Bn phi lm th nu gi tr trng c th nu khc lm
lng tng cho trnh phn tch gi tr tng hp. c bit, cc trng c cha cc du ngoc n, du
phy, du ngoc kp hoc du cho ngc phi c a vo cc du ngoc kp. t mt du
ngoc n hoc cho ngc trong mt gi tr trng tng hp trong du, hy t trc n mt du
cho ngc. (Hn na, mt cp du ngoc n trong mt gi tr trng cc du ngoc kp c ly
i din cho mt k t du ngoc kp, tng t nh cc qui tc cho cc du ngoc n trong cc
chui hng SQL). Nh mt s la chn, bn c th trnh a vo trong cc du v s dng k t
thot du cho ngc bo v tt c cc k t d liu m c th nu khc th s c ly nh l c
php tng hp.
Mt gi tr trng rng hon ton (hon ton khng c cc k t gia cc du phy v cc du
ngoc n) i din cho mt NULL. vit mt gi tr m l chui rng hn l NULL, hy vit "".
Th tc u ra tng hp s t cc du ngoc kp xung quanh cc gi tr trng nu chng l cc
chui rng hoc c cc du ngoc n, du phy, du ngoc kp, du cho ngc, hoc du trng.
(Lm nh vy cho du trng l khng c bn, nhng gip cho d hiu). Cc du ngoc kp hoc
cho ngc c nhng trong cc gi tr trng s c nhn i.
Lu : Hy ghi nh rng nhng g bn vit trong mt lnh SQL trc ht s c hiu nh
l mt hng chui, v sau nh mt s tng hp. iu ny nhn i s cc du cho
ngc m bn cn (gi thit c php chui thot c s dng). V d, chn mt trng
vn bn text c cha mt du ngoc kp v mt du cho ngc vo mt gi tr tng hp,
bn cn phi vit:
INSERT ... VALUES (E("\\"\\\\"));

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 176/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Trnh x l hng chui loi b mt mc cc du cho ngc, sao cho nhng g ti trnh phn
tch gi tr tng hp trng ging nh ("\"\\"). i li, chui c dng cho th tc u vo
dng d liu vn bn text s tr thnh "\. (nu chng ta tng lm vic vi mt dng d liu
m th tc u vo ca n cng i x vi cc du cho ngc mt cch c bit, v d
bytea, th chng ta c th cn ti 8 du cho ngc trong lnh c c mt du cho
ngc trong trng tng hp c lu tr). Vic cho vo ngoc cc du $ (xem Phn
4.1.2.4) c th c s dng trnh cn phi nhn i cc du cho ngc.
Mo: C php cu trc hng ROW thng d dng hn lm vic so vi c php hng tng
hp khi vit cc gi tr tng hp trong cc lnh SQL. Trong ROW, cc gi tr trng ring r
c vit theo cch y ht nh chng c th c vit khi khng c cc thnh vin ca mt
s tng hp.

8.16. Dng m nh danh i tng


M nh danh i tng - OID (Object Indentifier) c s dng ni b trong PostgreSQL nh l
cc kha chnh cho cc bng ca cc h thng khc nhau. Cc OID khng c thm vo cc bng
do ngi s dng to ra, tr phi WITH OIDS c ch nh khi bng c to ra, hoc bin cu hnh
default_with_oids c kch hot. Dng oid th hin mt m nh danh i tng. Cng c vi dng
tn hiu cho oid: regproc, regprocedure, regoper, regoperator, regclass, regtype, regconfig, v
regdictionary. Bng 8-23 ch ra s tng quan.
Dng oid hin c trin khai nh mt s nguyn 4 byte khng k. V th, n khng ln cung
cp tnh c nht rng khp c s d liu trong cc c s d liu ln, hoc thm ch trong cc bng
ln ring r. V th, s dng mt ct OID trong bng do ngi s dng to ra nh mt kha chnh
khng c khuyn khch. Cc OID s dng tt nht ch cho cc tham chiu ti cc bng h thng.
Bn thn dng oid c t hot ng ngoi s so snh. Tuy nhin, n c th a ra cho s nguyn v
sau c iu khin bng vic s dng cc ton t s nguyn tiu chun. (Ch v s ln xn
k vi khng k c th nu bn lm iu ny).
Cc dng tn hiu OID khng c cc hot ng ca ring chng ngoi tr cc th tc u vo v
u ra c chuyn bit ha. Cc th tc c kh nng chp nhn v hin th cc tn biu tng
cho cc i tng h thng, hn l cc gi tr cho cc i tng. V d, xem xt cc hng
pg_attribute c lin quan ti bng mytable, mt ngi c th vit:
SELECT * FROM pg_attribute WHERE attrelid = mytable::regclass;

hn l
SELECT * FROM pg_attribute
WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = mytable);

Trong khi bn thn iu tt c khng tht l xu, th n vn qu c n gin ha. S la chn


ph thm (subselect) tinh vi phc tp hn nhiu c th cn phi chn OID ng nu c nhiu bng
c t tn mytable trong cc s khc. Trnh chuyn i u vo regclass iu khin s tra cu

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 177/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

bng theo thit lp ng s , v v th n thc hin iu ng n mt cch t ng. Tng


t, vic a ra mt OID ca bng cho regclass l thun tin cho hin th biu tng ca mt OID s.
Bng 8-23. Dng nh danh i tng
Tn

Tham chiu

M t

V d gi tr

oid

any

nh danh i tng s

564182

regproc

pg_proc

tn hm

sum

regprocedure

pg_proc

hm vi cc dng i s

sum(int4)

regoper

pg_operator

tn ton t

regoperator

pg_operator

ton t vi cc dng i s

*(integer,integer) hoc -(NONE,integer)

regclass

pg_class

tn quan h

pg_type

regtype

pg_type

tn dng d liu

integer

regconfig

pg_ts_config

cu hnh tm kim vn bn

english

regdictionary

pg_ts_dict

t in tm kim vn bn

simple

Tt c cc dng tn hiu OID chp nhn cc tn iu kin theo s , v s hin th cc tn


iu kin theo s u ra nu i tng c th khng c tm thy trong ng tm kim
hin hnh m khng ang c iu kin. Cc dng tn hiu regproc v regoper s ch chp nhn
cc tn u vo m l c nht (khng b qu ti), nn chng c s dng hn ch; s dng nhiu
nht regprocedure hoc regoperator l ph hp hn. i vi regoperator, cc ton t mt yu t c
nhn din bng vic vit NONE cho ton hng khng c s dng.
Mt thuc tnh b sung ca cc dng tn hiu OID l s to ra cc ph thuc. Nu mt hng s ca
mt trong cc ng xut hin trong mt biu thc c lu tr (nh mt biu thc mc nh ct
hoc kiu nhn), th n to ra mt s ph thuc vo i tng c tham chiu . V d, nu mt
ct c mt biu thc mc nh nextval(my_seq::regclass), th PostgreSQL hiu rng biu thc mc
nh ph thuc vo tun t my_seq; h thng s khng cho s tun t b b i m khng c
vic trc loi b biu thc mc nh .
Dng nh dng khc c h thng s dng l xid, hoc nh dng giao dch (ngn gn l xact).
y l dng d liu ca cc ct h thng xmin v xmax. Cc nh danh giao dch l cc lng 32 bit.
Dng nh danh th 3 c h thng s dng l cid, hoc nh danh lnh. y l dng d liu ca
cc ct h thng cmin v cmax. nh danh lnh cng l cc lng 32 bit.
Dng nh danh cui cng c h thng s dng l tid, hoc nh danh b (nh danh hng). y
l dng d liu ca ct h thng ctid. Mt ID hng l mt cp (s khi, ch s b trong khi) m
nh danh v tr vt l ca hng bn trong bng ca n.
(Cc ct h thng c gii thch xa hn trong Phn 5.4).

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 178/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

8.17. Dng b danh


H thng dng PostgreSQL gm mt s khon u vo c mc ch c bit m ni chung c gi
l cc dng b danh. Mt dng b danh khng th c s dng nh mt dng d liu ct, nhng n
c th c s dng khai bo mt i s hm hoc dng kt qu. Tng trong s cc dng b danh
c sn c s dng trong cc tnh hung ni m hnh vi ca mt hm khng tng xng mt cch
n gin vi vic ly hoc tr v mt gi tr ca mt dng d liu SQL c bit. Bng 8-24 lit k
cc dng b danh ang tn ti.
Bng 8-24. Cc dng b danh
Tn

M t

any

Ch rng mt hm chp nhn bt k dng d liu u vo no.

anyarray

Ch rng mt hm chp nhn bt k dng d liu mng no (xem Phn 32.2.5).

anyelement

Ch rng mt hm chp nhn bt k dng d liu no (xem Phn 32.2.5).

anyenum

Ch rng mt hm chp nhn bt k dng d liu enum no (xem Phn 35.2.5 v Phn 8.7).

anynonarray

Ch rng mt hm chp nhn bt k dng d liu khng l mng no (xem Phn 35.2.5).

cstring

Ch rng mt hm chp nhn hoc tr v mt chui C c kt thc bng null.

internal

Ch rng mt hm chp nhn hoc tr v mt dng d liu ni b ca my ch.

language_handler

Mt iu khin li gi ngn ng th tc c khai bo tr v language_handler.

record

Nhn din mt hm tr v mt dng hng khng c xc nh.

trigger

Mt hm trigger c khai bo tr v trigger.

void

Ch rng mt hm tr v khng gi tr no c.

opaque

Mt tn dng li thi c phc v trc cho tt c cc mc ch trn.

Cc hm c vit m theo ngn ng C (hoc c ti ln sn hoc ng) c th c khai bo


chp nhn hoc tr v bt k dng d liu b danh no. iu ph thuc vo tc gi ca hm
m bo rng hm s hnh x an ton khi mt dng b danh c s dng nh mt dng i s.
Cc hm c vit m trong cc ngn ng th tc c th s dng cc dng tn hiu ch khi c cc
ngn ng trin khai ca chng cho php. Hin hnh cc ngn ng th tc tt c u cm s dng
mt dng b danh nh l dng i s, v ch cho php void v record nh mt dng kt qu (cng vi
trigger khi hm c s dng nh mt trigger). Mt s cng h tr cc hm a hnh bng vic s
dng cc dng anyarray, anyelement, anyenum, v anynonarray.
Dng b danh internal c s dng khai bo cc hm m ch c ngha c h thng c s d
liu gi ni b, v khng trc tip vin ti trong mt truy vn SQL. Nu mt hm c t nht mt i
s dng internal th n khng th c gi t SQL. gi an ton dng ca hn ch ny th iu
quan trng phi tun theo qui tc lp trnh ny: khng to ra bt k hm no m c khai bo
tr v internal tr phi n c t nht mt i s internal.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 179/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Chng 9. Hm v ton t
PostgreSQL a ra mt s lng ln cc hm v ton t cho cc dng d liu c xy dng sn.
Ngi s dng cng c th nh ngha cc hm v ton t ca ring mnh, nh c m t trong
Phn V. Cc lnh psql \df v \do c th c s dng lit k tt c cc hm v ton t c sn mt
cch tng ng.
Nu bn c quan tm v tnh kh chuyn th hy lu rng hu ht cc hm v ton t c m t
trong chng ny, vi ngoi l ca hu ht cc ton t s hc v so snh thng thng v mt s
hm c lu r rng, s khng c tiu chun SQL xc lp. Mt s trong chc nng c m
rng c hin din trong cc h thng qun l c s d liu SQL khc, v trong nhiu trng hp
chc nng l tng thch v nht qun gia cc trin khai khc nhau. Chng ny cng khng
phi l ton din mi kha cnh; cc hm b sung thm s c trong cc phn ph hp ca sch ch
dn ny.

9.1. Cc ton t logic


Cc ton t logic thng thng l sn sng:
AND
OR
NOT

SQL s dng mt h thng logic 3 gi tr vi true (ng), false (sai) v null (khng bit). Hy quan
st cc bng ng sau y:
a

a AND b

a OR b

TRUE

TRUE

TRUE

TRUE

TRUE

FALSE

FALSE

TRUE

TRUE

NULL

NULL

TRUE

FALSE

FALSE

FALSE

FALSE

FALSE

NULL

FALSE

NULL

FALSE

NULL

FALSE

NULL

NULL

NULL

NULL

NULL

NOT a

TRUE

FALSE

FALSE

TRUE

NULL

NULL

Cc ton t AND v OR l giao hon c, l, bn c th hon i ton hng bn tri v bn


phi m khng nh hng ti kt qu. Xem Phn 4.2.13 c thm thng tin v trt t nh gi cc
biu thc ph.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 180/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

9.2. Cc ton t so snh


Cc ton t so snh thng thng l c sn, c nu trong Bng 9-1.
Bng 9-1. Cc ton t so snh
Ton t

M t

<

nh hn

>

ln hn

<=

nh hn hoc bng

>=

ln hn hoc bng

bng

<> hoc !=

khng bng

Lu : Ton t != c chuyn thnh <> trong pha ca trnh phn tch c php. Khng c
kh nng trin khai cc ton t != v <> m lm cc iu khc nhau.
Cc ton t so snh l c sn cho tt c cc dng d liu ph hp. Tt c cc ton t u l cc ton
t nh phn tr v cc gi tr dng boolean; cc biu thc nh 1 < 2 < 3 l khng hp l (v khng c
ton t < so snh mt gi tr Boolean vi 3).
Hn na i vi cc ton t so snh, cu trc BETWEEN c th l c sn:
a BETWEEN x AND y

l tng ng vi
a >= x AND a <= y

Lu l

i x vi cc d liu u cui nh c a vo trong di . Cn


BETWEEN thc hin s so snh ngc li:
BETWEEN

NOT

a NOT BETWEEN x AND y

l tng ng vi
a < x OR a > y

l y ht nh BETWEEN ngoi tr khng c yu cu rng i s bn tri ca


AND s l t hn hoc bng i s bn phi. Nu khng phi th, th 2 i s t ng c hon
i cho nhau, sao cho mt di khng rng lun c ng .
BETWEEN SYMMETRIC

kim tra liu mt gi tr c hay khng l null, hy s dng cc cu trc:


expression IS NULL
expression IS NOT NULL

hoc tng t, nhng phi tiu chun, cc cu trc:


expression ISNULL
expression NOTNULL

Hy khng vit

expression = NULL

NULL

l khng bng vi

NULL.

(Gi tr null i din cho mt

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 181/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

gi tr khng c bit, v khng r liu 2 gi tr khng c bit c bng nhau hay khng). Hnh
vi ny tun th theo tiu chun SQL.
Mo: Mt s ng dng c th mong i rng expression = NULL tr v ng (true) nu expression
c tnh gi tr null. c khuyn co mnh m rng cc ng dng s c sa i
tun th vi tiu chun SQL. Tuy nhin, nu iu khng th c thc hin th bin cu
hnh transform_null_equals l sn sng. Nu iu c kch hot, th PostgreSQL s bin
i cc mnh x = NULL thnh x IS NULL.
Lu : Nu expression l c gi tr hng, th IS NULL l ng (true) khi bn thn biu thc hng
l null hoc khi tt c cc trng ca hng l null, trong khi IS NOT NULL l ng khi
bn thn biu th l non-null v tt c cc trng ca hng l non-null. V hnh vi ny,
IS NULL v IS NOT NULL khng lun tr v cc kt qu ngc nhau i vi cc biu thc c gi
tr hng, ngha l mt biu thc c gi tr hng m c cha c cc gi tr null v not-null s
tr v sai (false) cho c 2 kim th. nh ngha ny tun th tiu chun SQL, v l mt thay
i t hnh vi khng nht qun c trong PostgreSQL cc phin bn trc 8.2.
Cc ton t so snh thng thng mang li null (biu th khng bit), khng l ng (true) hoc
sai (false), khi u vo l null. V d, 7 = NULL mang li null. Khi hnh vi ny l khng ph hp,
hy s dng cc cu trc IS [ NOT ] DISTINCT FROM:
expression IS DISTINCT FROM expression
expression IS NOT DISTINCT FROM expression

i vi cc u vo non-null, IS DISTINCT FROM l y ht nh ton t <>. Tuy nhin, nu c 2 u


vo u l null th n tr v false, v nu ch mt u vo l null th n tr v true. Tng t, IS NOT
DISTINCT FROM l y ht vi = i vi cc u vo non-null, nhng n tr v true khi c 2 u vo l
null, v false khi ch mt u vo l null. V th, cc cu trc hnh ng c hiu lc nh th null
l mt gi tr d liu thng thng, ch khng phi l khng bit.
Cc gi tr Boolean cng c th c kim th bng vic s dng cc cu trc
IS TRUE
IS NOT TRUE
IS FALSE
IS NOT FALSE
expression IS UNKNOWN
expression IS NOT UNKNOWN
expression
expression
expression
expression

Chng s lun tr v true hoc false, khng bao gi tr v mt gi tr null, thm ch khi ton t l
null. Mt u vo null c i x nh l gi tr logic khng bit. Lu rng IS UNKNOWN v IS
NOT UNKNOWN c hiu lc nh nhau nh IS NULL v IS NOT NULL mt cch tng ng, ngoi tr l
biu thc u vo phi dng Boolean.

9.3. Hm v ton t ton hc


Cc ton t ton hc c cung cp cho nhiu dng PostgreSQL. i vi cc dng khng c cc
qui c ton hc tiu chun (nh cc dng ngy thng/thi gian date/time) chng ta m t hnh vi
thc s trong cc phn tip sau.
Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 182/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Bng 9-2 ch ra cc ton t ton hc c sn.


Bng 9-2. Cc ton t ton hc
Ton t

M t

V d

Kt qu

cng

2+3

tr

2-3

-1

nhn

2*3

chia (chia s nguyn s ct bt kt qu)

4/2

modulo (phn cn li)

5%4

ly tha

2.0 ^ 3.0

|/

cn bc 2

|/ 25.0

||/

cn bc 3

||/ 27.0

giai tha

5!

120

!!

giai tha (ton t tip u ng)

!! 5

120

gi tr tuyt i

@ -5.0

&

bitwise

AND 91 & 15

11

bitwise

OR 32 | 3

35

bitwise

XOR 17 # 5

20

bitwise

NOT ~1

-2

<<

bitwise dch tri

1 << 4

16

>>

bitwise dch phi

8 >> 2

Cc ton t bitwise ch lm vic trong cc dng d liu tch phn, trong khi cc ton t khc l sn
sng cho tt c cc dng d liu s. Cc ton t bitwise cng sn sng cho cc dng chui bit bit v
bit varying, nh c ch ra trong bng 9-10.
Bng 9-3 ch ra cc hm ton hc c sn. Trong bng, dp ch chnh xc gp i double precision.
Nhiu trong s cc hm c a ra nhiu dng vi cc dng i s khc nhau. Ngoi tr
nhng ni c lu , bt k dng no ca mt hm c a ra cng tr v dng d liu y ht nh
i s ca n. Cc hm lm vic vi cc d liu double precision hu ht c trin khai trn nh
ca th vin C h thng ch (host system); chnh xc v hnh vi trong cc trng hp bin v th
c th bin i, ph thuc vo h thng ch .
Bng 9-3. Cc hm ton hc
Hm

Dng tr v

M t

V d

Kt qu

abs(x)

(y ht nh u vo) gi tr tuyt i

abs(-17.4)

17.4

cbrt(dp)

dp

cbrt(27.0)

ceil(dp or numeric)

(y ht nh u vo) s nguyn nh nht khng ceil(-42.8)


nh hn i s

-42

ceiling(dp or numeric)

(y ht nh u vo) s nguyn nh nht khng ceiling(-95.3)

-95

cn bc 3

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 183/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Hm

Dng tr v

Xut bn nm 2013

M t

V d

Kt qu

nh hn i s (tn hiu
cho ceil)
degrees(dp)

dp

t radians sang

degrees(0.5)

28.6478897565412

div(y numeric, x
numeric)

numeric

thng s s nguyn ca
y/x

div(9,4)

exp(dp or numeric)

(y ht nh u vo) s m

exp(1.0)

2.71828182845905

floor(dp or numeric)

(y ht nh u vo) s nguyn ln nht khng


ln hn i s

floor(-42.8)

-43

ln(dp or numeric)

(y ht nh u vo) logarithm t nhin

ln(2.0)

0.693147180559945

log(dp or numeric)

(y ht nh u vo) logarithm c s 10

log(100.0)

log(b numeric, x
numeric)

numeric

Logarithm c s b

Log(2.0, 64.0)

6.0000000000

mod(y, x)

(y ht dng i s)

phn cn li ca y/x

mod(9,4)

pi()

dp

hng s

pi()

3.14159265358979

power(a dp, b dp)

dp

a ly tha b

power(9.0, 3.0)

729

power(a numeric, b
numeric)

numeric

a ly tha b

Power(9.0, 3.0)

729

radians(dp)

dp

t sang radians

radians(45.0)

0.785398163397448

random()

dp

gi tr ngu nhin trong


dy 0.0 <= x < 1.0

random()

round(dp or numeric)

(y ht nh u vo) lm trn ti s nguyn gn round(42.4)


nht

42

round(v numeric, s int)

numeric

lm trn ti s du thp
phn

42.44

setseed(dp)

void

t ht ging cho cc li setseed(0.54823)


gi random () tip sau (gi
tr gia -1.0 v 1.0, bao
gm 2 s )

sign(dp or numeric)

(y ht nh u vo) du ca i s (-1, 0, +1)

sign(-8.4)

-1

sqrt(dp or numeric)

(y ht nh u vo) cn bc 2

sqrt(2.0)

1.4142135623731

trunc(dp or numeric)

(y ht nh u vo) ct ngn ti 0

trunc(42.8)

42

trunc(v numeric, s int)

numeric

round(42.4382,
2)

ct ngn ti s du thp trunc(42.4382,


phn
2)

width_bucket(op
int
numeric, b1 numeric, b2
numeric, count int)

tr v khong theo ton width_bucket(5.3


hng c th c ch nh 5, 0.024, 10.06, 5)
theo biu cng mc vi
cc khong tnh ton,
trong di b1 ti b2

width_bucket(op dp, b1
dp, b2 dp, count int)

tr v khong theo ton width_bucket(5.3


hng c th c ch nh 5, 0.024, 10.06, 5)
theo biu cng mc vi
cc khong tnh ton,
trong di b1 ti b2

int

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

42.43

Trang 184/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Cui cng, Bng 9-4 ch ra cc hm lng gic c sn. Tt c cc hm lng gic ly cc i s v


tr v cc gi tr dng double precision. Cc i s hm lng gic c th hin bng radian. Cc
hm ngc tr v cc gi tr dng radian. Xem cc hm bin i n v radians() v degrees() trn.
Bng 9-4. Cc hm lng gic
Hm

acos(x)

asin(x)

atan(x)

atan2(y, x)

cos(x)

M t

ngc vi
cosine

ngc vi
sine

ngc vi
tangent

ngc vi cosine
tangent ca
y/x

cot(x)

sin(x)

tan(x)

cotangent

sine

tangent

9.4. Hm v ton t chui


Phn ny m t cc hm v ton t cho vic kim tra v iu khin cc gi tr chui. Cc chui
trong ng cnh ny bao gm cc gi tr cc dng character, character varying, v text. Tr phi c
lu khc i, tt c cc hm c lit k bn di lm vic trong tt c cc dng, nhng l khc
nhau v cc hiu ng tim nng ca vic chm vo ch trng mt cch t ng khi s dng dng
character. Mt s hm cng tn ti bm sinh i vi cc dng chui bit.
SQL xc nh mt s hm chui m s dng cc t kha, thay v cc du phy, tch cc i s.
Cc chi tit trong Bng 9-5. PostgreSQL cng a ra cc phin bn cc hm m s dng c php
gi hm thng thng (xem Bng 9-6).
Lu : Trc PostgreSQL v8.3, cc hm c th cng m thm chp nhn cc gi tr ca
vi dng d liu khng phi l chui, v s hin din ca s p buc ngm ngm t cc dng
d liu i vi text. Nhng p buc tng c loi b v chng thng xuyn gy ra
cc hnh vi gy ngc nhin. Tuy nhin, ton t ghp chui (||) vn chp nhn u vo khng
phi l chui, nn min l t nht mt u vo l dng chui, nh c nu trong Bng 95. i vi cc trng hp khc, hy chn mt s cng bc r rng vo text nubn cn p
bn hnh vi trc .
Bng 9-5. Hm v ton t chui SQL
Hm

Dng tr v

M t

V d

Kt qu

string || string

text

Ghp chui

Post || greSQL

PostgreSQL

String || non-string or
non-string || string

text

Ghp chui vi mt u vo
khng phi l chui

Value: || 42

Value: 42

bit_length(string)

int

S bit trong chui

bit_length(jose32)

char_length(string) hoc
character_length(string)

int

S k t trong chui

char_length(jos4e)

lower(string)

text

Chuyn chui sang ch thng

lower(TOM)

octet_length(string)

int

S byte trong chui

octet_length(jo4se)

overlay(string placing
string from int [for int])

text

Thay chui con

overlay(Txxxxas
t hom t 2 vi 4)

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

tom
Thomas

Trang 185/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Hm
position(substring in
string)

Dng tr v
int

Xut bn nm 2013

M t

V d

Kt qu

V tr chui con c ch nh

position(om trong
Thomas)

substring(string [from int] text


[for int])

Trch ra chui con

substring(Thomas
t 2 vi 3)

hom

substring(string from
pattern)

text

Trch chui con khp vi biu substring(Thomas t ...


thc POSIX thng thng. Xem $)
Phn 9.7 c thm thng tin v
khp mu.

mas

substring(string from
pattern for escape)

text

Trch chui con khp vi biu substring(Thomas


thc SQL thng thng. Xem t %#"o_a#"_ vi #)
Phn 9.7 c thm thng tin v
khp mu.

oma

trim([leading | trailing |
both] [characters] from
string)

text

Loi b chui di nht c cha


ch cc k t (mt du trng
mc nh) t im u/cui/2
u ca chui

trim(both x t
xTomxx)

Tom

upper(string)

text

Chuyn chui thnh ch hoa

upper(tom)

TOM

Cc hm b sung iu khin chui l sn c v c lit k trong Bng 9-6. Mt s chng c


s dng ni b trin khai cc hm chui theo tiu chun SQL c lit k trong Bng 9-5.
Bng 9-6. Cc hm chui khc
Hm

Dng tr v

M t

V d

Kt qu

ascii(string)

int

M ASCII k t u tin ascii(x)


ca i s. UTF8 tr v
im m k t Unicode.
Nhng m ha nhiu byte
khc th i s phi l mt
k t ASCII.

120

btrim(string text [,
characters text])

text

Loi b chui di nht ch btrim(xyxtrimyyx,


bao gm cc k t trong xy)
cc k t (mt du trng l
mc nh) t u v cui
ca chui.

trim

chr(int)

text

K t vi m c a ra. chr(65)
Vi UTF8 th i s c
theo di nh mt im m
Unicode, i vi cc m
ha nhiu byte khc th i
s phi ch nh mt k t
ASCII. K t NULL (0) l
khng c php v cc
dng d liu vn bn khng
th lu tr cc byte nh
vy.

convert(string bytea,
src_encoding name,
dest_encoding name)

bytea

Bin i chui sang convert(text_in_utf8,


dest_encoding. Vic m ha UTF8, LATIN1)
ban u c src_encoding

text_in_utf8
represented in
Latin-1 encoding

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 186/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Hm

Dng tr v

M t

Xut bn nm 2013
V d

ch nh. Chui phi l


hp l trong vic m ha
ny. Cc bin i c th do
CREATE CONVERSION
xc nh. Hn na s c
mt s bin i c xc
nh trc. Xem Bng 9-7
cho cc bin i c sn.

Kt qu
(ISO 8859-1)

convert_from(string
bytea, src_encoding
name)

text

Bin i chui sang m c convert_from(text_in_ text_in_utf8


s d liu. M gc ban u utf8, UTF8)
represented in the
c src_encoding ch
current database
nh. Chui phi hp l
encoding
trong m ny.

convert_to(string text,
dest_encoding name)

bytea

Bin i chui sang


dest_encoding.

convert_to(some text,
UTF8)

some text
represented in the
UTF8 encoding

decode(string text, format bytea


text)

Gii m cc d liu nh decode(MTIzAAE=,


phn t trnh din vn bn base64)
trong chui. Cc la chn
cho nh dng l y ht nh
trong m ha.

encode(data bytea, format text


text)

M ha d liu nh phn encode(E123\\000\\001 MTIzAAE=


thnh mt trnh din vn , base64)
bn. Cc nh dng c h
tr gm: base64, hex,
escape. escape bin i cc
byte 0 v cc byte trong
thit lp bit cao sang cc
tun t c s 8 (\nnn) v
p bn cc du cho
ngc.

initcap(string)

text

Bin i k t u ca tng initcap(hi THOMAS)


t thnh ch hoa v phn
cn li thnh ch thng.
Cc t l tun t ca cc k
t abc c tch bch nhau
bng cc k t khng phi
abc.

Hi Thomas

length(string)

int

S lng cc k t trong length(jose)


chui

length(stringbytea,
encoding name )

int

S lng cc k t trong length(jose, UTF8)


chui trong m c a
ra. Chui phi l hp l
trong m ny.

in chui vo di bng lpad(hi, 5, xy)


vic treo trc k t in
(mc nh mt du trng).
Nu chui di hn ri so
vi di th n b ct bt
( bn phi).

xyxhi

lpad(string text, length int text


[, fill text])

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

x3132330001

Trang 187/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Hm

Dng tr v

M t

Xut bn nm 2013
V d

Kt qu

ltrim(string text [,
characters text])

text

Loi b chui di nht ch ltrim(zzzytrim, xyz) trim


cha cc k t t cc k t
(mc nh mt du trng) t
u chui.

md5(string)

text

Tnh hm bm MD5 ca md5(abc)


chui, tr v kt qu dng
c s 16

900150983cd24fb0
d6963f7d28e17f72

pg_client_encoding()

name

Tn m ha trm hin hnh. pg_client_encoding

SQL()ASCII

quote_ident(string text)

text

Tr v chui c a ra quote_ident(Foo bar)


c a vo du ngoc
kp ph hp s dng
nh mt m nh danh
trong mt chui lnh SQL.
Cc du ngoc kp c b
sung ch nu cn thit (nh,
nu chui gm cc k t
khng phi ca m nh
danh hoc c th l ch
gp). Cc du ngoc kp
c nhng c p bn
ph hp. Xem thm V d
39-1.

"Foo bar"

quote_literal(string
text)

text

Tr v chui c a ra quote_literal(EO\RR
ph hp c a vo cc eeiilllyy)
du ngoc kp s dng
nh mt hng chui trong
mt chui lnh SQL. Cc
du ngoc kp n c
nhng v cc du cho
ngc c p bn ph
hp. Lu quote_literal tr
v null u vo null; nu
i s c th l null,
quote_nullable thng ph
hp hn. Xem thm V d
39-1.

quote_literal(value
anyelement)

text

p gi tr c a ra thnh quote_literal(42.452).5
vn bn v sau a n
vo du ngoc kp nh mt
hng. Cc du ngoc kp
n v cc du cho ngc
c p bn ph hp.

quote_nullable(string
text)

text

Tr v chui c a ra quote_nullable(NULL)
c a vo cc du
ngoc kp ph hp s
dng nh mt hng chui
trong mt chui lnh SQL
hoc, nu i s l null, th
tr v NULL. Cc du
ngoc n c nhng v
cc du cho ngc c
p bn ph hp. Xem

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 188/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Hm

Dng tr v

M t

Xut bn nm 2013
V d

Kt qu

thm V d 39-1.
quote_nullable(value
anyelement)

text

regexp_matches(string
text, pattern text [, flags
text]) setof text[]

regexp_replace(string
text, pattern text,
replacement text
[, flags text])

p gi tr c a ra thnh quote_nullable(424.25.
vn bn v sau a n )5
vo cc du ngoc kp nh
mt hng; hoc, nu i s
l null, th tr v NULL.
Cc du ngoc kp c
nhng v cc du cho
ngc c p bn ph
hp.
Tr v tt c cc chui con regexp_matches(foobar
bt c c c t vic bequebaz, (bar)
trng vi mt biu thc (beque)) {bar,beque}
POSIX thng thng i
vi chui . Xem phn
9.7.3 c thm thng tin.

text

Tr v (cc) chui con khp regexp_replace(Thoma ThM


vi mt biu thc POSIX s, .[mN]a., M)
thng thng. Xem Phn
9.7.3 c thm thng tin.

regexp_split_to_array(stri
ng text, pattern text [,
flags text ]) text[]

Chia chui bng vic s regexp_split_to_array( {hello,world}


dng mt biu thc POSIX hello world, E\\s+)
thng thng nh l du
tch. Xem Phn 9.7.3 c
thm thng tin.

regexp_split_to_table(stri
ng text, pattern text [,
flags text]) setof text

Chia chui bng vic s regexp_split_to_table(


dng mt biu thc POSIX hello world, E\\s+)
thng thng nh l du
tch. Xem Phn 9.7.3 c
thm thng tin.

Helloworld (2 rows)

repeat(string text, number text


int)

Lp li chui vi s ln repeat(Pg, 4)
c ch nh.

PgPgPgPg

replace(string text, from


text, to text)

Thay th tt c cc trng
hp trong chui ca chui
con t bng chui con ti

text

replace(abcdefabcdef, abXXefabXXef
cd, XX)

rpad(string text, length int text


[, fill text])

in chui vo di bng rpad(hi, 5, xy)


vic ni thm cc k t
in (mc nh mt k t
trng). Nu chui di
hn ri so vi chiu di
th n s b ct bt.

hixyx

rtrim(string text [,
characters text])

text

Loi b chui di nht ch rtrim(trimxxxx, x)


cha cc k t t cc k t
(mc nh l mt du trng)
t cui ca chui.

trim

split_part(string
text, delimiter
text, field int)

text

Chia chui theo du phn split_part(abc~@~def~ def


cch v tr v trng c @~ghi, ~@~, 2)
a ra (tnh t 1).

strpos(string, substring)

int

a im ca chui con strpos(high, ig)


c ch nh (y ht nh v

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 189/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Hm

Dng tr v

M t

Xut bn nm 2013
V d

Kt qu

tr (chui con trong chui),


nh lu trt t ngc ca
i s)
substr(string, from [,
count])

text

Trch chui con (y ht nh to_ascii(KarelK)arel


chui con (chui t
m) substr(alphabet, 3,
2) ph to_ascii(string text [,
encoding text]) text. Bin
i chui sang ASCII t
vic m ha khc (ch h
tr bin i t cc m ha
LATIN1,
LATIN2,
LATIN9, v WIN1250)

to_hex(number int or
bigint)

text

Bin i s thnh cc trnh to_hex(21474836477f)


by tng ng ca n
c s 16

ffffff

translate(string
text, from text,
to text)

text

Bt k k t no dng translate(12345, 14,


chui m khp mt k t ax)
bn trong tp hp t c
thay th bng k t tng
ng trong tp hp n.

a23x5

Xem thm hm tng hp string_agg Phn 9.18.


Bng 9-7. Cc chuyn i c xy dng sn
Tn chuyn i a

M ngun

M ch

ascii_to_mic

SQL_ASCII

MULE_INTERNAL

ascii_to_utf8

SQL_ASCII

UTF8

big5_to_euc_tw

BIG5

EUC_TW

big5_to_mic

BIG5

MULE_INTERNAL

big5_to_utf8

BIG5

UTF8

euc_cn_to_mic

EUC_CN

MULE_INTERNAL

euc_cn_to_utf8

EUC_CN

UTF8

euc_jp_to_mic

EUC_JP

MULE_INTERNAL

euc_jp_to_sjis

EUC_JP

SJIS

euc_jp_to_utf8

EUC_JP

UTF8

euc_kr_to_mic

EUC_KR

MULE_INTERNAL

euc_kr_to_utf8

EUC_KR

UTF8

euc_tw_to_big5

EUC_TW

BIG5

euc_tw_to_mic

EUC_TW

MULE_INTERNAL

euc_tw_to_utf8

EUC_TW

UTF8

gb18030_to_utf8

GB18030

UTF8

gbk_to_utf8

GBK

UTF8

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 190/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Tn chuyn i a

Xut bn nm 2013

M ngun

M ch

iso_8859_10_to_utf8

LATIN6

UTF8

iso_8859_13_to_utf8

LATIN7

UTF8

iso_8859_14_to_utf8

LATIN8

UTF8

iso_8859_15_to_utf8

LATIN9

UTF8

iso_8859_16_to_utf8

LATIN10

UTF8

iso_8859_1_to_mic

LATIN1

MULE_INTERNAL

iso_8859_1_to_utf8

LATIN1

UTF8

iso_8859_2_to_mic

LATIN2

MULE_INTERNAL

iso_8859_2_to_utf8

LATIN2

UTF8

iso_8859_2_to_windows_1250

LATIN2

WIN1250

iso_8859_3_to_mic

LATIN3

MULE_INTERNAL

iso_8859_3_to_utf8

LATIN3

UTF8

iso_8859_4_to_mic

LATIN4

MULE_INTERNAL

iso_8859_4_to_utf8

LATIN4

UTF8

iso_8859_5_to_koi8_r

ISO_8859_5

KOI8R

iso_8859_5_to_mic

ISO_8859_5

MULE_INTERNAL

iso_8859_5_to_utf8

ISO_8859_5

UTF8

iso_8859_5_to_windows_1251

ISO_8859_5

WIN1251

iso_8859_5_to_windows_866

ISO_8859_5

WIN866

iso_8859_6_to_utf8

ISO_8859_6

UTF8

iso_8859_7_to_utf8

ISO_8859_7

UTF8

iso_8859_8_to_utf8

ISO_8859_8

UTF8

iso_8859_9_to_utf8

LATIN5

UTF8

johab_to_utf8

JOHAB

UTF8

koi8_r_to_iso_8859_5

KOI8R

ISO_8859_5

koi8_r_to_mic

KOI8R

MULE_INTERNAL

koi8_r_to_utf8

KOI8R

UTF8

koi8_r_to_windows_1251

KOI8R

WIN1251

koi8_r_to_windows_866

KOI8R

WIN866

koi8_u_to_utf8

KOI8U

UTF8

mic_to_ascii

MULE_INTERNAL

SQL_ASCII

mic_to_big5

MULE_INTERNAL

BIG5

mic_to_euc_cn

MULE_INTERNAL

EUC_CN

mic_to_euc_jp

MULE_INTERNAL

EUC_JP

mic_to_euc_kr

MULE_INTERNAL

EUC_KR

mic_to_euc_tw

MULE_INTERNAL

EUC_TW

mic_to_iso_8859_1

MULE_INTERNAL

LATIN1

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 191/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Tn chuyn i a

Xut bn nm 2013

M ngun

M ch

mic_to_iso_8859_2

MULE_INTERNAL

LATIN2

mic_to_iso_8859_3

MULE_INTERNAL

LATIN3

mic_to_iso_8859_4

MULE_INTERNAL

LATIN4

mic_to_iso_8859_5

MULE_INTERNAL

ISO_8859_5

mic_to_koi8_r

MULE_INTERNAL

KOI8R

mic_to_sjis

MULE_INTERNAL

SJIS

mic_to_windows_1250

MULE_INTERNAL

WIN1250

mic_to_windows_1251

MULE_INTERNAL

WIN1251

mic_to_windows_866

MULE_INTERNAL

WIN866

sjis_to_euc_jp

SJIS

EUC_JP

sjis_to_mic

SJIS

MULE_INTERNAL

sjis_to_utf8

SJIS

UTF8

tcvn_to_utf8

WIN1258

UTF8

uhc_to_utf8

UHC

UTF8

utf8_to_ascii

UTF8

SQL_ASCII

utf8_to_big5

UTF8

BIG5

utf8_to_euc_cn

UTF8

EUC_CN

utf8_to_euc_jp

UTF8

EUC_JP

utf8_to_euc_kr

UTF8

EUC_KR

utf8_to_euc_tw

UTF8

EUC_TW

utf8_to_gb18030

UTF8

GB18030

utf8_to_gbk

UTF8

GBK

utf8_to_iso_8859_1

UTF8

LATIN1

utf8_to_iso_8859_10

UTF8

LATIN6

utf8_to_iso_8859_13

UTF8

LATIN7

utf8_to_iso_8859_14

UTF8

LATIN8

utf8_to_iso_8859_15

UTF8

LATIN9

utf8_to_iso_8859_16

UTF8

LATIN10

utf8_to_iso_8859_2

UTF8

LATIN2

utf8_to_iso_8859_3

UTF8

LATIN3

utf8_to_iso_8859_4

UTF8

LATIN4

utf8_to_iso_8859_5

UTF8

ISO_8859_5

utf8_to_iso_8859_6

UTF8

ISO_8859_6

utf8_to_iso_8859_7

UTF8

ISO_8859_7

utf8_to_iso_8859_8

UTF8

ISO_8859_8

utf8_to_iso_8859_9

UTF8

LATIN5

utf8_to_johab

UTF8

JOHAB

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 192/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Tn chuyn i a

Xut bn nm 2013

M ngun

M ch

utf8_to_koi8_r

UTF8

KOI8R

utf8_to_koi8_u

UTF8

KOI8U

utf8_to_sjis

UTF8

SJIS

utf8_to_tcvn

UTF8

WIN1258

utf8_to_uhc

UTF8

UHC

utf8_to_windows_1250

UTF8

WIN1250

utf8_to_windows_1251

UTF8

WIN1251

utf8_to_windows_1252

UTF8

WIN1252

utf8_to_windows_1253

UTF8

WIN1253

utf8_to_windows_1254

UTF8

WIN1254

utf8_to_windows_1255

UTF8

WIN1255

utf8_to_windows_1256

UTF8

WIN1256

utf8_to_windows_1257

UTF8

WIN1257

utf8_to_windows_866

UTF8

WIN866

utf8_to_windows_874

UTF8

WIN874

windows_1250_to_iso_8859_2

WIN1250

LATIN2

windows_1250_to_mic

WIN1250

MULE_INTERNAL

windows_1250_to_utf8

WIN1250

UTF8

windows_1251_to_iso_8859_5

WIN1251

ISO_8859_5

windows_1251_to_koi8_r

WIN1251

KOI8R

windows_1251_to_mic

WIN1251

MULE_INTERNAL

windows_1251_to_utf8

WIN1251

UTF8

windows_1251_to_windows_8

W6I6N1251

WIN866

windows_1252_to_utf8

WIN1252

UTF8

windows_1256_to_utf8

WIN1256

UTF8

windows_866_to_iso_8859_5

WIN866

ISO_8859_5

windows_866_to_koi8_r

WIN866

KOI8R

windows_866_to_mic

WIN866

MULE_INTERNAL

windows_866_to_utf8

WIN866

UTF8

windows_866_to_windows_12

W5I1N866

WIN

windows_874_to_utf8

WIN874

UTF8

euc_jis_2004_to_utf8

EUC_JIS_2004

UTF8

ut8_to_euc_jis_2004

UTF8

EUC_JIS_2004

shift_jis_2004_to_utf8

SHIFT_JIS_2004

UTF8

ut8_to_shift_jis_2004

UTF8

SHIFT_JIS_2004

euc_jis_2004_to_shift_jis

EU2C00J4IS_2004

SHIFT_JIS_2004

shift_jis_2004_to_euc_jis

SH2I0F0T4_JIS_2004

EUC_JIS_2004

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 193/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Tn chuyn i a

Xut bn nm 2013

M ngun

M ch

Lu :
a. Cc tn chuyn i theo mt s gi tn tiu chun: tn chnh thc ca m ngun vi tt c cc k t khng phi
l abc c cc du gch chn thay th, c theo sau bng _to_, c theo sau bng tn m ch c x l tng t.
V th, cc tn c th khc nhau vi cc tn m ha theo thi thng.

9.5. Hm v ton t chui nh phn


Phn ny m t cc hm v ton t cho vic kim tra v iu khin cc gi tr dng bytea.
SQL nh ngha mt s hm chui s dng cc t kha, thay v du phy, tch bit cc i s.
Cc chi tit nm trong Bng 9-8. PostgreSQL cng a ra cc phin bn ca cc hm c s dng c
php gi hm thng thng (xem Bng 9-9).
Lu : Cc kt qu v d trong trang ny gi thit rng tham s my ch
thit lp thot (nh dng PostgreSQL truyn thng).

bytea_output

Bng 9-8. Cc hm v ton t chui nh phn SQL


Hm
string ||
string

Dng tr v
bytea

M t
Ghp chui

V d
E\\\\Post::bytea
||
E\\047gres\\000::bytea

Kt qu
\\Postgres\000

octet_length(string) int

S lng byte trong chui octet_length(Ejo\\000se::bytea)


nh phn

overlay(string
bytea
placing string from
int [for int])

Thay th chui con

position(substring
in string)

V tr chui con c ch position(E\\000om::bytea in


nh
ETh\\000omas::bytea)

substring(string
bytea
[from int] [for int])

Trch ra chui con

h\000o

trim([both] bytes
from string)

Loi b chui di nht


trim(E\\000::bytea from
ch c cc byte trong cc E\\000Tom\\000::bytea)
byte t u ti cui chui

int

bytea

overlay(ETh\\000omas::bytea
T\\002\\003mas
placing E\\002\\003::bytea from 2
for 3)

substring(ETh\\000omas::bytea
from 2 for 3)

Tom

Cc hm iu khin chui nh phn b sung l sn sng v c lit k trong Bng 9-9. Mt s


trong s chng c s dng ni b trin khai cc hm chui tiu chun SQL c lit k trong
Bng 9-8.
Bng 9-9. Cc hm chui nh phn khc
Hm

Dng tr v

M t

V d

Kt qu

btrim(string bytea, bytea


bytes bytea)

Loi b chui di nht ch c cc btrim(E\\000trim::bytea,


byte trong cc byte t u ti cui
E\\000::bytea)
chui

\\000

decode(string text, bytea


format text)

Gii m d liu nh phn t trnh decode(E123\\000456,


by vn bn theo chui. Cc la escape)

123\000456

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 194/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Hm

Dng tr v

Xut bn nm 2013

M t

V d

Kt qu

chn v nh dng l y ht nh
trong m ha.
encode(data
text
bytea, format text)

D liu m ha nh phn trong encode(E123\\000456::b 123\000456


trnh by vn bn. Cc nh dng ytea, escape)
c h tr l: base64, hex,
escape. escape chuyn i cc
byte 0 v cc byte theo tp hp bit
thnh cc tun t h s 8 (\nnn)
v p bn cc du cho ngc.

get_bit(string,
offset)

int

Trch bit t chui

get_bit(ETh\\000omas:: 1
bytea, 45)

get_byte(string,
offset)

int

Trch byte t chui

get_byte(ETh\\000omas 109
::bytea, 4)

length(string)

int

di chui nh phn

length(Ejo\\000se::bytea 5
)

md5(string)

text

Tnh bm MD5 ca chui, tr v


kt qu h s 16 (hexadecimal)

md5(ETh\\000oma8sab: 9aaf18
2:db3yct9e6a8)
b4958c334c82d8b1

set_bit(string,
offset, newvalue)

bytea

Thit lp bit trong chui

set_bit(ETh\\000omas::
bytea, 45, 0)

set_byte(string,
offset, newvalue)

bytea

Thit lp byte trong chui

set_byte(ETh\\000omas: Th\000o@as
:bytea, 4, 64)

Th\000omAs

v set_byte s byte u ca mt chui nh phn nh byte 0. get_bit v set_bit s bit t phi


qua bn trong tng byte; v d bit 0 l bit t ng k nht ca byte u tin, v bit 15 l bit ng k
nht ca byte th 2.
get_byte

9.6. Hm v ton t chui bit


Phn ny m t cc hm v ton t cho vic xem xt v iu khin cc chui bit, l cc gi tr
ca cc dng bit v bit varying. Ngoi cc ton t so snh thng thng, cc ton t c nu trong
Bng 9-10 c th c s dng. Cc ton hng chui bit & , | v # phi c di bng nhau. Khi
dch chuyn bit, di ban u ca chui c gi li, nh c ch ra trong cc v d.
Bng 9-10. Cc ton t chui bit
Ton t

M t

V d

Kt qu

||

ghp (concatenation )

B10001 ||
B011

10001011

&

V bitwise (bitwise AND)

B10001 &
B01101

00001

HOC bitwise (bitwise OR)

B10001 |
B01101

11101

bitwise XOR

B10001 #
B01101

11100

bitwise NOT

~ B10001

01110

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 195/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Ton t

M t

Xut bn nm 2013
V d

Kt qu

<<

dch sang tri bitwise (bitwise shift left)

B10001 << 3

01000

>>

dch sang phi bitwise (bitwise shift right) B10001 >> 2

00100

Cc hm tiu chun SQL sau y lm vic trong c cc chui bit cng nh cc chui k t:
bit_length, octet_length, position, substring, overlay.

length,

Cc hm sau lm vic trong cc chui bit cng nh cc chui nh phn: get_bit, set_bit. Khi lm vic
vi mt chui bit, cc hm nh s cho bit u tin (bn tri nht) ca chui nh l bit 0. Hn
na, c kh nng a ra cc gi tr tch phn ti v t dng bit. Mt s v d:
44::bit(10)
44::bit(3)
cast(-44 as bit(12))
1110::bit(4)::integer

0000101100
100
111111010100
14

Lu rng vic a ra ch bit ngha l a ra cho


nht ca s interger .

bit(1),

v v th s phn phi ch bit t ng k

Lu : Trc PostgreSQL 8.0, vic a ra mt s interger cho bit(n) c th sao chp n bit tri
nht ca s interger , trong khi by gi n sao chp n bit phi nht. Hn na, vic a ra
mt s integer ti mt chui bit rng ln hn so vi bn thn s integer s m rng
du hiu v bn tri.

9.7. Khp mu
C 3 tip cn ring r khp mu c PostgreSQL cung cp: ton t LIKE ca SQL truyn thng,
ton t gn y hn SIMILAR TO (c b sung vo SQL:1999), v cc biu thc dng POSIX thng
thng. Ngoi cc ton t c bn lm cho chui ny khp vi mu ny?, cc hm l sn sng
m rng hoc thay th cc chui trng khp v chia mt chui cc v tr khp.
Mo: Nu bn c cc nhu cu khp mu m vt ra khi iu ny, hy cn nhc vic vit
mt hm do ngi s dng nh ngha trong Perl hoc TCL.

9.7.1. LIKE
string LIKE pattern [ESCAPE escape-character]
string NOT LIKE pattern [ESCAPE escape-character]

Biu thc LIKE tr v ng - true nu chui khp vi mu pattern c cung cp. (Nh c k
vng, biu thc NOT LIKE tr v sai - false nu LIKE tr v ng, v ngc li. Mt biu thc tng
ng l NOT (string LIKE pattern)).
Nu mu pattern khng cha cc du % hoc cc du gch chn, th mu ch i din cho bn
thn chui ; trong trng hp th LIKE hnh ng nh l ton t bng. Mt du gch chn (_)
trong pattern s i din cho (cc trng khp) bt k k t no; mt du % khp vi bt k tun t
no ca s 0 hoc nhiu hn cc k t. Mt s v d:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 196/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


abc
abc
abc
abc

LIKE
LIKE
LIKE
LIKE

abc
a%
_b_
c

Xut bn nm 2013

true
true
true
false

Khp mu LIKE lun bao trm ton b chui. V th, khp mt tun t bt k u trong mt
chui, th mu phi bt u v kt thc vi mt du %.
khp mt du gch chn hoc % ca hng m khng c vic khp vi cc k t khc, k t
tng ng trong mu pattern phi c k t thot i trc. K t thot mc nh l du cho ngc
nhng mt cch thot khc cng c th c chn bng vic s dng mnh thot ESCAPE.
khp bn thn k t thot, hy vit 2 k t thot.
Lu rng du cho ngc c ri mt ngha c bit trong cc hng chui, nn vit mt hng
mu c cha mt du cho ngc th bn phi vit 2 du cho ngc trong mt lnh SQL (gi thit
c php chui thot c s dng, xem Phn 4.1.2.1). V th, vic vit mt mu thc s khp vi
mt du cho ngc ngha l vit 4 du cho ngc trong lnh. Bn c th trnh iu ny bng vic
chn mt k t thot khc vi ESCAPE; ri mt du cho ngc s khng l c bit vi LIKE na.
(Nhng du cho ngc vn l c bit vi trnh phn tch hng chui, nn bn vn cn 2 du
khp vi mt du cho ngc).
Cng c kh nng khng chn k t thot no bng vic vit ESCAPE . iu ny s v hiu ha c
hiu qu c ch thot, n lm cho c kh nng tt ngha c bit ca cc du % v gch chn
trong mu .
T kha ILIKE c th c s dng thay cho LIKE to s khp phn bit ch hoa ch thng theo
ngn ng bn a ang hin din. y khng phi l tiu chun SQL nhng l mt m rng ca
PostgreSQL.
Ton t ~ ~ l tng ng vi LIKE, cn ~ ~ * l tng ng vi ILIKE. Cng c cc ton t !~ ~
v !~ ~* i din cho NOT LIKE v NOT ILIKE, mt cch tng ng. Tt c cc ton t l c th
cho PostgreSQL.

9.7.2. Biu thc thng dng SIMILAR TO


string SIMILAR TO pattern [ESCAPE escape-character]
string NOT SIMILAR TO pattern [ESCAPE escape-character]

Ton t SIMILAR TO tr v ng - true hoc sai - false ph thuc vo vic liu mu c khp vi
chui c a ra hay khng. Tng t nh LIKE, ngoi tr l n din gii mu bng vic s
dng nh ngha tiu chun SQL ca mt biu thc thng dng. Cc biu thc thng dng SQL l
mt s t m gia k hiu LIKE v k hiu biu thc thng thng.
Ging nh LIKE, ton t SIMILAR TO ch thnh cng nu mu ca n khp vi ton b chui; y c
l khng l hnh vi ca biu thc thng thng chung nhng ni m mu c th khp vi bt
k phn no ca chui. Hn na, ging nh LIKE , SIMILAR TO s dng cc du _v % nh l cc k
t * biu th bt k k t duy nht no v bt k chui no, mt cch tng ng (c s so snh du

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 197/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

chm (.) vi du chm i vi k t sao (.*) trong cc biu thc POSIX thng thng).
B sung thm vo cc c s c mn t LIKE , SIMILAR TO h tr cho cc k t khp mu c
mn t cc biu thc POSIX thng thng:
biu th s xoay chiu (hoc 2 la chn thay th cho nhau).

* biu th s lp li khon trc 0 hoc nhiu ln.

+ biu th s lp li khon trc 1 hoc nhiu ln.

? biu th s lp li khon trc 0 hoc 1 ln.

{m} biu th s lp li khon trc chnh xc m ln.

{m,} biu th s lp li khon trc m hoc nhiu hn ln.

{m,n} biu th s lp li khon trc t nht m v khng ln hn n ln.

Cc du ngoc n ( ) c th c s dng nhm cc khon trong mt khon logic duy


nht.

Mt biu thc trong cc du ngoc vung [] ch nh mt lp k t, ht nh trong cc


biu thc POSIX thng thng.

Lu rng du chm (.) khng phi l mt k t cho SIMILAR TO.


Nh vi LIKE, mt du cho ngc v hiu ha ngha c bit ca bt k siu k t no; hoc mt
k t thot khc c th c ch nh vi ESCAPE.
Mt s v d:
abc
abc
abc
abc

SIMILAR
SIMILAR
SIMILAR
SIMILAR

TO
TO
TO
TO

abc
a
%(b|d)%
(b|c)%

true
false
true
false

Hm substring vi 3 tham s, substring (string from pattern for escape-character), a ra s trch mt


chui khp vi mt mu biu thc thng thng SQL. Nh vi SIMILAR TO, mu c ch nh phi
khp vi ton b chui d liu, hoc nu khng th hm tht bi v tr v null. ch ra phn ca
mu m s c tr v thnh cng, mu phi c 2 ln k t thot theo sau l mt du ngoc kp
( ). Cc ch khp vi phn mu gia cc nh du c tr v.
Mt s v d, vi # phn nh chui tr v:
substring(foobar from %#"o_b#"% for #)
substring(foobar from #"o_b#"% for #)

oob
NULL

9.7.3. Cc biu thc POSIX thng thng


Bng 9-11 lit k cc ton t c sn cho vic khp mu bng vic s dng cc biu thc POSIX
thng thng.
Bng 9-11. Cc ton t khp biu thc thng thng

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 198/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Ton t

Xut bn nm 2013

M t

V d

Khp biu thc thng thng, phn bit ch hoa ch thng

thomas ~ .*thomas.*

~*

Khp biu thc thng thng, khng phn bit ch hoa ch thng

thomas ~* .*Thomas.*

!~

Khng khp biu thc thng thng, phn bit ch hoa ch thng

thomas !~ .*Thomas.*

!~*

Khng khp biu thc thng thng, khng phn bit ch hoa ch thng

thomas !~* .*vadim.*

Cc biu thc POSIX thng thng a ra mt phng tin mnh hn cho vic khp mu so vi
cc ton t LIKE v SIMILAR TO. Nhiu cng c Unix nh egrep, sed hoc awk s dng mt ngn ng
khp mu l tng t vi th c m t y.
Mt biu thc thng thng l mt s tun t cc k t m l mt nh ngha ngn gn ca mt tp
hp cc chui (mt tp hp thng thng). Mt chui c ni l khp vi mt biu thc thng
thng nu n l mt thnh vin ca tp thng thng c biu thc thng thng m t. Nh
vi LIKE, cc k t mu khp cc k t chui mt cch chnh xc tr phi chng l nhng k t c
bit trong ngn ng ca biu thc thng thng - nhng cc biu thc thng thng s dng cc k
t c bit khc vi LIKE lm. Khng ging nh mu LIKE, mt biu thc thng thng c php
khp bt k u trong mt chui, tr phi biu thc thng thng r rng neo u u hoc
cui ca chui. Mt vi v d
abc
abc
abc
abc

~
~
~
~

abc
^a
(b|d)
^(b|c)

true
true
true
false

Ngn ng POSIX mu c m t chi tit hn nhiu bn di. Hm trch chui vi 2 tham s,


substring(string from pattern), a ra s trch xut mt chui con khp vi mu biu thc POSIX
thng thng. Nhng nu mu c cha bt k du ngoc kp no, th t l vn bn v khp vi
cc biu thc con u tin trong cc du ngoc n (biu thc con m du ngoc tri ca n n
trc) c tr v. Bn c th t cc du ngoc n xung quanh ton b biu thc nu bn mun
s dng cc du ngoc n bn trong n m khng ng chm ti ngoi l ny. Nu bn cn cc
du ngoc n trong mu trc biu thc con bn mun trch, hy xem cc du ngoc n khng
bt c c m t bn di. Mt s v d:
substring(foobar from o.b)
substring(foobar from o(.)b)

oob
o

Hm regexp_replace a ra s thay th vn bn mi cho cc chui con khp vi cc mu biu thc


POSIX thng thng. N c c php regexp_replace(source, pattern, replacement [, flags ]). Chui
ngun c tr v khng thay i nu khng c s trng khp no vi mu pattern. Nu c s trng
khp, th chui ngun c tr v vi chui thay th replacement c thay th cho chui con trng
khp. Chui thay th replacement c th cha \n, trong n l 1 ti 9, ch ra rng chui con
ngun khp vi biu thc con trong du ngoc th n ca mu s c chn vo, v n c th gm
\& ch rng chui con khp vi ton b mu nn c chn vo. Hy vit \ nu bn cn phi t
mt du cho ngc hng trong vn bn thay th. (Nh thng l, hy nh p bn cc du cho
ngc c vit trong cc chui hng theo ngha en, gi thit c php chui thot c s dng).

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 199/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Tham s flags l mt chui vn bn ty c cha cc c 0 hoc nhiu k t duy nht hn m thay


i hnh vi ca hm. C i ch vic trng khp c phn bit ch hoa ch thng, trong khi c g ch
s thay th ca tng chui con trng khp thay v ch chui con u tin trng khp. Cc c c
h tr khc c m t trong Bng 9-19. Mt s v d:
regexp_replace(foobarbaz, b.., X)
fooXbaz
regexp_replace(foobarbaz, b.., X, g)
fooXX
regexp_replace(foobarbaz, b(..), EX\\1Y, g)
fooXarYXazY

Hm regexp_matches tr v mt mng vn bn ca tt c cc chui con ly c l kt qu t vic


khp mu ca mt biu thc POSIX thng thng. N c c php regexp_matches (string , pattern
[, flags ]). Chc nng c th khng tr v hng no, tr v 1 hng, hoc nhiu hng (xem c g
bn di). Nu mu pattern khng trng khp, th hm khng tr v hng no. Nu mu
khng cha cc biu thc con trong cc du ngoc n, th tng hng c tr v l mt mng vn
bn c 1 yu t duy nht, c cha chui con trng khp vi ton b mu. Nu mu c cha cc
biu thc con trong cc du ngoc n, th hm tr v mt mng vn bn m phn t th n ca n l
chui con trng khp vi biu thc con nm trong cc du ngoc n th n ca mu (khng tnh
ti cc du ngoc n khng bt c; xem bn di c thm chi tit). Tham s c flags l
mt chui vn bn ty chn c cha cc c 0 hoc nhiu hn 1 k t m thay i hnh vi ca hm.
C g lm cho hm tm tng s trng khp trong chui , khng ch s trng khp u tin, v tr
v mt hng cho tng s trng khp nh vy. Cc c c h tr khc c m t trong Bng 9-19.
Mt s v d:
SELECT regexp_matches(foobarbequebaz, (bar)(beque));
regexp_matches
---------------{bar,beque}
(1 row)
SELECT regexp_matches(foobarbequebazilbarfbonk, (b[^b]+)(b[^b]+), g);
regexp_matches
---------------{bar,beque}
{bazil,barf}
(2 rows)
SELECT regexp_matches(foobarbequebaz, barbeque);
regexp_matches
---------------{barbeque}
(1 row)

C kh nng p regexp_matches() lun tr v mt hng bng vic s dng mt la chn ph


(con); iu ny l hu dng mt phn trong mt danh sch chn ch SELECT khi bn mun tt c
cc hng c tr v, thm ch cc hng khng trng khp.
SELECT col1, (SELECT regexp_matches(col2, (bar)(beque))) FROM tab;

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 200/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Hm regexp_split_to_table chia mt chui bng vic s dng mt mu biu thc POSIX thng
thng nh mt k t phn cch. N c c php regexp_split_to_table (string , pattern [, flags ]).
Nu khng c s trng khp no i vi mu pattern, th hm tr v chui string. Nu c t nht
mt s trng khp, i vi mi s trng khp n tr v vn bn t cui ca s trng khp cui cng
(hoc u ca chui ) ti u ca s trng khp. Khi khng c cc trng khp khc na, th n
tr v vn bn t cui ca s trng khp cui cng ti cui ca chui . Tham s flags l mt
chui vn bn ty chn c cha cc c 0 hoc nhiu hn 1 k t duy nht m thay i hnh vi ca
hm . regexp_split_to_table h tr cc c c m t trong Bng 9-19.
Hm regexp_split_to_array hnh x y ht nh regexp_split_to_table, ngoi tr l regexp_split_to_array
tr v kt qu ca n nh mt mng vn bn text. N c c php regexp_split_to_array (string ,
pattern [, flags ]). Cc tham s l y ht nh i vi regexp_split_to_table. Mt s v d:
SELECT foo FROM regexp_split_to_table(the quick brown fox jumped over the lazy dog, E\\
foo
-------the
quick
brown
fox
jumped
over
the
lazy
dog
(9 rows)
SELECT regexp_split_to_array(the quick brown fox jumped over the lazy dog, E\\s+);
regexp_split_to_array
-----------------------------------------------{the,quick,brown,fox,jumped,over,the,lazy,dog}
(1 row)
SELECT foo FROM regexp_split_to_table(the quick brown fox, E\\s*) AS foo;
foo
----t
h
e
q
u
i
c
k
b
r
o
w
n
f
o
x
(16 rows)

Nh v d cui cng th hin, cc hm chia regexp b qua cc trng khp di 0 m din ra u

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 201/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

hoc cui ca chui hoc ngay sau mt s trng khp trc . iu ny l ngc li vi nh
ngha kht khe ca vic trng khp regexp m c regexp_matches trin khai, nhng thng l
hnh vi tin li nht trong thc tin. Cc h thng phn mm khc nh Perl s dng cc nh ngha
tng t.
9.7.3.1. Chi tit ca biu thc thng thng

Cc biu thc thng thng ca PostgreSQL c trin khai bng vic s dng mt gi phn mm
c Henry Spencer vit. Nhiu m t cc biu thc thng thng bn di c sao chp nguyn
bn t sch ch dn ca ng.
Cc biu thc thng thng - RE (Regular Expressions), nh c nh ngha trong POSIX 1003.2,
c 2 dng: cc RE c m rng hoc cc ERE (th thin nh cc biu thc egrep), v cc RE
hoc BRE c bn (th thin nh cc dng ed). PostgreSQL h tr c 2 dng, v cng trin khai mt
s m rng m khng c trong tiu chun POSIX, nhng c s dng rng ri v tnh sn sng
ca chng trong cc ngn ng lp trnh nh Perl v TCL. Cc RE s dng cc m rng phi POSIX
c gi l cc RE hoc ARE tin tin trong ti liu ny. Cc ARE hu nh chnh xc l mt
siu tp hp cc ERE, nhng cc BRE c vi s khng tng thch ng lu (cng nh b hn ch
hn nhiu). Chng ti ln u m t cc dng ARE v ERE, lu cc tnh cht p dng ch cho cc
ARE, v sau m t cch m cc BRE khc bit.
Lu : PostgreSQL lun ngay t u gi nh rng mt biu thc thng thng tun theo
cc qui tc ca ARE. Tuy nhin, cc qui tc ca ERE hoc BRE b hn ch hn c th c
la chn bng vic thm vo trc mt la chn c nhng vo mu RE, nh c m t
trong Phn 9.7.3.4. iu ny c th l hu dng cho tnh tng thch vi cc ng dng m
k vng chnh xc cc qui tc ca POSIX 1003.2.
Mt biu thc thng thng c xc nh nh mt hoc nhiu nhnh hn, c phn tch nhau
bng du |. N khp vi bt k iu g m khp c vi mt trong cc nhnh .
Mt nhnh l 0 hoc cc nguyn t hoc rng buc nh lng c hn, c ghp vo nhau. N
trng khp vi mt s trng khp cho ci u, tip sau l s trng khp cho ci th 2...; mt nhnh
rng trng khp vi chui rng.
Mt nguyn t iu kin l mt nguyn t c kh nng sau c mt trnh nh lng duy nht.
Khng c mt trnh nh lng, n khp vi mt s trng khp cho nguyn t . Vi mt trnh
nh lng, n c th khp vi vi s trng khp ca nguyn t . Mt nguyn t c th l bt k
trong cc kh nng c ch ra trong Bng 9-12. Cc trnh nh lng c kh nng v cc ngha
ca chng c ch ra trong Bng 9-13.
Mt rng buc khp vi mt chui rng, nhng ch trng khp khi cc iu kin c bit c p
ng. Mt rng buc c th c s dng ni m mt nguyn t c th c s dng, ngoi tr n
khng th c i theo vi mt trnh nh lng. Cc rng buc n gin c ch ra trong Bng 914; mt s rng buc hn c m t sau.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 202/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Bng 9-12. Cc nguyn t ca biu thc thng thng


Nguyn t

M t

(re)

( nhng ni m re l bt k biu thc no) khp vi mt trng khp cho re, vi s trng khp c lu
v vic bo co c kh nng

(?:re)

nh trn, nhng s trng khp khng c lu cho vic bo co (mt tp hp cc du ngoc n


khng bt c) (ch cc ARE)

khp vi bt k k t n no

[chars]

biu thc trong du ngoc vung, khp vi bt k mt trong s cc k t (xem Phn 9.7.3.2 c thm
chi tit)

\k

( nhng ni k l k t khng phi abc) cc trng khp k t c ly nh mt k t thng thng,


nh \\ khp vi mt k t du cho ngc

\c

nhng ni m c l k t abc (c kh nng c cc k t khc theo sau) l mt s thot, xem Phn 9.7.3.3
(ch cc ARE; trong cc ERE v BRE, iu ny trng khp vi c)

khi i theo sau l mt k t khc vi mt k t s, trng khp k t p tri {; khi theo sau l mt k t
s, y l u ca mt rng buc (xem bn di)

nhng ni m x l mt k t duy nht m khng c ngha khc, khp vi k t

Mt RE khng th kt thc bng du cho ngc \.


Lu : Hy nh l du cho ngc (\) c ri mt ngha c bit trong cc hng chui
PostgreSQL. vit mt hng mu c cha mt du cho ngc, bn phi vit 2 du cho
ngc trong lnh, gi thit c php chui thot c s dng (xem Phn 4.1.2.1).
Bng 9-13. Cc trnh nh lng biu thc thng thng
Trnh nh lng

Cc trng khp

s tun t ca 0 hoc nhiu s trng khp hn ca ht nhn

s tun t ca 1 hoc nhiu s trng khp hn ca ht nhn

s tun t ca 0 hoc 1 s trng khp hn ca ht nhn

{m}

s tun t ca chnh xc m s trng khp ca ht nhn

{m,}

s tun t ca m hoc nhiu s trng khp hn ca ht nhn

{m,n}

s tun t ca m ti n (bao gm c) cc s trng khp ca ht nhn; m khng th vt n

*?

phin bn khng tham ca *

+?

phin bn khng tham ca +

??

phin bn khng tham ca ?

{m}?

phin bn khng tham ca {m}

{m,}?

phin bn khng tham ca {m,}

{m,n}?

phin bn khng tham ca {m,n}

Cc mu s dng {...} c bit nh l cc gii hn. Cc s m v n trong mt gii hn l cc s


nguyn thp phn khng c k vi cc gi tr cho php t >= 0 ti <= 255.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 203/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Cc trnh nh lng khng tham (ch sn sng cc ARE) khp vi cng cc kh nng nh cc i
tc (tham) thng thng tng ng ca chng, nhng u tin hn s nh nht thay v s ln nht
cc trng khp. Xem Phn 9.7.3.5 c thm chi tit.
Lu : Mt trnh nh lng khng th ngay lp tc theo sau mt trnh nh lng khc,
nh, ** l khng hp l. Mt trnh nh lng khng th bt u mt biu thc hoc biu
thc con hoc i theo du m ^ hoc du |.
Bng 9-14. Cc rng buc biu thc thng thng
Rng buc

M t

khp u ca chui

khp cui ca chui

(?=re)

ci nhn tch cc v pha trc trng khp vi thi im bt k ni m mt chui con khp vi RE
bt u (ch cc ARE)

(?!re)

ci nhn tiu cc v pha trc khp vi bt k im no ni m khng chui con no trng khp vi
RE bt u (ch cc ARE)

Cc rng buc hng v pha trc khng th c cc tham chiu ngc (xem Phn 9.7.3.3), v tt
c cc du ngoc n bn trong chng c xem nh l khng bt c.
9.7.3.2. Cc biu thc du ngoc vung

Mt biu thc du ngoc vung l mt danh sch cc k t t trong cc du ngoc vung [ ]. N


thng khp vi bt k k t no t danh sch (xem bn di). Nu danh sch bt u bng ^,
th n khp vi bt k k t n no khng t phn cn li ca danh sch . Nu 2 k t trong
danh sch tch bit nhau bng du gch ngang (-), th y l vit tt cho c dy y cc k t
gia 2 k t (tnh c 2 k t ) trong tun t so snh , ngha l, [0-9] theo ASCII khp vi
bt k k t s thp phn no. L khng hp l cho 2 dy chia s mt im kt thc, nh, a-c-e.
Cc dy l rt ph thuc vo tun t i chiu so snh, v th cc chng trnh kh chuyn nn
trnh da vo chng.
a vo mt du ] trong danh sch, hy lm cho n thnh k t u tin (sau du ^, nu iu
c s dng). a vo mt du -, hy lm cho n thnh k t u hoc cui, hoc im kt
thc th 2 ca dy. s dng mt du - nh l im kt thc u tin ca mt dy, hy a n vo
trong [. and .] lm cho n thnh mt phn t i chiu (xem bn di). Vi ngoi l ca cc k
t , mt s kt hp bng vic s dng [ (xem cc on tip sau), v cc k t thot (ch cc ARE),
tt c cc k t c bit khc nh mt ngha c bit ca chng bn trong mt biu thc du
ngoc vung. c bit, du cho ngc \ khng l c bit khi tun theo cc qui tc ERE hoc
BRE, d n l c bit (nh gii thiu mt k t thot) trong cc ARE.
Trong mt biu thc du ngoc vung, mt phn t i chiu (mt k t, mt tun t nhiu k t
m i snh dng nh n l mt k t duy nht, hoc mt tn tun t i snh) c a vo
trong [. and .] ngha l s tun t cc k t ca phn t i snh . S tun t c ng x nh

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 204/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

mt phn t duy nht ca danh sch cc biu thc du ngoc vung. iu ny cho php mt biu
thc du ngoc vung cha mt phn t i snh c nhiu k t khp nhiu hn so vi mt k t,
ngha l, nu tun t i snh bao gm mt phn t i snh ch, th RE [[.ch.]]*c s khp vi 5 k
t u tin ca chchcc.
Lu : PostgreSQL hin hnh khng h tr cc phn t i snh nhiu k t. Thng tin ny
m t hnh vi c kh nng trong tng lai.
Trong mt biu thc du ngoc vung, mt phn t i snh c a vo trong [= and =] l lp
tng ng, thay cho cc tun t cc k t ca tt c cc phn t i snh tng ng cho tun t
, bao gm chnh n. (Nu khng c cc phn t i snh tng ng khc, th i x dng nh l
vic a vo cc du ngt l [.and.]). V d, nu o v ^ l cc thnh vin ca mt lp tng ng, th
[[=o=]], [[=^=]], v [o^] l tt c cc ng ngha. Mt lp tng ng khng th l mt im kt
thc ca mt dy.
Trong mt biu thc du ngoc vung, tn ca mt lp k t c a vo trong [: and :] cc ch
cho danh sch tt c cc k t thuc v lp . Cc tn lp k t tiu chun l: alnum, alpha, blank,
cntrl, digit, graph, lower, print, punct, space, upper, xdigit. Cc ch cho cc lp k t c xc
nh theo ctype. Mt min a phng c th a ra cc th khc. Mt lp k t khng th c s
dng nh mt im cui ca mt dy .
C 2 trng hp c bit cc biu thc du ngoc vung: cc biu thc du ngoc vung [[:<:]] v
[[:>:]] l cc rng buc, khp vi cc chui rng u v cui ca mt t mt cch tng ng. Mt
t c xc nh nh mt s tun t cc k t ca t m khng c ng trc cng khng ng
ng sau cc k t ca t. Mt k t ca t l mt k t alnum (nh c ctype xc nh) hoc mt
du gch chn. y l mt m rng, tng thch vi nhng khng do POSIX 1003.2 ch nh, v
nn c s dng vi s thn trng trong phn mm c nh s l kh chuyn i vi cc h
thng khc. Cc s thot rng buc c m t bn di thng c u tin; chng khng cn l
tiu chun na, m d dng hn g.
9.7.3.3. Cc thot biu thc thng thng

Cc thot l nhng tun t c bit bt u vi du cho ngc \ i theo sau vi mt k t abc. Cc


thot c vi bin th khc nhau: khon vo ca k t, cc tc k lp, cc thot rng buc v cc
tham chiu ngc. Mt du cho ngc theo sau l mt k t abc nhng khng cu thnh mt thot
hp l l khng hp l trong cc ARE. Trong cc ERE, khng c cc thot: ngoi mt biu thc du
ngoc vung, th mt du cho ngc \ i sau mt k t abc ch thay cho k t nh mt k t
thng thng, v bn trong mt biu thc du ngoc vung, th du cho ngc \ l mt k t thng
thng. (Ci sau l ci thc s khng tng thch gia cc ERE v ARE).
Cc thot khon vo ca k t (character-entry escape) tn ti lm cho d dng hn ch nh
cc k t khng in c v cc k t khng thun tin khc trong cc RE. Chng c ch ra trong
Bng 9-15.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 205/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Cc thot tc k lp ( Class-shorthand escapes) a ra cc tc k cho cc lp k t nht nh c


s dng ph bin. Chng c ch ra trong Bng 9-16.
Mt thot rng buc l mt rng buc, khp vi chui rng nu cc iu kin c bit c p
ng, c vit nh mt thot. Chng c ch ra trong Bng 9-17.
Mt tham chiu ngc (\n ) khp vi cng y ht chui c biu thc ph trong cc du ngoc n
trc khp c s n ch nh (xem Bng 9-18). V d, ([bc])\1 khp vi bb hoc cc nhng
khng vi bc hoc cb. Biu thc con phi hon ton ng trc tham chiu ngc trong RE. Cc
biu thc con c nh s theo trt t cc du ngoc n dn dt ca chng. Cc du ngoc n
khng bt c s khng xc nh cc biu thc con.
Lu : Hy ghi nh rng mt du cho ngc \ dn dt ca s thot s cn phi c p
bn khi vo mu nh mt hng chui SQL. V d:
123 ~ E^\\d{3} true

Bng 9-15. Cc thot khon vo ca k t ca biu thc thng thng


Thot

M t

\a

k t cnh bo (chung), nh trong C

\b

du ngc backspace, nh trong C

\B

ng ngha cho du cho ngc (\) gip lm gim nhu cu v p bn du cho ngc

\cX

(trong X l k t bt k) k t m 5 bit trt t thp ca n l y ht nh cc bit ca X, v cc bit khc


ca n tt c u l 0

\e

k t v tn trt t i snh ca n l ESC, hoc k t vi gi tr 033 theo h s 8

\f

mu nui, nh trong C

\n

dng mi, nh trong C

\r

tr v s thi hnh, nh trong C

\t

th tab nm ngang, nh trong C

\uwxyz

(trong wxyz chnh xc l 4 k t s h 16) k t UTF16 (Unicode, 16 bit) U+wxyz trong trt t byte
cc b

\Ustuvwxyz (trong stuvwxyz chnh xc l 8 k t s h 16) c gi li cho mt m rng Unicode gi cho 32 bit
\v

th tab thng ng, nh trong C

\xhhh

(trong hhh l tun t bt k ca cc k t s h 16) k t m gi tr theo h 16 ca n l 0xhhh (mt


k t duy nht bt k c bao nhiu k t s h 16 c s dng)

\0

k t m gi tr ca n l 0 (byte null)

\xy

(trong xy chnh xc l 2 k t s h 8, v khng phi l mt tham chiu ngc) k t m gi tr theo


h 8 ca n l 0xy

\xyz

(trong xyz chnh xc l 3 k t s h 8, v khng phi l mt tham chiu ngc) k t m gi tr theo


h 8 ca n l 0xyz

Cc k t s h 16 l 0-9, a-f, v A-F. Cc k t s h 8 l 0-7.


Cc thot khon vo k t lun c ly nh l cc k t thng thng. V d, \135 l ] trong

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 206/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ASCII, nhng \135 khng kt thc mt biu thc du ngoc vung.


Bng 9-16. Cc thot tc k lp ca biu thc thng thng
Thot

M t

\d

[[:digit:]]

\s

[[:space:]]

\w

[[:alnum:]_] (lu du gch chn c a vo)

\D

[^[:digit:]]

\S

[^[:space:]]

\W

[^[:alnum:]_] (lu du gch chn c a vo)

Trong cc biu thc du ngoc vung, \d, \s, v \w nh mt cc du ngoc vung bn ngoi hn,
v \D, \S v \W l khng hp l. (V th, v d, [a-c\d] l tng ng vi [a-c[:digit:]]. Hn na, [ac\D], n l tng ng vi [a-c^[:digit:]], l khng hp l).
Bng 9-17. Cc thot rng buc biu thc thng thng
Thot

M t

\A

ch khp u ca chui (xem Phn 9.7.3.5 thy iu ny khc th no, so vi ^)

\m

ch khp u ca mt t

\M

ch khp cui ca mt t

\y

ch khp u hoc cui ca mt t

\Y

ch khp mt im khng phi l bt u hoc kt thc ca mt t

\Z

ch khp cui ca chui (xem Phn 9.7.3.5 thy iu ny khc th no so vi $)

Mt t c nh ngha nh trong c t ca [[:<:]] and [[:>:]] trn. Cc thot rng buc l khng
hp l trong cc biu thc du ngoc vung.
Bng 9-18. Cc tham chiu ngc ca biu thc thng thng
Thot

M t

\m

(trong m l mt k t s khng phi l 0) mt tham chiu ngc ti biu thc con th m

\mnn

(trong m l mt k t s khng phi l 0, v nn l nhiu hn vi k t s, v gi tr thp phn mnn


khng ln hn so vi s lng cc du ngoc n ng bt c c thy cho ti nay) mt tham chiu
ngc ti biu thc con th mnn

Lu : C mt s t m vn d gia cc thot khon vo ca k t h 8 v cc tham chiu


ngc, n c gii quyt bng cng ngh t ng sau, nh c gi trn. S 0 dn
trc lun ch ra mt thot h 8. K t s khng phi l 0, khng c k t s no khc theo
sau, lun l mt tham chiu ngc. S tun t nhiu k t s khng bt u bng s 0 c
ly nh mt tham chiu ngc nu n i sau mt biu thc con ph hp (ngha l, s l
trong dy hp h cho mt tham chiu ngc), v nu khng th n c ly nh l h 8.
Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 207/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

9.7.3.4. Siu c php ca biu thc thng thng

B sung vo c php chnh c m t trn, c mt s dng c bit v cc c s thuc v c


php hn hp c sn.
Mt RE c th bt u vi 1 trong 2 tip u ng dn dt. Nu mt RE bt u bng ***:, th phn
cn li ca RE c ly nh l mt ARE. (iu ny thng khng c tc ng trong PostgreSQL,
v cc RE c gi thit s l cc ARE; nhng n c mt hiu ng nu ch ERE hoc BRE tng
c cc tham s c flags ch nh). Nu mt RE bt u bng ***=, th phn cn li ca RE c
ly s l mt chui hng, vi tt c cc k t c xem l cc k t thng thng.
Mt ARE c th bt u vi cc la chn c nhng: mt s tun t (?xyz) (trong xyz l mt
hoc nhiu hn cc k t abc) ch nh cc la chn c tc ng ti phn cn li ca RE. Cc la
chn ln bt k la chn no trc c xc nh - c bit, chng c th ln hnh vi
phn bit ch hoa ch thng c mt ton t regex ng , hoc tham s c flags i vi mt hm
regex. Cc k t la chn sn sng c ch ra trong Bng 9-19. Lu rng cc k t la chn y
ht c s dng trong cc tham s c flags ca cc hm regex.
Bng 9-19. Cc k t la chn nhng ARE
La chn

M t

phn cn li ca RE l mt BRE

khp phn bit ch hoa ch thng ( dng ton t)

phn cn li ca RE l mt ERE

khp phn bit ch hoa ch thng (xem Phn 9.7.3.5) ( dng ton t)

ng ngha v lch s i vi n

khp dng mi phn bit ch hoa ch thng (xem Phn 9.7.3.5)

khp dng mi phn bit ch hoa ch thng mt phn (xem Phn 9.7.3.5)

phn cn li ca RE l mt chui hng (c trch), tt c cc k t thng thng

khp dng mi khng phn bit ch hoa ch thng (mc nh)

c php cht ch (mc nh; xem bn di)

khp phn bit ch hoa ch thng dng mi ngc mt phn (k l) (xem Phn 9.7.3.5)

c php c m rng (xem bn di)

Cc la chn nhng c hiu qu trong ) kt thc s tun t. Chng c th ch xut hin u ca


mt ARE (sau ***: dn dt nu c).
B sung thm vo c php thng thng RE (cht), theo tt c cc k t l c ngha, c mt c
php c m rng, sn sng bng vic ch nh la chn x c nhng. Trong c php c m
rng, cc k t du trng trong RE c b qua, nh l tt c cc k t gia a# v dng mi theo
sau (hoc kt thc ca RE). iu ny cho php to on v ghi ch cho mt RE phc tp. C 3
ngoi l cho qui tc c bn :

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 208/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

mt k t trng hoc \ i trc c gi li

k t trng hoc # trong mt biu thc du ngoc vung c gi li

k t trng v cc ghi ch khng th xut hin trong cc k hiu nhiu k t, nh (?:

V mc ch ny, cc k t du trng l du trng, cc th tab, dng mi, v bt k k t no thuc


v lp cc k t trng space.
Cui cng, trong mt ARE, bn ngoi cc biu thc du ngoc vung, tun t ( ?#ttt) (trong ttt l
bt k vn bn no khng cha mt du ngoc n) ) l mt bnh lun, hon ton b b qua. Mt ln
na, iu ny khng c php gia cc k t ca cc k hiu nhiu k t, nh (?:. Cc ghi ch nh
vy l nhiu hn mt ch tc lch s so vi mt c s hu dng, v s dng chng b phn i; s
dng c php c m rng thay vo .
Khng s m rng siu c php no l sn sng nu mt dn dt ***= ch nh rng u vo ca
ngi s dng c i x nh mt chui hng thay v nh mt RE.
9.7.3.5. Cc qui tc khp ca biu thc thng thng

Trong s kin mt RE c th khp nhiu hn mt chui con ca mt chui c a ra, th RE


khp vi chui con bt u sm nht trong chui . Nu RE c th khp nhiu hn mt chui con
bt u im , th hoc s khp c kh nng di nht hoc s khp c kh nng ngn nht s
xy ra, ph thuc vo vic liu RE c l tham hay khng tham.
Liu mt RE c l tham hay khng c cc qui tc sau y xc nh:

Hu ht cc nguyn t, v tt c cc rng buc, khng c thuc tnh tham (v chng khng


th khp lng bin ca vn bn bng mi cch).

B sung thm cc du ngoc n xung quanh mt RE khng lm thay i tnh tham ca n.

Nguyn t c iu kin vi mt s lng ha c nh lp i lp li ({m} hoc {m}?) c


cng tham (c th l khng) nh bn thn nguyn t .

Nguyn t ca mt s lng ha vi cc s lng ha thng thng khc (bao gm c


{m,n}? vi m bng n) l tham (u tin s khp di nht).

Nguyn t ca mt s lng ha vi mt s lng ha khng tham (bao gm c {m,n}? vi


m bng n) l khng tham (u tin khp ngn nht).

Mt nhnh - l, mt RE khng c ton t | mc nh - c tham y ht nh ht nhn u


tin c iu kin trong n m c mt thuc tnh tham.

Mt RE bao gm 2 hoc nhiu nhnh hn c ton t | kt ni lun l tham.

Cc qui tc trn c lin quan ti cc thuc tnh tham khng ch vi cc nguyn t nh lng c
nhn, m cn vi cc chi nhnh v ton b cc RE cha cc nguyn t c nh lng . Nhng
g iu c ngha l vic khp c thc hin theo mt cch thc m nhnh , hoc ton b RE,

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 209/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

khp vi chui con c kh nng di nht hoc ngn nht nh mt tng th. Mt khi chiu di ca
ton b s khp c xc nh, th phn ca n m khp vi bt k biu thc con c th no c
xc nh trn c s ca thuc tnh tham ca biu thc ph , vi cc biu thc ph bt u sm
hn trong RE ly u tin hn cc biu thc ph bt u mun hn.
Mt v d ca nhng g iu ny c ngha:
SELECT SUBSTRING(XY1234Z, Y*([0-9]{1,3}));
Result: 123
SELECT SUBSTRING(XY1234Z, Y*?([0-9]{1,3}));
Result: 1

Trong trng hp u tin, RE nh mt tng th l tham v Y* l tham. N c th khp vi u Y,


v n khp vi chui c kh nng di nht bt u , ngha l, Y123. Kt qu u ra c a
vo cc du ngoc n phn ca n, hay 123. Trong trng hp th 2, RE nh mt tng th l
khng tham v Y*? l khng tham.
N c th khp vi u Y, v n khp vi chui c kh nng ngn nht bt u , ngha l, Y1.
Biu thc con [0-9]{1,3} l tham nhng n khng th thay i quyt nh i vi ton b chiu di
khp c; v th n b p phi khp ch vi 1.
Ngn gn, khi mt RE cha c cc biu thc ph tham v khng tham, tng chiu di khp hoc di
hoc ngn nht c th, ty theo thuc tnh c ch nh cho ton b RE. Cc thuc tnh c ch
nh cho cc biu thc ph ch tc ng ti bao nhiu s khp chng c php n ln
nhau mt cch tng i.
Cc nh lng {1,1} v {1,1}? c th c s dng p tnh tham hoc khng tham, mt cch
tng ng, trong mt biu thc ph hoc ton b RE.
Cc di trng khp c o m theo cc k t, khng theo cc phn t i snh. Mt chui
rng c xem l di hn so vi khng khp hon ton. V d: bb* khp 3 k t gia ca abbbc;
(week|wee)(night|knights) khp tt c 10 k t ca cc m cui tun (weeknights); khi (.*).* l
khp c i vi abc biu thc trong du ngoc n khp tt c 3 k t; v khi (a*)* khp c
i vi bc c ton b RE v biu thc con trong du ngoc n khp mt chui rng.
Nu vic khp c lp vi ch hoa ch thng c ch nh, th hiu ng l nhiu nu tt c cc
khc bit ch hoa ch thng bin khi abc. Khi mt abc tn ti trong nhiu trng hp xut
hin nh mt k t thng thng bn ngoi mt biu thc du ngoc vung, th n c bin i c
hiu qu thnh mt biu thc du ngoc vung c cha c 2 dng ch, ngha l, x tr thnh [xX].
Khi n xut hin bn trong mt biu thc du ngoc vung, th tt c cc i tc ch hoa ch
thng ca n c b sung thm vo biu thc du ngoc vung , ngha l, [x] tr thnh [xX]
v [^x] tr thnh [^xX].
Nu vic khp dng mi phn bit ch hoa ch thng c ch nh, th du chm . v cc biu
thc du ngoc vung c s dng du m ^ s khng bao gi khp k t dng mi (sao cho cc
s khp s khng bao gi xuyn cc dng mi tr phi RE r rng dn xp n) v ^ v $ s khp
chui rng sau v trc mt dng mi mt cch tng ng, b sung thm vo vic khp u v

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 210/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

cui ca chui mt cch tng ng. Nhng thot ARE \A v \Z tip tc ch khp u hoc cui ca
chui.
Nu vic khp mt phn dng mi phn bit ch hoa ch thng c ch nh, v cc biu thc
du ngoc vung nh vi vic khp phn bit ch hoa ch thng dng mi, nhng khng phi ^
v $.
Nu vic khp phn bit ch hoa ch thng dng mi mt phn ngc li c ch nh, th iu
ny tc ng ti ^ v $ nh vi vic khp phn bit ch hoa ch thng dng mi, nhng khng l
du chm (.) v cc biu thc du ngoc vung. iu ny rt khng hu dng nhng c a ra v
s i xng.
9.7.3.6. Gii hn v tnh tng thch

Khng c gii hn c bit no c p t ln chiu di ca cc RE trong trin khai ny. Tuy


nhin, cc chng trnh c nh s c tnh kh chuyn cao nn khng trin khai cc RE di hn
256 byte, v mt trin khai tun th POSIX c th t chi chp nhn cc RE nh vy.
Tnh nng duy nht ca cc ARE m thc s khng tng thch vi cc ERE POSIX l vic du
cho ngc \ khng nh mt tm quan trng c bit ca n bn trong cc biu thc du ngoc
vung. Tt c cc tnh nng khc ca ARE s dng c php khng hp l hoc c cc hiu ng
cha c nh ngha hoc cha c ch nh trong cc ERE POSIX; c php *** ca cc ch dn
ging nh l nm bn ngoi c php POSIX cho c cc BRE v ERE.
Nhiu m rng ARE c mn t Perl, nhng mt s tng b thay i lm r thm chng, v
mt t m rng Perl khng hin din. Cc ch lu khng tng thch bao gm \b, \B s thiu i
x c bit cho mt dng mi i sau, b sung thm cc biu thc du ngoc vung vo nhng iu
b tc ng t vic khp cc dng mi c phn bit ch hoa ch thng, v cc ng ngha ca vic
khp i vi khp di nht/ngn nht (thay v khp ci u tin).
2 s khng tng thch ng k tn ti gia c php ca cc ARE v ERE c tha nhn trong cc
phin bn trc 7.4 ca PostgreSQL.

Trong cc ARE, du cho ngc \ i theo sau l mt k t abc hoc l mt k t thot hoc
l mt li, trong khi trong cc phin bn trc , n tng ch l mt cch vit khc cho abc.
iu ny s khng l mt vn g ln v khng c l do vit mt s tun t nh vy
trong cc phin bn trc .

Trong cc ARE, cc du cho ngc \ vn l mt k t c bit trong cc du ngoc vung


[], v th mt du cho ngc hng \ trong mt biu thc du ngoc vung phi c vit
l \\.

9.7.3.7. Biu thc c bn thng thng

Cc BRE khc vi cc ERE trong vi kha cnh. Trong cc BRE, du |, + v ? l cc k t thng


thng v khng tng ng vi chc nng ca chng. Cc du phn cch cho cc rng buc l \{
Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 211/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

and \},

vi { and } t chng l cc k t thng thng. Cc du ngoc cho cc biu thc ph lng


nhau l \( and \), vi ( and ) bn thn chng l cc k t thng thng. ^ l mt k t thng thng
ngoi tr u ca RE hoc u ca mt biu thc ph trong cc du ngoc, $ l mt k t thng
thng ngoi tr cui ca RE hoc cui ca mt biu thc ph trong cc du ngoc, v * l mt
k t thng thng nu n xut hin u ca RE hoc u ca mt biu thc ph trong cc du
ngoc (sau mt du ^ i trc c th). Cui cng, cc tham chiu ngc mt k t s duy nht l
sn sng, v \< v \> l ng ngha vi [[:<:]] v [[:>:]] mt cch tng ng; khng k t thot no
khc l sn sng trong cc BRE.

9.8. Hm nh dng dng d liu


Cc hm nh dng ca PostgreSQL a ra mt tp hp cc cng c mnh bin i cc dng d
liu khc nhau (ngy thng/thi gian, s nguyn, chm thp phn, s) sang cc chui c nh
dng v cho vic bin i t cc chui c nh dng sang cc dng d liu c th. Bng 9-20 lit
k chng. Cc hm tt c tun theo mt qui c gi chung: i s u tin l gi tr s c nh
dng v i s th 2 l mt mu template xc nh nh dng u ra hoc u vo.
Mt hm i s duy nht to_timestamp cng sn sng; n chp nhn mt i s chnh xc gp
i double precision v bin i t thi Unix (cc giy k t 1970-01-01 00:00:00+00) thnh
timestamp vi vng thi gian time zone. (S nguyn Interger thi k Unix c a ra mt cch
ngm nh cho chnh xc gp i double precision).
Bng 9-20. Cc hm nh dng
Hm

Dng tr v

M t

V d

to_char(timestamp, text)

text

bin i du thi gian sang chui

to_char(current_timestamp,
HH12:MI:SS)

to_char(interval, text)

text

bin i khong thi gian sang chui to_char(interval 15h 2m


12s, HH24:MI:SS)

to_char(int, text)

text

bin i s nguyn sang chui

to_char(125, 999)

to_char(double precision, text) text

bin i chnh xc thc/p


(real/double) sang chui

to_char(125.8::real,
999D9)

to_char(numeric, text)

text

bin i s sang chui

to_char(-125.8, 999D99S)

to_date(text, text)

date

bin i chui sang ngy thng

to_date(05 Dec 2000,


DD Mon YYYY)

to_number(text, text)

numeric

bin i chui sang s

to_number(12,454.8-,
99G999D9S)

to_timestamp(text, text)

timestamp with bin i chui sang du thi gian


time zone

to_timestamp(05 Dec 2000,


DD Mon YYYY)

to_timestamp(double
precision)

timestamp with bin i t thi k Unix sang du


time zone
thi gian

to_timestamp(1284352323)

Trong mt chui mu temlate u ra to_char, c cc mu nht nh c tha nhn v c thay th


bng cc d liu c nh dng ph hp da vo gi tr c a ra. Bt k vn bn no m khng
Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 212/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

phi l mt mu template n gin s c sao chp y nguyn. Tng t, trong mt chui mu


template u vo (i vi cc hm khc), cc mu template xc nh cc gi tr s c chui d
liu u vo cung cp.
Bng 9-21 ch ra cc mu template c sn cho vic nh dng cc gi tr ngy thng v thi gian.
Bng 9-21. Cc mu template cho vic nh dng ngy thng / thi gian
Mu

M t

HH

gi ca ngy (01-12)

HH12

gi ca ngy (01-12)

HH24

gi ca ngy (00-23)

MI

pht (00-59)

SS

giy (00-59)

MS

mili giy (000-999)

US

mili giy (000000-999999)

SSSS

cc giy i qua na m (0-86399)

AM, am, PM hoc pm

ch s meridiem, ch na ngy u v na ngy sau (khng c cc du chm)

A.M. , a.m. , P.M. hoc p.m.

ch s meridiem, ch na ngy u v na ngy sau (c cc du chm)

Y,YYY

nm (4 hoc nhiu hn k t s) vi du phy

YYYY

Nm (4 v nhiu hn cc k t s)

YYY

3 k t cui ca nm

YY

2 k t s cui ca nm

k t s cui ca nm

IYYY

nm theo ISO (4 v nhiu hn k t s)

IYY

3 k t s cui ca nm theo ISO

IY

2 k t s cui ca nm theo ISO

k t s cui ca nm theo ISO

BC , bc , AD hoc ad

ch s k nguyn (khng c cc du chm)

B.C. , b.c. , A.D. hoc a.d.

ch s k nguyn (c cc du chm)

MONTH

tn thng ch hoa y (du trng - c thm vo ti 9 k t)

Month

tn thng ch hoa y (du trng - c thm vo ti 9 k t)

month

tn thng ch thng y (du trng - c thm vo ti 9 k t)

MON

tn thng ch hoa vit tt (3 k t ting Anh, di c bn a ha khc nhau)

Mon

tn thng ch hoa vit tt (3 k t ting Anh, di c bn a ha khc nhau)

mon

tn thng ch thng vit tt (3 k t ting Anh, di c bn a ha khc nhau)

MM

s thng (01-12)

DAY

tn ngy ch hoa y (du trng - c thm vo cho ti 9 k t)

Day

tn ngy ch hoa y (du trng - c thm vo cho ti 9 k t)

day

tn ngy ch thng y (du trng - c thm vo cho ti 9 k t)

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 213/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Mu

Xut bn nm 2013
M t

DY

tn ngy ch hoa vit tt (3 k t ting Anh, di c bn a ha khc nhau)

Dy

tn ngy ch hoa vit tt (3 k t ting Anh, di c bn a ha khc nhau)

dy

tn ngy ch thng vit tt (3 k t ting Anh, di c bn a ha khc nhau)

DDD

ngy ca nm (001-366)

IDDD ISO

ngy ca nm (001-371; ngy 1 ca nm l Th hai ca tun u tin theo ISO).

DD

ngy ca thng (01-31)

ngy ca tun, Ch nht (1) ti Th by (7)

ID ISO

ngy ca tun, Th hai (1) ti Th by (7)

tun ca thng (1-5) (tun u tin bt du vo ngy u tin ca thng)

WW

s tun ca nm (1-53) (tun u tin bt u vo ngy u tin ca nm).

IW ISO

s tun ca nm (01-53; Th nm u tin ca nm mi l trong tun u tin)

CC

th k (2 k t s) (th k 21 bt u vo 01/01/2001)

Ngy theo lch Julian (cc ngy k t 24/11 nm 4714 BC vo lc na m)

Qu (b b qua bi to_date v to_timestamp)

RM

thng vit ch hoa theo cc s La m (I-XII; I = Thng 1)

rm

thng vit ch thng theo cc s La m (i-xii; i = Thng 1)

TZ

tn vng thi gian ch hoa

tz

tn vng thi gian ch thng

Cc sa i c th c p dng cho bt k mu template no chnh sa hnh vi ca n. V d,


FMMonth l mu Month vi sa i FM. Bng 9-22 ch ra cc mu sa i cho nh dng ngy
thng / thi gian.
Bng 9-22. Cc sa i mu template cho vic nh dng ngy thng / thi gian
Sa i

M t

V d

Tin t FM

ch in (ngn chn cc khong trng thm vo v cc s 0)

FMMonth

Hu t TH

hu t s thng thng ch hoa

DDTH, e.g., 12TH

Hu t th

hu t s thng thng ch thng

DDth, e.g., 12th

Tin t FX

la chn tng th nh dng c nh (xem cc lu s dng)

FX Month DD Day

Tin t TM

ch dch (in cc tn ngy v thng c bn a ha da vo lc_time)

TMMonth

Hu t SP

ch chnh t (khng c trin khai)

DDSP

S dng cc lu cho vic nh dng ngy thng / thi gian:

FM ngn chn cc s 0 i u v cc du trng i sau m c th nu khng s c b sung


thm vo lm thnh u ra ca mt mu c rng c nh. Trong PostgreSQL, FM ch
sa i c t tip theo, trong khi trong Oracle th FM tc ng ti tt c cc c t tip sau,
v cc sa i FM c lp i lp li, chuyn qua li bt / tt ch in.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 214/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

TM khng bao gm cc khong trng i sau.

Nhiu khong trng to_timestamp v to_date skip trong chui u vo tr phi la chn FX
c s dng. V d, to_timestamp(2000 JUN, YYYY MON) lm vic, nhng
to_timestamp(2000 JUN, FXYYYY MON) tr v mt li v to_timestamp k vng mt khong
trng duy nht. FX phi c ch nh nh l khon u tin trong mu template.

Vn bn thng thng c php trong cc mu template to_char v s l u ra theo ngha


en. Bn c th t mt chui con trong cc du ngoc kp p n s c dch nh l vn
bn hng thm ch nu n c cha cc t kha mu. V d trong "Hello Year "YYYY, YYYY s
c thay th bng d liu nm, nhng Y duy nht trong Year th s khng. Trong to_date,
to_number, v to_timestamp, cc chui trong cc du ngoc kp b qua mt s k t u vo
c trong chui , ngha l "XX" b qua 2 k t u vo.

Nu bn mun c mt du ngoc n u ra th bn phi t trc n mt du cho


ngc, v d E\\"YYYY Month\\". (2 du cho ngc l cn thit v du cho ngc c ngha
c bit khi s dng c php chui thot).

Bin i YYYY t chui sang timestamp hoc date c mt hn ch khi vic x l cc nm vi


hn 4 k t s. Bn phi s dng mt s k t khng phi k t s hoc mu template sau
YYYY, nu khng th nm s lun c dch nh l 4 k t s. V d (vi nm 20000):
to_date(200001131, YYYYMMDD) s c dch nh l mt nm 4 k t s; thay v s dng
mt s phn tch khng phi k t s sau nm, nh to_date(20000-1131, YYYY-MMDD) hoc
to_date(20000Nov31, YYYYMonDD).

Trong bin i t chui sang timestamp hoc date, trng CC (th k) b b qua nu c mt
trng YYY, YYYY hoc Y,YYY. Nu CC c s dng vi YY hoc Y th nm c tnh nh l
(CC-1)*100+YY.

Mt ngy ca tun theo ISO (khc vi ngy theo Gregorian) c th c ch nh cho


to_timestamp v to_date theo 1 trong 2 cch:
Nm, tun v ngy trong tun: v d to_date(2006-42-4, IYYY-IW-ID) s tr v ngy
19/10/2006. Nu bn lm m ngy trong tun th n c gi thit s l 1 (Th hai).
Nm v ngy ca nm: v d to_date(2006-291, IYYY-IDDD) cng s tr v 19/10/2006.
Vic c gng xy dng mt ngy bng vic s dng mt s pha trn cc trng tun theo
ISO v ngy thng theo Gregorian l khng c ngha, v s gy ra li. Trong ng cnh ca
mt nm theo ISO, khi nim ca mt thng hoc ngy ca thng khng c ngha.
Trong ng cnh ca mt nm theo Gregoria, th tun theo ISO khng c ngha. Nhng
ngi s dng nn trnh vic trn cc c t ngy thng theo Gregorian v ISO.

Trong mt bin i t chui sang timestamp, cc gi tr mili giy (MS) hoc mili giy (US)
s c s dng nh l cc k t s cho cc giy sau du chm thp phn. V d

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 215/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

khng phi l 3 mili giy, m l 300, v bin i tnh n nh


l 12 + 0.3 giy. iu ny c ngha l i vi nh dng SS:MS, cc gi tr u vo 12:3 ,
12:30 v 12:300 ch nh s cc mili giy y ht. c 3 mili giy, phi s dng 12:003,
bin i tnh nh l 12 + 0.003 = 12.003 giy.
to_timestamp(12:3, SS:MS)

y l mt v d phc tp hn: to_timestamp(15:12:02.020.001230, HH:MI:SS.MS.US) l 15


gi, 12 pht v 2 giy + 20 mili giy + 1230 micro giy = 2.021230 giy.

Vic nh s ngy ca tun ca to_char(..., ID) khp vi hm extract(isodow from ...), nhng
to_char(..., D) khng khp vi vic nh s ngy ca extract(dow from ...).

to_char(interval)

nh dng HH v HH12 nh c ch ra trong mt chic ng h 12 gi,


ngha l cc gi 0 v 36 cho ra nh l 12, trong khi HH24 cho u ra gi tr gi y , n
c th vt qua 23 trong mt khong thi gian.

Bng 9-23 ch ra cc mu template sn sng cho vic nh dng cc gi tr s.


Bng 9-23. Cc mu template cho vic nh dng s
Mu

M t

gi tr vi s cc k t s c ch nh

gi tr vi cc s 0 dn u

. (du chm)

du thp phn

, (du phy)

du phn cch nhm (hng ngn)

PR

gi tr m trong cc du ngoc nhn

du c neo cho s (s dng bn a)

k hiu hin hnh (s dng bn a)

du chm thp phn (s dng bn a)

phn cch nhm (s dng bn a)

MI

du tr v tr c ch nh (nu s nh hn 0)

PL

du cng v tr c ch nh (nu s ln hn 0)

SG

du cng/tr v tr c ch nh

RN

s La m (u vo gia 1 v 3999)

TH hoc th

hu t ca s thng thng

s cc k t s dch chuyn c ch nh (xem cc lu )

EEEE

s m cho cc k hiu khoa hc

S dng cc lu cho vic nh dng s:

Mt k hiu c nh dng bng vic s dng Si Gn, PL, hoc MI khng c neo cho
s; v d, to_char(-12,MI9999) to ra - 12 nhng to_char(-12, S9999) to ra -12. Trin khai
ca Oracle khng cho php s dng MI trc 9, nhng thay vo yu cu l 9 i trc MI.

9 dn ti mt gi tr vi s cc k t s y ht nh c 9 s. Nu mt k t s khng sn sng

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 216/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

th n a ra mt du trng.

TH khng bin i cc gi tr t hn 0 v khng bin i cc s thp phn.

PL, SG, v TH l cc m rng ca PostgreSQL.

V nhn c hiu lc cc gi tr u vo vi 10^n, trong n l s cc k t s sau V. to_char


khng h tr s dng V c kt hp vi mt du thp phn (ngha l, 00.9V99 l khng
c php).

EEEE (k hiu khoa hc) khng th c s dng trong s kt hp vi bt k mu hoc sa


i nh dng no khc ngoi cc mu k t s v du thp phn, v phi t cui ca
chui nh dng (nh, 9.99EEEE l mt mu hp l).

Cc sa i nht nh c th c p dng cho bt k mu template no sa hnh vi ca n. V


d, FM9999 l mu 9999 vi sa i FM. Bng 9-24 ch ra cc mu sa i cho vic nh dng s.
Bng 9-24. Cc sa i mu template cho vic nh dng s
Sa i

M t

V d

Tin t FM

ch in (ngn chn cc du trng v 0 thm vo)

FM9999

Hu t TH

hu t s thng thng ch hoa

999TH

Hu t th

hu t s thng thng ch thng

999th

Bng 9-25 ch ra mt s v d s dng hm to_char.


Bng 9-25. Cc v d hm

to_char

Biu thc

Kt qu

to_char(current_timestamp, Day, DD HH12:MI:SS)

Tuesday , 06 05:39:18

to_char(current_timestamp, FMDay, FMDD HH12:MI:SS)

Tuesday, 6 05:39:18

to_char(-0.1, 99.99)

-.10

to_char(-0.1, FM9.99)

-.1

to_char(0.1, 0.9)

0.1

to_char(12, 9990999.9)

0012.0

to_char(12, FM9990999.9)

0012.

to_char(485, 999)

485

to_char(-485, 999)

-485

to_char(485, 9 9 9)

4 8 5

to_char(1485, 9,999)

1,485

to_char(1485, 9G999)

1 485

to_char(148.5, 999.999)

148.500

to_char(148.5, FM999.999)

148.5

to_char(148.5, FM999.990)

148.500

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 217/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Biu thc

Xut bn nm 2013
Kt qu

to_char(148.5, 999D999)

148,500

to_char(3148.5, 9G999D999)

3 148,500

to_char(-485, 999S)

485-

to_char(-485, 999MI)

485-

to_char(485, 999MI)

485

to_char(485, FM999MI)

485

to_char(485, PL999)

+485

to_char(485, SG999)

+485

to_char(-485, SG999)

-485

to_char(-485, 9SG99)

4-85

to_char(-485, 999PR)

<485>

to_char(485, L999)

DM 485

to_char(485, RN)

CDLXXXV

to_char(485, FMRN)

CDLXXXV

to_char(5.2, FMRN)

to_char(482, 999th)

482nd

to_char(485, "Good number:"999)

Good number: 485

to_char(485.8, "Pre:"999" Post:" .999)

Pre: 485 Post: .800

to_char(12, 99V999)

12000

to_char(12.4, 99V999)

12400

to_char(12.45, 99V9)

125

to_char(0.0004859, 9.99EEEE)

4.86e-04

9.9. Hm v ton t ngy thng / thi gian


Bng 9-27 ch ra cc hm c sn cho vic x l gi tr ngy thng / thi gian, vi cc chi tit xut
hin trong cc tiu phn sau y. Bng 9-26 minh ha cc hnh vi ca cc ton t s hc c bn (+,
*, ). i vi cc hm nh dng, hy tham chiu ti Phn 9.8. Bn nn lm quen vi thng tin c
bn v cc dng d liu ngy thng / thi gian t Phn 8.5.
Tt c cc hm v ton t c m t bn di m ly cc u vo time hoc timestamp thc s c
2 phng n: mt l ly time vi time zone hoc timestamp vi time zone, v hai l ly time khng
vi time zone hoc timestamp khng vi time zone. V tnh khng bn, cc phng n khng
c ch ra mt cch ring r. Hn na, cc ton t + v * i theo cc cp giao hon (v d c ngy
thng + s nguyn v s nguyn + ngy thng), chng ta s ch a ra mt trong cc cp nh vy.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 218/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Bng 9-26. Cc ton t ngy thng / thi gian


Ton t

V d

Kt qu

date 2001-09-28 + integer 7

date 2001-10-05

date 2001-09-28 + interval 1 hour

timestamp 2001-09-28 01:00:00

date 2001-09-28 + time 03:00

timestamp 2001-09-28 03:00:00

interval 1 day + interval 1 hour

interval 1 day 01:00:00

timestamp 2001-09-28 01:00 + interval 23 hours

timestamp 2001-09-29 00:00:00

time 01:00 + interval 3 hours

time 04:00:00

- interval 23 hours

interval -23:00:00

date 2001-10-01 - date 2001-09-28

integer 3 (days)

date 2001-10-01 - integer 7

date 2001-09-24

date 2001-09-28 - interval 1 hour

timestamp 2001-09-27 23:00:00

time 05:00 - time 03:00

interval 02:00:00

time 05:00 - interval 2 hours

time 03:00:00

timestamp 2001-09-28 23:00 - interval 23 hours

timestamp 2001-09-28 00:00:00

interval 1 day - interval 1 hour

interval 1 day -01:00:00

timestamp 2001-09-29 03:00 timestamp 2001-09-27 12:00

interval 1 day 15:00:00

900 * interval 1 second

interval 00:15:00

21 * interval 1 day

interval 21 days

double precision 3.5 * interval 1 hour

interval 03:30:00

interval 1 hour / double precision 1.5

interval 00:40:00

Bng 9-27. Cc hm ngy thng / thi gian


Hm

Dng tr v

M t

V d

Kt qu

age(timestamp,
timestamp)

interval

i s php tr, to ra mt age(timestamp 2001-04-10,


kt qu biu tng m s timestamp 1957-06-13)
dng cc nm v thng

43 nm 9
thng 27 ngy

age(timestamp)

interval

Tr i t ngy hin hnh


current_date (lc na m)

43 nm 8
thng 3 ngy

clock_timestamp() timestamp
with time
zone

Ngy thng v thi gian hin


hnh (cc thay i khi thc
hin lnh); xem Phn 9.9.4

current_date

date

Ngy thng hin hnh; xem


Phn 9.9.4

current_time

time with time Thi gian hin hnh ca


zone
ngy; xem Phn 9.9.4

age(timestamp 1957-06-13)

current_timestamp timestamp
Ngy thng v thi gian hin
with time zone hnh (bt u giao dch hin
hnh); xem Phn 9.9.4
date_part(text,

double

Ly trng con (ging nh date_part(hour, timestamp

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

20

Trang 219/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Hm

Dng tr v

M t

Xut bn nm 2013
V d

Kt qu

timestamp)

precision

php tr); xem Phn 9.9.1

2001-02-16 20:38:40)

date_part(text,
interval)

double
precision

Ly trng con (ging nh date_part(month, interval 2


php tr); xem Phn 9.9.1
years 3 months)

date_trunc(text,
timestamp)

timestamp

Ct bt v chnh xc c date_trunc(hour, timestamp


ch nh; xem Phn 9.9.2
2001-02-16 20:38:40)

2001-02-16
20:00:00

extract(field from
timestamp)

double
precision

Ly trng con; xem Phn


9.9.1

extract(hour from timestamp


2001-02-16 20:38:40)

20

extract(field
from interval)

double
precision

Ly trng con; xem Phn


9.9.1

extract(month from interval


2 years 3 months)

isfinite(date)

boolean

Kim th ngy thng xc isfinite(date 2001-02-16)


nh (not +/-infinity)

true

isfinite(timestamp) boolean

Kim th ngy thng xc isfinite(timestamp 2001-02-16 true


nh (not +/-infinity)
21:28:30)

isfinite(interval)

Kim th khong xc nh

boolean

isfinite(interval 4 hours)

true

justify_days(interv interval
al)

Tinh chnh khong sao cho justify_days(interval 35 days) 1 mon 5 days


giai on thi gian 30 ngy
c th hin nh cc thng

justify_hours(inter interval
val)

Chnh khong sao cho giai justify_hours(interval 27


on 24 gi c th hin hours)
nh cc ngy

justify_interval(int interval
erval)

Tinh chnh khong bng vic justify_interval(interval 1 mon 29 days


s dng justify_days v -1 hour)
23:00:00
justify_hours, vi cc tinh
chnh k hiu b sung

localtime

time

Thi gian ca ngy hin


hnh; xem Phn 9.9.4

localtimestamp

timestamp

Ngy thng v thi gian hin


hnh (bt u giao dch hin
hnh); xem Phn 9.9.4

now()

timestamp
Ngy thng v thi gian hin
with time zone hnh (bt u giao dch hin
hnh); xem Phn 9.9.4

statement_timesta
mp()

timestamp
Ngy thng v thi gian hin
with time zone hnh (bt u giao dch hin
hnh); xem Phn 9.9.4

timeofday()

text

1 day 03:00:00

Ngy thng v thi gian hin


hnh (nh clock_timestamp,
nhng nh mt chui vn
bn); xem Phn 9.9.4

B sung thm vo cc hm , ton t OVERLAPS ca SQL c h tr:


(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)

Biu thc ny l ng khi 2 giai on thi gian (c cc im cui ca chng xc nh) chng ln

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 220/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ln nhau, l sai khi chng khng chng ln nhau. Cc im cui c th c ch nh nh cc cp


ngy thng, thi gian hoc cc du thi gian; hoc nh mt ngy thng, thi gian, hoc du thi
gian i sau l mt khong thi gian. Khi mt cp cc gi tr c cung cp, hoc bt u hoc kt
thc c th c vit trc; OVERLAPS t ng ly gi tr sm nht ca cp nh l bt u. Mi
giai on thi gian c xem xt th hin khong na m bt u start <= time < end (kt thc),
tr phi start v end l nh nhau trong trng hp n th hin thi gian duy nht ngay lp tc .
iu ny c ngha l s vic m 2 giai on thi gian ch mt im kt thc ni chung khng chng
ln nhau.
SELECT (DATE 2001-02-16, DATE 2001-12-21) OVERLAPS
(DATE 2001-10-30, DATE 2002-10-30);
Result: true
SELECT (DATE 2001-02-16, INTERVAL 100 days) OVERLAPS
(DATE 2001-10-30, DATE 2002-10-30);
Result: false
SELECT (DATE 2001-10-29, DATE 2001-10-30) OVERLAPS
(DATE 2001-10-30, DATE 2001-10-31);
Result: false
SELECT (DATE 2001-10-30, DATE 2001-10-30) OVERLAPS
(DATE 2001-10-30, DATE 2001-10-31);
Result: true

Khi thm mt gi tr interval vo (hoc bt i mt gi tr interval khi) mt gi tr du thi gian vi


vng thi gian (timestamp with time zone), thnh phn cc ngy tng (hoc gim) ngy ca
timestamp with time zone bng s cc ngy c ch nh. Khp nhng thay i tit kim nh sng
ban ngy (vi vng thi gian cc phin c thit lp ti mt vng thi gian m nhn bit c
DST), iu ny c ngha l interval 1 day (khong thi gian 1 ngy) khng nht thit bng vi
interval 24 hours (khong thi gian 24 gi). V d, vi vng thi gian cc phin c thit lp v
CST7DT, th timestamp with time zone 2005-04-02 12:00-07 + interval 1 day s to ra timestamp
with time zone 2005-04-03 12:00-06 , trong khi vic thm interval 24 hours vo timestamp with time
zone y ht ban u s to ra timestamp with time zone 2005-04-03 13:00-06 , nh c mt s thay i
trong thi gian tit kim nh sng ban ngy lc 2005-04-03 02:00 theo vng thi gian CST7CDT.
Lu c th s c s m m trong cc thng c age tr v v cc thng khc nhau c cc s ngy
khc nhau. Tip cn ca PostgreSQL s dng thng t u ca 2 ngy khi tnh ton phn ca cc
thng. V d, age(2004-06-01, 2004-04-30) s dng thng T c 1 mon 1 day, trong khi s dng
thng Nm c th c 1 mon 2 day v thng Nm c 31 ngy, trong khi thng T ch c 30 ngy.

9.9.1. EXTRACT, date_part


EXTRACT(field FROM source)

Hm extract truy xut cc trng con nh nm hoc gi t cc gi tr ngy thng / thi gian. Trong
source phi l mt biu thc gi tr dng timestamp, time hoc interval. (Cc biu thc dng date
a ra cho timestamp v c th v th cng c s dng). Trng field l mt m nh danh hoc

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 221/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

chui m chn trng no trch xut t gi tr ngun. Hm


precision. Sau y l cc tn trng hp l:

extract

tr v cc gi tr dng

double

century

Th k (century) s
SELECT EXTRACT(CENTURY FROM TIMESTAMP 2000-12-16 12:21:13);
Result: 20
SELECT EXTRACT(CENTURY FROM TIMESTAMP 2001-02-16 20:38:40);
Result: 21

Th k u tin bt u lc 0001-01-01 00:00:00 AD, d chng khng bit n khi .


nh ngha ny p dng cho tt c cc nc c lch Gregorian. Khng c th k 0, bn i t
th k -1 sang th k 1. Nu bn khng ng vi iu ny, xin vit yu cu ca bn cho:
Gio hong, Nh th Saint-Peter Roma, Vatican.
Cc phin bn PostgreSQL trc 8.0 khng tun theo vic nh s th k nh qui c,
m ch tr v trng nm c chia cho 100.
day

Trng ngy (ca thng) (1-31)


SELECT EXTRACT(DAY FROM TIMESTAMP 2001-02-16 20:38:40);
Result: 16
decade

Trng nm chia cho 10


SELECT EXTRACT(DECADE FROM TIMESTAMP 2001-02-16 20:38:40);
Result: 200
dow

Ngy ca tun l t Ch nht (0) ti th By (6)


SELECT EXTRACT(DOW FROM TIMESTAMP 2001-02-16 20:38:40);
Result: 5

Lu rng vic nh s ngy ca tun ca hm


to_char(..., D).

extract

khc vi vic nh s ca hm

doy

Ngy ca nm (1-365/366)
SELECT EXTRACT(DOY FROM TIMESTAMP 2001-02-16 20:38:40);
Result: 47
epoch

i vi cc gi tr date v timestamp, s cc giy t 1970-01-01 00:00:00 UTC (c th l s


m); i vi cc gi tr khong interval, tng s cc giy trong khong
SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE 2001-02-16 20:38:40.12-08);
Result: 982384720.12
SELECT EXTRACT(EPOCH FROM INTERVAL 5 days 3 hours);
Result: 442800

y l cch m bn c th bin i mt gi tr thi i ngc tr v mt du thi gian:


SELECT TIMESTAMP WITH TIME ZONE epoch + 982384720.12 * INTERVAL 1 second;

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 222/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

(Hm to_timestamp tun theo qui c bn trn).


hour

Trng gi (0-23)
SELECT EXTRACT(HOUR FROM TIMESTAMP 2001-02-16 20:38:40);
Result: 20
isodow

Ngy ca tun nh l th Hai (1) ti th By (7)


SELECT EXTRACT(ISODOW FROM TIMESTAMP 2001-02-18 20:38:40);
Result: 7

iu ny l ng ht nhng ngoi tr th By. iu ny khp vi vic nh s ngy ca


tun theo ISO 8601.
isoyear

Nm theo ISO 8601 c ngy thng nm trong (khng p dng c cho cc khong)
SELECT EXTRACT(ISOYEAR FROM DATE 2006-01-01);
Result: 2005
SELECT EXTRACT(ISOYEAR FROM DATE 2006-01-02);
Result: 2006

Mi nm theo ISO bt u vo th Hai ca tun gm tun th 4 ca thng 1, nn trong thng


1 sm hoc thng 12 mun th nm theo ISO c th khc vi nm theo Gregorian. Xem
trng tun week c thm thng tin.
Trng ny khng c trong cc phin bn PostgreSQL trc 8.3.
microseconds

Trng giy, bao gm c cc phn thp phn, c nhn ln vi 1.000.000; lu rng iu


ny bao gm c cc giy y
SELECT EXTRACT(MICROSECONDS FROM TIME 17:12:28.5);
Result: 28500000
millennium

Thin nin k
SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP 2001-02-16 20:38:40);
Result: 3

Cc nm trong nhng nm 1900 l thuc thin nin k th 2. Thin nin k th 3 bt u


vo ngy 01/01/2001.
Cc phin bn PostgreSQL trc 8.0 khng tun theo vic nh s thin nin k ny, m
ch tr v trng nm c chia cho 1.000.
milliseconds

Trng cc giy, bao gm c cc phn thp phn, c nhn vi 1.000. Lu l iu ny


bao gm cc giy y .
SELECT EXTRACT(MILLISECONDS FROM TIME 17:12:28.5);

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 223/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Result: 28500
minute

Trng pht (0-59)


SELECT EXTRACT(MINUTE FROM TIMESTAMP 2001-02-16 20:38:40);
Result: 38
month

i vi cc gi tr timestamp, s thng trong nm (1-12); i vi cc gi tr khong


s cc thng, modulo 12 (0-11)

interval

SELECT EXTRACT(MONTH FROM TIMESTAMP 2001-02-16 20:38:40);


Result: 2
SELECT EXTRACT(MONTH FROM INTERVAL 2 years 3 months);
Result: 3
SELECT EXTRACT(MONTH FROM INTERVAL 2 years 13 months);
Result: 1

quarter

Qu ca nm (1-4) m ngy thng l trong


SELECT EXTRACT(QUARTER FROM TIMESTAMP 2001-02-16 20:38:40);
Result: 1
second

Trng giy, bao gm cc phn thp phn (0-59)


SELECT EXTRACT(SECOND FROM TIMESTAMP 2001-02-16 20:38:40);
Result: 40
SELECT EXTRACT(SECOND FROM TIME 17:12:28.5);
Result: 28.5
timezone

B tr vng thi gian t UTC, c o bng giy. Cc gi tr dng tng ng vi cc vng


thi gian pha ng ca UTC, cc gi tr m cho cc vng pha ty ca UTC.
timezone_hour

Thnh phn gi ca b tr vng thi gian


timezone_minute

Thnh phn pht ca b tr vng thi gian


week

S tun ca nm m ngy trong . Theo nh ngha ca ISO 8601, cc tun bt u vo th


Hai v tun u ca nm c ngy mng 4 thng 1 ca nm . Ni cch khc, th Nm u
tin ca mt nm l trong tun s 1 ca nm .
nh ngha ca ISO, kh nng ca n cho cc ngy thng ca thng 1 sm s l mt phn
ca tun th 52 hoc 53 ca nm trc , v i vi cc ngy thng ca thng 12 mun s
l mt phn ca tun u tin ca nm tip sau. V d, 2005-01-01 l mt phn ca tun th
53 ca nm 2004, v 2006-01-01 l mt phn ca tun th 52 ca nm 2005, trong khi 201212-31 l mt phn ca tun u tin ca nm 2013. c khuyn co s dng trng isoyear
cng vi week c c cc kt qu nht qun.
Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 224/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

SELECT EXTRACT(WEEK FROM TIMESTAMP 2001-02-16 20:38:40);


Result: 7
year

Trng nm. Hy ghi nh trong u khng c AD 0, nn vic tr cc nm BC t cc nm


AD nn c thc hin thn trng.
SELECT EXTRACT(YEAR FROM TIMESTAMP 2001-02-16 20:38:40);
Result: 2001

Hm extract trc ht c nh cho vic x l tnh ton. i vi cc gi tr ngy thng / thi gian
hin th, xem Phn 9.8.
Hm date_part to thnh m hnh tng ng vi Ingres truyn thng vi hm tiu chun SQL.
extract:
date_part(field, source)

Lu rng y tham s trng field cn phi l mt gi tr chui, khng phi l mt tn. Cc tn


trng hp l cho date_part l y ht nh vi extract.
L 60 nu cc giy ca nm nhun c h iu hnh trin khai
SELECT date_part(day, TIMESTAMP 2001-02-16 20:38:40);
Result: 16
SELECT date_part(hour, INTERVAL 4 hours 3 minutes);
Result: 4

9.9.2. date_trunc
Hm date_trunc v khi nim l tng t nh hm trunc cho cc s.
date_trunc(field, source)

Trong source l mt biu thc gi tr dng timestamp hoc interval. (Cc gi tr dng date v time
c a ra mt cch t ng cho timestamp hoc interval, mt cch tng ng). Trng field s
chn chnh xc no ct bt gi tr u vo. Gi tr tr v l dng timestamp hoc interval
vi tt c cc trng t quan trng hn so vi c chn v c thit lp v 0 (hoc 1, cho ngy v
thng).
Cc gi tr hp l cho field l:
microseconds
milliseconds
second
minute
hour
day
week
month
quarter
year
decade
century
millennium

Cc v d:
SELECT date_trunc(hour, TIMESTAMP 2001-02-16 20:38:40);

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 225/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Result: 2001-02-16 20:00:00


SELECT date_trunc(year, TIMESTAMP 2001-02-16 20:38:40);
Result: 2001-01-01 00:00:00

9.9.3. AT TIME ZONE


Cu trc AT TIME ZONE cho php cc bin i cc du thi gian cho cc vng thi gian khc nhau.
Bng 9-28 ch ra cc bin th ca n.
Bng 9-28. Cc phng n AT TIME ZONE
Biu thc

Dng tr v

timestamp without time


du thi gian c vng thi
zone AT TIME ZONE zone gian

M t
i x vi du thi gian c a ra khng c vng thi
gian c nm trong vng thi gian c ch nh

timestamp with time zone


AT TIME ZONE zone

du thi gian khng c vng Bin i du thi gian c a ra c vng thi gian cho
thi gian
vng thi gian mi, khng c ch nh vng thi gian

time with time zone AT


TIME ZONE zone

Thi gian c vng thi gian

Bin i thi gian cho trc c vng thi gian thnh vng
thi gian mi

Trong cc biu thc , vng thi gian mong mun zone c th c ch nh hoc nh mt chui
vn bn (nh, 'PST') hoc nh mt khong (nh, INTERVAL -08:00). Trong trng hp vn bn, mt
tn vng thi gian c th c ch nh theo bt k cch no c m t trong Phn 8.5.3.
Cc v d (gi thit vng thi gian a phng l PST8PDT):
SELECT TIMESTAMP 2001-02-16 20:38:40 AT TIME ZONE MST;
Result: 2001-02-16 19:38:40-08
SELECT TIMESTAMP WITH TIME ZONE 2001-02-16 20:38:40-05 AT TIME ZONE MST;
Result: 2001-02-16 18:38:40

V d u ly mt du thi gian m khng c vng thi gian v dch n thnh thi gian MST (UTC7), m sau c bin i thnh PST (UTC-8) hin th. V d 2 ly mt du thi gian c ch
nh trong EST (UTC-5) v bin i n thnh thi gian a phng theo MST (UTC-7).
Hm timezone(zone, timestamp) l tng ng vi cu trc tun th SQL timestamp AT TIME ZONE zone.

9.9.4. Date/Time hin hnh


PostgreSQL a ra mt s hm tr v cc gi tr c lin quan ti ngy thng v gi hin hnh.
Cc hm tiu chun SQL tt c u tr v cc gi tr da vo thi im u ca giao dch hin
hnh:
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME(precision)
CURRENT_TIMESTAMP(precision)
LOCALTIME
LOCALTIMESTAMP

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 226/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

LOCALTIME(precision)
LOCALTIMESTAMP(precision)

v CURRENT_TIMESTAMP a ra cc gi tr vi vng thi gian;


LOCALTIMESTAMP a ra cc gi tr khng c vng thi gian.
CURRENT_TIME

LOCALTIME

v LOCALTIMESTAMP c th ty ly mt tham s
chnh xc, n lm cho vic lm trn s cho nhiu k t s thp phn trong trng giy. Khng c
mt tham s chnh xc, th kt qu c a ra vi chnh xc y c sn. Mt s v d:
CURRENT_TIME, CURRENT_TIMESTAMP, LOCALTIME

SELECT CURRENT_TIME;
Result: 14:39:53.662522-05
SELECT CURRENT_DATE;
Result: 2001-12-23
SELECT CURRENT_TIMESTAMP;
Result: 2001-12-23 14:39:53.662522-05
SELECT CURRENT_TIMESTAMP(2);
Result: 2001-12-23 14:39:53.66-05
SELECT LOCALTIMESTAMP;
Result: 2001-12-23 14:39:53.662522

V cc hm tr v thi im u ca giao dch hin hnh, cc gi tr ca chng khng thay i


trong qu trnh giao dch . iu ny c xem nh l mt chc nng: nh l cho php mt
giao dch duy nht s c mt k hiu nht qun v thi im hin hnh, sao cho nhiu sa i bn
trong cng giao dch c c du thi gian y ht.
Lu : Cc h c s d liu khc c th u tin cc gi tr thng xuyn hn.
PostgreSQL cng a ra cc hm tr v thi im u ca lnh hin hnh, cng nh thi im hin
hnh thc s trong s vic khi hm c gi. Danh sch y cc hm thi gian khng theo
tiu chun SQL l:
transaction_timestamp()
statement_timestamp()
clock_timestamp()
timeofday()
now()

l tng ng vi CURRENT_TIMESTAMP, nhng c t tn phn nh r


rng nhng g n tr v. statement_timestamp() tr v gi tr y ht trong qu trnh lnh u tin ca
mt giao dch, m c th khc trong qu trnh cc lnh tip theo. clock_timestamp() tr v thi gian
hin hnh thc s, v v th gi tr ca n thay i thm ch trong mt lnh SQL duy nht.
timeofday() l mt hm lch s ca PostgreSQL. Ging nh clock_timestamp(), n tr v thi gian
hin thnh thc t, nhng nh mt chui text c nh dng thay v mt gi tr du thi gian vi
vng thi gian. now() l mt tng ng truyn thng ca PostgreSQL cho transaction_timestamp().
transaction_timestamp()

Tt c cc dng d liu ngy thng / thi gian cng chp nhn gi tr hng c bit now ch nh
ngy thng v thi gian hin hnh (mt ln na, c dch nh l thi im bt u ca giao dch).
V th c 3 th sau u tr v cng mt kt qu:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 227/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

SELECT CURRENT_TIMESTAMP;
SELECT now();
SELECT TIMESTAMP now; --

khng ng s dng vi DEFAULT

Mo: Bn khng mun s dng dng th 3 khi ch nh mt mnh mc nh DEFAULT trong


khi to mt bng. H thng s bin i now thnh mt timestamp ngay khi hng s c
phn tch, sao cho khi gi tr mc nh l cn thit, th thi gian to bng c th c s
dng! 2 dng u s khng c nh gi cho ti khi gi tr mc nh c s dng, v
chng l cc li gi hm. V th chng s a ra hnh vi mong mun ca vic mc nh
chn thi gian vo hng.

9.9.5. Thc thi tr


Hm sau y l sn sng lm tr s thc thi tin trnh ca my ch:
pg_sleep(seconds)

to ra s ng tin trnh ca phin lm vic hin hnh cho ti cc giy seconds tri qua.
seconds l mt gi tr dng chnh xc gp i double precision, nn cc tr phn thp phn ca
giy c th c ch nh. V d:
pg_sleep

SELECT pg_sleep(1.5);

Lu : Gii php hiu qu ca khong ng l c th theo nn tng; 0.01 giy l mt gi tr


chung. Tr ng s t nht min l c ch nh. N c th l di hn, ph thuc vo cc yu
t nh ti ca cc my ch.
Cnh bo
Hy chc chn l phin lm vic ca bn khng gi cc kha nhiu hn so vi cn
thit khi gi pg_sleep. Nu khng th cc phin khc c th phi ch tin trnh ng
ca bn, lm chm ton b h thng.

9.10. Hm h tr nh s Enum
i vi cc dng nh s (c m t trong Phn 8.7), c vi hm cho php vic lp trnh sch s
hn m khng c cc gi tr c bit m cng (hard code) ca mt dng nh s enum. Chng c
lit k trong Bng 9-29. Cc v d gi thit mt dng nh s enum c to ra nh:
CREATE TYPE rainbow AS ENUM (red, orange, yellow, green, blue, purple);

Bng 9-29. Cc hm h tr nh s Enum


Hm

M t

V d

Kt qu v d

enum_first(anyenum)

Tr v gi tr u ca dng enum u vo enum_first(null::rainbow)

red

enum_last(anyenum)

Tr v gi tr cui cng ca ng enum enum_last(null::rainbow)


u vo

purple

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 228/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Hm

M t

Xut bn nm 2013
V d

Kt qu v d

enum_range(anyenum) Tr v tt c cc gi tr ca dng enum enum_range(null::rainbow) {red, orange, yellow,


u vo trong mt mng c trt t
green, blue, purple}
enum_range(anyenum, Tr v di gia 2 gi tr enum c a
anyenum)
ra, nh mt mng c trt t. Cc gi tr
phi t cng mt dng enum y ht. Nu
tham s u l null, th kt qu s bt u
vi gi tr u tin ca dng enum. Nu
tham s th 2 l null, th kt qu s kt
thc vi gi tr cui ca dng enum.

enum_range(orange::rain {orange, yellow,


bow, green::rainbow)
green}
enum_range(NULL,
green::rainbow)

{red, orange, yellow,


green}

enum_range(orange::rain {orange, yellow,


bow, NULL)
green, blue, purple}

Lu rng ngoi tr dng 2 i s ca enum_range, cc hm khng quan tm ti gi tr c th


c truyn ti chng; chng ch quan tm v dng d liu c khai bo ca n. Hoc null hoc
mt gi tr c th ca dng c th c truyn qua, vi cng y ht kt qu. Ph bin hn p
dng cc hm cho mt ct ca bng hoc i s ca hm hn l cho mt tn dng c vit tay
nh c cc v d gi .

9.11. Hm v ton t hnh hc


Cc dng point, box, lseg, line, path, polygon v circle c mt tp hp ln cc hm v ton t bm
sinh h tr, c ch ra trong Bng 9-30, v Bng 9-32.
Ch
Lu rng ton t ht nh, ~ =, th hin k hiu bng nhau thng thng cho
cc dng the point, box, polygon v circle. Mt s dng cng c mt ton t =,
nhng = so vi ch cc lnh vc bng nhau. Cc ton t so snh tuyn tnh khc
(<= v ) hn na so snh cc lnh vc cho cc dng .

Bng 9-30. Cc ton t a l


Ton t

M t

V d

Chuyn i

box ((0,0),(1,1)) + point (2.0,0)

Chuyn i

box ((0,0),(1,1)) - point (2.0,0)

Co dn / Xoay

box ((0,0),(1,1)) * point (2.0,0)

Co dn / Xoay

box ((0,0),(2,2)) / point (2.0,0)

im hoc hp giao nhau

((1,-1),(-1,1)) # ((1,1),(-1,-1))

S cc im trn ng hoc a gic

# ((1,0),(0,1),(-1,0))

@-@

Chiu di hoc chu vi

@-@ path ((0,0),(1,0))

@@

Tm

@@ circle ((0,0),10)

##

im gn nht vi ton hng u tin trong ton hng


th 2

point (0,0) ## lseg ((2,0),(0,2))

<->

Khong gia

circle ((0,0),1) <-> circle ((5,0),1)

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 229/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Ton t

Xut bn nm 2013

M t

V d

&&

Chng ln? (Mt im chung lm iu ny thnh ng). box ((0,0),(1,1)) && box ((0,0),(2,2))

<<

Nghim tri?

circle ((0,0),1) << circle ((5,0),1)

>>

Nghim phi?

circle ((5,0),1) >> circle ((0,0),1)

&<

Khng m rng sang phi?

box ((0,0),(1,1)) &< box ((0,0),(2,2))

&>

Khng m rng sang tri?

box ((0,0),(3,3)) &> box ((0,0),(2,2))

<<|

Nghim di?

box ((0,0),(3,3)) <<| box ((3,4),(5,5))

|>>

Nghim trn?

box ((3,4),(5,5)) |>> box ((0,0),(3,3))

&<|

Khng m rng ln trn?

box ((0,0),(1,1)) &<| box ((0,0),(2,2))

|&>

Khng m rng xung di?

box ((0,0),(3,3)) |&> box ((0,0),(2,2))

<^

di (cho php ng ti)?

circle ((0,0),1) <^ circle ((0,5),1)

>^

trn (cho php ng ti)?

circle ((0,5),1) >^ circle ((0,0),1)

?#

Giao nhau?

lseg ((-1,0),(1,0)) ?# box ((-2,-2),(2,2))

?-

Nm ngang?

?- lseg ((-1,0),(1,0))

?-

Dng hng nm ngang?

point (1,0) ?- point (0,0)

?|

Thng ng?

?| lseg ((-1,0),(1,0))

?|

Dng hng thng ng?

point (0,1) ?| point (0,0)

?-|

Vung gc?

lseg ((0,0),(0,1)) ?-| lseg ((0,0),(1,0))

?||

Song song?

lseg ((-1,0),(1,0)) ?|| lseg ((-1,2),(1,2))

@>

Bao gm?

circle ((0,0),2) @> point (1,1)

<@

Nm trong hoc nm trn?

point (1,1) <@ circle ((0,0),2)

~=

Ht nh?

polygon ((0,0),(1,1)) ~= polygon ((1,1),(0,0))

Lu : Trc PostgreSQL 8.2, cc ton t cha @> v <@ tng c gi mt cch tng
ng l ~ v @. Cc tn vn sn sng, nhng c ct ngn v cui cng s b loi b.
Bng 9-31. Cc hm a l
Hm

Dng tr v

M t

V d

area(object)

double precision

vng din tch

area(box ((0,0),(1,1)))

center(object)

point

tm

center(box ((0,0),(1,2)))

diameter(circle)

double precision

ng knh vng trn

diameter(circle ((0,0),2.0))

height(box)

double precision

kch thc chiu dc ca hp

height(box ((0,0),(1,1)))

isclosed(path)

boolean

ng khp kn?

isclosed(path ((0,0),(1,1),(2,0)))

isopen(path)

boolean

ng m?

isopen(path [(0,0),(1,1),(2,0)])

length(object)

double precision

di

length(path ((-1,0),(1,0)))

npoints(path)

int

s cc im

npoints(path [(0,0),(1,1),(2,0)])

npoints(polygon)

int

s cc im

npoints(polygon ((1,1),(0,0)))

pclose(path)

path

bin i ng thnh khp kn

pclose(path [(0,0),(1,1),(2,0)])

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 230/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Hm

Dng tr v

Xut bn nm 2013

M t

V d

popen(path)

path

bin i ng thnh m

popen(path ((0,0),(1,1),(2,0)))

radius(circle)

double precision

bn knh vng trn

radius(circle ((0,0),2.0))

width(box)

double precision

kch thc nm ngang ca hp

width(box ((0,0),(1,1)))

Bng 9-32. Cc hm bin i dng hnh hc


Hm

Dng tr v

M t

V d

box(circle)

box

vng trn thnh hp

box(circle ((0,0),2.0))

box(point, point)

box

cc im thnh hp

box(point (0,0), point (1,1))

box(polygon)

box

a gic thnh hp

box(polygon ((0,0),(1,1),(2,0)))

circle(box)

circle

hp thnh vng trn

circle(box ((0,0),(1,1)))

circle(point, double precision)

circle

tm v bn knh ng trn

circle(point (0,0), 2.0)

circle(polygon)

circle

a gic thnh ng trn

circle(polygon ((0,0),(1,1),(2,0)))

lseg(box)

lseg

ng cho hp thnh on thng

lseg(box ((-1,0),(1,0)))

lseg(point, point)

lseg

cc im thnh on thng

lseg(point (-1,0), point (1,0))

path(polygon)

path

a gic thnh ng

path(polygon ((0,0),(1,1),(2,0)))

point(double precision, double point


precision)

xy dng im

point(23.4, -44.5)

point(box)

point

tm ca hp

point(box ((-1,0),(1,0)))

point(circle)

point

tm ng trn

point(circle ((0,0),2.0))

point(lseg)

point

tm ca on thng

point(lseg ((-1,0),(1,0)))

point(polygon)

point

tm ca a gic

point(polygon ((0,0),(1,1),(2,0)))

polygon(box)

polygon

hp thnh a gic 4 im

polygon(box ((0,0),(1,1)))

polygon(circle)

polygon

ng trn thnh a gic 12 im

polygon(circle ((0,0),2.0))

polygon(npts, circle)

polygon

ng trn thnh a gic npts im Polygon(12, circle ((0,0),2.0))

polygon(path)

polygon

ng thnh a gic

polygon(path ((0,0),(1,1),(2,0)))

C kh nng truy cp 2 s thnh phn ca mt im d im tng l mt mng vi cc ch s 0


v 1. V d, nu t.p l mt ct cc im point th SELECT p[0] FROM t truy xut ta X v UPDATE t
SET p[1] = ... thay i ta Y. Theo cch y ht, mt gi tr dng box hoc lseg c th c truy xut
nh mt mng ca 2 gi tr im point.
Hm area lm vic cho cc dng box, circle v path. Hm area ch lm vic dng d liu path nu
cc im trong path l khng giao nhau. V d, path ((0,0),(0,1),(2,1),(2,2),(1,2),(1,0),(0,0))::PATH s
khng lm vic; tuy nhin, path ((0,0),(0,1),(1,1),(1,2),(2,2),(2,1),(1,1),(1,0),(0,0))::PATH s lm vic.
Nu khi nim ca vic giao nhau i li vi path khng giao nhau l d ln, th hy v c 2 ng
path trn cnh nhau trong mt mu giy ha.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 231/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

9.12. Hm v ton t a ch mng


Bng 9-33 ch cc ton t c sn cho cc dng cidr v inet. Cc ton t <<, <<=, >> v >>= kim
th s a vo mng con (subnet). Chng ch xem cc phn mng ca 2 a ch (b qua bt k phn
ch (host) no) v xc nh liu mt mng c l y ht vi hoc mng con ca mng khc hay khng.
Bng 9-33. Cc ton t cidr v inet
Ton t

M t

V d

<

nh hn

inet 192.168.1.5 < inet 192.168.1.6

<=

nh hn hoc bng

inet 192.168.1.5 <= inet 192.168.1.5

bng

inet 192.168.1.5 = inet 192.168.1.5

>=

ln hn hoc bng

inet 192.168.1.5 >= inet 192.168.1.5

>

ln hn

inet 192.168.1.5 > inet 192.168.1.4

<>

khng bng

inet 192.168.1.5 <> inet 192.168.1.4

<<

nm trong

inet 192.168.1.5 << inet 192.168.1/24

<<=

nm trong hoc bng

inet 192.168.1/24 <<= inet 192.168.1/24

>>

bao gm

inet 192.168.1/24 >> inet 192.168.1.5

>>=

bao gm hoc bng

inet 192.168.1/24 >>= inet 192.168.1/24

KHNG (NOT) theo bit

~ inet 192.168.1.6

&

V (AND) theo bit

inet 192.168.1.6 & inet 0.0.0.255

HOC (OR) theo bit

itwise OR inet 192.168.1.6 | inet 0.0.0.255

cng

inet 192.168.1.6 + 25

tr

inet 192.168.1.43 - 36

tr

inet 192.168.1.43 - inet 192.168.1.19

Bng 9-34 ch cc hm sn sng s dng vi cc dng cidr v inet. Cc hm


ban u c nh a ra cc nh dng hin th ty chn thay th.
Bng 9-34. Cc hm cidr v
Hm

Dng
tr v

abbrev, host

v text

inet

M t

V d

Kt qu

abbrev(inet)

text

nh dng hin th rt gn nh vn bn abbrev(inet 10.1.0.0/16)

10.1.0.0/16

abbrev(cidr)

text

nh dng hin th rt gn nh vn bn abbrev(cidr 10.1.0.0/16)

10.1/16

broadcast(inet)

inet

a ch pht cho mng

family(inet)

int

h a ch chnh xc; 4 cho IPv4, 6 cho family(::1)


IPv6

host(inet)

text

a ch IP chnh xc nh vn bn

host(192.168.1.5/24)

192.168.1.5

hostmask(inet)

inet

xy dng mt n ch cho mng

hostmask(192.168.2.30/30) 0.0.2.30

masklen(inet)

int

di chnh xc ca mt n

masklen(192.168.1.5/24)

24

netmask(inet)

inet

xy dng mt n cho mng

netmask(192.168.1.5/24)

255.255.255.0

broadcast(192.168.168/24) 192.255/24

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 232/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Hm
network(inet)

Dng
tr v
cidr

Xut bn nm 2013

M t

V d

Kt qu

phn a ch mng chnh xc

network(192.168.1.5/24)

set_masklen(inet, int) inet

thit lp di mt n cho gi tr inet

set_masklen(192.168.1.5/24 192.168.1.5/16
, 16)

set_masklen(cidr, int) cidr

thit lp di mt n cho gi tr cidr

set_masklen(192.168.1.0/24 192.168.0.0/16
::cidr, 16)

text(inet)

trch a ch IP v di mt n nh
vn bn

text(inet 192.168.1.5)

text

192.168.0.1/24

192.168.1.5/32

Bt k gi tr cidr no cng c th a ra cho inet s ngm nh hoc r rng; v th cc hm c


ch ra trn nh vic vn hnh trong inet cng lm vic c trong cc gi tr ca cidr. ( nhng
ni c cc hm ring r cho intet v cidr, th l v hnh vi phi l khc i vi 2 trng hp ).
Hn na, c cho php a ra mt gi tr inet cho cidr. Khi iu ny c thc hin, th bt k bit
no bn phi ca mt n cng m thm bin thnh 0 to ra mt gi tr cidr hp l. Hn na, bn
c th a ra mt gi tr vn bn cho inet hoc cidr bng vic s dng c php a ra thng thng,
v d: inet(expression) hoc colname::cidr.
Bng 9-35 ch ra cc hm sn sng s dng vi dng macaddr. Hm trunc(macaddr) tr v mt a
ch MAC vi 3 byte cui cng c t v 0. iu ny c th c s dng lin kt tin t cn
li vi mt nh sn xut.
Bng 9-35. Cc hm macaddr
Hm

Dng tr v

trunc(macaddr) macaddr

M t

V d

thit lp 3 byte cui v 0

Kt qu

trunc(macaddr 12:34:56:78:90:ab)

12:34:56:00:00:00

Dng macaddr cng h tr cc ton t quan h tiu chun (>, <=, ) theo trt t t in.

9.13. Hm v ton t tm kim vn bn


Bng 9-36, Bng 9-37 v Bng 9-38 tm tt cc hm v ton t s c cung cp cho vic tm kim
ton vn. Xem Chng 12 c gii thch chi tit v c s tm kim ton vn ca PostgreSQL.
Bng 9-36. Cc ton t tm kim vn bn
Ton t

M t

V d

Kt qu

@@

tsvector c khp tsquery ?

to_tsvector(fat cats ate rats) @@


to_tsquery(cat & rat)

@@@

t ng ngha c yu cu cho @@

to_tsvector(fat cats ate rats) @@@


to_tsquery(cat & rat)

||

ghp ni tsvectors

a:1 b:2::tsvector || c:1 d:2 b:3::tsvector a:1 b:2,5 c:3 d:4

&&

AND tsquerys cng nhau

fat | rat::tsquery && cat::tsquery

( fat | rat ) & cat

||

OR tsquerys cng nhau

fat | rat::tsquery || cat::tsquery

( fat | rat ) | cat

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 233/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Ton t

M t

Xut bn nm 2013
V d

Kt qu

!!

ph nh mt tsquery

!! cat::tsquery

!cat

@>

tsquery cha th khc?

cat::tsquery @> cat & rat::tsquery

<@

tsquery nm bn trong?

cat::tsquery <@ cat & rat::tsquery

Lu : Cc ton t cha tsquery ch xem xt cc t c lit k trong 2 truy vn, b qua cc


ton t kt hp.
B sung thm vo cc ton t c ch ra trong bng, cc ton t so snh B-tree (cy-B) thng
thng (=, <, ) c xc nh cho cc dng tsvector v tsquery. Chng khng tht hu dng
tm kim vn bn nhng cho php, v d, cc t c nht c xy dng trong cc ct cc dng .
Bng 9-37. Cc hm tm kim vn bn
Hm

Dng
tr v

M t

V d

Kt qu

to_tsvector([config regconfig , ]
document text)

tsvector gim vn bn ti liu v to_tsvector(english,


tsvector
The Fat Rats)

fat:2 rat:3

length(tsvector)

integer s cc t trong tsvector

setweight(tsvector, "char")

tsvector ch nh trng s cho setweight(fat:2,4


tng yu t ca tsvector cat:3 rat:5B::tsvector,
A)

cat:3A fat:2A,4A
rat:5A

strip(tsvector)

tsvector loi b cc v tr v strip(fat:2,4 cat:3


trng s khi tsvector
rat:5A::tsvector)

cat fat rat

to_tsquery([ config regconfig , ]


query text)

tsquery bnh thng ha cc t to_tsquery(english,


v bin i sang tsquery The & Fat & Rats)

fat & rat

length(fat:2,4 cat:3
rat:5A::tsvector)

plainto_tsquery([config regconfig , tsquery to tsquery b qua cc plainto_tsquery(english fat & rat


] query text)
du ngt t
, The Fat Rats)
numnode(tsquery)

integer s t cng cc ton t numnode((fat & rat) |


trong tsquery
cat::tsquery)

querytree(query tsquery)

text

ly phn to c ch s querytree(foo & !


ca mt tsquery
bar::tsquery)

foo

ts_rank([weights float4[], ] vector


tsvector, query tsquery [,
normalization integer ])

float4

xp hng ti liu cho ts_rank(textsearch,


truy vn
query)

0.818

ts_rank_cd([weights float4[], ]
vector tsvector, query tsquery [,
normalization integer ])

float4

xp hng ti liu cho ts_rank_cd({0.1, 0.2,


truy vn bng vic s 0.4, 1.0}, textsearch,
dng mt bao trm
query)

2.01317

ts_headline([config regconfig, ]
document text, query tsquery [,
options text ])

text

hin th mt s khp ts_headline(x y z,


truy vn
z::tsquery)

x y <b>z</b>

ts_rewrite(query tsquery, target


tsquery, substitute tsquery)

tsquery thay th ch bng cm ts_rewrite(a &


b & ( foo | bar )
thay th trong truy vn b::tsquery, a::tsquery,
foo|bar::tsquery)

ts_rewrite(query tsquery, select

tsquery thay th bng vic s SELECT ts_rewrite(a

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

b & ( foo | bar )

Trang 234/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Hm

Dng
tr v

text)

Xut bn nm 2013

M t

V d

Kt qu

dng cc ch v thay & b::tsquery, SELECT


th
t
mt
lnh t,s FROM aliases)
SELECT

get_current_ts_config regconfig()

text

ly cu hnh tm kim get_current_ts_config()


mc nh

tsvector_update_trigger()

trigger

hm trigger cho cp
nht ct tsvector t
ng
CREATE
TRIGGER ...

tsvector_update_trigger_column()

trigger

hm trigger cho cp tsvector_update_trigger


nht ct tsvector t _column(tsvcol,
ng
CREATE configcol, title, body)
TRIGGER ...

english

tsvector_update_trigger(
tsvcol,
pg_catalog.swedish,
title, body)

Lu : Tt c cc hm tm kim vn bn chp nhn mt i s ty chn regconfig s s dng


cu hnh c default_text_search_config ch nh khi i s b lm m i.
Cc hm trong Bng 9-38 c lit k ring r v chng thng khng c s dng trong cc hot
ng tm kim vn bn hng ngy. Chng l hu dng cho s pht trin v vic d li cc cu hnh
tm kim mi cc vn bn.
Bng 9-38. Cc hm g li tm kim vn bn
Hm

Dng
tr v

M t

V d

Kt qu

ts_debug([config regconfig, ]
setof
document text, OUT alias text,
record
OUT description text, OUT token
text, OUT dictionaries regdictionary[],
OUT dictionary
regdictionary, OUT lexemes text[])

kim th mt cu hnh

ts_debug(engl (asciiword,"Word,
ish,
all ASCII",The,
The Brightest {english_stem},eng
supernovaes)

ts_lexize(dict regdictionary, token text) text[]

kim th mt t in

ts_lexize(engl {star}
ish_stem,
stars)

ts_parse(parser_name text, document


text, OUT tokid integer, OUT token
text)

setof
record

kim th mt trnh phn tch ts_parse(defa (1,foo) ...


c php
ult, foo bar)

ts_parse(parser_oid oid, document


text, OUT tokid integer, OUT token
text)

setof
record

kim th mt trnh phn tch ts_parse(3722, (1,foo) ...


c php
foo - bar)

ts_token_type(parser_name text, OUT setof


tokid integer, OUT alias text, OUT
record
description text)

ly cc dng token c trnh ts_token_type( (1, ascii word,"Word,


phn tch c php xc nh
default)
all ASCII") ...

ts_token_type(parser_oid oid, OUT


tokid integer, OUT alias text, OUT
description text)

ly cc dng token c trnh ts_token_type( (1, ascii word,"Word,


phn tch c php xc nh
3722)
all ASCII") ...

setof
record

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 235/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Hm
ts_stat(sqlquery text, [ weights
text, ] OUT word text, OUT ndoc
integer, OUT nentry integer)

Dng
tr v
setof
record

M t

Xut bn nm 2013
V d

ly s thng k ca mt ct ts_stat(SELE
tsvector
CT vector
from apod)

Kt qu
(foo,10,15) ...

9.14. Hm XML
Cc hm v cc biu thc ging hm c m t trong phn ny vn hnh vi cc gi tr dng xml.
Hy kim tra Phn 8.13 c thng tin v dng xml. Cc biu thc ging hm xmlparse v
xmlserialize cho vic bin i sang v t dng xml khng c lp li y. S dng nhiu hm
i hi ci t phi c xy dng cu hnh - vi libxml.

9.14.1. To ni dung XML


Mt tp hp cc hm v cc biu thc ging hm l sn sng cho vic to ra ni dung XML t cc
d liu SQL. Nh vy, chng c bit ph hp cho vic nh dng cc kt qu truy vn trong cc ti
liu XML cho vic x l trong cc ng dng my trm.
9.14.1.1. xmlcomment
xmlcomment(text)

Hm xmlcomment to ra mt gi tr XML c cha mt bnh lun XML vi vn bn c ch nh nh


l ni dung. Vn bn khng th c -- hoc kt thc vi mt - sao cho cu trc kt qu l mt
bnh lun XML hp l. Nu i s l null, th kt qu l null.
V d:
SELECT xmlcomment(hello);
xmlcomment
-------------<!--hello-->

9.14.1.2. xmlconcat
xmlconcat(xml[, ...])

Hm xmlconcat ghp ni mt danh sch cc gi tr XML ring r to mt gi tr duy nht c cha


mt phn mnh ni dung XML. Cc gi tr null c lm m; kt qu ch l null nu khng c cc
i s nonnull.
V d:
SELECT xmlconcat(<abc/>, <bar>foo</bar>);
xmlconcat
---------------------<abc/><bar>foo</bar>

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 236/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Cc khai bo XML, nu c, c kt hp nh sau. Nu tt c cc gi tr i s c cng khai bo


phin bn XML, th phin bn c s dng trong kt qu , nu khng th khng phin bn
no c s dng. Nu tt c cc gi tr i s c gi tr khai bo ng mt mnh l yes (c), th
gi tr c s dng trong kt qu. Nu tt c cc gi tr i s c mt gi tr khai bo ng mt
mnh v t nht mt gi tr l no (khng), th n c s dng trong kt qu . Kt qu khc s
khng c khai bo ng mt mnh. Nu kt qu c xc nh phi yu cu mt khai bo ng mt
mnh nhng khng khai bo phin bn no c, th mt khai bo phin bn vi phin bn 1.0 s c
s dng v XML i hi mt khai bo XML c cha mt khai bo phin bn. Vic m ha cc khai
bo b b qua v b loi b trong tt c cc trng hp.
V d:
SELECT xmlconcat(<?xml version="1.1"?><foo/>, <?xml version="1.1" standalone="no"?><bar/>);
xmlconcat
----------------------------------<?xml version="1.1"?><foo/><bar/>

9.14.1.3. xmlelement
xmlelement(name name [, xmlattributes(value [AS attname] [, ... ])] [, content, ...])

Biu thc xmlelement to ra mt phn t XML, c trao tn, cc thuc tnh v ni dung. V d:
SELECT xmlelement(name foo);
xmlelement
-----------<foo/>
SELECT xmlelement(name foo, xmlattributes(xyz as bar));
xmlelement
-----------------<foo bar="xyz"/>
SELECT xmlelement(name foo, xmlattributes(current_date as bar), cont, ent);
xmlelement
------------------------------------<foo bar="2007-01-26">content</foo>

Cc tn phn t v thuc tnh m khng phi l cc tn XML hp l c thot bng vic thay th
cc k t c li bng s tun t _xHHHH_, trong HHHH l im m Unicode ca k t theo k hiu
hexadecimal (h 16). V d:
SELECT xmlelement(name "foo$bar", xmlattributes(xyz as "a&b"));
xmlelement
---------------------------------<foo_x0024_bar a_x0026_b="xyz"/>

Mt tn thuc tnh r rng cn khng c ch nh nu gi tr thuc tnh l mt tham chiu ct,


trong trng hp tn ct s c s dng nh l tn thuc tnh mt cch mc nh. Trong cc
trng hp khc, thuc tnh phi c a ra mt ci tn r rng. V th v d ny l hp l:
CREATE TABLE test (a xml, b xml);

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 237/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

SELECT xmlelement(name test, xmlattributes(a, b)) FROM test;

Nhng cc v d ny th khng:
SELECT xmlelement(name test, xmlattributes(constant), a, b) FROM test;
SELECT xmlelement(name test, xmlattributes(func(a, b))) FROM test;

Ni dung ca phn t, nu c ch nh, s c nh dng theo dng d liu ca n. Nu ni


dung l bn thn dng xml, th cc ti liu XML phc tp c th c cu thnh. V d:
SELECT xmlelement(name foo, xmlattributes(xyz as bar),
xmlelement(name abc),
xmlcomment(test),
xmlelement(name xyz));
xmlelement
---------------------------------------------<foo bar="xyz"><abc/><!--test--><xyz/></foo>

Ni dung ca cc dng khc s c nh dng trong cc d liu k t XML hp l. iu ny c


ngha c bit rng cc k t <, > v & s c bin i thnh cc thc th. Cc d liu nh phn
(dng d liu bytea) s c th hin m base64 hoc hex, ph thuc vo thit lp ca tham s
cu hnh xmlbinary. Hnh vi c bit i vi cc dng d liu c nhn c k vng s tin ha
ph hp vi cc dng d liu ca SQL v PostgreSQL vi c t S XML, im m mt m t
chnh xc hn s xut hin.
9.14.1.4. xmlforest
xmlforest(content [AS name] [, ...])

Biu thc xmlforest to ra mt rng (tun t) XML cc phn t bng vic s dng cc tn v ni
dung c a ra.
Cc v d:
SELECT xmlforest(abc AS foo, 123 AS bar);
xmlforest
-----------------------------<foo>abc</foo><bar>123</bar>
SELECT xmlforest(table_name, column_name)
FROM information_schema.columns
WHERE table_schema = pg_catalog;
xmlforest
------------------------------------------------------------------------------------------<table_name>pg_authid</table_name><column_name>rolname</column_name>
<table_name>pg_authid</table_name><column_name>rolsuper</column_name>
...

Nh c thy trong v d th 2, tn phn t c th lm m nu gi tr ni dung l mt tham chiu


ct, trong trng hp th tn ct c s dng mc nh. Nu khng, mt tn phi c ch nh.
Cc tn phn t m khng l cc tn XML hp l s c thot nh c ch ra cho xmlelement
trn. Tng t, d liu ni dung c thot lm cho ni dung XML hp l, tr phi n l dng
xml ri.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 238/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Lu rng cc rng XML khng l cc ti liu XML hp l nu chng bao gm nhiu hn mt


phn t, nn c th l hu dng bc cc biu thc xmlforest trong xmlelement.
9.14.1.5. xmlpi
xmlpi(name target [, content])

Biu thc xmlpi to ra mt lnh x l XML. Ni dung, nu c, phi khng cha s tun t k t ?>.
V d:
SELECT xmlpi(name php, echo "hello world";);
xmlpi
----------------------------<?php echo "hello world";?>

9.14.1.6. xmlroot
xmlroot(xml, version text | no value [, standalone yes|no|no value])

Biu thc xmlroot chnh cc thuc tnh nt gc root ca mt gi tr XML. Nu mt phin bn c


ch nh, n thay th gi tr trong khai bo phin bn nt gc ; nu mt thit lp ng mt mnh
c ch nh, th n thay th gi tr trong khai bo ng mt mnh ca nt gc .
SELECT xmlroot(xmlparse(document <?xml version="1.1"?><content>abc</content>),
version 1.0, standalone yes);
xmlroot
---------------------------------------<?xml version="1.0" standalone="yes"?>
<content>abc</content>

9.14.1.7. xmlagg
xmlagg(xml)

Hm xmlagg l, khng ging nh cc hm khc c m t y, mt hm tng hp. N ghp ni


cc gi tr u vo ti li gi ca hm tng hp, rt ging xmlconcat lm, ngoi tr l s ghp ni
xy ra khp cc hng thay v khp cc biu thc trong mt hng duy nht. Xem Phn 9.18 c
thm thng tin v cc hm tng hp.
V d:
CREATE TABLE test (y int, x xml);
INSERT INTO test VALUES (1, <foo>abc</foo>);
INSERT INTO test VALUES (2, <bar/>);
SELECT xmlagg(x) FROM test;
xmlagg
---------------------<foo>abc</foo><bar/>

xc nh trt t ghp ni, mt mnh


c m t trong Phn 4.2.7. V d:

ORDER BY

c th c thm vo li gi tng hp nh

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 239/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

SELECT xmlagg(x ORDER BY y DESC) FROM test;


xmlagg
---------------------<bar/><foo>abc</foo>

Tip cn phi tiu chun sau y c s dng khuyn co trong cc phin bn trc, v c th
vn cn hu dng trong cc trng hp c bit:
SELECT xmlagg(x) FROM (SELECT * FROM test ORDER BY y DESC) AS tab;
xmlagg
---------------------<bar/><foo>abc</foo>

9.14.1.8. T v XML
xml IS DOCUMENT

Biu thc IS DOCUMENT tr v ng (true) nu gi tr i s XML l mt ti liu XML ph hp, sai


(false) nu n khng ( l, y l mt s phn mnh ni dung), hoc null nu i s l null. Xem
Phn 8.13 v s khc bit gia cc ti liu v cc phn mnh ni dung.

9.14.2. X l XML
x l cc gi tr dng d liu xml, PostgreSQL a ra hm
Xpath 1.0.

xpath,

n nh gi cc biu thc

xpath(xpath, xml[, nsarray])

Hm xpath nh gi biu thc XPath xpath i vi gi tr XML xml. N tr v mt mng cc gi tr


XML tng ng vi tp hp cc nt c biu thc XPath to ra.
i s th 2 phi l mt ti liu XML c hnh thnh tt. c bit, n phi c mt yu t nt gc
root duy nht.
i s th 3 ca hm l mt mng cc nh x khng gian tn. Mng ny nn l mt mng 2 chiu
vi di trc th 2 bng 2 (ngha l, n nn l mt mng ca cc mng, mi mng ca n bao gm
chnh xc 2 phn t). Phn t u ca tng u vo mng l tn khng gian tn (alias), phn t th
2 l URL khng gian tn. Khng c yu cu rng cc alias c cung cp trong mng ny l y
ht nh cc alias ang c s dng trong bn thn ti liu XML (ni cch khc, c trong ti liu
XML v trong ng cnh ca hm xpath, cc alias l cc b). V d:
SELECT xpath(/my:a/text(), <my:a xmlns:my="http://example.com">test</my:a>,
ARRAY[ARRAY[my, http://example.com]]);
xpath
-------{test}
(1 row)

Lm vic th no vi cc khng gian tn mc nh (nc danh):


SELECT xpath(//mydefns:b/text(), <a xmlns="http://example.com"><b>test</b></a>,

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 240/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ARRAY[ARRAY[mydefns, http://example.com]]);
xpath
-------{test}
(1 row)

9.14.3. Bng nh x ti XML


Cc hm sau y nh x cc ni dung cc bng quan h ti cc gi tr XML. Chng c th c
ngh nh l chc nng xut XML:
table_to_xml(tbl regclass, nulls boolean, tableforest boolean, targetns text)
query_to_xml(query text, nulls boolean, tableforest boolean, targetns text)
cursor_to_xml(cursor refcursor, count int, nulls boolean,
tableforest boolean, targetns text)

Dng tr v ca tng hm l xml.


nh x ni dung ca bng c tn, truyn nh tham s tbl. Dng regclass chp nhn cc
chui xc nh cc bng bng vic s dng k hiu thng thng, bao gm cht lng s ty
chn v cc du ngoc kp, query_to_xml thc thi truy vn m vn bn ca n c truyn nh tham
s query v nh x tp cc kt qu. cursor_to_xml em n s cc hng c nh ch s t con tr
c tham s cursor ch nh. Phng n ny c khuyn co nu cc bng ln phi c nh x,
v gi tr kt qu c xy dng trong b nh t tng hm.
table_to_xml

Nu tableforest l sai (false), th ti liu XML kt qu trng nh th ny:


<tablename>
<row>
<columnname1>data</columnname1>
<columnname2>data</columnname2>
</row>
<row>
...
</row>
...
</tablename>

Nu l ng, th kt qu l mt phn mnh ni dung XML m trng nh th ny:


<tablename>
<columnname1>data</columnname1>
<columnname2>data</columnname2>
</tablename>
<tablename>
...
</tablename>
...

Nu khng tn bng no l sn sng, l, khi vic nh x mt truy vn hoc mt con tr, chui
table c s dng trong nh dng trc, cn row trong nh dng th 2.
S la chn gia cc nh dng ph thuc vo ngi s dng. nh dng u tin l mt ti liu

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 241/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

XML ph hp, n s l quan trng trong nhiu ng dng. nh dng th 2 c xu hng s l hu


dng hn trong hm cursor_to_xml nu cc gi tr kt qu s c tp hp li trong ti liu sau .
Cc hm cho vic to ra ni dung XML c tho lun trn, c bit
dng ty bin cc kt qu theo mun.

xmlelement,

c th c s

Cc gi tr d liu c nh x theo cch thc y ht nh c m t cho hm xmlelement trn.


tham s nulls xc nh liu cc gi tr null c nn c a vo u ra hay khng. Nu ng, th
cc gi tr null trong cc ct c th hin nh:
<columnname xsi:nil="true"/>

trong xsi l tin t khng gian tn XML cho trng hp S XML. Mt khai bo khng gian
tn ph hp s c thm vo gi tr kt qu. Nu sai, cc ct c cha cc gi tr null n gin s b
m khi u ra.
Tham s targetns ch nh khng gian tn XML mong mun ca kt qu. Nu khng c khng gian
tn no c bit mong mun, th mt chui rng s c truyn.
Cc hm sau tr v cc ti liu S XML, m t vic nh x c cc hm tng ng trn thc
hin:
table_to_xmlschema(tbl regclass, nulls boolean, tableforest boolean, targetns text)
query_to_xmlschema(query text, nulls boolean, tableforest boolean, targetns text)
cursor_to_xmlschema(cursor refcursor, nulls boolean, tableforest boolean, targetns text)

L c bn rng cc tham s y ht c truyn ginh c vic khp cc nh x d liu XML v


cc ti liu S XML.
Cc hm sau to ra cc nh x d liu XML v S XML tng ng trong mt ti liu (hoc
rng), c lin kt vi nhau. Chng c th l hu dng nhng ni cc kt qu khp kn v t m
t c mong mun:
table_to_xml_and_xmlschema(tbl regclass, nulls boolean, tableforest boolean, targetns text)
query_to_xml_and_xmlschema(query text, nulls boolean, tableforest boolean, targetns text)

Hn na, cc hm sau l sn sng to ra cc nh x tng t ca ton b cc s hoc ton b


c s d liu hin hnh:
schema_to_xml(schema name, nulls boolean, tableforest boolean, targetns text)
schema_to_xmlschema(schema name, nulls boolean, tableforest boolean, targetns text)
schema_to_xml_and_xmlschema(schema name, nulls boolean, tableforest boolean, targetns text)
database_to_xml(nulls boolean, tableforest boolean, targetns text)
database_to_xmlschema(nulls boolean, tableforest boolean, targetns text)
database_to_xml_and_xmlschema(nulls boolean, tableforest boolean, targetns text)

Lu rng cc nh x ni dung ca cc s v c s d liu ln, c th ng xem xt vic nh


x cc bng mt cch tch bch thay vo , thm ch c th thng qua mt con tr.
Kt qu ca mt nh x ni dung s trng ging nh th ny:
<schemaname>
table1-mapping
table2-mapping

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 242/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

...
</schemaname>

trong nh dng mt nh x bng ph thuc vo tham s rng bng nh c gii thch trn.
Kt qu ca mt nh x ni dung c s d liu trng ging th ny:
<dbname>
<schema1name>
...
</schema1name>
<schema2name>
...
</schema2name>
...
</dbname>

trong nh x s l nh trn.
Nh mt v d s dng u ra c cc hm to ra, Hnh 9-1 ch mt bng kiu XSLT m bin
i u ra ca table_to_xml_and_xmlschema thnh mt ti liu HTML c cha mt s tr v dng
bng cc d liu bng . Theo cch thc tng t, cc kt qu t cc hm c th c bin i
thnh cc nh dng khc da vo XML.
Hnh 9-1. Bng XSLT cho vic bin i u ra SQL/XML thnh HTML
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.w3.org/1999/xhtml"
>
<xsl:output method="xml"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
doctype-public="-//W3C/DTD XHTML 1.0 Strict//EN"
indent="yes"/>
<xsl:template match="/*">
<xsl:variable name="schema" select="//xsd:schema"/>
<xsl:variable name="tabletypename"
select="$schema/xsd:element[@name=name(current())]/@type"/>
<xsl:variable name="rowtypename"
select="$schema/xsd:complexType[@name=$tabletypename]/xsd:sequence/xsd:<html>
<head>
<title><xsl:value-of select="name(current())"/></title>
</head>
<body>
<table>
<tr>
<xsl:for-each select= "$schema/xsd:complexType[@name=$rowtypename]/xsd:sequence/
<th> <xsl:value-of select="."/></th>
</xsl:for-each>
</tr>
<xsl:for-each select="row">
<tr>
<xsl:for-each select="*">
<td><xsl:value-of select="."/></td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</body>

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 243/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

</html>
</xsl:template>
</xsl:stylesheet>

9.15. Hm iu khin s tun t


Phn ny m t cc hm PostgreSQL vn hnh trong cc i tng tun t. Cc i tng tun
t (cn c gi l cc b sinh tun t hoc ch n thun l cc tun t) l cc bng c bit 1
hng duy nht c to ra bng lnh CREATE SEQUENCE. Mt i tng tun t thng c s
dng sinh ra cc m nh danh duy nht cho cc hng ca mt bng. Cc hm tun t, c lit
k trong Bng 9-39, a ra cc phng php n gin, an ton cho ngi s dng c c cc
gi tr tun t thnh cng t cc i tng tun t.
Bng 3-39. Cc hm tun t
Hm

Dng tr v

M t

currval(regclass)

bigint

Tr v gi tr c gn y nht vi nextval cho tun t c ch nh

lastval()

bigint

Tr v gi tr c gn y nht vi nextval cho bt k tun t no

nextval(regclass)

bigint

Tun t tin tin v tr v gi tr mi

setval(regclass, bigint)

bigint

Thit lp gi tr hin hnh ca tun t

setval(regclass, bigint, boolean) bigint

Thit lp gi tr hin hnh ca tun t v c is_called

Tun t s c vn hnh bng mt hm tun t c mt i s regclass ch nh, n n gin l


mt OID ca s tun t trong catalog h thng pg_class. Tuy nhin, bn khng phi tra cu bng tay
OID v trnh bin i u vo dng d liu regclass s thc hin cng vic cho bn. Ch vit tn
s tun t c a vo trong cc du ngoc n sao cho n trng ging nh mt hng k t. i
vi tnh tng thch vi vic iu khin cc tn SQL thng thng, chui s c bin i thnh
cc ch thng, tr phi n c cc du ngoc kp xung quanh tn tun t. V th:
nextval(foo) operates on sequence foo
nextval(FOO) operates on sequence foo
nextval("Foo") operates on sequence Foo

Tn ca s tun t c th c nh tnh theo s nu cn thit:


nextval(myschema.foo) operates on myschema.foo
nextval("myschema".foo) same as above
nextval(foo) searches search path for foo

Xem Phn 8.16 c thm thng tin v regclass.


Lu : Trc phin bn PostgreSQL 8.1, cc i s ca cc hm tun t tng l dng text,
khng phi regclass, v bin i c m t trn t mt chui vn bn thnh mt gi tr
OID c th xy ra trong thi gian thc trong tng li gi. V tnh tng hp ngc, c s
ny vn tn ti, nhng trong ni b n by gi c iu khin nh mt s cng p ngm
t text ti regclass trc khi hm c gi.
Khi bn vit i s ca mt hm tun t nh mt chui k t khng c trang tr, th n tr
thnh mt hng dng regclass. V iu ny thc s ch l mt OID, n s di theo s tun t

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 244/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

c nhn din ban u bt chp vic i tn, ti ch nh s sau ny... Hnh vi rng
buc sm ny thng l mong mun cho cc tham chiu tun t trong cc mc nh ct v
cc kiu nhn. Nhng i khi bn c th mun rng buc sau nhng ni tham chiu tun
t c gii quyt trong thi gian thc. c c hnh vi rng buc sau, hy p hng s
phi c lu gi nh mt hng s text thay v regclass:
nextval(foo::text) foo is looked up at runtime

Lu rng rng buc sau tng ch l hnh vi c cc phin bn PostgreSQL trc 8.1 h
tr, nn bn c th cn phi lm iu ny gi li cc ng ngha ca cc ng dng c.
Tt nhin, i s ca mt hm tun t c th l mt biu thc cng nh mt hng s. Nu n
l mt biu thc vn bn th s cng p ngm s gy ra mt s tra cu thi gian thc.
Cc hm tun t c sn l:
nextval

Thc y i tng tun t ti gi tr tip sau ca n v tr v gi tr . iu ny c thc


hin mt cch t ng: thm ch nu nhiu phin thc thi nextval cng mt lc, tng phin
s an ton nhn c mt gi tr tun t ring bit.
currval

Tr v gi tr gn y nht c c bng nextval cho tun t ny trong phin hin hnh. (Mt
li c bo co nu nextval cha bao gi tng c gi cho tun t trong phin ny). V
iu ny ang tr v mt gi tr phin cc b, n trao mt cu tr li c th on trc c
liu c hay khng cc phin khc thc thi nextval k t khi phin hin hnh thc hin.
lastval

Tr v gi tr gn y nht c tr v bng nextval trong phin hin hnh. Hm ny l y ht


vi currval, ngoi tr rng thay v ly tn tun t nh mt i s th n ly gi tr ca tun t
cui cng c nextval s dng trong phin hin hnh. y l mt li gi lastval nu nextval
cn cha c gi trong phin hin hnh.
setval

Thit lp li gi tr tnh i tng tun t. Dng 2 tham s thit lp trng last_value ca s


tun t cho gi tr c ch nh v thit lp trng is_called ca n thnh ng (true), ngha
l nextval tip theo s thc y s tun t trc vic tr v mt gi tr. Gi tr c currval
nu cng c thit lp ti gi tr c ch nh. dng 3 tham s, is_called c th c
thit lp hoc v ng (true) hoc v sai (false). true c cng hiu ng nh dng 2 tham s.
Nu n c thit lp thnh sai (false), th nextval tip sau s tr v chnh xc gi tr c
ch nh, v s thc y tun t bt u bng nextval sau. Hn na, gi tr c currval nu
khng b thay i trong trng hp ny (y l mt thay i t hnh vi phin bn trc 8.3).
V d,

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 245/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

SELECT setval(foo, 42); Next nextval will return 43


SELECT setval(foo, 42, true); Same as above
SELECT setval(foo, 42, false); Next nextval will return 42

Kt qu c setval tr v ch l gi tr ca i s th 2 ca n.
Nu mt i tng tun t tng c to ra vi cc tham s mc nh, th cc li gi nextval tip
sau s tr v cc gi tr tip sau bt u bng 1. Cc hnh vi khc c th c c bng vic s dng
cc tham s c bit trong lnh CREATE SEQUENCE; xem trang tham chiu lnh ca n c thm
thng tin.
Quan trng: trnh vic kha cc giao dch ng thi m c c cc s t cng y ht s
tun t, mt hot ng nextval l khng bao gi quay ngc li c; l, mt khi mt gi
tr tng c ly th n c xem l c s dng, thm ch nu giao dch m lm cho
nextval sau hng. iu ny c ngha l cc giao dch b hng c th li cc l hng
khng c s dng trong tun t ca cc gi tr c ch nh. Cc hnh ng ca setval
cng khng bao gi quay ngc tr li c.

9.16. Biu thc iu kin


Phn ny m t cc biu thc iu kin tun th SQL c sn trong PostgreSQL.
Mo: Nu nhu cu ca bn vt ra khi cc tng thch ca cc biu thc iu kin , th
bn c th mun xem xt vic vit mt th tc c lu li trong mt ngn ng lp trnh c
ngha hn.

9.16.1. CASE
Biu thc SQL CASE l mt biu thc iu kin chung, tng t nh cc lnh if/else trong cc ngn
ng lp trnh khc:
CASE WHEN condition THEN result
[WHEN ...]
[ELSE result]
END

Cc mnh CASE c th c s dng bt k u mt biu thc l hp l. Tng iu kin


condition l mt biu thc tr v mt kt qu boolean. Nu kt qu iu kin l ng, th gi tr ca
biu thc CASE l kt qu m tun theo iu kin , v phn cn li ca biu thc CASE khng
c x l na. Nu kt qu iu kin l khng ng, th bt k mnh WHEN tip sau no cng s
c xem xt theo cch thc y ht. Nu khng c iu kin WHEN no l ng, th gi tr ca biu
thc CASE l kt qu ca mnh ELSE. Nu mnh ELSE b m v khng iu kin no l ng,
th kt qu l null. Mt v d:
SELECT * FROM test;
a
--1
2
3
SELECT a,
CASE WHEN a=1 THEN one

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 246/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

WHEN a=2 THEN two


ELSE other
END
FROM test;
a | case
---+------1 | one
2 | two
3 | other

Cc dng d liu ca tt c cc biu thc kt qu phi c kh nng bin i thnh mt dng u ra


duy nht. Xem Phn 10.5 c thm chi tit.
C mt dng n gin biu thc CASE m l mt phng n ca dng chung trn:
CASE expression
WHEN value THEN result
[WHEN ...]
[ELSE result]
END

Biu thc u tin c tnh ton, ri c so snh vi tng trong s cc biu thc gi tr value
trong cc mnh WHEN cho ti khi mt gi tr c tm thy m bng n. Nu khng s trng
khp no c tm thy, th kt qu ca mnh ELSE (hoc mt gi tr null) c tr v. iu ny
l tng t vi lnh switch trong C.
V d trn c th c vit bng vic s dng c php CASE n gin:
SELECT a,
CASE a WHEN 1 THEN one
WHEN 2 THEN two
ELSE other
END
FROM test;
a | case
---+------1 | one
2 | two
3 | other

Mt biu thc CASE khng c lng c bt k biu thc con no m khng cn thit xc nh
kt qu.
V d, y l cch thc c kh nng trnh mt li chia cho 0:
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;

9.16.2. COALESCE
COALESCE(value [, ...])

Hm COALESCE tr v trc ht cc i s ca n m khng l null. Null ch c tr v nu tt c


cc i s l null. N thng c s dng thay th mt gi tr mc nh i vi cc gi tr null
khi d liu c truy xut hin th, v d:
SELECT COALESCE(description, short_description, (none)) ...

Ging nh biu thc

CASE, COALESCE

ch nh gi cc i s cn thit xc nh kt qu; l,

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 247/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

cc i s bn phi ca i s khng null u tin s khng c nh gi. Hm tiu chun SQL


ny a ra cc kh nng tng t nh NVL v IFNULL, chng c s dng trong mt s h thng c
s d liu khc.

9.16.3. NULLIF
NULLIF(value1, value2)

Hm NULLIF tr v mt gi tr null nu value1 bng value2; nu khng th n tr v value1. iu ny


c th c s dng thc hin hnh ng ngc li ca v d COALESCE c a ra trn:
SELECT NULLIF(value, (none)) ...

Trong v d ny, nu gi tr value l (none), th null s c tr v, nu khng th gi tr ca


c tr v.

value

9.16.4. GREATEST v LEAST


GREATEST(value [, ...])

LEAST(value [, ...])

Cc hm GREATEST v LEAST la chn gi tr ln nht hoc nh nht t mt danh sch bt k s


lng no cc biu thc. Cc biu thc tt c phi tng thch vi mt dng d liu chung, n s l
dng ca kt qu (xem Phn 10.5 c cc chi tit). Cc gi tr null trong danh sch s b b qua.
Kt qu s l NULL ch nu tt c cc biu thc nh gi v NULL.
Lu rng GREATEST v LEAST khng phi l tiu chun SQL, nhng l mt m rng chung. Mt s
c s d liu khc lm cho chng tr v NULL nu bt k i s no l NULL, thay v ch khi tt c
l NULL.

9.17. Hm v ton t mng


Bng 9-40 ch ra cc ton t sn sng cho cc dng mng.
Bng 9-40. Cc ton t mng
Ton t

M t

V d

Kt qu

bng

ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3] t

<>

khng bng

ARRAY[1,2,3] <> ARRAY[1,2,4]

<

nh hn

ARRAY[1,2,3] < ARRAY[1,2,4]

>

ln hn

ARRAY[1,4,3] > ARRAY[1,2,4]

<=

nh hn hoc bng

ARRAY[1,2,3] <= ARRAY[1,2,3]

>=

ln hn hoc bng

ARRAY[1,4,3] >= ARRAY[1,4,3]

@>

bao gm

ARRAY[1,4,3] @> ARRAY[3,1]

<@

nm trong

ARRAY[2,7] <@ ARRAY[1,7,4,2,6]

&&

chng ln (c cc phn t chung)

ARRAY[1,4,3] && ARRAY[2,1]

||

ghp ni mng vi mng

ARRAY[1,2,3] || ARRAY[4,5,6]

{1,2,3,4,5,6}

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 248/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Ton t

M t

Xut bn nm 2013

V d

Kt qu

||

ghp ni mng vi mng

ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]]

{{1,2,3},{4,5,6},{7,8,9}}

||

ghp ni phn t vi mng

3 || ARRAY[4,5,6]

{3,4,5,6}

||

ghp ni mng vi phn t

ARRAY[4,5,6] || 7

{4,5,6,7}

Cc so snh mng so snh cc ni dung mng phn t vi phn t, bng vic s dng hm so snh
cy B (B-tree) mc nh cho dng d liu phn t. Trong cc mng a chiu, cc phn t c
ving thm theo trt t hng chnh (subscript cui cng khc nhanh nht). Nu cc ni dung ca 2
mng bng nhau nhng khc nhau v chiu, th s khc bit u tin trong thng tin theo chiu xc
nh trt t sp xp. (y l s thay i t cc phin bn ca PostgreSQL trc 8.2: cc phin bn
c hn c th ni rng 2 mng vi cng ni dung l bng nhau, thm ch nu s lng cc chiu
hoc cc di subscript l khc nhau).
Xem Phn 8.14 c cc chi tit v hnh vi ca ton t mng.
Bng 9-41 ch ra cc hm sn sng s dng vi cc dng mng. Xem Phn 8.14 c thm
thng tin v cc v d s dng cc hm .
Bng 9-41. Cc hm mng
Hm

Dng tr v

M t

V d

Kt qu

array_append(anyarr anyarray
ay,
anyelement)

ni mt phn t vo cui mt array_append(ARRAY[1,2], 3) {1,2,3}


mng

array_cat(anyarray,
anyarray)

ghp 2 mng

array_cat(ARRAY[1,2,3],
ARRAY[4,5])

{1,2,3,4,5}

array_ndims(anyarra int
y)

tr v s chiu ca mng

array_ndims(ARRAY[[1,2,3],
[4,5,6]])

array_dims(anyarray) text

tr v mt i din vn bn cc array_dims(ARRAY[[1,2,3],
chiu ca mng
[4,5,6]])

[1:2][1:3]

array_fill(anyelement anyarray
,
int[], [, int[]])

tr v mng c khi to vi array_fill(7, ARRAY[3],


gi tr v cc chiu c cung ARRAY[2])
cp, hp l vi cc rng buc
thp hn khc 1

[2:4]={7,7,7}

array_length(anyarra int
y,
int)

tr v chiu di chiu mng array_length(array[1,2,3], 1)


c yu cu

array_lower(anyarray int
, int)

tr v rng buc thp hn chiu array_lower([0:2]={1,2,3}::i 0


mng c yu cu
nt[], 1)

array_prepend(anyel anyarray
ement, anyarray)

ni phn t vo u ca mng

array_to_string(anyar text
ray, text)

ghp cc phn t mng bng s array_to_string(ARRAY[1, 2,


dng phn cch c cung cp 3], ~^~)

array_upper(anyarray int
, int)

tr v rng buc trn hn cc array_upper(ARRAY[1,2,3,4], 4


chiu mng c yu cu
1)

anyarray

array_prepend(1,
ARRAY[2,3])

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

{1,2,3}
1~^~2~^~3

Trang 249/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Hm

Dng tr v

M t

Xut bn nm 2013
V d

Kt qu

string_to_array(text,
text)

text[]

chia chui thnh cc phn t string_to_array(xx~^~yy~^~z {xx,yy,zz}


mng bng vic s dng phn z, ~^~)
cch c cung cp

unnest(anyarray)

setof

bt k phn t no m rng mt unnest(ARRAY[1,21]2)


mng ti mt tp hp cc hng

(2 rows)

Xem Phn 9.18 v hm tng hp array_agg s dng vi cc mng.

9.18. Hm tng hp
Cc hm tng hp (aggregate function) tnh ton mt kt qu duy nht t mt tp hp cc gi tr
u vo. Cc hm tng hp c xy dng sn c lit k trong Bng 9-42 v Bng 9-43. Cc cn
nhc c php c bit cho cc hm tng hp c gii thch trong Phn 4.2.7. Hy xem thm Phn
2.7 c thng tin gii thiu b sung.
Bng 9-42. Cc hm tng hp mc ch chung
Hm

(Cc) dng i s

array_agg(expression) bt k

Dng tr v
mng dng ca i s

M t
cc gi tr u vo, bao gm c
null, c ghp trong mt mng

avg(expression)

smallint, int, bigint, real, numeric tho bt k i s dng trung bnh (trung bnh s hc)
double precision,
integer no, double precision cho ca tt c cc gi tr u vo
numeric, hoc interval
mt i s du thp phn, nu
khng th y ht nh dng d liu
ca i s

bit_and(expression)

smallint, int, bigint, hoc ht nh dng d liu ca i s


bit

AND theo bit i vi tt c cc


gi tr u vo khng null, hoc
null nu c mt gi tr nh vy

bit_or(expression)

smallint, int, bigint, hoc ht nh dng d liu ca i s


bit

OR theo bit i vi tt c cc
gi tr u vo khng null, hoc
null nu c mt gi tr nh vy

bool_and(expression) bool

bool

ng (true) nu cc gi tr u
vo true, nu khng l sai (false)

bool_or(expression)

bool

true nu t nht mt gi tr u
vo l true, nu khng l false

bigint

s lng cc hng u vo

bool

count(*)
count(expression)

any

bigint

s lng cc hng u vo theo


gi tr biu thc khng null

every(expression)

bool

bool

tng ng vi bool_and

max(expression)

any array, numeric,


string, or date/time type

y ht nh dng ca i s

gi tr cc i ca biu thc
khp tt c cc gi tr u vo

min(expression)

any array, numeric,


string, or date/time type

y ht nh dng ca i s

gi tr cc tiu ca biu thc


khp tt c cc gi tr u vo

text

cc gi tr u vo c ghp
trong mt chui, tch bch nhau

string_agg(expression text, text


, delimiter)

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 250/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Hm

(Cc) dng i s

Xut bn nm 2013

Dng tr v

M t
bng cc du ngt

sum(expression)

smallint, int, bigint, real, bigint cho cc i s smallint tng biu thc khp tt c cc
double precision,
hoc int, numeric cho cc i s gi tr u vo
numeric, hoc interval
bigint, double precision cho cc
i s cc du phn cch, nu
khng th y ht nh dng d liu
ca i s

xmlagg(expression)

xml

xml

ghp ni cc gi tr XML (xem


thm Phn 9.14.1.7)

c lu rng ngoi tr i vi count, cc hm tr v mt gi tr null khi khng hng no c


chn. c bit, sum ca khng hng no s tr v null, khng phi l 0 nh ai c th k vng, v
array_agg tr v null thay v mt mng rng khi khng c cc hng u vo. Hm coalesce c th
c s dng thay th 0 hoc mt mng rng cho null khi cn thit.
Lu : Boolean tng hp bool_and v bool_or tng ng vi cc tng hp SQL every v any
hoc some. Nh i vi any v some, dng nh l c mt s m m c xy dng trong c
php tiu chun:
SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;

y ANY c th c xem hoc nh vic gii thiu mt truy vn con, hoc nh ang l mt
hm tng hp, nu truy vn con tr v mt hng vi mt gi tr Boolean. V th tn tiu
chun khng th c a ra cho cc tng hp .
Lu : Ngi s dng quen lm vic vi cc h qun tr c s d liu SQL khc c th
tht vng v hiu nng ca tng hp count khi m n c p dng cho ton b bng. Mt
truy vn nh:
SELECT count(*) FROM sometable;

s c PostgreSQL thc thi bng vic s dng mt s qut tun t ton b bng.
Cc hm tng hp array_agg, string_agg v xmlagg, cng nh cc hm tng hp tng t do ngi
s dng nh ngha, to ra cc gi tr kt qu c ngha khc nhau, ph thuc vo trt t ca cc gi
tr u vo. Trt t ny c ch nh mc nh, nhng c th c kim sot bng vic vit mt
mnh ORDER BY bn trong li gi tng hp , nh c ch ra trong Phn 4.2.7. Nh mt s la
chn, vic cung cp cc gi tr u vo t mt truy vn con c sp xp thng s lm vic. V d:
SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;

Nhng c php ny l khng c php trong tiu chun SQL, v khng kh chuyn c cho cc
h thng c s d liu khc.
Bng 9-43 ch ra cc hm tng hp thng c s dng trong phn tch cc s thng k (chng
c tch bch nhau ch trnh vic hn n danh sch cc tng hp c s dng ph bin hn).
nhng ni m m t nhc ti N, n c ngha l s lng cc hng u vo theo tt c cc biu

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 251/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

thc u vo l khng null. Trong tt c mi trng hp, null c tr v nu cu hnh l khng c


ngha, v d khi N l 0.
Bng 9-43. Cc hm tng hp cho thng k
Hm

Dng i s

Dng tr v

M t

corr(Y, X)

double precision

double precision

h s tng quan

covar_pop(Y, X)

double precision

double precision

hip phng
covariance)

covar_samp(Y, X)

double precision

double precision

phng sai mu

regr_avgx(Y, X)

double precision

double precision

trung bnh phng sai c lp


(sum(X)/N)

regr_avgy(Y, X)

double precision

double precision

trung bnh bin c lp (sum(Y)/N)

regr_count(Y, X)

double precision

bigint

s hng u vo theo c 2 biu


thc l khng null

regr_intercept(Y, X)

double precision

double precision

giao ct trc y phng trnh tuyn


tnh cc bnh phng nh nht va
khp c cc cp (X, Y) xc nh

regr_r2(Y, X)

double precision

ouble precision

dsquare ca h s tng quan

regr_slope(Y, X)

double precision

double precision

dc phng trnh tuyn tnh cc


bnh phng nh nht va khp
c cc cp (X, Y) xc nh

regr_sxx(Y, X)

double precision

double precision

sum(X^2) - sum(X)^2/N (tng cc


bnh phng ca bin c lp)

regr_sxy(Y, X)

double precision

double precision

sum(X*Y) sum(X) * sum(Y)/N


(tng cc sn phm ca bin ph
thuc theo thi gian c lp)

regr_syy(Y, X)

double precision

double precision

sum(Y^2) - sum(Y)^2/N (tng


bnh phng ca bin ph thuc)

stddev(expression)

smallint, int, bigint, real,


double precision, hoc
numeric

double precision cho cc


alias theo lch s cho stddev_samp
i s du chm ng, nu
khng th l numeric

sai

(population

stddev_pop(expression) smallint, int, bigint, real,


double precision, hoc
numeric

double precision cho cc


hip phng sai tiu chun ca cc
i s du chm ng, nu gi tr u vo
khng th l numeric

stddev_samp(expressio smallint, int, bigint, real,


n)
double precision, hoc
numeric

double precision cho cc


phng sai mu tiu chun ca cc
i s du chm ng, nu gi tr u vo
khng th l numeric

variance(expression)

smallint, int, bigint, real,


double precision, hoc
numeric

double precision cho cc


alias theo lch s cho var_samp
i s du chm ng, nu
khng th l numeric

var_pop(expression)

smallint, int, bigint, real,


double precision, hoc
numeric

double precision cho cc


hip phng sai ca cc gi tr u
i s du chm ng, nu vo (bnh phng ca hip phng
khng th l numeric
sai tiu chun)

var_samp(expression)

smallint, int, bigint, real,


double precision, hoc
numeric

double precision cho cc


phng sai mu ca cc gi tr u
i s du chm ng, nu vo (bnh phng phng sai mu
khng th l numeric
tiu chun)

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 252/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

9.19. Hm ca s
Cc hm ca s a ra kh nng thc hin cc tnh ton khp cc tp hp cc hng c lin quan ti
hng truy vn hin hnh. Xem Phn 3.5 c s gii thiu cho chc nng ny.
Cc hm ca s c xy dng sn c lit k trong Bng 9-44. Lu rng cc hm phi c
triu gi bng vic s dng c php cc hm ca s; l mt mnh OVER theo yu cu.
B sung thm vo cc hm , bt k hm tng hp c xy dng sn hoc do ngi s dng t
nh ngha no cng c th c s dng nh mt hm ca s (xem Phn 9.18 c mt danh sch
cc tng hp c xy dng sn ). Cc hm tng hp hnh ng nh cc hm ca s ch khi mt
mnh OVER i sau li gi; nu khng th chng hnh ng nh l cc tng hp thng thng.
Bng 9-44. Cc hm ca s mc ch chung
Hm

Dng tr v

M t

row_number()

bigint

s hng hin hnh trong phn vng ca n, tnh t 1

rank()

bigint

hng ca hng hin hnh vi cc khong cch; y ht nh row_number


im ngang hng u tin ca n

dense_rank()

bigint

hng ca hng hin hnh khng c khong cch; hm ny tnh cc nhm


ngang hng

percent_rank()

double precision hng tng i ca hng hin hnh: (hng - 1) / (tng s hng - 1)

cume_dist()

double precision hng tng i ca hng hin hnh: (s hng i trc hoc ngang hng
vi hng hin hnh) / (tng s hng)

ntile(num_buckets
integer)

integer

s nguyn xp t 1 ti gi tr i s, chia cho phn bng nhau c th

lag(value any [, offset


dng y ht nh
integer [, default any ]]) gi tr

tr v gi tr c nh gi trong hng m l cc hng b trc hng hin


hnh trong phn vng ; nu khng c hng no nh vy, th thay vo
tr v mc nh. C phn b v mc nh c nh gi vi lu cho
hng hin hnh. Nu b m, phn b mc nh l 1 v mc nh l 0

lead(value any [, offset dng y ht nh


integer [, default any ]]) gi tr

tr v gi tr c nh gi trong hng m l cc hng b sau hng hin


hnh trong phn vng ; nu khng c hng no nh vy, th thay vo
tr v mc nh. C phn b v mc nh c nh gi vi lu cho
hng hin hnh. Nu b m, phn b mc nh l 1 v mc nh l 0

first_value(value any)

dng y ht nh
gi tr

tr v gi tr c nh gi trong hng m l hng u tin ca khung ca


s

last_value(value any)

dng y ht nh
gi tr

tr v gi tr c nh gi trong hng m l hng cui ca khung ca s

nth_value(value any,
nth integer)

dng y ht nh
gi tr

tr v gi tr c nh gi hng m l hng th n ca khung ca s


(tnh t 1); null nu khng c hng no nh vy

Tt c cc hm c lit k trong Bng 9-44 ph thuc vo trt t sp xp c mnh ORDER BY


ca nh ngha ca s c lin quan, ch nh. Cc hng m khng phn bit trong trt t sp xp
ORDER BY s c ni l cc im ngang hng; 4 hm xp hng c xc nh sao cho chng a ra

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 253/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

cu tr li y ht cho bt k 2 hng ng hng no.


Lu rng first_value, last_value v nth_value ch xem xt cc hng bn trong khung ca s, m
mc nh bao gm cc hng t u ca phn vng qua s ngang hng cui cng ca hng hin
hnh. iu ny c kh nng a ra cc kt qu khng hu dng cho last_value v i khi c
nth_value. Bn c th ti xc nh khung bng vic b sung thm mt c t khung ph hp
(RANGE hoc ROWS) ti mnh OVER. Xem Phn 4.2.8 c thm thng tin v cc c t khung.
Khi mt hm tng hp c s dng nh mt hm ca s, n tng hp qua cc hng bn trong
khung ca s ca hng hin hnh. Mt s tng hp c s dng vi ORDER BY v nh ngha
khung ca s mc nh to ra mt dng hnh vi chy tng, n c th c hoc c th khng l
nhng g c mong mun. c c s tng hp i vi ton b phn , hy lm m ORDER BY
hoc s dng ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING . Cc c t
khc ca khung c th c s dng ginh c cc hiu ng khc.
Lu : Tiu chun SQL xc nh mt la chn RESPECT NULLS hoc IGNORE NULLS cho lead, lag,
first_value, last_value v nth_value. iu ny khng c trin khai trong PostgreSQL: hnh vi
lun l y ht nh mc nh tiu chun, y l RESPECT NULLS. Cng vy, la chn tiu chun
FROM FIRST hoc FROM LAST i vi nth_value khng c trin khai: ch hnh vi mc nh
FROM FIRST c h tr. (Bn c th t c kt qu ca FROM LAST bng vic lt ngc
li trt t sp xp ca ORDER BY).

9.20. Biu thc truy vn con


Phn ny m t cc biu thc truy vn con tun th SQL c sn trong PostgreSQL. Tt c cc mu
biu thc c ghi chp trong phn ny tr v cc kt qu Boolean (ng/sai true/false).

9.20.1. EXISTS
EXISTS (subquery)

i s ca EXISTS l mt lnh ty SELECT, hoc mt truy vn con. Truy vn con c nh gi


xc nh liu n c tr v bt k hng no hay khng. Nu n tr v t nht 1 hng, th kt qu ca
EXISTS l ng true; Nu truy vn ph khng tr v hng no, th kt qu ca EXISTS l sai false.
Truy vn con c th tham chiu ti cc bin t truy vn bao quanh, n s hnh ng nh cc hng
s trong bt k mt nh gi no ca truy vn con .
Truy vn con thng s ch c thc thi lu xc nh liu c t nht mt hng c tr v
hay khng, ch khng phi trn ng hon tt. L khng khn ngoan vit mt truy vn con m
c cc hiu ng ph (nh gi cc hm tun t); liu cc hiu ng ph xy ra c l khng th on
trc c hay khng.
V kt qu ch ph thuc vo liu c bt k hng no c tr v hay khng, v khng da vo cc
ni dung ca cc hng , danh sch u ra ca truy vn con thng l quan trng. Mt qui c
lp trnh chung l phi vit tt c cc kim th EXISTS dng EXISTS(SELECT 1 WHERE ...). Tuy nhin,

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 254/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

c cc ngoi l cho qui tc ny, nh cc truy vn con m s dng INTERSECT.


V d n gin ny ging nh mt kt ni bn trong col2, nhng n to ra nhiu nht mt hng
u ra cho tng hng ca tab1, thm ch nu c vi hng ca tab2 khp:
SELECT col1
FROM tab1
WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);

9.20.2. IN
expression IN (subquery)

Pha bn tay phi l mt truy vn con trong cc du ngoc n, n phi tr v chnh xc mt ct.
Biu thc bn tay tri c nh gi v c so snh vi tng hng kt qu ca truy vn con .
Kt qu ca IN l ng true nu bt k hng ca truy vn con no bng c tm thy. Kt qu l
sai false nu khng hng no bng c thy (bao gm c trng hp ni m truy vn con
khng tr v hng no c).
Lu rng nu biu thc bn tay tri cho ra null, hoc nu khng c cc gi tr bng no bn tay
phi v t nht mt hng bn tay phi c null, th kt qu ca cu trc IN s l null, ch khng phi
l false. iu ny l tun theo vi cc qui tc thng thng ca SQL cho cc kt hp Boolean ca
cc gi tr null.
Nh vi EXISTS, khng khn ngoan gi thit rng truy vn con s c nh gi hon chnh.
row_constructor IN (subquery)

Pha bn tay tri ca mu ny ca IN l mt cu trc hng, nh c m t trong Phn 4.2.12. Phn


bn tay phi l mt truy vn con trong cc du ngoc n, n phi tr v chnh xc cng nhiu ct
nh c cc biu thc hng bn tay tri. Cc biu thc bn tay tri c nh gi v c so snh
tng hng mt i vi kt qu ca truy vn con. Kt qu ca IN l true nu bt k hng ca truy
vn con bng nhau no c thy. Kt qu l false nu khng hng bng nhau no c thy (bao
gm c trng hp ni m truy vn con khng tr v hng no).
Nh thng l, cc gi tr null trong cc hng c kt hp theo cc qui tc thng thng ca cc
biu thc Boolean ca SQL. Hai hng c xem l bng nhau nu tt c cc thnh vin tng ng
ca chng l khng null v bng nhau; cc hng khng bng nhau nu bt k cc thnh vin tng
ng no l khng null v khng bng nhau; nu khng th kt qu ca s so snh hng l khng
r (null). Nu tt c cc kt qu theo hng hoc khng bng nhau hoc l null, vi t nht mt kt
qu null, th kt qu ca IN l null.

9.20.3. NOT IN
expression NOT IN (subquery)

Bn tay phi l mt truy vn con trong cc du ngoc n, n phi tr v chnh xc 1 ct. Biu thc
bn tay tri c nh gi v c so snh vi tng hng kt qu ca truy vn con . Kt qu ca
NOT IN l true nu ch cc hng khng bng nhau ca truy vn con c thy (bao gm c trng

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 255/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

hp ni m truy vn con khng tr v hng no). Kt qu l false nu bt k hng bng nhau


no c tm thy.
Lu rng nu biu thc bn tay tri cho null, hoc nu khng c cc gi tr bng nhau bn tay phi
v t nht mt hng bn tay phi cho null, th kt qu ca cu trc NOT IN s l null, ch khng phi
l true. iu ny l tun theo vi cc qui tc thng thng ca SQL cho cc kt hp Boolean ca
cc gi tr null.
Nh vi EXISTS, l khng khn ngoan gi thit rng truy vn con s c nh gi hon chnh.
row_constructor NOT IN (subquery)

Bn tay tri ca mu ny ca NOT IN l mt cu trc hng, nh c m t trong Phn 4.2.12. Bn


tay phi l mt truy vn con trong cc du ngoc n, n phi tr v chnh xc cng nhiu ct nh
c cc biu thc hng bn tay tri. Cc biu thc bn tay tri c nh gi v c so snh vi
tng hng ca kt qu truy vn con. Kt qu ca NOT IN l true nu ch cc hng truy vn con
khng bng nhau c tm thy (bao gm trng hp ni m truy vn con khng tr v hng
no). Kt qu l false nu bt k hng bng nhau no c tm thy.
Nh thng l, cc gi tr null trong cc hng c kt hp theo cc qui tc thng thng ca cc
biu thc Boolean SQL. Hai hng c xem l bng nhau nu tt c cc thnh vin tng ng ca
chng l khng null v bng nhau; cc hng l khng bng nhau nu bt k cc thnh vin tng
ng no l khng null v khng bng nhau; nu khng th kt qu ca so snh hng l khng r
(null). Nu tt c cc kt qu theo hng hoc khng bng nhau hoc l null, vi t nht mt kt qu
null, th sau kt qu ca NOT IN l null.

9.20.4. ANY/SOME
expression operator ANY (subquery)
expression operator SOME (subquery)

Bn tay phi l mt truy vn con trong cc du ngoc n, n phi tr v chnh xc mt ct. Biu
thc bn tay tri c nh gi v c so snh hng khn ngoan theo tng hng kt qu ca truy
vn con bng vic s dng operator c a ra, n phi cho mt kt qu Boolean. Kt qu ca ANY
l true nu bt k kt qu true no c c. Kt qu l false nu khng kt qu true no c
thy (bao gm trng hp ni m truy vn con khng tr v hng no).
SOME

l mt ng ngha vi ANY. IN l tng ng vi = ANY.

Lu l nu khng c thnh cng v t nht mt hng bn tay phi c null cho kt qu ca ton t
, th kt qu ca cu trc ANY s l null, khng phi l false. iu ny l tun theo vi cc qui tc
thng thng ca SQL i vi cc kt hp Boolean ca cc gi tr null.
Nh vi EXISTS, l khng khn ngoan gi thit rng truy vn con s c nh gi hon chnh.
row_constructor operator ANY (subquery)
row_constructor operator SOME (subquery)

Bn tay tri ca mu ny ca ANY l mt cu trc hng, nh c m t trong Phn 4.2.12. Bn tay

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 256/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

phi l mt truy vn con trong cc du ngoc n, n phi tr v chnh xc cng nhiu ct nh c


cc biu thc trong hng bn tay tri cng tt. Cc biu thc bn tay tri c nh gi v c so
snh hng khn ngoan theo tng hng kt qu ca truy vn con , bng vic s dng operator c
a ra. Kt qu ca ANY l true nu s so snh tr v true cho bt k hng truy vn con no.
Kt qu l false nu so snh tr v false cho tng hng ca truy vn con (bao gm c trng
hp ni m truy vn con khng tr v hng no). Kt qu l NULL nu so snh khng tr v
true cho bt k hng no, v n tr v NULL cho t nht mt hng.
Xem Phn 9.21.5 v cc chi tit v ngha ca mt so snh hng khn ngoan.

9.20.5. ALL
expression operator ALL (subquery)

Bn tay phi l mt truy vn con trong cc du ngoc n, n phi tr v chnh xc 1 ct. Biu thc
bn tay tri c nh gi v c so snh ti tng hng kt qu ca truy vn con bng vic s
dng operator c a ra, n phi cho mt kt qu Boolean. Kt qu ca ALL l true nu tt c
cc hng cho true (bao gm c trng hp ni m truy vn con khng tr v hng no). Cc kt
qu l false nu bt k kt qu false no c tm thy. Kt qu l NULL nu so snh khng
tr v false cho bt k hng no, v n tr v NULL cho t nht mt hng.
NOT IN

l tng ng vi <> ALL.

Nh vi EXISTS, l khng khn ngoan gi thit rng truy vn con s c nh gi hon chnh.
row_constructor operator ALL (subquery)

Bn tay tri ca mu ny ca ALL l mt cu trc hng, nh c m t trong Phn 4.2.12. Bn tay


phi l mt truy vn con trong cc du ngoc n, n phi tr v chnh xc cng nhiu ct nh c
cc biu thc hng bn tay tri cng tt. Cc biu thc bn tay tri c nh gi v c so snh
hng khn ngoan cho tng hng kt qu ca truy vn con, bng vic s dng operator c a ra.
Kt qu ca ALL l true nu so snh tr v true cho tt c cc hng ca truy vn con (bao
gm c trng hp ni m truy vn con khng tr v hng no). Kt qu l false nu so snh
tr v false cho bt k hng no ca truy vn con. Kt qu l NULL nu so snh khng tr v
false cho bt k hng truy vn con no, v n tr v NULL cho t nht mt hng.
Xem Phn 9.21.5 c cc chi tit v ngha ca mt so snh hng khn ngoan.

9.20.6. So snh hng khn ngoan


row_constructor operator (subquery)

Bn tay tri l mt cu trc hng, nh c m t trong Phn 4.2.12. Bn tay phi l mt truy vn
con trong cc du ngoc n, n phi tr v chnh xc cng nhiu ct nh c cc biu thc hng
bn tay tri cng tt. Hn na, truy vn con khng th tr v nhiu hn 1 hng. (Nu n khng tr
v hng no, th kt qu c ly l null). Bn tay tri c nh gi v c so snh hng khn
ngoan cho tng hng kt qu ca truy vn con duy nht.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 257/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Xem Phn 9.21.5 c cc chi tit v ngha ca mt so snh hng khn ngoan.

9.21. So snh hng v mng


Phn ny m t vi cu trc c bit cho vic tin hnh nhiu so snh gia cc nhm gi tr. Cc
mu c lin quan v c php i vi cc mu truy vn con ca phn trc, nhng khng c lin
quan ti cc truy vn con. Cc mu c lin quan ti cc biu thc con ca mng l cc m rng ca
PostgreSQL; phn cn li l tun th SQL. Tt c cc mu biu thc c ghi thnh ti liu trong
phn ny tr v cc kt qu Boolean (true/false).

9.21.1. IN
expression IN (value [, ...])

Bn tay phi l mt danh sch cc biu thc v hng trong cc du ngoc n. Kt qu l true
nu kt qu biu thc bn tay tri l bng vi bt k biu thc no bn tay phi. y l mt k hiu
tc k cho
expression = value1

OR

expression = value2

OR
...

Lu rng nu biu thc bn tay tri c null, hoc nu khng c cc gi tr bng nhau no bn tay
phi v t nht mt biu thc bn tay phi c null, th kt qu ca cu trc IN s l null, khng l
false. iu ny tun theo qui tc thng thng ca SQL v cc kt hp Boolean cc gi tr null.

9.21.2. NOT IN
expression NOT IN (value [, ...])

Bn tay phi l mt danh sch cc biu thc v hng trong cc du ngoc n. Kt qu l true
nu kt qu biu thc bn tay tri l bng vi tt c cc biu thc bn tay phi. y l mt k hiu
tc k cho
expression <> value1

AND

expression <> value2

AND
...

Lu rng nu biu thc bn tay tri cho null, hoc nu khng c gi tr bng nhau no bn tay
phi v t nht mt biu thc bn tay phi cho null, th kt qu ca cu trc NOT IN s l null, khng
ng nh bn c th ngy th k vng. iu ny l tun theo vi cc qui tc SQL thng thng cho
cc kt hp Boolean cc gi tr null.
Mo: x NOT IN y l tng ng vi NOT (x IN y) trong mi trng hp. Tuy nhin, cc gi tr
null ging hn nhiu ln ci mi khi lm vic vi NOT IN so vi khi lm vic vi IN. L tt
nht th hin iu kin ca bn mt cch tch cc nu c th.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 258/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

9.21.3. ANY/SOME (mng)


expression operator ANY (array expression)
expression operator SOME (array expression)

Bn tay phi l mt biu thc trong du ngoc n, n phi cho mt gi tr mng. Biu thc bn tay
tri c nh gi v c so snh vi tng phn t ca mng bng vic s dng operator c a
ra, n phi cho mt kt qu Boolean. Kt qu ca ANY l true nu bt k kt qu true no c c.
Kt qu l false nu khng kt qu true no c tm thy (bao gm c trng hp ni m mng
khng c phn t no).
Nu biu thc mng cho mt mng null, th kt qu ca ANY s l null. Nu biu thc bn tay tri
cho null, th kt qu ca ANY thng l null (d mt ton t so snh khng kht khe c th c kh
nng cho mt kt qu khc). Hn na, nu mng bn tay phi c bt k cc thnh phn null no v
kt qu so snh khng ng c c, th kt qu ca ANY vn s l null, khng phi l false (mt ln
na, gi thit mt ton t so snh kht khe). iu ny tun th vi cc qui tc SQL thng thng
cho cc kt hp Boolean ca cc gi tr null.
SOME

l mt ng ngha vi ANY.

9.21.4. ALL (mng)


expression operator ALL (array expression)

Bn tay phi l mt biu thc trong cc du ngoc n, n phi cho mt gi tr mng. Biu thc bn
tay tri c nh gi v c so snh vi tng phn t mng bng vic s dng operator c a
ra, n phi cho mt kt qu Boolean. Kt qu ca ALL l true nu tt c cc so snh cho l ng
(bao gm c trng hp ni m mng c cc phn t 0). Kt qu l false nu bt k kt qu sai
no c thy.
Nu biu thc mng cho mt mng null, th kt qu ca ALL s l null. Nu biu thc bn tay tri
cho null, th kt qu ca ALL thng l null (d mt ton t so snh khng kht khe c th c kh
nng cho mt kt qu khc). Hn na, nu mng bn tay phi c bt k phn t null no v kt qu
so snh khng ng c c, th kt qu ca ALL s l null, khng phi false (mt ln na, gi thit
mt ton t so snh kht khe). iu ny l tun th vi cc qui tc SQL thng thng cho cc kt
hp Boolean ca cc gi tr null.

9.21.5. So snh hng khn ngoan


row_constructor operator row_constructor

Tng bn l mt cu trc hng, nh c m t trong Phn 4.2.12. Hai gi tr hng phi c cng
s cc trng. Tng bn c nh gi v chng c so snh hng khn ngoan. Cc so snh hng
c php khi operator l = , <> , < , <= , > or >=, hoc c ng ngha tng t mt trong s .
(S l c bit, mt ton t c th l mt ton t so snh hng nu n l mt thnh vin ca mt lp
ton t B-tree, hoc l ph nh ca thnh vin = trong mt lp ton t B-tree).

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 259/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Cc trng hp = v <> lm vic kh khc nhau so vi cc trng hp khc. Hai hng c xem l
bng nhau nu tt c cc thnh vin tng ng ca chng l khng null v bng nhau; cc hng l
khng bng nhau nu bt k thnh vin tng ng no l khng null v khng bng nhau; nu
khng th kt qu ca so snh hng l khng r (null).
i vi cc trng hp <, <=, > v >=, cc phn t hng c so snh t tri qua phi, dng ngay
khi mt cp cc phn t khng bng nhau hoc null c thy. Nu hoc cp cc phn t ny l
null, th kt qu ca so snh hng l khng r (null); nu khng th so snh cp cc phn t ny xc
nh kt qu. V d, ROW(1,2,NULL) < ROW(1,3,0) cho true, khng phi null, v cp cc phn t th 3
s khng c xem xt.
Lu : Trc phin bn PostgreSQL 8.2, cc trng hp <, <=, > v >= tng khng c
c t SQL nm. Mt so snh nh ROW(a,b) < ROW(c,d) tng c trin khai nh l a < c AND b
< d, trong khi hnh vi ng l tng ng vi a < c OR (a = c AND b < d).
row_constructor IS DISTINCT FROM row_constructor

Cu trc ny ging vi mt so snh hng <>, nhng n khng cho null i vi cc u vo null.
Thay vo , bt k gi tr null no c xem l khng bng vi (khc vi) bt k gi tr khng null
no, v bt k 2 null no c xem l bng nhau (khng khc nhau). V th kt qu hoc s l true
hoc l false, khng bao gi null.
row_constructor IS NOT DISTINCT FROM row_constructor

Cu trc ny l tng t vi mt so snh hng =, nhng n khng cho null i vi cc u vo null.


Thay vo , bt k gi tr null no cng c xem l khng bng vi (khc vi) bt k gi tr
khng null no, v bt k 2 null no cng c xem l bng nhau (khng khc). V th kt qu s
lun hoc l true hoc l false, khng bao gi null.
Lu : c t SQL i hi so snh hng khn ngoan tr v NULL nu kt qu ph thuc
vo vic so snh 2 gi tr NULL hoc mt NULL v mt khng NULL. PostgreSQL ch lm
iu ny khi so snh cc kt qu ca 2 cu trc hng hoc so snh mt cu trc hng vi u
ra ca mt truy vn con (nh trong Phn 9.20). Trong cc ng cnh khc ni m 2 gi tr
dng tng hp c so snh, th 2 gi tr trng NULL c xem l bng nhau, v mt
NULL c xem l ln hn so vi mt khng NULL. iu ny l cn thit c hnh vi
ca vic sp xp v nh ch s nht qun cho cc dng tng hp.

9.22. Hm thit lp tr v
Phn ny m t cc hm c kh nng tr v nhiu hn mt hng. Hin hnh ch cc hm trong lp
ny l cc hm sinh lot, nh c chi tit ha trong Bng 9-45 v Bng 9-46.
Bng 9-45. Cc hm sinh lot
Hm

Dng i s

generate_series(start, int or bigint


stop)

Dng tr v

M t

setof int hoc setof bigint Sinh mt lot cc gi tr, t u ti khi


(ht nh dng i s)
dng vi bc kch c bng 1

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 260/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Hm

Dng i s

generate_series(start, int or bigint


stop, step)

Dng tr v

Xut bn nm 2013
M t

setof int hoc setof bigint Sinh mt lot cc gi tr, t u ti khi


(ht nh dng i s)
dng vi bc kch c bng bc.

generate_series(start, timestamp or timestamp setof timestamp hoc setof Sinh mt lot cc gi tr, t u ti khi
stop, step interval)
with time zone
timestamp with time zone dng vi bc kch c bng bc.
(ht nh dng i s)

Khi bc l dng, th cc hng 0 s c tr v nu bt u l ln hn so vi bc. Ngc li, khi


bc l m, cc hng 0 s c tr v nu bt u t hn so vi im dng. Cc hng 0 cng s
c tr v cho cc u vo NULL. L mt li cho bc s l 0. Mt s v d nh sau:
SELECT * FROM generate_series(2,4);
generate_series
----------------2
3
4
(3 rows)
SELECT * FROM generate_series(5,1,-2);
generate_series
----------------5
3
1
(3 rows)
SELECT * FROM generate_series(4,3);
generate_series
----------------(0 rows)

-- v d ny da vo ton t ngy thng cng vi s nguyn


SELECT current_date + s.a AS dates FROM generate_series(0,14,7) AS s(a);
dates
-----------2004-02-05
2004-02-12
2004-02-19
(3 rows)
SELECT * FROM generate_series(2008-03-01 00:00::timestamp,
2008-03-04 12:00, 10 hours);
generate_series
--------------------2008-03-01 00:00:00
2008-03-01 10:00:00
2008-03-01 20:00:00
2008-03-02 06:00:00
2008-03-02 16:00:00
2008-03-03 02:00:00
2008-03-03 12:00:00
2008-03-03 22:00:00

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 261/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

2008-03-04 08:00:00
(9 rows)

Bng 9-46. Cc hm sinh ra subscript


Hm

Dng tr v

M t

generate_subscripts(array anyarray,
dim int)

setof int

Sinh ra mt dy t cc subscript ca mng c a ra.

generate_subscripts(array anyarray,
dim int, reverse boolean)

setof int

Sinh ra mt dy cc subscript ca mng c a ra. Khi ngc


li l ng, th cc dy c tr v theo trt t ngc li.

l mt hm thun tin sinh ra tp hp cc subscript hp l c ch nh cho


chiu ca mng c a ra. Cc hng 0 c tr v cho cc mng m khng c chiu c yu
cu, hoc cc mng NULL (nhng cc subscript hp l c tr v cho cc phn t mng NULL).
Mt s v d nh sau:
generate_subscripts

-- s dng c bn
SELECT generate_subscripts({NULL,1,NULL,2}::int[], 1) AS s;
s
--1
2
3
4
(4 rows)

-- th hin mt mng, subscript v c subscript


-- gi tr i hi mt truy vn ph
SELECT * FROM arrays;
a
-------------------{-1,-2}
{100,200,300}
(2 rows)
SELECT a AS array, s AS subscript, a[s] AS value
FROM (SELECT generate_subscripts(a, 1) AS s, a FROM arrays) foo;
array
| subscript | value
---------------------+-------------+---------{-1,-2} |
1 | -1
{-1,-2} |
2 | -2
{100,200,300} |
1 | 100
{100,200,300} |
2 | 200
{100,200,300} |
3 | 300
(5 rows)
-- b lng mt mng 2D
CREATE OR REPLACE FUNCTION unnest2(anyarray)
RETURNS SETOF anyelement AS $$
select $1[i][j]
from generate_subscripts($1,1) g1(i),
generate_subscripts($1,2) g2(j);
$$ LANGUAGE sql IMMUTABLE;

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 262/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

CREATE FUNCTION
postgres=# SELECT * FROM unnest2(ARRAY[[1,2],[3,4]]);
unnest2
--------1
2
3
4
(4 rows)

9.23. Hm thng tin h thng


Bng 9-47 ch ra vi hm trch thng tin phin lm vic v h thng. B sung thm vo cc hm
c lit k trong phn ny, c mt s hm c lin quan ti h thng thng k cng cung cp thng
tin h thng. Xem Phn 27.2.2 c thm thng tin.
Bng 9-47. Cc hm thng tin phin
Hm

Dng tr v

M t

current_catalog

name

tn ca c s d liu hin hnh (gi l catalog theo tiu chun SQL)

current_database()

name

tn ca c s d liu hin hnh

current_schema[()]

name

tn ca c s d liu hin hnh

current_schemas(boolean) name[]

tn cc s trong ng tm kim, ty a vo cc s ngm nh

current_user

name

tn ca ngi s dng theo ng cnh thc thi hin hnh

current_query()

text

vn bn truy vn thc thi hin hnh, nh c my trm trnh (c th


cha nhiu hn mt lnh)

pg_backend_pid()

int

ID qui trnh ca tin trnh my ch c gn cho phin hin hnh

pg_listening_channels()

setof text

tn cc knh m phin ang nghe hin hnh

inet_client_addr()

inet

a ch ca kt ni t xa

inet_client_port()

int

cng ca kt ni t xa

inet_server_addr()

inet

a ch ca kt ni cc b

inet_server_port()

int

cng ca kt ni cc b

pg_my_temp_schema()

oid

OID ca s tm thi ca phin, hoc 0 nu khng c

pg_is_other_temp_schem boolean
a(oid)

l s ca s tm thi ca phin khc?

pg_postmaster_start_time timestamp with thi gian khi ng my ch


()
time zone
pg_conf_load_time()

timestamp with thi gian ti cu hnh


time zone

session_user

name

tn ngi s dng phin

user

name

tng ng vi current_user

version()

text

thng tin phin bn ca PostgreSQL

Lu : current_catalog, current_schema, current_user, session_user v user c tnh trng c php c

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 263/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

bit trong SQL: chng phi c gi m khng c cc du ngoc n i sau. (Trong


PostgreSQL, cc du ngoc n c th ty c s dng vi current_schema, nhng khng
vi cc th khc).
l thng thng m ngi s dng khi to kt ni c s d liu hin hnh; nhng
cc siu ngi s dng (superusers) c th thay i thit lp ny vi SET SESSION
AUTHORIZATION. current_user l m nh danh ngi s dng m c th p dng c cho vic
kim tra quyn. Thng th n l ngang bng vi ngi s dng phin, nhng n c th b thay i
vi SET ROLE. N cng thay i trong qu trnh thc thi cc hm vi thuc tnh SECURITY DEFINER.
Trong cch ni ca Unix, ngi s dng phin l ngi s dng thc s v ngi s dng hin
hnh l ngi s dng c hiu qu.
session_user

tr v tn ca s m l u tin trong ng tm kim (hoc mt gi tr null nu


ng tm kim l rng). y l s m s c s dng cho bt k bng no hoc cc i tng
c tn khc c to ra m khng c vic ch nh mt s ch. current_schemas(boolean) tr v
mt mng cc tn ca tt c cc s hin c trong ng tm kim. La chn boolean xc nh
liu c hay khng cc s h thng c ngm nh a vo nh pg_catalog c a vo trong
ng tm kim c tr v.
current_schema

Lu : ng tm kim c th c ty chnh theo thi gian chy. Lnh l:


SET search_path TO schema [, schema, ...]

tr v mt tp hp cc tn cc knh m phin hin hnh ang nghe. Xem


LISTEN c thm thng tin.
pg_listening_channels

tr v a ch IP ca my trm hin hnh, v inet_client_port tr v s cng.


inet_server_addr tr v a ch IP trong my ch chp nhn kt ni hin hnh, v
inet_server_port tr v s cng. Tt c cc hm tr v NULL nu kt ni hin hnh l thng qua
mt socket min Unix.
inet_client_addr

tr v OID ca s tm thi phin hin hnh, hoc 0 nu n khng c (v n


khng to ra bt k bng tm no). pg_is_other_temp_schema tr v true nu OID c a ra l
OID ca mt s tm ca phin khc. (iu ny c th c s dng, v d, loi tr cc bng
tm ca phin khc khi hin th trong mt catalog).
pg_my_temp_schema

pg_postmaster_start_time

tr v timestamp with time zone khi my ch c khi ng.

tr v timestamp with time zone khi cc tp cu hnh my ch c ti ln mi


nht. (Nu phin hin hnh l sng khi , th y s l thi gian khi bn thn phin c li cc
tp cu hnh, sao cho vic c s khc nhau mt cht trong cc phin khc nhau. Nu khng th y
l thi gian khi qui trnh ch (postmaster) c li cc tp cu hnh).
pg_conf_load_time

version

tr v mt chui m t phin bn my ch PostgreSQL.

Bng 9-48 lit k cc hm cho php ngi s dng truy vn cc quyn u tin truy cp i tng
lp trnh. Xem Phn 5.6 c thm thng tin v cc quyn u tin.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 264/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Bng 9-48. Cc hm yu cu quyn u tin truy cp


Hm

Dng
tr v

M t

has_any_column_privilege(user, table, privilege)

boolean ngi s dng c quyn u tin cho bt k ct no ca


bng

has_any_column_privilege(table, privilege)

boolean ngi s dng hin hnh c quyn u tin cho bt k


ct no ca bng

has_column_privilege(user, table, column, privilege) boolean ngi s dng c quyn u tin cho ct
has_column_privilege(table, column, privilege)

boolean ngi s dng hin hnh c quyn u tin cho ct

has_database_privilege(user, database, privilege)

boolean ngi s dng c quyn u tin cho c s d liu

has_database_privilege(database, privilege)

boolean ngi s dng hin hnh c quyn u tin cho c s


d liu

has_foreign_data_wrapper_privilege(user, fdw,
privilege)

boolean ngi s dng c quyn u tin cho trnh gi li d


liu bn ngoi

has_foreign_data_wrapper_privilege(fdw, privilege) boolean ngi s dng hin hnh c quyn u tin cho trnh
gi li d liu bn ngoi
has_function_privilege(user, function, privilege)

boolean ngi s dng c quyn u tin cho hm

has_function_privilege(function, privilege)

boolean ngi s dng hin hnh c quyn u tin cho hm

has_language_privilege(user, language, privilege)

boolean ngi s dng c quyn u tin cho ngn ng

has_language_privilege(language, privilege)

boolean ngi s dng hin hnh c quyn u tin cho ngn


ng

has_schema_privilege(user, schema, privilege)

boolean ngi s dng c quyn u tin cho s

has_schema_privilege(schema, privilege)

boolean ngi s dng hin hnh c quyn u tin cho s

has_server_privilege(user, server, privilege)

boolean ngi s dng c quyn u tin cho my ch ngoi

has_server_privilege(server, privilege)

boolean ngi s dng hin hnh c quyn u tin cho my


ch ngoi

has_sequence_privilege(user, sequence, privilege)

boolean ngi s dng c quyn u tin cho s tun t

has_sequence_privilege(sequence, privilege)

boolean ngi s dng hin hnh c quyn u tin cho s tun


t

has_table_privilege(user, table, privilege)

boolean ngi s dng c quyn u tin cho bng

has_table_privilege(table, privilege)

boolean ngi s dng hin hnh c quyn u tin cho bng

has_tablespace_privilege(user, tablespace, privilege) boolean ngi s dng c quyn u tin cho khng gian bng
has_tablespace_privilege(tablespace, privilege)

boolean ngi s dng hin hnh c quyn u tin cho khng


gian bng

pg_has_role(user, role, privilege)

boolean ngi s dng c quyn u tin cho vai tr

kim tra liu mt ngi s dng c th truy cp mt bng theo mt cch thc c
bit hay khng. Ngi s dng c th c ch nh bng tn hoc bng OID ( pg_authid.oid), hoc
nu i s b lm m current_user c gi thit. Bng c th c ch nh bng tn hoc bng
OID. (V th, thc s c 6 phng n ca has_table_privilege, n c th nh s lng dng cc i
s ca chng phn bit). Khi ch nh bng tn, th tn c th c nh tnh theo s nu cn
has_table_privilege

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 265/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

thit. Dng quyn u tin truy cp mong mun c ch nh bng mt chui vn bn, n phi nh
gi theo mt trong cc gi tr SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES hoc
TRIGGER. Nh mt s la chn, WITH GRANT OPTION c th c b sung vo mt dng quyn u
tin kim th liu quyn u tin c c gi vi la chn c trao hay khng. Hn na, cc
dng nhiu quyn u tin c th c lit k tch bch nhau bng du phy, trong trng hp kt
qu s l true nu bt k quyn u tin c lit k no c gi. (Trng hp chui quyn u tin
l khng ng k, v cc du trng tha ra c php gia nhng khng bn trong cc tn quyn
u tin). Mt s v d:
SELECT has_table_privilege(myschema.mytable, select);
SELECT has_table_privilege(joe, mytable, INSERT, SELECT WITH GRANT OPTION);

kim tra liu mt ngi s dng c th truy cp mt s tun t theo mt cch


thc c bit hay khng. Cc kh nng cho cc i s ca n l tng t nh has_table_privilege.
Dng quyn u tin truy cp mong mun phi nh gi vi mt trong s USAGE, SELECT hoc
UPDATE.
has_sequence_privilege

kim tra liu mt ngi s dng c th truy cp bt k ct no ca mt


bng theo mt cch thc c bit hay khng. Cc kh nng i s ca n l tng t vi
has_table_privilege, ngoi tr l dng quyn u tin truy cp mong mun phi nh gi mt s kt
hp ca SELECT, INSERT, UPDATE hoc REFERENCES. Lu rng vic c bt k cc quyn u tin
mc bng ngm trao n cho tng ct ca bng , nn has_any_column_privilege s lun tr v true
nu has_table_privilege lm v cc i s y ht. Nhng has_any_column_privilege cng thnh cng nu
c mt s trao mc ct quyn u tin cho t nht mt ct.
has_any_column_privilege

kim tra liu mt ngi s dng c th truy cp mt ct theo mt cch thc


c bit hay khng. Cc kh nng i s ca n l tng t vi has_table_privilege, vi s b sung
rng ct c th c ch nh hoc bng tn hoc s thuc tnh. Dng quyn u tin truy cp
mong mun phi nh gi vi mt s kt hp ca SELECT, INSERT, UPDATE hoc REFERENCES. Lu
rng vic c bt k quyn u tin mc bng ngm nh trao n cho tng ct ca bng .
has_column_privilege

kim tra liu mt ngi s dng c th truy cp c mt c s d liu theo


mt cch thc c bit hay khng. Cc kh nng i s ca n l tng t vi has_table_privilege.
Dng cc quyn u tin truy cp mong mun phi nh gi vi mt s kt hp ca CREATE,
CONNECT, TEMPORARY hoc TEMP (n l tng ng vi TEMPORARY).
has_database_privilege

kim tra liu mt ngi s dng c th truy cp mt hm theo mt cch thc


c bit hay khng. Cc kh nng i s ca n l tng t vi has_table_privilege. Khi ch nh mt
hm bng mt chui vn bn thay v bng OID, u vo c php l tn nh i vi dng d liu
regprocedure (xem Phn 8.16). Dng quyn u tin truy cp mong mun phi nh gi vi EXECUTE.
Mt v d l:
has_function_privilege

SELECT has_function_privilege(joeuser, myfunc(int, text), execute);

kim tra liu mt ngi s dng c th truy cp mt b ng gi


d liu ngoi theo mt cch c bit hay khng. Cc kh nng i s ca n l tng t vi
has_foreign_data_wrapper_privilege

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 266/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


has_table_privilege.

Xut bn nm 2013

Dng quyn u tin truy cp mong mun phi nh gi vi USAGE.

kim tra liu mt ngi s dng c th truy cp mt ngn ng th tc theo


mt cch thc c bit hay khng. Cc kh nng i s ca n l tng t vi has_table_privilege.
Dng quyn u tin truy cp mong mun phi nh gi vi USAGE.
has_language_privilege

kim tra liu mt ngi s dng c th truy cp mt s theo mt cch c


bit hay khng. Cc kh nng i s ca n l tng t vi has_table_privilege. Dng quyn u tin
truy cp mong mun phi nh gi vi mt s kt hp ca CREATE hoc USAGE.
has_schema_privilege

kim tra liu mt ngi s dng c th truy cp c mt my ch ngoi theo


mt cch c bit hay khng. Cc kh nng i s ca n l tng t vi has_table_privilege. Dng
quyn u tin truy cp mong mun phi nh gi theo USAGE.
has_server_privilege

kim tra liu mt ngi s dng c th truy cp mt khng gian bng theo
mt cch thc c bit hay khng. Cc kh nng i s ca n l tng t vi has_table_privilege.
Dng quyn u tin truy cp mong mun phi nh gi theo CREATE.
has_tablespace_privilege

kim tra liu mt ngi s dng c th truy cp mt vai tr theo mt cch c bit hay
khng. Cc kh nng i s ca n l tng t vi has_table_privilege. Dng quyn u tin truy cp
mong mun phi nh gi theo mt s kt hp ca MEMBER hoc USAGE. MEMBER biu th quan h
thnh vin trc tip hoc gin tip trong vai tr ( l, quyn thc hin SET ROLE), trong khi
USAGE biu th vic liu cc quyn u tin ca vai tr c sn sng ngay lp tc m khng phi
thc hin SET ROLE hay khng.
pg_has_role

Bng 9-49 ch ra cc hm xc nh liu mt i tng nht nh c l trc quan hay khng trong
ng tm kim s hin hnh. V d, mt bng c ni s l trc quan nu s bao gm ca
n l trong ng tm kim v khng c bng cng y ht tn no xut hin trc trong ng
tm kim . iu ny tng ng vi tuyn b rng bng c th c tham chiu ti bng tn
khng c kh nng s r rng. lit k cc tn ca tt c cc bng nhn thy c:
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

Bng 9-49. Cc hm i hi s trc quan s


Hm

Dng tr v

M t

pg_conversion_is_visible(conversion_oid) boolean

l bin i nhn thy trong ng tm kim

pg_function_is_visible(function_oid)

boolean

l hm nhn thy trong ng tm kim

pg_operator_is_visible(operator_oid)

boolean

l ton t nhn thy trong ng tm kim

pg_opclass_is_visible(opclass_oid)

boolean

l lp ton t nhn thy trong ng tm kim

pg_table_is_visible(table_oid)

boolean

l bng nhn thy trong ng tm kim

pg_ts_config_is_visible(config_oid)

boolean

l cu hnh tm kim vn bn nhn thy trong ng


tm kim

pg_ts_dict_is_visible(dict_oid)

boolean

l th mc tm kim vn bn nhn thy trong ng


tm kim

pg_ts_parser_is_visible(parser_oie)

boolean

l trnh phn tch tm kim vn bn nhn thy trong

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 267/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Hm

Xut bn nm 2013

Dng tr v

M t
ng tm kim

pg_ts_template_is_visible(templateoid)

boolean

l mu template tm kim vn bn nhn thy trong


ng tm kim

pg_type_is_visible(type_oid)

boolean

l dng (hoc min) nhn thy trong ng tm kim

Tng hm thc thi kim tra tnh trc quan cho mt dng i tng c s d liu. Lu rng
pg_table_is_visible cng c th c s dng vi cc kiu nhn, cc ch s v cc tun t;
pg_type_is_visible cng c th c s dng vi cc min. i vi cc hm v ton t, mt i
tng trong ng tm kim l nhn thy nu khng c i tng no cng tn y ht v (cc) dng
d liu ca i s trc trong ng tm kim. i vi cc lp ton t, c tn v phng php
truy cp ch s c lin quan c xem xt.
Tt c cc hm i hi cc OID i tng nhn din i tng s c kim tra. Nu bn
mun kim tra mt i tng theo tn, l thun tin s dng cc dng tn hiu (alias) OID
(regclass, regtype, regprocedure, regoperator, regconfig hoc regdictionary), v d:
SELECT pg_type_is_visible(myschema.widget::regtype);

Lu l c th khng c nhiu ngha kim th mt tn dng khng c nh tnh theo s


theo cch ny - nu tn c th c tha nhn, th n phi l nhn thy c.
Bng 9-50 lit k cc hm trch thng tin t cc catalog h thng.
Bng 9-50. Cc hm thng tin catalog h thng.
Tn

Dng tr
v

M t

format_type(type_oid, typemod)

text

c tn SQL ca mt dng d liu

pg_get_keywords()

setof record c danh sch cc t kha SQL v cc chng loi ca chng

pg_get_constraintdef(constrainoid)

text

c nh ngha ca mt rng buc

pg_get_constraintdef(constraint_oid,
pretty_bool)

text

c nh ngha ca mt rng buc

pg_get_expr(expr_text, relation_oid)

text

dch ngc mu ni b ca biu thc, gi thit l bt k Vars no


trong cng tham chiu ti quan h c tham s th 2 ch ra

pg_get_expr(expr_text, relation_oid,
pretty_bool)

text

dch ngc mu ni b ca biu thc, gi thit l bt k Vars no


trong cng tham chiu ti quan h c tham s th 2 ch ra

pg_get_functiondef(func_oid)

text

c nh ngha ca mt hm

pg_get_function_arguments(func_oid) text

c danh sch i s nh ngha hm (vi cc gi tr mc nh)

pg_get_function_identity_arguments(f text
unc_oid)

c danh sch i s nhn din hm (vi cc gi tr mc nh)

pg_get_function_result(func_oid)

text

c mnh RETURNS cho hm

pg_get_indexdef(index_oid)

text

c lnh CREATE INDEX cho ch s

pg_get_indexdef(index_oid,
column_no, pretty_bool)

text

c lnh CREATE INDEX cho ch s, hoc nh ngha ca ch


mt ct ch s khi column_no khng l 0

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 268/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


Tn
pg_get_ruledef(rule_oid)

Dng tr
v

Xut bn nm 2013
M t

text

c lnh CREATE RULE cho qui tc

pg_get_ruledef(rule_oid, pretty_bool) text

c lnh CREATE RULE cho qui tc

pg_get_serial_sequence(table_name,
column_name)

text

c tn s tun t m mt ct serial hoc bigserial s dng

pg_get_triggerdef(trigger_oid)

text

c lnh CREATE [ CONSTRAINT ] TRIGGER cho trigger

pg_get_triggerdef(trigger_oid,
pretty_bool)

text

c lnh CREATE [ CONSTRAINT ] TRIGGER cho trigger

pg_get_userbyid(role_oid)

name

c tn vai tr vi OID c a ra

pg_get_viewdef(view_name)

text

c lnh SELECT nm bn di xem (c yu cu)

pg_get_viewdef(view_name,
pretty_bool)

text

c lnh SELECT nm bn di xem (c yu cu)

pg_get_viewdef(view_oid)

text

c lnh SELECT nm bn di xem

pg_get_viewdef(view_oid,
pretty_bool)

text

c lnh SELECT nm bn di xem

pg_tablespace_databases(tablespace_o setof oid


id)

c tp hp cc OID c s d liu m c cc i tng trong


khng gian bng

pg_typeof(any)

c dng d liu ca bt k gi tr no

regtype

tr v tn dng d liu theo SQL c dng OID v c kh nng mt trnh sa i dng


ca n nhn din. Hy truyn NULL qua cho trnh sa i dng nu khng c trnh sa i c bit
no c bit.
format_type

tr v mt tp hp cc bn ghi m t cc t kha SQL c my ch tha nhn.


Ct word cha cc t kha. Ct catcode cha mt m chng loi: U cho khng c duy tr, C cho
tn ct, T cho dng hoc tn hm, hoc R cho c duy tr. Ct catdesc c mt chui c kh nng
bn a ha m t chng loi .
pg_get_keywords

v pg_get_triggerdef mt cch tng ng, ti to


li lnh to mt rng buc, ch s, qui tc hoc trigger. (Lu rng y l mt s ti to li c
bin dch ngc, khng phi vn bn lnh gc ban u). pg_get_expr dch ngc dng ni b ca
mt biu thc ring r, nh gi tr mc nh cho mt ct. C th l hu dng khi xem xt cc ni
dung ca cc catalog h thng. Nu biu thc c th cha cc Vars, hy ch nh OID ca quan
h m chng tham chiu ti nh l tham s th 2; nu khng Vars no c k vng, th 0 l .
pg_get_viewdef ti to truy vn SELECT m xc nh mt kiu nhn. Hu ht cc hm i vi 2 phng
n, mt trong s c th ty chn kt qu in kh. nh dng in c kh c c nhiu hn,
nhng nh dng mc nh l c kh nng hn c din gii theo cch y ht trong cc phin bn
trong tng lai ca PostgreSQL; trnh s dng u ra in c kh cho cc mc ch b (dump).
Vic truyn false qua cho tham s in c kh a ra kt qu y ht nh phng n m khng c
tham s hon ton.
pg_get_constraintdef, pg_get_indexdef, pg_get_ruledef

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 269/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

tr v mt lnh hon chnh CREATE OR REPLACE FUNCTION cho mt hm.


pg_get_function_arguments tr v danh sch i s ca mt hm, dng n c th cn xut hin
trong CREATE FUNCTION. pg_get_function_result tng t tr v mnh RETURNS ph hp cho hm
. pg_get_function_identity_arguments tr v danh sch i s cn thit nhn din mt hm,
dng n c th cn phi xut hin trong ALTER FUNCTION, v d th. Dng ny lm m cc gi tr
mc nh.
pg_get_functiondef

tr v tn ca tun t c lin quan ti mt ct, hoc NULL nu khng c s


tun t no c lin quan ti ct . Tham s u vo u tin l mt tn bng vi s ty chn, v
tham s th hai l mt tn ct. V tham s th nht tim tng l mt s v bng, n s khng
c i x nh mt m nh danh trong du ngoc kp, ngha l n dng cc ch thng mt
cch mc nh, trong khi tham s th 2, ch l tn mt ct, s c i x nh trong cc du ngoc
kp v gi li c dng ch ca n. Hm tr v mt gi tr c nh dng ph hp cho vic
truyn ti cc hm tun t (xem Phn 9.15). S lin quan ny c th c sa i hoc loi b bng
ALTER SEQUENCE OWNED BY. (Hm c kh nng s c gi l pg_get_owned_sequence; tn hin
hnh ca n phn nh thc t rng n thng c s dng vi cc ct serial hoc bigserial).
pg_get_serial_sequence

pg_get_userbyid

trch mt tn vai tr a ra OID ca n.

cho php mt khng gian bng s c kim tra. N tr v tp hp cc


OID cc c s d liu m c cc i tng c lu tr trong khng gian bng. Nu hm ny tr v
bt k hng no, th khng gian bng khng rng v khng th b loi b. hin th cc i tng
c bit a ra khng gian bng, bn s cn phi kt ni ti cc c s d liu c nhn din bng
pg_tablespace_databases v truy vn cc catalog pg_class ca chng.
pg_tablespace_databases

tr v OID dng d liu ca gi tr c truyn qua n. iu ny c th l hu dng cho


vic x l s c hoc xy dng mt cch ng cc truy vn SQL. Hm c khai bo nh vic
tr v regtype, n l mt dng tn hiu OID (xem Phn 8.16); iu ny c ngha l n l y ht nh
mt OID cho cc mc ch so snh nhng hin th nh mt tn dng. V d:
pg_typeof

SELECT pg_typeof(33);
pg_typeof
----------integer
(1 row)
SELECT typlen FROM pg_type WHERE oid = pg_typeof(33);
typlen
-------4
(1 row)

Cc hm ch ra trong Bng 9-51 trch cc ch gii trc c lu gi vi lnh COMMENT.


Mt gi tr null c tr v nu khng ch gii no c th c tm thy cho cc tham s c ch
nh.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 270/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Bng 9-51. Cc hm thng tin ch gii


Tn

Dng
tr v

M t

col_description(table_oid, column_number)

text

c ch gii cho mt ct ca bng

obj_description(object_oid, catalog_name)

text

c ch gii cho mt i tng c s d liu

obj_description(object_oid)

text

c ch gii cho mt i tng c s d liu (c yu cu)

shobj_description(object_oid, catalog_name)

text

c ch gii cho mt i tng c s d liu c chia s

tr v ch gii cho mt ct ca bng, n c OID bng ca n v s ct ca n ch


nh. obj_description khng th c s dng cho cc ct ca bng v cc ct khng c cc OID ca
ring chng.
col_description

Mu 2 tham s ca obj_description tr v ch gii cho mt i tng c s d liu c OID v tn


ca catalog h thng cha n ch nh. V d, obj_description(123456,pg_class) c th truy xut ch
gii cho bng vi OID 123456. Mu mt tham s ca obj_description ch i hi OID i tng. N
c yu cu v khng c m bo rng OID l c nht xuyn khp catalog cc h thng khc
nhau; v th, ch gii sai c th c tr v.
c s dng ch ging nh obj_description ngoi tr n c s dng cho vic
truy xut cc ch gii v cc i tng c chia s. Mt s catalog l tng th cho tt c cc c s
d liu bn trong tng b v cc m t ca chng c lu gi cng bng cch tng th.
shobj_description

Cc hm c ch ra trong Bng 9-52 a ra thng tin giao dch my ch mt mu c th xut


c. S s dng chnh cc hm l xc nh cc giao dch no c thc hin gia 2 hnh
chp mn hnh.
Bng 9-52. Cc ID giao dch v cc hnh chp mn hnh
Tn

Dng tr v

M t

txid_current()

bigint

c ID giao dch hin hnh

txid_current_snapshot()

txid_snapshot c hnh chp mn hnh hin hnh

txid_snapshot_xmin(txid_snapshot) bigint

c xmin ca hnh chp mn hnh

txid_snapshot_xmax(txid_snapshot) bigint

c xmax ca hnh chp mn hnh

txid_snapshot_xip(txid_snapshot)

setof bigint

c cc ID giao dch ang tin trin trong hnh chp mn hnh

txid_visible_in_snapshot(bigint,
txid_snapshot)

boolean

l ID giao dch nhn thy c trong hnh chp mn hnh?


(khng s dng vi cc ids cc giao dch con)

Dng ID giao dch ni b (xid) l 32 bit rng v bao bc khong mi 4 t giao dch. Tuy nhin, cc
giao dch xut khu mt nh dng 64 bit m c m rng vi mt b m th k sao cho n
s khng bao quanh trong khi ang ci t. Dng d liu c cc hm s dng, txid_snapshot,
lu tr thng tin v kh nng nhn thy ID giao dch mt thi im c bit theo thi gian.
Cc thnh phn ca n c m t trong Bng 9-53.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 271/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Bng 9-53. Cc ch gii hnh chp mn hnh.


Tn

M t

xmin

ID giao dch sm nht (txid) m vn cn hot ng. Tt c cc giao dch sm hn s hoc c trnh v
nhn thy, hoc c quay tr ngc li v cht.

xmax

txid cn cha c k u tin. Tt c cc txids ln hn hoc bng th ny cn cha c khi ng vo thi


gian ca hnh chp mn hnh, v v th khng nhn thy.

xip_list txids tch cc vo thi im ca hnh chp mn hnh. Danh sch bao gm ch nhng txids tch cc gia xmin
v xmax; c th c cc txids tch cc cao hn so vi xmax. Mt txid m l xmin <= txid < xmax v khng
nm trong danh sch ny tng phc tp ri vo thi im ca hnh chp mn hnh, v v th hoc nhn thy
hoc cht ty theo tnh trng trnh ca n. Danh sch khng bao gm txids ca cc giao dch.

S din t vn bn ca txid_snapshot l xmin:xmax:xip_list. V d 10:20:10,14,15 ngha l


xmin=10, xmax=20, xip_list=10, 14, 15.

9.24. Hm qun tr h thng


Bng 9-54 ch ra cc hm sn sng truy vn v ty bin cc tham s cu hnh theo thi gian chy.
(run-time).
Bng 9-54. Cc hm thit lp cu hnh
Tn

Dng tr v

M t

current_setting(setting_name)

text

c gi tr ca thit lp hin hnh

set_config(setting_name, new_value, is_local)

text

thit lp tham s v tr v gi tr mi

Hm

current_setting

SHOW.

c gi tr hin hnh ca thit lp

setting_name.

N tng ng vi lnh SQL

Mt v d:

SELECT current_setting(datestyle);
current_setting
----------------ISO, MDY
(1 row)

thit lp tham s setting_name cho new_value. Nu is_local l true, th gi tr mi s ch


p dng cho giao dch hin hnh. Nu bn mun gi tr mi p dng cho phin hin hnh, hy s
dng false thay vo . Hm tng ng vi lnh SQL SET. Mt v d:
set_config

SELECT set_config(log_statement_stats, off, false);


set_config
-----------off
(1 row)

Hm c ch ra trong Bng 9-55 gi i cc tn hiu kim sot cho cc tin trnh khc ca my
ch. S dng cc hm b hn ch ch cho cc siu ngi s dng.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 272/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Bng 9-55. Cc hm nh tn hiu cho my ch


Tn
pg_cancel_backend(pid int)

Dng tr v
boolean

M t
Hon mt truy vn hin hnh phn ph tr (backend)

pg_terminate_backend(pid int) boolean

Kt thc mt phn ph tr

pg_reload_conf()

boolean

Lm cho cc tin trnh my ch ti li cc tp cu hnh ca chng.

pg_rotate_logfile()

boolean

Xoay tp lu k ca my ch

Tng trong s cc hm tr v true nu thnh cng v false nu l khc.


v pg_terminate_backend gi cc tn hiu (SIGINT hoc SIGTERM mt cch tng
ng) ti cc tin trnh phn ph tr (backend) c ID tin trnh xc nh. ID tin trnh ca mt
phn ph tr tch cc c th thy t ct procpid ca kiu nhn pg_stat_activity, hoc bng vic lit k
cc tin trnh postgres trn my ch (bng vic s dng ps trn Unix hoc Task Manager - Trnh
qun l tc v trn Windows).
pg_cancel_backend

gi mt tn hiu SIGHUP ti my ch, lm cho cc tp cu hnh s c tt c cc


tin trnh ca my ch ti li.
pg_reload_conf

nh tn hiu cho trnh qun l tp lu k chuyn ti mt tp u ra mi ngay


lp tc. iu ny ch lm vic khi b thu thp lu k c xy dng sn ri ang chy, v nu khc
th s khng c cc tin trnh con qun l tp lu k.
pg_rotate_logfile

Cc hm c ch ra trong Bng 9-56 h tr trong vic tin hnh cc sao lu trc tuyn. Cc hm
khng th c thc thi trong qu trnh phc hi. S dng 3 hm u tin b hn ch ch cho cc
siu ngi s dng (superusers).
Bng 9-56. Cc hm kim sot sao lu
Tn

Dng tr v

M t

pg_start_backup(label text [, fast


boolean ])

text

Chun b cho vic thc thi sao lu trc tuyn

pg_stop_backup()

text

Kt thc vic thc thi sao lu trc tuyn

pg_switch_xlog()

text

p chuyn sang mt tp lu k giao dch mi

pg_current_xlog_location()

text

C v tr vit lu k giao dch hin hnh

pg_current_xlog_insert_location()

text

C v tr chn lu k giao dch hin hnh

pg_xlogfile_name_offset(location text) text, integer Bin i chui v tr lu k giao dch thnh tn tp v phn b
thp phn byte trong tp
pg_xlogfile_name(location text)

text

Bin i chui v tr lu k thnh tn tp

chp nhn mt nhn ty do ngi s dng nh ngha cho sao lu. (Thng th
iu ny c th l tn theo tp dump sao lu s c lu tr). Hm vit mt tp nhn sao lu
(backup_label) vo th mc d liu ca b c s d liu , thc thi mt im kim tra, v sau
tr v cho vic khi u sao lu v tr lu k giao dch nh l vn bn. Ngi s dng c th b qua
pg_start_backup

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 273/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

gi tr kt qu ny, nhng n c cung cp trong trng hp iu l hu dng.


postgres=# select pg_start_backup(label_goes_here);
pg_start_backup
----------------0/D4445B8
(1 row)

C mt tham s la chn th 2 dng boolean. Nu true, n ch nh vic thc thi pg_start_backup


cng nhanh cng tt. iu ny p mt im kim tra ngay lp tc m s gy ra mt s tng t bin
trong cc hot ng I/O, lm chm li bt k truy vn ang ng thi thc thi no.
loi b tp nhn c pg_start_backup to ra, v to ra mt tp lch s sao lu trong
khu vc lu tr lu k giao dch. Tp lch s bao gm nhn c a ra cho pg_start_backup, cc
v tr bt u v kt thc lu k giao dch sao lu, v thi im bt u v kt thc s sao lu .
Gi tr tr v l v tr lu k giao dch kt thc ca s sao lu (n mt ln na c th b b qua).
Sau vic ghi li v tr kt thc, im chn lu k giao dch hin hnh c t ng tin n tp lu
k giao dch tip sau, sao cho tp lu k giao dch kt thc c th c lu tr ngay lp tc hon
tt sao lu.
pg_stop_backup

chuyn sang tp lu k giao dch tip sau, cho php tp hin hnh s c lu tr
(gi thit bn ang s dng vic lu tr lin tc). Gi tr tr v l v tr lu k giao dch kt thc +1
bn trong tp lu k giao dch va c hon tt. Nu cha tng c hot ng lu k giao dch no
k t s chuyn lu k giao dch cui cng, th pg_switch_xlog khng lm g c v tr v v tr ban
u tp lu k giao dch hin ang c s dng.
pg_switch_xlog

hin th v tr ghi lu k giao dch hin hnh trong cng mt nh dng c


cc hm trn s dng. Tng t, pg_current_xlog_insert_location hin th im chn lu k giao
dch hin hnh. im chn l kt thc logic ca lu k giao dch trong bt k s kin no,
trong khi v tr ghi l kt thc ca nhng g thc s tng c ghi ra t b nh m (buffer) ni b
ca my ch, v thng l nhng g bn mun nu bn c quan tm trong vic lu tr cc tp lu
k giao dch c hon tt mt phn. im chn c lm cho sn sng trc ht cho cc mc ch
g li ca my ch. Chng l c cc hot ng ch c v khng i hi cc quyn ca siu ngi
s dng.
pg_current_xlog_location

Bn c th s dng pg_xlogfile_name_offset trch tn v phn b theo byte cc tp lu k giao


dch tng ng t cc kt qu ca bt k hm no trn. V d:
postgres=# SELECT * FROM pg_xlogfile_name_offset(pg_stop_backup());
file_name | file_offset
--------------------------+------------00000001000000000000000D | 4039624
(1 row)

Tng t, pg_xlogfile_name trch ch tn tp lu k giao dch. Khi v tr lu k giao dch c a ra


chnh xc trong mt gii hn tp lu k giao dch, th c cc hm u tr v tn ca tp lu k
giao dch trc . iu ny thng l hnh vi c mong mun cho vic qun l hnh vi lu tr
lu k giao dch, v tp trc l tp cui cng m hin hnh cn phi c lu tr.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 274/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

c cc chi tit v s dng ng cc hm , xem Phn 24.3.


Cc hm c ch ra trong Bng 9-57 a ra thng tin v hin trng ca ch ch. Cc hm c
th c thc thi trong qu trnh phc hi v trong khi chy bnh thng.
Bng 9-57. Cc hm thng tin phc hi
Tn

Dng tr v

M t

pg_is_in_recovery() bool

True nu phc hi vn cn ang din ra.

pg_last_xlog_receiv text
e_location()

C v tr lu k giao dch mi nht nhn c v c ng b vo a bng nhn


bn lung. Trong khi s nhn bn lung ang din ra th iu ny s lm gia tng
mt cch n iu. Nhng khi s nhn bn lung c khi ng li th iu ny
s quay tr li vi v tr bt u nhn bn, thng l bt u tp WAL c cha v
tr chi li hin hnh. Nu s phc hi hon tt th iu ny s vn l tnh trong
gi tr ca bn ghi WAL mi nht c nhn v c ng b vo a trong qu
trnh phc hi. Nu nhn bn lung b v hiu ha, hoc nu n cn cha bt u,
th hm tr v NULL.

pg_last_xlog_replay text
_location()

C v tr lu k giao dch c chi li trong qu trnh phc hi. Nu s phc hi


vn cn din ra th iu ny s lm gia tng mt cch n iu. Nu s phc hi
hon tt th gi tr ny vn gi l tnh trong gi tr ca bn ghi WAL mi nht
c p dng trong qu trnh phc hi . Khi my ch c khi to bnh
thng m khng c phc hi th hm tr v NULL.

Cc hm c ch ra trong Bng 9-58 tnh s dng khng gian a ca cc i tng c s d liu.


Bng 9-58. Cc hm kch thc i tng c s d liu
Tn
pg_column_size(any)

Dng tr v
int

M t
S byte c s dng lu tr mt gi tr c bit (c th c nn)

pg_total_relation_size(regclass) bigint

Tng khng gian a c bng s dng vi OID hoc tn c ch


nh, bao gm tt c cc ch s v d liu TOAST

pg_table_size(regclass)

bigint

Khng gian a c bng s dng vi OID hoc tn c ch nh,


ngoi tr cc ch s (nhng bao gm TOAST, bn khng gian t
do, v bn nhn thy c)

pg_indexes_size(regclass)

bigint

Tng khng gian a c cc ch s s dng c gn vo bng vi


OID hoc tn c ch nh

pg_database_size(oid)

bigint

Khng gian a c c s d liu s dng vi OID c ch nh

pg_database_size(name)

bigint

Khng gian a c c s d liu s dng vi OID c ch nh

pg_tablespace_size(oid)

bigint

Khng gian a c c s d liu s dng vi OID c ch nh

pg_tablespace_size(name)

bigint

Khng gian a c c s d liu s dng vi OID c ch nh

pg_relation_size(relation
regclass, fork text)

bigint

Khng gian a c bng r nhnh ch nh (main, fsm or vm)


hoc ch s vi OID hoc tn c ch nh

pg_relation_size(relation
regclass)

bigint

Vit tt cho pg_relation_size(..., main)

pg_size_pretty(bigint)

text

Bin i mt kch thc dng byte thnh mt nh dng ngi c


c vi cc n v ca kch thc

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 275/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ch ra khng gian c s dng lu tr bt k gi tr d liu ring r no.

pg_column_size

chp nhn OID hoc tn ca mt bng hoc bng toast, v tr v tng khng
gian trn a c s dng cho bng , bao gm tt c cc ch s c lin quan. Hm ny l tng
ng vi pg_table_size + pg_indexes_size.
pg_total_relation_size

chp nhn OID hoc tn ca mt bng v tr v khng gian a cn thit cho bng ,
ngoi tr cc ch s. (Khng gian TOAST, bn khng gian t do, v bn trc quan bao gm).
pg_table_size

chp nhn OID hoc tn ca mt bng v tr v tng khng gian a c tt c cc


ch s s dng c gn ti bng .
pg_indexes_size

v pg_tablespace_size chp nhn OID hoc tn ca mt bng hoc khng gian


bng, v tr v tng khng gian a c s dng trong .
pg_database_size

chp nhn OID hoc tn ca mt bng, ch s hoc bng toast, v tr v kch c trn
a theo cc byte. Vic ch nh main hoc ra i s th 2 tr v kch c ca r nhnh d liu
chnh ca quan h . Vic ch nh fsm tr v kch c ca Bn Khng gian T do (xem Phn
54.3) c lin quan ti quan h ny. Vic ch nh vm tr v kch c ca Bn Trc quan (xem
Phn 54.4) c lin quan ti quan h ny. Lu rng hm ny ch ra kch c ca ch mt r nhnh; v
hu ht cc mc ch l thun tin hn s dng cc hm mc cao hn pg_total_relation_size hoc
pg_table_size.
pg_relation_size

c th c s dng nh dng kt qu ca mt trong cc hm khc theo cch con


ngi c th c c, bng vic s dng kB, MB, GB hoc TB mt cch ph hp.
pg_size_pretty

Cc hm c ch ra trong Bng 9-59 h tr trong vic nhn din cc tp a c th c lin quan


ti cc i tng c s d liu.
Bng 9-59. Cc hm v tr i tng c s d liu
Tn

Dng tr v

M t

pg_relation_filenode(relation regclass) oid

S nt tp ca quan h vi OID hoc tn c ch nh

pg_relation_filepath(relation regclass) text

Tn ng dn tp ca quan h vi OID hoc tn c ch nh

chp nhn OID hoc tn ca mt bng, ch s, s tun t hoc bng toast, v tr


v s nt tp (filenode) hin c ch nh cho n. Nt tp l thnh phn c bn ca (cc) tn tp
c s dng cho quan h (xem Phn 54.l c thm thng tin). i vi hu ht cc bng th
kt qu l y ht nh pg_class .relfilenode, nhng i vi cc catalog h thng nht nh th relfilenode
l 0 v hm ny phi c s dng c gi tr ng. Hm tr v NULL nu truyn mt quan
h m khng c lu tr, nh mt kiu nhn chng hn.
pg_relation_filenode

l tng t nh pg_relation_filenode, nhng n tr v ton b tn ng dn tp


(lin quan ti th mc d liu b c s d liu PGDATA) ca quan h .
pg_relation_filepath

Cc hm c ch ra trong Bng 9-60 a ra s truy cp bm sinh ti cc tp trn my t ch

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 276/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

(hosting) cho my ch. Ch cc tp trong th mc b c s d liu v log_directory c th c truy


cp. Hy s dng mt ng dn tng i cho cc tp trong th mc b , v mt ng dn
khp vi thit lp cu hnh log_directory cho cc tp lu k. S s dng cc hm gii hn cho cc
siu ngi s dng.
Bng 9-60. Cc hm truy cp tp chung
Tn

Dng tr v

pg_ls_dir(dirname text)

setof text

M t
Lit k cc ni dung ca mt th mc

pg_read_file(filename text, offset bigint, length bigint) text

Tr v cc ni dung ca mt tp vn bn

pg_stat_file(filename text)

Tr v thng tin v mt tp

pg_ls_dir

record

tr v tt c cc tn trong th mc c ch nh, ngoi tr cc u vo c bit . v ...

tr v mt phn ca mt tp vn bn, bt u offset c a ra, tr v nhiu nht


length cc byte (t hn nu kt thc tp t ti c u tin). Nu offset l m, th n l cui tp.
pg_read_file

tr v mt bn ghi cha kch thc tp, du thi gian c truy cp ln cui, du thi
gian c sa i ln cui, du thi gian thay i tnh trng tp ln cui (ch cho cc nn tng
Unix), du thi gian to tp (ch cho Windows), v mt boolean ch ra nu l mt th mc. Cc
s dng in hnh bao gm:
pg_stat_file

SELECT * FROM pg_stat_file(filename);


SELECT (pg_stat_file(filename)).modification;

Cc hm c ch ra trong Bng 9-61 qun l cc kha c vn. c cc chi tit v s dng ng


cc hm , hy xem Phn 13.3.4.
Bng 9-61. Cc hm kha c vn
Tn

Dng tr v

M t

pg_advisory_lock(key bigint)

void

C c kha c vn c quyn

pg_advisory_lock(key1 int, key2 int)

void

C c kha c vn c quyn

pg_advisory_lock_shared(key bigint)

void

C c kha c vn chia s

pg_advisory_lock_shared(key1 int, key2 int)

void

C c kha c vn chia s

pg_try_advisory_lock(key bigint)

boolean

C c kha c vn c quyn nu sn sng

pg_try_advisory_lock(key1 int, key2 int)

boolean

C c kha c vn c quyn nu sn sng

pg_try_advisory_lock_shared(key bigint)

boolean

C c kha c vn chia s nu sn sng

pg_try_advisory_lock_shared(key1 int, key2 int) boolean

C c kha c vn chia s nu sn sng

pg_advisory_unlock(key bigint)

boolean

a ra mt kha c vn c quyn

pg_advisory_unlock(key1 int, key2 int)

boolean

a ra mt kha c vn c quyn

pg_advisory_unlock_shared(key bigint)

boolean

a ra mt kha c vn chia s

pg_advisory_unlock_shared(key1 int, key2 int)

boolean

a ra mt kha c vn chia s

pg_advisory_unlock_all()

void

a ra tt c cc kha c vn c phin lm vic


hin hnh nm gi

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 277/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

kha mt ti nguyn do ng dng nh ngha, n c th c xc nh hoc bng


mt gi tr kha 64 bit duy nht hoc 2 gi tr kha 32 bit (lu l 2 khng gian kha khng
chng ln nhau). Dng kha c ch nh trong pg_locks.objid. Nu phin khc gi mt kha trong
cng ti nguyn, th hm s ch cho ti khi ti nguyn sn sng. Kha l c quyn. Nhiu
kha yu cu ngn xp (stack), sao cho nu cng y ht ti nguyn b kha 3 ln th n cng phi
c m kha 3 ln c a ra cho cc phin khc s dng.
pg_advisory_lock

lm vic y ht nh pg_advisory_lock, ngoi tr kha c th c chia s


vi cc phin khc i hi cc kha chia s. Ch nhng kha c quyn c th s b kha.
pg_advisory_lock_shared

l tng t nh pg_advisory_lock, ngoi tr hm s khng ch kha tr


nn sn sng. N s hoc l ginh ly kha ngay lp tc v tr v true, hoc tr v false nu kha
khng th c c ngay lp tc.
pg_try_advisory_lock

lm vic ht nh
mt kha chia s hn l kha c quyn.
pg_try_advisory_lock_shared

pg_try_advisory_lock,

ngoi tr l n c gng c c

s a ra mt kha c vn c quyn c yu cu trc . N tr v true nu


kha c a ra thnh cng. Nu kha khng nm gi c, th n s tr v false, v hn
na, mt cnh bo SQL s c my ch a ra.
pg_advisory_unlock

pg_advisory_unlock_shared

lm vic ht nh pg_advisory_unlock, ngoi tr n a ra mt kha c vn

chia s.
s a ra tt c cc kha c vn c phin hin hnh nm gi. (Hm ny
c triu gi ngm cui phin, thm ch nu my trm b kt ni mt cch t ngt).
pg_advisory_unlock_all

9.25. Hm Trigger
PostgreSQL hin hnh a ra mt xy dng trong hm trigger, suppress_redundant_updates_trigger,
n s ngn cn s cp nht m khng thc s thay i cc d liu trong hng khi vic chim ch,
ngc li vi hnh vi thng thng m lun thc hin cp nht bt k liu c hay khng cc d liu
thay i. (Hnh vi bnh thng ny lm cho cc cp nht chy nhanh hn, v khng c vic kim
tra no c yu cu, v cng l hu dng hn trong cc trng hp nht nh).
L tng, bn thng nn trnh chy cc cp nht khng thc s thay i cc d liu trong bn ghi.
Cc cp nht d tha c th ly i thi gian ng k khng cn thit, c bit nu c nhiu ch s
phi ty bin, v khng gian trong cc hng cht cui cng s phi c loi b. Tuy nhin, vic d
tm ra c cc tnh hung nh vy trong m ca khch hng khng phi lc no cng d dng,
hoc thm ch c th, v vic vit cc biu thc d tm ra chng c th b li. Mt la chn thay
th l hy s dng suppress_redundant_updates_trigger, n s b qua cc cp nht khng thay i d
liu. Tuy nhin, bn nn s dng ci ny cn thn. Trigger tn t thi gian m khng tm thng
cho tng bn ghi, v th nu hu ht cc bn ghi b nh hng v mt cp nht thc s c thay
i, th s dng trigger ny s thc s lm cho cp nht chy chm hn.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 278/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Hm suppress_redundant_updates_trigger c th c b sung vo mt bng nh th ny:


CREATE TRIGGER z_min_update
BEFORE UPDATE ON tablename
FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger();

Trong hu ht cc trng hp, bn c th mun s dng trigger ny cui cng cho tng hng. Nh
trong u rng cc trigger s dng theo trt t tn, bn c th sau chn mt tn trigger m i sau
tn ca bt k trigger no khc m bn c th c trong bng .
c thm thng tin v vic to cc trigger, hy xem CREATE TRIGGER.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 279/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Chng 10. Bin i dng


Cc lnh SQL c th, c hay khng, i hi vic pha trn cc dng d liu khc nhau trong cng
y ht mt biu thc. PostgreSQL c cc c s tng cng cho vic nh gi cc biu thc dng
c pha trn.
Trong nhiu trng hp ngi s dng khng cn phi hiu cc chi tit ca c ch bin i dng.
Tuy nhin, cc bin i ngm c PostgreSQL thc hin c th nh hng ti kt qu ca truy
vn. Khi cn thit, cc kt qu c th c ty bin bng vic s dng bin i dng r rng.
Chng ny gii thiu cc c ch v cc qui c bin i dng ca PostgreSQL. Hy tham chiu ti
cc phn tng ng trong Chng 8 v Chng 9 c thm thng tin v cc dng d liu c th
v cc hm v ton t c php.

10.1. Tng quan


SQL l mt ngn ng c khun dng mnh. l, mi khon d liu c mt dng d liu c lin
quan m xc nh hnh vi v s dng c php ca n. PostgreSQL c mt h thng dng c
tng cng m l chung v mm do hn so vi cc trin khai SQL khc. V th, hu ht cc hnh
vi bin i dng trong PostgreSQL c cc qui tc chung iu chnh hn l bng cc cng ngh
c bit. iu ny cho php s dng cc biu thc dng pha trn thm ch vi cc dng do ngi s
dng nh ngha.
Cc trnh qut / trnh phn tch ca PostgreSQL chia cc phn t t ng thnh 5 chng loi c bn:
cc s nguyn, cc s khng nguyn, cc chui, cc m nh danh v cc t kha. Cc hng ca hu
ht cc dng khng phi s trc ht c phn loi nh l cc chui. nh ngha ngn ng SQL
cho php ch nh cc tn dng vi cc chui, v c ch ny c th c s dng trong PostgreSQL
khi to trnh phn tch i theo ng ng. V d, truy vn:
SELECT text Origin AS "label", point (0,0) AS "value";
label | value
--------+------Origin | (0,0)
(1 row)

C 2 hng k t, dng text v point. Nu mt dng khng c ch nh cho mt hng chui, th


dng t ch sn unknown c ch nh t u, s c gii quyt trong cc giai on sau nh
c m t bn di.
C 4 cu trc SQL c bn i hi cc qui tc bin i dng phn bit nhau trong trnh phn tch ca
PostgreSQL.
Cc li gi hm
Nhiu h thng dng PostgreSQL c xy dng xung quanh mt tp hp giu c cc hm.
Cc hm c th c mt hoc nhiu i s. V PostgreSQL cho php hm qu ti, nn tn ca
hm mt mnh khng duy nht nhn din hm s c gi; trnh phn tch phi chn hm

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 280/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ng da vo cc dng d liu ca cc i s c cung cp.


Cc ton t
PostgreSQL cho php cc biu thc vi cc ton t unary tin t v hu t (mt i s),
cng nh cc ton t nh phn (2 i s). Ging nh cc hm, cc ton t c th s qu ti,
nn vn y ht ca vic chn ng ton t cng tn ti.
Lu tr gi tr
Cc lnh SQL INSERT v UPDATE t kt qu ca cc biu thc vo trong mt bng. Cc biu
thc trong lnh phi c khp vi, v c l phi c bin i thnh, cc dng ct ch.
UNION, CASE

v cc cu trc c lin quan

V tt c cc kt qu truy vn t mt lnh SELECT phi xut hin trong mt tp hp duy nht


cc ct, nn cc dng kt qu ca tng mnh SELECT phi c khp v c bin i
thnh mt tp hp ng nht. Tng t, cc biu thc kt qu ca cu trc CASE phi c
bin i thnh mt dng chung sao cho biu thc CASE nh mt tng th c mt dng u ra
c bit. Y ht nh vy cho cc cu trc ARRAY, v cho cc hm GREATEST v LEAST.
Cc catalog h thng lu tr thng tin v cc bin i hoc cast no, tn ti gia cc dng d liu
no, v lm th no thc hin cc bin i . Cc cast b sung c th c ngi s dng vi
lnh CREATE CAST a thm vo. (iu ny thng c thc hin trong s kt hp vi vic nh
ngha cc dng d liu mi. Tp hp cc cast gia cc dng c xy dng sn tng c lm cn
thn v tt nht l khng ty chnh).
Mt kinh nghim gii quyt vn b sung c trnh phn tch cung cp cho php nh ngha
c ci thin i vi hnh vi a ra ph hp trong cc nhm cc dng c cc cast ngm nh. Cc
dng d liu c chia thnh vi chng loi dng c bn, bao gm numeric, string, bitstring,
datetime, timespan, geometric, network v do ngi s dng nh ngha. (danh sch c trong Bng
45-45; nhng lu l cng c kh nng to cc chng loi dng ty bin). Trong tng chng loi c
th c 1 hoc nhiu hn cc dng c u tin, chng c u tin khi c mt s la chn cc dng
c kh nng. Vi s la chn cn thn cc dng c u tin v cc cast ngm nh c sn, c kh
nng m bo rng cc biu thc m m (cc biu thc vi nhiu gii php phn tch ty chn)
c th c gii quyt theo mt cch thc hu dng.
Tt c cc qui tc bin i dng c thit k vi vi nguyn tc trong u:

Cc bin i ngm nh nn khng bao gi c cc u ra gy ngc nhin hoc khng th


on trc c.

Nn khng c chi ph thm trong trnh phn tch hoc trnh thc thi nu mt truy vn khng
cn bin i dng ngm nh. l, nu mt truy vn c hnh thnh tt v cc dng khp
c ri, th truy vn nn thc thi m khng mt thm thi gian trong trnh phn tch v
khng a ra cc li gi bin i ngm nh khng cn thit trong truy vn .

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 281/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Hn na, nu mt truy vn thng yu cu mt bin i ngm nh cho mt hm, v nu


sau ngi s dng nh ngha mt hm mi vi cc dng i s ng, th trnh phn tch
nn s dng hm mi v khng cn thc hin bin i ngm nh s dng hm c na.

10.2. Ton t
Ton t c bit c mt biu thc ton t tham chiu ti c xc nh bng vic s dng th tc
sau. Lu rng th tc ny gin tip c s u tin trc ca cc ton t c lin quan tc ng, v
iu s xc nh cc biu thc con no c ly lm cc u vo ca cc ton t no. Xem Phn
4.1.6 c thm thng tin.
Quyt nh dng ton t
1. Chn cc ton t s c xem xt t catalog h thng pg_operator. Nu mt tn ton t
khng iu kin v s tng c s dng (trng hp thng thng), th cc ton t
c xem xt l nhng ton t vi tn trng khp v tnh ton i s m nhn thy c
trong ng tm kim hin hnh (xem Phn 5.7.3). Nu mt tn ton t iu kin
c a ra, th ch cc ton t no trong s c ch nh s c xem xt.
a) Nu ng tm kim thy nhiu ton t vi cc dng i s ht nhau, th ch ton t no
xut hin sm nht trong ng c xem xt. Cc ton t vi cc dng i s khc
nhau s c xem xt ngang bng nhau bt k v tr ca ng tm kim.
2. Kim tra mt ton t chp nhn chnh xc cc dng i s u vo. Nu c mt ton t tn
ti (c th ch c mt ton t khp chnh xc trong tp hp cc ton t c xem xt), hy
s dng n.
a) Nu mt i s ca mt li gi ton t nh phn l dng cn cha c bit unknown, th
gi thit n l dng y ht nh i s khc cho kim tra ny. Cc li gi c lin quan ti 2
u vo unknown, hoc mt ton t duy nht vi mt u vo unknown, s khng bao gi
thy mt s trng khp bc ny.
3. Tm kim s trng khp tt nht
a) B cc ton t ng vin m i vi chng cc dng u vo khng khp v khng th
bin i c (bng vic s dng mt bin i ngm nh) khp. Cc hng unknown
s c gi thit l c kh nng bin i c sang bt k iu g v mc ch ny. Nu
ch c mt ng vin, th hy s dng n; nu khc th hy tip tc sang bc tip sau.
b) Chy qua tt c cc ng vin v gi li nhng ng vin no vi s trng khp chnh xc
nht cc dng u vo. (Cc min c xem xt y ht nh dng c bn ca chng v
mc ch ny). Hy gi li tt c cc ng vin nu khng c cc trng khp chnh xc.
Nu ch mt ng vin cn li, hy s dng n; nu khc, hy tip tc cc bc tip sau.
c) Chy qua tt c cc ng vin v gi li cc ng vin m chp nhn cc dng c u
tin (ca chng loi dng cc dng d liu u vo) trong hu ht cc v tr ni m bin

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 282/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

i dng s c yu cu. Hy gi li tt c cc ng vin nu khng ng vin no chp


nhn cc dng c u tin. Nu ch cn li mt ng vin, hy s dng n; nu khc th
hy tip tc bc tip sau.
d) Nu bt k i s u vo no l unknown, hy kim tra cc chng loi dng c chp
nhn cc v tr i s vi cc ng vin cn li. Ti tng v tr, hy chn chng loi
string nu bt k ng vin no chp nhn chng loi . (Khuynh hng hng ti chui
ny l ph hp v mt hng dng khng bit trng ging nh mt chui). Nu khng,
nu tt c cc ng vin cn li chp nhn chng loi dng y ht, th hy chn chng loi
; nu khng s hng v s la chn ng khng th c suy lun m khng c nhiu
hn cc manh mi. By gi hy loi b cc ng vin m khng chp nhn chng loi
dng c la chn. Hn na, nu bt k ng vin no chp nhn dng c u tin
theo chng loi , th hy b cc ng vin m chp nhn cc dng khng c u tin
i vi i s .
e) Nu ch mt ng vin cn li, hy s dng n. Nu khng ng vin no hoc hn 1 ng
vin cn li, th hng.
Mt s v d sau.
V d 10-1. Quyt nh dng ton t yu t
Ch c mt ton t yu t ( postfix !) c xc nh trong catalog tiu chun, v n ly mt i s
dng bigint. Trnh qut ch nh mt dng ban u integer cho i s trong biu thc truy vn
ny:
SELECT 40 ! AS "40 factorial";
40 factorial
-------------------------------------------------815915283247897734345611269596115894272000000000
(1 row)

V th trnh phn tch lm mt bin i dng trong ton hng v truy vn l tng ng vi:
SELECT CAST(40 AS bigint) ! AS "40 factorial";

V d 10-2. Quyt nh dng ton t ghp ni chui


C php ging chui c s dng lm vic vi cc dng chui v lm vic vi cc dng m
rng phc tp. Cc chui vi dng khng c ch nh s khp vi cc ng vin ton t c kh
nng. Mt v d vi mt i s khng c ch nh:
SELECT text abc || def AS "text and unknown";
text and unknown
-----------------abcdef
(1 row)

Trong trng hp ny trnh phn tch tm xem liu c mt ton t ly text cho c 2 i s hay
khng. V l c, nn n gi thit rng i s th 2 s c din gii nh dng text.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 283/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

y l mt s ghp ni trong cc dng khng c ch nh:


SELECT abc || def AS "unspecified";
unspecified
------------abcdef
(1 row)

Trong trng hp ny khng c mo ban u no cho dng no s dng, v khng dng no


c ch nh trong truy vn. V th, trnh phn tch tm tt c cc ton t ng vin v thy rng c
cc ng vin chp nhn c cc u vo chng loi chui v chng loi chui bit. V chng loi
chui c u tin khi sn sng, chng loi c chn, v sau dng c u tin cho cc
chui, text, c s dng nh dng c bit gii quyt cc hng khng c r.
V d 10-3. Quyt nh dng ton t ph nh v gi tr tuyt i
Catalog cc ton t ca PostgreSQL c vi khon cho ton t tin t @, tt c th trin khai cc
hot ng gi tr tuyt i cho cc dng d liu s khc nhau. Mt trong nhng khon l cho
float8, n l dng c u tin trong chng loi s. V th, PostgreSQL s s dng khon khi i
mt vi mt u vo khng r:
SELECT @ -4.5 AS "abs";
abs
----4.5
(1 row)

y h thng gii quyt mt cch ngm nh hng dng khng r nh dng float8 trc khi p
dng ton t c chn. Chng ta c th kim tra hp l rng float8 v mt s dng khng phi
khc tng c s dng:
SELECT @ -4.5e500 AS "abs";
ERROR: "-4.5e500" is out of range for type double precision

Mt khc, ton t tin t ~ (ph nh dng bitwise) ch c xc nh cho cc dng d liu s


nguyn, khng cho float8. V th, nu chng ta th mt trng hp tng t vi ~, th ta c:
SELECT ~ 20 AS "negation";
ERROR: operator is not unique: ~ "unknown"

Mo: Khng th chn mt ton t ng vin tt nht. Bn c th cn thm cc cast dng ngm nh.
iu ny xy ra v h thng khng th quyt nh kh nng no trong vi kh nng cc ton t ~ s
c u tin. Chng ta c th gip n a ra vi mt cast ngm nh:
SELECT ~ CAST(20 AS int8) AS "negation";
negation
----------21
(1 row)

10.3. Hm
Hm c bit c mt li gi hm tham chiu ti c xc nh bng vic s dng th tc sau.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 284/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Quyt nh dng hm
1. Chn cc hm s c xem xt t catalog h thng pg_proc. Nu mt tn hm iu kin
khng theo s tng c s dng, th cc hm c xem xt l cc hm vi tn trng
khp v tnh ton i s l trc quan trong ng tm kim hin hnh (xem Phn 5.7.3).
Nu mt tn hm iu kin tng c a ra, th ch cc hm trong s c ch nh
s c xem xt.
a) Nu ng tm kim thy nhiu hm cc dng i s y ht nhau, th ch hm no xut
hin trc nht trong ng s c xem xt. Cc hm cc dng i s khc nhau s
c xem xt trong c s ngang bng nhau bt k v tr ng tm kim.
b) Nu mt hm c khai bo vi mt tham s mng VARIADIC, v li gi khng s dng
t kha VARIADIC, th hm c i x nh th tham s mng b thay th bng
mt hoc nhiu trng hp dng phn t ca n, nh cn thit khp vi li gi. Sau
s m rng nh vy th hm c th c cc dng i s hiu qu ngang bng vi mt
s hm khng nhiu i s (nonvariadic). Trong trng hp hm xut hin sm hn
trong ng tm kim s c s dng, hoc nu 2 hm l trong cng y ht s , th
hm khng nhiu i s s c u tin.
c) Cc hm m c cc gi tr mc nh i vi cc tham s s c xem xt khp vi
bt k li gi no m lm m s 0 hoc nhiu v tr tham s c kh nng mc nh hn.
Nu hn mt hm nh vy khp vi mt li gi, th mt hm xut hin sm nht trong
ng tm kim s c s dng. Nu c 2 hoc nhiu hn cc hm nh vy trong s
y ht vi cc dng tham s ging ht nhau trong cc v tr khng phi l mc nh (c
kh nng nu chng c cc tp hp khc nhau cc tham s khng c kh nng mc
nh), th h thng s khng c kh nng xc nh hm no s u tin, v v th mt li
li gi hm m m s xy ra nu khng c s trng khp no tt hn cho li gi c
th c tm thy.
2. Hy kim tra mt hm chp nhn chnh xc cc dng i s u vo . Nu mt hm ang
tn ti (c th ch l mt s trng khp chnh xc trong tp hp cc hm c xem xt), th
hy s dng n. (Cc trng hp c lin quan ti unknown s khng bao gi thy mt s
trng khp bc ny).
3. Nu khng s trng khp chnh xc no c tm thy, hy xem liu li gi hm c xut
hin l mt yu cu bin i dng c bit hay khng. iu ny xy ra nu li gi hm
ch c mt i s v tn hm l y ht nh tn (ni b) ca mt s dng d liu. Hn
na, i s hm phi hoc l mt hng dng khng c bit, hoc mt dng m c th p
buc nh phn ti dng d liu c t tn, hoc mt dng m c th c bin i thnh
dng d liu c t tn bng vic p dng cc hm I/O dng ( l, bin i hoc l ti
hoc t mt trong nhng dng chui tiu chun). Khi cc iu kin c tha mn, th

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 285/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

li gi hm c i x nh mt dng c t CAST1.
4. Tm kim s trng khp tt nht.
a) Hy loi b cc hm ng vin theo cc dng u vo khng trng khp v khng th
c bin i (bng vic s dng mt bin i ngm) trng khp. Cc hng unknown
s c gi thit c kh nng bin i c thnh bt k iu g cho mc ch ny. Nu
ch mt ng vin cn li, hy s dng n; nu khng hy tip tc bc tip sau.
b) Hy chy qua tt c cc ng vin v gi cc ng vin no c cc trng khp chnh xc
nht trong cc dng u vo. (Cc min s c xem xt y ht nh dng c bn ca
chng cho mc ch ny). Hy gi tt c cc ng vin nu khng ng vin no c cc
trng khp chnh xc. Nu ch mt ng vin cn li, hy s dng n; nu khng hy tip
tc bc tip sau.
c) Hy chy qua tt c cc ng vin v gi li cc ng vin no m chp nhn cc dng
c u tin (i vi chng loi dng cc dng d liu u vo) hu ht cc v tr ni
m s bin i dng s c yu cu. Hy gi tt c cc ng vin nu khng ng vin
no chp nhn cc dng c u tin. Nu ch mt ng vin cn li, hy s dng n; nu
khng, hy tip tc bc tip sau.
d) Nu bt k i s u vo no l unknown, hy kim tra cc chng loi dng c chp
nhn cc v tr i s bng vic gi li cc ng vin. Ti tng v tr, hy chn chng
loi chui string nu bt k ng vin no chp nhn chng loi . (Khuynh hng
hng ti chui ny l ph hp v mt hng dng khng bit trng ging nh mt
chui). Nu khng, nu tt c cc ng vin cn li chp nhn chng loi dng y ht, th
hy chn chng loi ; nu khng s hng v s la chn ng khng th c suy ra
m khng c manh mi no hn. By gi hy loi b cc ng vin m khng chp nhn
chng loi dng c chn. Hn na, nu bt k ng vin no chp nhn mt dng c
u tin trong chng loi , hy loi b cc ng vin m chp nhn cc dng khng
c u tin i vi i s .
e) Nu ch mt ng vin cn li, hy s dng n. Nu khng ng vin no hoc hn mt
ng vin cn li, th hng.
Lu rng cc qui tc trng khp tt nht l y nh nhau i vi quyt nh dng hm v
ton t. Mt s v d bn di.
V d 10-4. Quyt nh dng i s hm s lm trn
Ch c mt hm round c 2 i s; n ly i s u dng s numeric v i s th 2 dng s
nguyn integer. V th truy vn sau s t ng bin i i s u t dng integer thnh numeric:
SELECT round(4, 4);

L do cho bc ny l h tr cc c t cast dng hm trong cc trng hp ni m khng c mt hm cast thc


s. Nu c mt hm cast, th n c t tn theo qui nh sau dng u ra ca n, v v th s khng c nhu cu
phi c mt trng hp c bit. Xem CREATE CAST c ch gii b sung.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 286/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

round
-------4.0000
(1 row)

Truy vn thc s c trnh phn tch bin thnh:


SELECT round(CAST (4 AS numeric), 4);

V cc hng s dng s vi cc du thp phn ban u c ch nh cho dng


sau s khng i hi s bin i dng v v th c th hiu lc hn mt cht:

numeric,

nn truy vn

SELECT round(4.0, 4);

V d 10-5. Quyt nh dng hm chui con


C vi hm substr, mt trong s chng ly cc dng text v integer. Nu c gi bng mt hng
chui ca dng khng c ch nh, th h thng s chn hm ng vin m chp nhn mt i s
ca chng loi string c u tin (y l dng text).
SELECT substr(1234, 3);
substr
-------34
(1 row)

Nu chui c khai bo s l dng varchar, nh c th l trong trng hp nu n ti t mt


bng, th trnh phn tch s c gng bin i n tr thnh text:
SELECT substr(varchar 1234, 3);
substr
-------34
(1 row)

iu ny c trnh phn tch bin i tr nn c hiu lc:


SELECT substr(CAST (varchar 1234 AS text), 3);

Lu : Trnh phn tch hc t catalog pg_cast catalog rng text v varchar l tng thch nh
phn, ngha l mt th c th c truyn ti mt hm m chp nhn th khc m khng
lm bt k bin i vt l no. V th, khng li gi bin i dng no thc s c chn
vo trong trng hp ny.
V, nu hm c gi vi i s dng integer, th trnh phn tch s c bin i n thnh text:
SELECT substr(1234, 3);
ERROR: hm substr(integer, integer) khng tn ti
Gi : Khng hm no khp vi cc dng i s v tn c a ra. Bn c l cn b sung thm cc cast
dng r rng.

iu ny khng lm vic v integer khng c mt cast ngm cho text. Mt cast r rng s lm vic,
tuy nhin:
SELECT substr(CAST (1234 AS text), 3);
substr
-------34
(1 row)

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 287/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

10.4. Lu gi tr
Cc gi tr c chn vo trong mt bng s c bin i sang dng d liu ca cc ct ch theo
cc bc sau.
Bin i dng lu gi tr
1. Kim tra mt s trng khp chnh xc vi ch.
2. Nu khng, c gng bin i biu thc thnh dng ch. iu ny s thnh cng nu c
mt cast c ng k gia 2 dng . Nu biu thc l mt hng dng khng c bit, th
cc ni dung ca chui hng s c a vo th tc bin i u vo i vi dng ch.
3. Kim tra xem nu c mt cast kch c cho dng ch. Mt cast kch c l mt cast t dng
ti bn thn n. Nu mt cast kch c c thy trong catalog pg_cast, hy p dng n
cho biu thc trc khi lu vo ct ch. Hm trin khai cho mt cast nh vy lun ly
mt tham s d tha dng integer, n nhn gi tr atttypmod ca ct ch (thng l di
c khai bo ca n, d s din gii atttypmod l khc nhau i vi cc dng d liu khc
nhau), v n c th ly mt tham s boolean m ni liu cast c l r rng hay n. Hm
cast c trch nhim v vic p dng bt k ng ngha ph thuc di no nh vic kim
tra kch c hoc ct ngn bt.
V d 10-6. Bin i dng lu character
i vi mt ct ch c khai bo nh l character(20) th lnh sau y ch ra rng gi tr c lu
c kch c ng:
CREATE TABLE vv (v character(20));
INSERT INTO vv SELECT abc || def;
SELECT v, octet_length(v) FROM vv;
v | octet_length
----------------------+-------------abcdef | 20
(1 row)

Nhng g thc s xy ra y l 2 hng khng c r c gii quyt thnh text mt cch mc


nh, cho php ton t || s c gii quyt nh l s ghp ni text. Sau kt qu text ca ton t
c bin i thnh bpchar (k t trng c ni vo, tn ni b ca dng d liu character) s
khp vi dng ct ch. (V s bin i t text sang bpchar l p nh phn, nn bin i ny khng
chn bt k li gi hm thc s no). Cui cng, hm kch c bpchar(bpchar, integer, boolean) c
thy trong catalog h thng v c p dng cho kt qu ca ton t v di ct c lu tr.
Hm c dng c th ny thc hin kim tra di c yu cu v s b sung cc khong trng
ni thm vo.

10.5. UNION, CASE v cc cu trc c lin quan


Cc cu trc SQL UNION phi khp c l vi cc dng khng tng t tr thnh mt tp kt qu
duy nht. Quyt nh thut ton c p dng mt cch tch bit i vi tng ct u ra ca mt

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 288/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

truy vn thng nht. Cc cu trc INTERSECT v EXCEPT gii quyt cc dng khng tng t theo
cch y ht nh UNION. Cc cu trc CASE, ARRAY, VALUES, GREATEST v LEAST s dng thut ton ht
nh nhau khp cc biu thc thnh phn ca chng v chn mt dng d liu kt qu.
Quyt nh dng cho UNION, CASE v cc cu trc c lin quan
1. Nu tt c cc u vo l cng mt dng nh nhau, v n khng phi l unknown, hy gii
quyt nh dng . Nu khng, hy thay th bt k cc dng min no trong danh sch vi
cc dng c bn bn di ca chng.
2. Nu tt c cc u vo l dng unknown, hy gii quyt nh dng text (dng c u tin
ca chng loi chui). Nu khng cc u vo unknown s b b qua.
3.

Nu cc u vo khng phi tt c cng chng loi dng y ht nhau, th hng.

4. Hy chn dng u vo khng phi l khng r m l mt dng c u tin trong chng


loi , nu c mt dng nh vy.
5. Nu khng, hy chn dng u vo cui cng khng phi l khng r m cho php tt c cc
u vo khng phi khng r ng ng trc s c bin i mt cch ngm sang n.
(Lun c mt dng nh vy, v t nht dng u tin trong danh sch phi tha mn iu
kin ny).
6. Hy bin i tt c cc u vo thnh dng c la chn. Hng nu khng c mt bin i
no t mt u vo c a ra sang dng c chn.
Mt s v d sau.
V d 10-7. Quyt nh dng vi cc dng theo qui nh trong mt lin on (Union)
SELECT text a AS "text" UNION SELECT b;
text
-----a
b
(2 rows)

y, hng dng khng r 'b' s c gii quyt thnh dng text.


V d 10-8. Quyt nh dng trong mt lin on n gin
SELECT 1.2 AS "numeric" UNION SELECT 1;
numeric
--------1
1.2
(2 rows)

Hng 1.2 l dng numeric, v gi tr 1 integer c th l cast n i vi numeric, nn dng c s


dng.
V d 10-9. Quyt nh dng trong mt lin on c chuyn ti
SELECT 1 AS "real" UNION SELECT CAST(2.2 AS REAL);

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 289/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

real
-----1
2.2
(2 rows)

y, v dng real khng th l mt cast n cho integer, nhng integer c th l cast n cho real, nn
dng kt qu lin on c gii quyt nh l real.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 290/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Chng 11. Cc ch s
Cc ch s l mt cch ph bin ci thin hiu nng ca c s d liu. Mt ch s cho php my
ch c s d liu tm v truy xut cc hng c bit nhanh hn nhiu so vi n c th lm m
khng c mt ch s. Nhng cc ch s cng b sung thm chi ph tng vo h thng c s d liu
nh mt tng th, v th chng nn c s dng mt cch hp l.

11.1. Gii thiu


Gi thit chng ta c mt bng tng t vi iu ny:
CREATE TABLE test1 (
id integer,
content varchar
);

v ng dng a ra nhiu truy vn c dng:


SELECT content FROM test1 WHERE id = constant;

Khng c chun b trc, h thng c th phi qut ton b bng test1, tng hng mt, tm tt c
cc khon trng khp. Nu c nhiu hng trong bng test1 v ch mt t hng (c th l 0 hoc 1)
m c th c tr v bng mt truy vn nh vy, th iu ny r rng l mt phng php khng
hiu qu. Nhng nu h thng tng c ra lnh phi duy tr mt ch s trong ct id, th n c th s
dng mt phng php hiu qu hn cho vic nh v cc hng trng khp. V d, n c th ch
phi i qua mt t mc su trong mt cy tm kim.
Mt tip cn tng t c s dng trong hu ht cc sch khng vin tng: cc khi nim v cc
khon m thng xuyn c cc c gi tra cu s c thu thp trong mt ch s theo vn abc
cui ca cun sch. c gi c quan tm c th qut ch s kh nhanh v lt sang (cc) trang
tng ng, thay v phi c ton b cun sch tm ra t liu quan tm. chnh l tc v ca tc
gi cho bit trc cc khon m cc c gi c kh nng s tra cu, chnh l tc v ca ngi
lp trnh c s d liu thy trc c cc ch s no s l hu dng.
Lnh sau y c th c s dng to ra mt ch s trong ct id, nh c tho lun:
CREATE INDEX test1_id_index ON test1 (id);

Tn test1_id_index c th c chn t do, nhng bn nn chn th g m cho php bn nh sau


ny ch s l v ci g.
loi b mt ch s, hy s dng lnh DROP INDEX. Cc ch s c th c thm vo v b loi b
t cc bng bt k lc no.
Mt khi mt ch s c to ra, khng s can thip tip sau no c yu cu: h thng s cp nht
ch s khi bng c sa i, v n s s dng ch s trong cc truy vn khi n ngh lm nh
vy c th c hiu qu hn so vi mt s qut bng tun t. Nhng bn c th phi chy lnh
ANALYZE thng xuyn cp nht cc thng k cho php trnh hoch nh truy vn to ra cc

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 291/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

quyt nh c cn nhc k. Xem Chng 14 c thng tin v cch tm ra liu mt ch s c


c s dng v khi no v v sao trnh hoch nh c th chn khng s dng mt ch s.
Cc ch s cng c th c li cho cc lnh UPDATE v DELETE vi cc iu kin tm kim. Cc ch s
c th c s dng nhiu hn trong cc tm kim chung. V th, mt ch s c nh ngha trong
mt ct m l mt phn ca mt iu kin chung cng c th lm nhanh ng k cc truy vn vi
cc vic chung .
Vic to ra mt ch s trong mt bng ln c th mt thi gian. Mc nh, PostgreSQL cho php c
(cc lnh SELECT) s xy ra trong bng song song vi vic to ch s, nhng ghi ( INSERT, UPDATE,
DELETE) b kha cho ti khi s xy ch s hon tt. Trong cc mi trng sn xut th iu ny
thng khng chp nhn c. C kh nng cho php ghi xy ra song song vi s to ch s,
nhng c vi cm by phi nhn thc c - c thm thng tin, hy xem Xy dng cc ch s
cng ng thi.
Sau khi mt ch s c to ra, h thng phi gi n c ng b vi bng . iu ny b sung
thm chi ph tng cho cc hot ng iu khin d liu. V th cc ch s m t khi hoc khng bao
gi c s dng trong cc truy vn nn b loi b.

11.2. Cc dng ch s
PostgreSQL a ra vi dng ch s: B-tree, Hash, GiST v GIN. Tng dng ch s s dng mt
thut ton khc nhau ph hp nht cho cc dng truy vn khc nhau. Mc nh, lnh CREATE INDEX
s to ra cc ch s B-tree, n ph hp vi hu ht cc tnh hung ph bin.
B-tree c th iu khin cc truy vn ngang bng nhau v theo dy trong cc d liu c th c
lu gi theo mt s trt t. c bit, trnh hoch nh truy vn ca PostgreSQL s xem xt s dng
mt ch s B-tree bt k khi no mt ct ch s c lin quan trong mt so snh bng vic s dng
mt trong cc ton t:
<
<=
=
>=
>

Cc cu trc tng ng vi cc kt hp ca cc ton t , nh BETWEEN v IN, c th cng c


trin khai vi tm kim ch s B-tree. Hn na, mt iu kin IS NULL hoc IS NOT NULL trong mt
ct ch s c th c s dng vi mt ch s B-tree.
Trnh ti u ha cng c th s dng mt ch s B-tree cho cc truy vn c lin quan ti mu khp
vi cc ton t LIKE v ~ nu mu l mt hng s v nm u ca chui - v d, col LIKE foo
% hoc col ~ ^foo, nhng khng phi l col LIKE %bar. Tuy nhin, nu c s d liu ca bn
khng s dng min a phng C th bn s cn phi to ch s bng mt lp ton t c bit h
tr vic nh ch s ca cc truy vn khp mu; xem Phn 11.9 bn di. Cng c kh nng s
dng cc ch s B-tree cho ILIKE v ~* nhng ch nu mu bt u vi cc k t khng phi abc,
ngha l cc k t khng b nh hng v bin i ch hoa/ch thng.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 292/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Cc ch s Hash cng c th iu khin cc so snh ngang bng nhau n gin. Trnh hoch nh
truy vn s xem xt s dng mt ch s hash bt k khi no mt ct c nh ch s c lin quan
trong mt so snh bng vic s dng ton t =. Lnh sau y c s dng to mt ch s hash:
CREATE INDEX name ON table USING hash (column);

Ch
Cc hot ng ca ch s hash hin khng c ghi lu k WAL, nn cc ch s
hash c th cn phi c xy dng li vi REINDEX sau khi mt c s d liu hng
nu tng c nhng thay i khng c ghi. Hn na, cc thay i i vi cc ch
s hash s khng c nhn bn qua s nhn bn da vo tp hoc nn dng sau
sao lu c bn ban u, v th chng a ra cc cu tr li sai cho cc truy vn m
sau s dng chng. V cc l do , s dng ch s hash hin khng c
khuyn khch.

Cc ch s GiST khng phi l mt dng ch s duy nht, m l mt h tng trong nhiu chin
lc nh ch s c th c trin khai. Mt cch tng xng, cc ton t c bit vi chng mt
ch s GiST c th c s dng l khc nhau, ph thuc vo chin lc nh ch s (lp ton t).
Nh mt v d, phn phi tiu chun ca PostgreSQL bao gm cc lp ton t GiST cho vi dng
d liu a l 2 chiu, chng h tr cc truy vn c nh ch s bng vic s dng cc ton t :
<<
&<
&>
>>
<<|
&<|
|&>
|>>
@>
<@
~=
&&

(Xem Phn 9.11 v ngha ca cc ton t ). Nhiu lp ton t khc ca GiST l sn sng trong
b su tp contrib hoc nh cc d n ring r. c thm thng tin, xem Chng 52.
Cc ch s GIN l cc ch s nghch o, chng c th iu khin cc gi tr cha hn mt kha, cc
mng, v d th. Nh mt v d, phn phi PostgreSQL tiu chun bao gm cc lp ton t GIN cho
cc mng 1 chiu, chng h tr cc truy vn c nh ch s bng vic s dng cc ton t :
<@
@>
=
&&

(Xem Phn 9.17 v ngha ca cc ton t ). Nhiu lp ton t khc ca GIN l sn sng trong
b su tp contrib hoc nh cc d n ring bit. c thm thng tin, xem Chng 53.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 293/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

11.3. Cc ch s nhiu ct
Mt ch s c th c nh ngha trong hn 1 ct ca 1 bng. V d, nu bn c 1 bng dng ny:
CREATE TABLE test2 (
major int,
minor int,
name varchar
);

(ni, bn gi th mc /dev ca bn trong mt c s d liu...) v bn thng xuyn a ra cc truy


vn nh:
SELECT name FROM test2 WHERE major = constant AND minor = constant;

sau c th l ph hp nh ngha mt ch s trong cc ct major v minor cng nhau, ngha l:


CREATE INDEX test2_mm_idx ON test2 (major, minor);

Hin hnh, ch cc dng ch s B-tree, GiST v GIN h tr cc ch s nhiu ct. Ti 32 ct c th


c ch nh. (Gii hn ny c th c ty chnh khi xy dng PostgreSQL; xem tp
pg_config_manual.h).
Mt ch s B-tree nhiu ct c th c s dng vi cc iu kin truy vn m lin quan ti bt k
tp con no ca cc ct ch s, nhng ch s l hiu qu nht khi c cc rng buc trong cc ct
dn u (bn tri nht). Qui tc chnh xc l cc rng buc ngang nhau trong cc ct dn dt, cng
vi bt k rng buc khng bng nhau no trong ct u m khng c mt rng buc bng nhau, s
c s dng gii hn phn ca ch s c qut. Cc rng buc trong cc ct bn phi ca
cc ct c kim tra trong ch s , sao cho chng bo v cc cuc ving thm ti bng
mt cch ng n, nhng chng khng lm gim phn ca ch s m phi c qut. V d, a ra
mt ch s trong (a, b, c) v mt iu kin truy vn WHERE a = 5 AND b >= 42 AND c < 77, th ch s
c th phi c qut t khon u vi a = 5 v b = 42 cho qua ti khon cui vi a = 5. Cc
khon ch s vi c > = 77 c th b b qua, nhng chng c th vn s phi c qut qua. Ch s
ny c th, v nguyn tc, c s dng cho cc truy vn c cc rng buc trong b v/hoc c vi
khng c rng buc trong a - nhng ton b ch s c th phi c qut, nn trong hu ht cc
trng hp th trnh hoch nh c th u tin mt s qut bng tun t hn l bng vic s dng
ch s .
Mt ch s GiST nhiu ct c th c s dng vi cc iu kin truy vn m c lin quan ti bt
k tp con no ca cc ct ch s. Cc iu kin trong cc ct b sung gii hn cc khon u vo
c ch s tr v, nhng iu kin trong ct u l quan trng nht cho vic xc nh ch s
cn phi c qut bao nhiu. Mt ch s GiST s l kh khng hiu qu nu ct u ca n ch c
mt t cc gi tr phn bit, thm ch nu c nhiu gi tr phn bit trong cc ct b sung thm.
Mt ch s GIN nhiu ct c th c s dng vi cc iu kin truy vn c lin quan ti bt k tp
con no ca cc ct ch s. Khng ging nh B-tree hoc GiST, tnh hiu qu tm kim ca ch s l
y ht bt chp (cc) ct ch s no cc iu kin truy vn s dng.
Tt nhin, tng ct phi c s dng vi cc ton t ph hp cho dng ch s ; cc mnh c
lin quan ti cc ton t khc s khng c xem xt.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 294/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Cc ch s nhiu ct nn c s dng d sn. Trong hu ht cc tnh hung, mt ch s trong mt


ct duy nht l v tit kim khng gian v thi gian. Cc ch s vi nhiu hn 3 ct c l khng
l hu dng tr phi s s dng bng l cc k cch iu. Xem thm Phn 11.5 v mt s tho
lun cc gi tr ca cc cu hnh ch s khc nhau.

11.4. Ch s v ORDER BY
B sung thm vo vic tm kim n gin cc hng s c tr v bng mt truy vn, mt ch s c
th c kh nng a chng ra theo mt trt t c sp xp. iu ny cho php mt c t ORDER
BY ca truy vn s c vinh danh m khng c mt bc sp xp ring r. i vi cc dng ch
s hin ang c PostgreSQL h tr, ch B-tree c th cho kt qu u ra c sp xp - cc dng
ch s khc tr v cc hng trng khp theo mt trt t khng xc nh, ph thuc vo s trin khai.
Trnh hoch nh s xem xt lm tha mn c t ORDER BY hoc bng vic qut mt ch s c sn
m khp c c t , hoc bng vic qut bng theo trt t vt l v tin hnh sp xp r rng.
i vi mt truy vn m i hi vic qut mt phn ln ca bng, th mt s sp xp r rng c kh
nng s l nhanh hn so vi vic s dng mt ch s v n i hi t I/O ca a hn v tun theo
mt mu truy cp tun t. Cc ch s l hu dng hn ch khi mt t hng cn phi c ly. Mt
trng hp c bit quan trng l ORDER BY trong s kt hp vi LIMIT n: mt s sp xp r rng s
phi x l tt c cc d liu nhn din n hng u tin, nhng nu c mt ch s trng khp vi
ORDER BY, th n hng u tin c th c truy xut trc tip, hon ton khng c vic qut phn
cn li.
Mc nh, cc ch s B-tree lu tr cc khon u vo ca chng theo trt t tng dn vi cc null
cui cng. iu ny c ngha l mt s qut tin ca mt ch s trong ct x to ra u ra tha mn
ORDER BY x (hoc mt cch chi tit, ORDER BY x ASC NULLS LAST ). Ch s cng c th c qut
ngc, to ra cc kt qu u ra tha mn ORDER BY x DESC (hoc mt cch chi tit hn, ORDER BY x
DESC NULLS FIRST, v NULLS FIRST l mc nh cho ORDER BY DESC).
Bn c th tinh chnh trt t ca mt ch s B-tree bng vic a vo cc la chn ASC, DESC, NULLS
FIRST, v/hoc NULLS LAST khi to ch s ; v d:
CREATE INDEX test2_info_nulls_low ON test2 (info NULLS FIRST);
CREATE INDEX test3_desc_index ON test3 (id DESC NULLS LAST);

Mt ch s c lu gi theo trt t tng dn vi cc null trc ht c th lm tha mn hoc


ORDER BY x ASC NULLS FIRST hoc ORDER BY x DESC NULLS LAST ph thuc vo theo chiu no n
c qut.
Bn c th h nghi v sao chng a ra tt c 4 la chn, khi m 2 la chn cng nhau vi kh nng
qut ngc c th bao trm tt c cc phng n ca ORDER BY. Trong cc ch s 1 ct duy nht th
cc la chn qu thc l d tha, nhng trong cc ch s nhiu ct th chng c th l hu dng.
Hy xem xt mt ch s 2 ct trong ( x, y): iu ny c th lm tha mn ORDER BY x, y nu chng ta
qut tin, hoc ORDER BY x DESC, y DESC nu chng ta qut li. Nhng n c th l ng dng thng
xuyn cn phi s dng ORDER BY x ASC, y DESC. Khng c cch no c c trt t t mt

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 295/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ch s th, m c kh nng nu ch s c nh ngha nh (x ASC, y DESC) hoc (x DESC, y ASC).


R rng, cc ch s vi cc trt t sp xp khng mc nh l mt chc nng kh chuyn dng,
nhng i khi chng c th to ra s tng tc nhanh to ln cho cc truy vn nht nh. Liu c ng
gi cho vic duy tr mt ch s nh vy hay khng, ph thuc vo vic bn thng xuyn s dng
th no cc truy vn i hi mt trt t sp xp c bit.

11.5. Kt hp nhiu ch s
Mt s qut ch s duy nht ch c th s dng cc mnh truy vn m s dng cc ct ch s vi
cc ton t ca lp ton t ca n c kt ni bng AND. V d, a ra mt ch s trn (a, b) th
mt ch s nh WHERE a = 5 AND b = 6 c th s dng ch s , nhng mt truy vn nh WHERE a
= 5 OR b = 6 c th khng trc tip s dng ch s .
May thay, PostgreSQL c kh nng kt hp nhiu ch s (bao gm nhiu s dng cng y ht ch s
) iu khin cc trng hp m khng th c trin khai bng cc s qut ch s duy nht.
H thng c th to thnh cc iu kin AND v OR khp vi s qut ch s. V d, mt truy vn
ging nh WHERE x = 42 OR x = 47 OR x = 53 OR x = 99 c th l c chia thnh 4 s qut ring
bit ca mt ch s trn x, mi s qut s dng mt trong cc mnh truy vn . Cc kt qu ca
cc s qut sau s c hoc (OR) cng nhau to ra kt qu . V d khc l nu chng ta
c cc ch s ring r trong x v y, th mt trin khai c kh nng ca mt truy vn ging nh
WHERE x = 5 AND y = 6 l s dng tng ch s vi mnh truy vn ng ph hp v sau v
(AND) cng nhau cc kt qu ch s nhn din cc hng kt qu.
kt hp nhiu ch s, h thng qut tng ch s cn thit v chun b mt bitmap trong b nh
trao cc v tr cc hng ca bng m s c nu nh l khp vi cc iu kin ca ch s . Cc
bitmap sau c v (AND) v c hoc (OR) cng vi nhau nh cn thit bng truy vn .
Cui cng, cc hng ca bng thc s c ving thm v c tr v. Cc hng ca bng c
ving thm theo trt t vt l, v l cch m bitmap c a ra; iu ny c ngha l bt k
trt t no ca cc ch s gc ban u l mt, v v th mt bc sp xp ring r s l cn thit nu
truy vn c mt mnh ORDER BY. V l do ny, v v tng s qut ch s b sung thm thi
gian d tha, m trnh hoch nh i khi s chn s dng mt s qut ch s n gin thm ch d
cc ch s b sung thm l c sn m c th cng tng c s dng.
Trong tt c ngoi tr cc ng dng n gin nht, c hng lot cc s kt hp cc ch s m c th
l hu dng, v lp trnh vin c s d liu phi la chn quyt nh cc ch s no s cung cp.
i khi cc ch s nhiu ct l tt nht, nhng i khi s l tt hn to ra cc ch s ring r v
da vo chc nng kt hp ch s. V d, nu ti cng vic ca bn bao gm mt s pha trn ca
cc truy vn m i khi ch lin quan ti ct x, i khi ch lin quan ti ct y, v i khi c 2 ct, th
bn c th chn to ra 2 ch s ring r cho x v y, da vo s kt hp cc ch s x l cc cu
hi m s dng c 2 ct . Bn cng c th to ra mt ch s nhiu ct ( x, y). Ch s ny thng c
th s hiu qu hn so vi s kt hp ch s cho cc truy vn c lin quan ti c 2 ct, m nh c
tho lun trong Phn 11.3, n c th hu nh l v dng i vi cc truy vn ch lin quan ti y, sao

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 296/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

cho n s khng l ch s duy nht. Mt s kt hp ch s nhiu ct v mt ch s ring r trn y


cng c th phc v mt cch hp l. i vi cc truy vn ch lin quan ti x, ch s nhiu ct c
th c s dng, d n c th ln hn v v th chm hn so vi mt ch s trn ch x. La chn
thay th sau l to ra tt c 3 ch s, m iu ny c kh nng ch hp l nu bng c tm
kim thng nhiu hn so vi n c cp nht v tt c 3 dng truy vn l ph bin. Nu mt
trong cc dng truy vn l ph bin t hn so vi dng khc, th bn c l mun thit lp cho vic
to ra ch 2 ch s m trng khp tt nht vi cc dng ph bin .

11.6. Ch s duy nht


Cc ch s cng c s dng p tun th tnh duy nht gi tr ca mt ct, hoc tnh duy nht
cc gi tr c kt hp ca nhiu hn mt ct.
CREATE UNIQUE INDEX name ON table (column [, ...])

Hin hnh, ch cc ch s B-tree c th c khai bo duy nht.


Khi mt ch s c khai bo duy nht, cc hng ca nhiu bng vi cc gi tr c nh ch s
nh nhau s khng c php. Cc gi tr null khng c xem xt bng nhau. Mt ch s duy nht
ca nhiu ct s ch t chi cc trng hp ni m tt c cc ct c nh ch s l bng nhau
trong nhiu hng.
PostgreSQL t ng to mt ch s duy nht khi mt rng buc duy nht hoc kha chnh c xc
nh cho mt bng. Ch s bao trm cc ct to thnh kha chnh hoc rng buc duy nht (mt
ch s nhiu ct, nu ph hp), v l c ch p tun th rng buc .
Lu : Cch c u tin b sung mt rng buc duy nht ti mt bng l ALTER TABLE ...
ADD CONSTRAINT. S dng cc ch s p tun th cc rng buc duy nht c th c xem
l chi tit trin khai s khng c nh gi trc tip. Tuy nhin, ngi ta s nhn thc c
rng khng c nhu cu bng tay to ra cc ch s trong cc ct duy nht; lm nh vy c
th ch p bn ch s c to ra mt cch t ng.

11.7. Ch s trong cc biu thc


Mt ct ch s khng ch cn l mt ct ca bng nm bn di, m c th l mt hm hoc biu
thc v hng c tnh ton t mt hoc nhiu ct ca bng. Chc nng ny l hu dng c
c s truy cp nhanh ti cc bng da vo cc kt qu ca cc tnh ton.
V d, mt cch ph bin tin hnh cc so snh ch hoa ch thng l s dng hm lower:
SELECT * FROM test1 WHERE lower(col1) = value;

Truy vn ny c th s dng mt ch s nu mt ch s tng c xc nh trong kt qu ca hm


lower(col1):
CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));

Nu chng ta tng khai bo ch s UNIQUE ny, th n c th ngn cn s to ra cc hng m cc gi

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 297/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

tr col1 ca chng ch khc theo ch hoa ch thng, cng nh cc hng m cc gi tr col1 ca


chng thc s y ht nhau. V th, cc ch s trong cc biu thc c th c s dng p tun th
cc rng buc m khng xc nh c nh l cc rng buc duy nht n gin.
Nh mt v d khc, nu mt ngi thng tin hnh cc truy vn nh:
SELECT * FROM people WHERE (first_name || || last_name) = John Smith;

th c th ng to ra mt ch s ging th ny:
CREATE INDEX people_names ON people ((first_name || || last_name));

C php ca lnh CREATE INDEX thng i hi vit cc du ngoc n xung quanh cc biu thc
ch s, nh c thy trong v d th 2. Cc du ngoc n c th c b qua nu biu thc ch
l mt li gi hm, nh trong v d u.
Cc biu thc ch s kh l t gi duy tr, v (cc) biu thc dn xut phi c tnh ton s
khng c tnh ton li trong qu trnh mt tm kim c nh ch s, v chng c lu tr ri
trong ch s . Trong c 2 v d trn, h thng coi truy vn ch nh WHERE indexedcolumn =
constant v v th tc ca tm kim l tng ng vi bt k truy vn ch s n gin no
khc. V th, cc ch s trong cc biu thc l hu dng khi tc c truy vn l quan trng hn so
vi tc chn v cp nht.

11.8. Ch s mt phn
Mt ch s mt phn (Partial Index) l mt ch s c xy dng qua mt tp con ca mt bng;
tp con c mt biu thc iu kin xc nh (c gi l thuc tnh ca ch s mt phn ).
Ch s bao gm cc khon u vo ch cho cc hng ca cc bng tha mn thuc tnh . Cc
ch s mt phn l mt chc nng chuyn bit, nhng c vi tnh hung theo chng l hu dng.
Mt l do chnh cho vic s dng mt ch s mt phn l trnh vic nh ch s cc gi tr ph
bin. V vic tm kim truy vn cho mt gi tr ph bin (mt gi tr m tnh ti hn mt t % ca tt
c cc hng ca bng) s khng s dng ch s , nn khng quan trng trong vic gi cc hng
trong ch s . iu ny lm gim kch c ca ch s, n s lm tng tc cc truy vn m s
dng ch s . N cng s tng tc nhiu hot ng cp nht bng v ch s khng cn phi
c cp nht trong tt c cc trng hp. V d 11-1 ch ra mt ng dng c th ca tng ny.
V d 11-1. Thit lp mt ch s mt phn loi tr cc gi tr ph bin
Gi s bn ang lu tr cc lu k truy cp my ch web trong mt c s d liu. Hu ht cc truy
cp xut pht t dy a ch IP ca t chc ca bn nhng mt s l t u khc (nh, cc nhn
vin trong cc kt ni quay s in thoi).
Nu cc tm kim IP ca bn ban u l cho cc truy cp bn ngoi, th bn c th khng cn nh
ch s dy IP tng ng vi on mng ca t chc ca bn.
Gi thit mt bng ging th ny:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 298/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

CREATE TABLE access_log (


url varchar,
client_ip inet,
...
);

to mt ch s mt phn ph hp vi v d ca chng ti, hy s dng mt lnh nh th ny:


CREATE INDEX access_log_client_ip_ix ON access_log (client_ip)
WHERE NOT (client_ip > inet 192.168.100.0 AND
client_ip < inet 192.168.100.255);

Mt truy vn in hnh c th s dng ch s ny c th l:


SELECT *
FROM access_log
WHERE url = /index.html AND client_ip = inet 212.78.10.32;

Mt truy vn khng th s dng ch s ny l:


SELECT *
FROM access_log
WHERE client_ip = inet 192.168.100.23;

Quan st thy rng dng ch s mt phn ny i hi cc gi tr ph bin c xc nh trc, sao


cho cc ch s mt phn nh vy c s dng tt nht cho cc phn phi d liu khng thay i.
Cc ch s c th thnh thong c ti to li tinh chnh cho cc phn phi d liu mi, m
iu ny b sung thm cho n lc duy tr.
S dng c th khc i vi mt ch s mt phn l loi tr cc gi tr khi ch s m ti cng
vic ca truy vn in hnh khng c quan tm; iu ny c ch ra trong v d 11-2. iu ny
dn ti mt s u im nh c lit k trn, n ngn chn cc gi tr khng quan tm khi
vic c truy cp thng qua ch s , thm ch nu mt s qut ch s c th c li trong trng
hp . R rng, vic thit lp cc ch s mt phn cho dng kch bn ny s i hi nhiu thn
trng v kinh nghim hn.
V d 11-2. Thit lp mt ch s mt phn loi tr cc gi tr khng quan tm
Nu bn c mt bng cha cc n hng c ha n v khng c ha n, ni m cc n hng
khng c ha n chim mt phn nh ca bng tng v chng l cc hng c truy cp nhiu
nht, th bn c th ci thin hiu nng bng vic to mt ch s ch trong cc hng khng c ha
n . Lnh to ch s c th trng ging th ny:
CREATE INDEX orders_unbilled_index ON orders (order_nr)
WHERE billed is not true;

Mt truy vn c th s s dng ch s ny c th l:
SELECT * FROM orders WHERE billed is not true AND order_nr < 10000;

Tuy nhin, ch s cng c th c s dng trong cc truy vn khng lin quan ti order_nr, nh:
SELECT * FROM orders WHERE billed is not true AND amount > 5000.00;

iu ny khng tht hiu qu nh mt ch s mt phn trong ct amount c th, v h thng phi


qut ton b ch s. Hn na, nu c kh t n hng khng c ha n, th bng vic s dng ch
s mt phn ny ch tm thy cc n hng khng c ha n c th l mt thnh cng.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 299/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Lu rng truy vn khng th s dng ch s ny:


SELECT * FROM orders WHERE order_nr = 3501;

n hng 3501 c th nm trong s cc n hng c ha n hoc khng c ha n.


V d 11-2 cng minh ha rng ct c nh ch s v ct c s dng trong thuc tnh khng
cn trng nhau. PostgreSQL h tr cc ch s mt phn vi cc thuc tnh ty chn, min l ch cc
ct ca bng ang c nh ch s c lin quan. Tuy nhin hy nh trong u rng thuc tnh phi
trng khp vi cc iu kin c s dng trong cc truy vn c h tr c li t ch s .
chnh xc, mt ch s mt phn c th c s dng trong mt truy vn ch nu h thng c th
tha nhn rng iu kin WHERE ca truy vn t ng ng thuc tnh ca ch s . PostgreSQL
khng c mt trnh chng minh nh l c th nhn thc c cc biu thc tng ng nhau v
mt ton hc c vit cc dng khc nhau. (Mt trnh chng minh nh l chung nh vy khng
ch l kh to ra, m n cn c th l qu chm i vi bt k s s dng thc t no). H thng
c th nhn bit c cc tc ng khng bng nhau n gin, v d x < 1 ng x < 2; nu
khng th iu kin thuc tnh phi chnh xc khp vi phn ca iu kin WHERE ca truy vn hoc
ch s s khng c tha nhn l c kh nng s dng. Vic trng khp din ra trong thi gian
lp k hoch truy vn, khng trong thi gian chy. Kt qu l, cc mnh truy vn c tham s
khng lm vic vi mt ch s mt phn. V d, truy vn c chun b vi mt tham s c th ch
nh x < ? m s khng bao gi ng x < 2 i vi tt c cc gi tr c th ca tham s .
S dng c kh nng th 3 cho cc ch s mt phn khng i hi ch s s c s dng trong
cc truy vn hon ton. tng y l to ra mt ch s duy nht i vi mt tp con ca mt
bng, nh trong v d 11-3. iu ny p tun th tnh c nht trong cc hng tha mn thuc tnh
ch s , khng c vic rng buc cc hng khng tha mn.
V d 11-3. Thit lp mt ch s mt phn duy nht
Gi thit l chng ta c mt bng m t cc u ra ca kim th. Chng ta mun m bo rng ch
c mt khon u vo thnh cng cho mt i tng c a ra v s kt hp ch, nhng c
th c bt k s cc khon u vo khng thnh cng no. y l mt cch lm iu ny:
CREATE TABLE tests (
subject text,
target text,
success boolean,
...
);
CREATE UNIQUE INDEX tests_success_constraint ON tests (subject, target)
WHERE success;

y l mt tip cn c bit hiu qu khi c t cc kim th thnh cng v nhiu kim th khng
thnh cng.
Cui cng, mt ch s mt phn cng c s dng ghi cc la chn k hoch truy vn ca h
thng. Hn na, cc tp hp d liu vi cc phn phi c bit c th lm cho h thng s dng
mt ch s khi n thc s khng nn. Trong trng hp ch s c th c thit lp sao cho n l

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 300/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

khng sn sng i vi truy vn vi phm. Thng thng, PostgreSQL thc hin cc la chn hp l
v s dng ch s (nh, n trnh chng khi truy xut cc gi tr ph bin, nn v d trc thc s
ch tit kim kch c ca ch s, n khng c yu cu trnh s dng ch s), v cc la chn k
hoch khng ng mt cch hin nhin l l do cho mt bo co li.
Nh trong u rng vic thit lp mt ch s mt phn ch ra rng bn bit t nht nh nhiu trnh
hoch nh truy vn cng bit, c bit bn bit khi mt ch s c th c li. Vic hnh thnh tri thc
ny i hi kinh nghim v s hiu bit cch m cc ch s trong PostgreSQL lm vic. Trong hu
ht cc trng hp, u th ca mt ch s mt phn i vi mt ch s thng thng s l ti thiu.
Nhiu thng tin hn v cc ch s mt phn c th thy trong Trng hp cho cc ch s mt phn,
Vic nh ch s mt phn trong PostgreSQL: d n nghin cu, v cc ch s mt phn c khi
qut ha (phin bn c nm bt).

11.9. Lp ton t v h ton t


Mt nh ngha ch s c th ch nh mt lp ton t cho tng ct ca mt ch s.
CREATE INDEX name ON table (column opclass [sort options] [, ...]);

Lp ton t nhn din cc ton t s c ch s cho ct s dng. V d, mt ch s B-tree


dng int4 c th s dng lp int4_ops; lp ton t ny bao gm cc hm so snh cho cc gi tr dng
int4. Trong thc t lp ton t mc nh cho dng d liu ct thng l . L do chnh cho vic c
cc lp ton t l i vi mt s dng d liu, c th c nhiu hn mt hnh vi ch s c ngha. V
d, chng ta c th mun sp xp mt dng d liu ct phc tp hoc bng gi tr tuyt i hoc
bng phn thc t. Chng ta c th lm iu ny bng vic xc nh 2 lp ton t cho dng d liu
v sau la chn lp ph hp khi thc hin mt ch s. Lp ton t xc nh trt t sp xp
c bn (m c th sau c thay i bng vic b sung thm cc la chn sp xp ASC /DESC
v/hoc NULLS FIRST /NULLS LAST).
Cng c mt s lp ton t c xy dng sn ngoi cc lp mc nh:

Cc lp ton t text_pattern_ops , varchar_pattern_ops v bpchar_pattern_ops h tr cc ch s


B-tree cc dng text, varchar v char mt cch tng ng. S khc bit vi cc lp ton t
mc nh l cc gi tr s c so snh kht khe tng k t mt thay v theo cc qui tc i
chiu c th bn a. iu ny lm cho cc lp ton t ph hp cc truy vn c lin
quan ti cc biu thc khp mu s dng (cc biu thc thng thng LIKE hoc POSIX) khi
c s d liu khng s dng bn a tiu chun C. Nh mt v d, bn c th nh ch s
mt ct varchar nh th ny:
CREATE INDEX test_index ON test_table (col varchar_pattern_ops);

Lu l bn cng nn to mt ch s vi lp ton t mc nh nu bn mun cc ch s c


lin quan ti cc ton t so snh thng thng <, <=, >, hoc >= s dng mt ch s. Cc
truy vn nh vy khng th s dng cc lp ton t xxx_pattern_ops. (Tuy nhin, thng th
cc so snh bng nhau c th s dng cc lp ton t ). Nu c kh nng to nhiu ch

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 301/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

s trong cng ct y ht vi cc lp khc nhau. Nu bn s dng bn a C, th bn khng cn


cc lp ton t xxx_pattern_ops, v mt ch s vi lp ton t mc nh l s dng c cho
cc truy vn khp mu trong bn a C.
Truy vn sau ch ra tt c cc lp ton t c xc nh:
SELECT am.amname AS index_method,
opc.opcname AS opclass_name
FROM pg_am am, pg_opclass opc
WHERE opc.opcmethod = am.oid
ORDER BY index_method, opclass_name;

Mt lp ton t thc s ch l mt tp con ca mt cu trc ln hn gi l mt h ton t. Trong


cc trng hp ni m vi dng d liu c cc hnh vi tng t nhau th thng hu dng nh
ngha cc ton t dng lin d liu v cho php chng lm vic vi cc ch s. lm iu ny, cc
lp ton t cho tng trong s cc dng phi c nhm vo trong cng mt h ton t. Cc ton
t lin dng l cc thnh vin ca h , nhng khng c lin quan vi bt k lp duy nht no
trong h .
Truy vn ny ch ra tt c cc h ton t c nh ngha v tt c cc ton t c a vo trong
tng h:
SELECT am.amname AS index_method,
opf.opfname AS opfamily_name,
amop.amopopr::regoperator AS opfamily_operator
FROM pg_am am, pg_opfamily opf, pg_amop amop
WHERE opf.opfmethod = am.oid AND
amop.amopfamily = opf.oid
ORDER BY index_method, opfamily_name, opfamily_operator;

11.10. Kim tra s dng ch s


D cc ch s trong PostgreSQL khng cn duy tr hay tinh chnh, th vn quan trng phi kim tra
cc ch s no thc s c ti cng vic truy vn trong cuc sng thc s dng. Vic kim tra s
dng ch s cho mt truy vn ring r c thc hin vi lnh EXPLAIN; ng dng ca n cho mc
ch ny c minh ha trong Phn 14.1. Cng c kh nng tp hp ton b cc s liu thng k v
s dng cc ch s trong mt my ch ang chy, nh c m t trong Phn 27.2.
L kh to mt th tc chung cho vic xc nh cc ch s no to ra. C mt s trng hp
in hnh c ch ra trong cc v d khp cc phn trc. Mt s vic th im tt thng l cn
thit. Phn cn li ca phn ny a ra mt s mo cho iu :

Lun chy lnh ANALYZE trc tin. Lnh ny thu thp cc s liu thng k v phn phi
cc gi tr trong bng. Thng tin ny c yu cu nh gi s lng cc hng c mt
truy vn tr v, n l cn thit cho trnh hoch nh ch nh cc chi ph thc t cho tng
k hoch truy vn c kh nng. Thiu bt k s liu thng k thc t no, th mt s gi tr
mc nh s c gi thit, chng hu nh chc chn s l khng chnh xc. Vic kim tra s
s dng ch s ca mt ng dng m khng chy ANALYZE v th l mt l do b thiu. Xem
Phn 23.1.3 v Phn 23.1.5 c thm thng tin.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 302/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

S dng cc d liu thc t cho th im. Vic s dng cc d liu kim th cho vic thit
lp cc ch s s ni cho bn cc ch s no bn cn cho cc d liu kim th , m iu
l tt c.
c bit sng cn s dng cc tp hp d liu kim th rt nh. Trong khi vic la chn
1.000 trong s 100.000 hng c th l mt ng vin cho mt ch s, th vic la chn 1 trong
s 100 hng s kh l nh vy, v 100 hng c th ph hp trong mt trang a duy nht, v
khng c k hoch c th tun t chim c 1 trang a.
Cng thn trng khi ly cc d liu kim th, n thng c kh nng trnh c khi ng
dng cn cha nm trong sn xut. Cc gi tr l rt nh, hon ton ngu nhin, hoc c
chn vo theo trt t c sp xp s bp mo cc s liu thng k khi s phn phi m d
liu thc c th c.

Khi cc ch s khng c s dng, c th l hu dng cho vic kim th p tun th s


dng chng. C cc tham s thi gian chy (run time) c th tt cc dng k hoch khc
nhau (xem Phn 18.6.1). V d, vic tt cc s qut tun t ( enable_seqscan) v cc lin kt
lp lng nhau (enable_nestloop), chng l cc k hoch c bn nht, s p h thng phi s
dng mt k hoch khc. Nu h thng vn cn chn mt s qut tun t hoc lin kt lng
nhau th c th s c mt l do c bn hn v sao ch s khng c s dng; v d, iu
kin truy vn khng khp vi ch s . (Dng truy vn no c th s dng dng ch s no
c gii thch trong cc phn trc).

Nu vic p s dng ch s khng s dng ch s, th sau c 2 kh nng: Hoc h thng l


ng v vic s dng ch s qu thc l khng ph hp, hoc cc c lng chi ph ca cc
k hoch truy vn ang khng phn nh c thc t. V th bn nn nh thi gian cho truy
vn ca bn vi v khng vi cc ch s. Lnh EXPLAIN ANALYZE c th l hu dng y.

Nu ha ra l cc c lng chi ph l sai, mt ln na, c th c 2 kh nng. Tng chi ph


c tnh ton t cc chi ph cho tng hng ca tng nt k hoch nh thi gian cho c
lng chn lc ca nt k hoch. Cc chi ph c c tnh cho cc nt k hoch c th
c tinh chnh do cc s liu thng k khng . C th l c kh nng ci thin iu
ny bng vic tinh chnh cc s liu thng k - vic tp hp cc tham s (xem ALTER
TABLE).
Nu bn khng thnh cng trong vic tinh chnh cc chi ph cho ph hp hn, th bn c th
phi sp xp li p s dng ch s mt cch r rng. Bn cng c th mun lin h vi
cc lp trnh vin PostgreSQL xem xt vn .

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 303/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Chng 12. Tm kim ton vn


12.1. Gii thiu
Tm kim ton vn (hoc ch l tm kim vn bn) a ra kh nng nhn din cc ti liu ngn ng
t nhin m lm tha mn mt truy vn, v thng sp xp chng thch ng cho s truy vn.
Dng tm kim ph bin nht l tm tt c cc ti liu c cha cc khon truy vn c a ra v tr
chng v theo trt t tng t ca chng i vi truy vn . Cc khi nim query v similarity l rt
mm do v ph thuc vo ng dng c th. Tm kim n gin nht coi query nh mt tp hp cc
t v similarity nh tn sut ca cc t truy vn trong ti liu .
Cc ton t tm kim vn bn tn ti trong cc c s d liu nhiu nm. PostgreSQL c cc ton
t ~, ~*, LIKE, v ILIKE cho cc dng d liu vn bn, nhng chng thiu nhiu thuc tnh c bn
c cc h thng thng tin hin i yu cu:

Khng c h tr ngn ng, thm ch cho ting Anh. Cc biu thc thng thng l khng
v chng khng th d dng iu khin cc t dn xut, nh, satisfies v satisfy. Bn c th
b qua cc ti liu m c cha satisfies, d bn c th mun tm chng khi tm kim satisfy.
C kh nng s dng OR tm nhiu dng c dn xut, nhng iu ny l nng n v d
b li (mt s t c th c vi ngn dn xut).

Chng khng a ra trt t (xp hng) cc kt qu tm kim, m lm cho chng khng hiu
qu khi hng ngn ti liu trng khp c tm thy.

Chng c xu hng chm v khng c h tr ch s, nn chng phi x l tt c cc ti liu


cho tng tm kim.

nh ch s ton vn cho php cc ti liu s c tin x l v mt ch s c lu cho vic tm


kim nhanh sau ny. Vic x l bao gm:
Vic phn tch cc ti liu trong cc th token. L hu dng nhn din cc lp th token
khc nhau, nh, cc s, t, t phc tp, a ch th in t, sao cho chng c th c x l
khc nhau. V nguyn tc cc lp th token ph thuc vo ng dng c th, nhng i vi
hu ht cc mc ch th l ph hp s dng mt tp hp cc lp c xc nh sn trc.
PostgreSQL s dng mt trnh phn tch thc hin bc ny. Mt trnh phn tch tiu
chun c cung cp, v cc trnh phn tch ty bin c th c to ra cho nhu cu c th.
Vic bin i cc th token thnh cc t v. Mt t v l mt chui, ht nh mt th token,
nhng n c bnh thng ha sao cho cc dng khc nhau ca cng mt t c lm cho
ging nhau. V d, s bnh thng ha hu ht lun bao gm vic bin cc ch hoa thnh
ch thng, v thng c lin quan ti vic loi b cc hu t (nh k t s hoc es trong
ting Anh). iu ny cho php cc tm kim tm cc dng phng n ca cng mt t,
khng nng nhc a vo tt c cc phng n c th. Hn na, bc ny thng loi b
cc t cht (stop word), chng l cc t qu ph bin m chng l v dng cho vic tm

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 304/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

kim. (Ngn gn, sau , cc th token l cc phn on th ca vn bn ti liu, trong khi


cc t v l cc t c tin tng l hu dng cho vic nh ch s v tm kim).
PostgreSQL s dng cc t in thc hin bc ny. Cc t in tiu chun khc nhau
c cung cp, v cc t in ty bin c th c to ra cho cc nhu cu c th.
Vic lu tr cc ti liu c tin x l c ti u ha cho vic tm kim. V d, tng ti
liu c th c trnh by nh mt mng c sp xp cc t v c bnh thng ha.
Cng vi cc t v thng c mong mun lu tr cc thng tin v tr s dng cho xp
hng gn ng, sao cho mt ti liu c cha mt vng m c hn cc t truy vn c
ch nh hng cao hn so vi mt ti liu vi cc t truy vn ri rc.
Cc t in cho php kim sot mn hn i vi cch m cc th token c bnh thng ha. Vi
cc t in thch hp, bn c th:

nh ngha cc t cht s khng c nh ch s.

nh x cc t ng ngha ti mt t duy nht bng vic s dng Ispell.

nh x cc cm t ti mt t duy nht bng vic s dng mt t in ng ngha.

nh x cc phng n khc nhau ca mt t ti mt dng kinh in bng vic s dng mt


t in Ispell.

nh x cc phng n khc nhau ca mt t ti mt dng kinh in bng vic s dng cc


qui tc cng bng tuyt (Snowball stemmer).
Dng d liu tsvector c cung cp cho vic lu tr cc ti liu c tin x l, cng vi
mt dng tsquery cho vic th hin cc truy vn c x l (Phn 8.11). C nhiu hm v
ton t c sn cho cc dng d liu (Phn 9.13), quan trng nht trong s l ton t
trng khp @@, m chng ti gii thiu trong Phn 12.1.2. Cc tm kim ton vn c th
c tng tc bng vic s dng cc ch s (Phn 12.9).

12.1.1. Ti liu l g?
Mt ti liu l n v tm kim trong mt h thng tm kim ton vn; v d, bi bo ca mt tp ch
hoc thng ip th in t. My tm kim vn bn phi c kh nng phn tch cc ti liu v lu
tr cc iu lin quan ca cc t vng (cc t kha) vi ti liu cha ca chng. Sau ny, cc iu
lin quan c s dng tm kim cc ti liu c cha cc t truy vn.
i vi cc tm kim trong PostgreSQL, mt ti liu thng l mt trng vn bn bn trong mt
hng ca mt bng c s d liu, hoc c th l mt s kt hp (s ghp) cc trng nh vy, c
th c lu tr trong vi bng hoc c c mt cch nng ng. Ni cch khc, mt ti liu c
th c xy dng t cc phn khc nhau cho vic nh ch s v n c th khng c lu tr
bt k u nh mt tng th. V d:
SELECT title || || author || || abstract || || body AS document
FROM messages
WHERE mid = 12;

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 305/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

SELECT m.title || || m.author || || m.abstract || || d.body AS document


FROM messages m, docs d
WHERE mid = did AND mid = 12;

Lu : Thc s, trong cc truy vn v d , coalesce s c s dng ngn nga mt


thuc tnh NULL duy nht khi vic gy ra mt kt qu NULL cho ti liu tng th.
Kh nng khc l lu tr cc ti liu nh cc tp vn bn n gin trong h thng tp. Trong trng
hp ny, c s d liu c th c s dng lu tr ch s ton vn v thc thi cc tm kim,
v mt s m nh danh c nht c th c s dng truy xut ti liu t h thng tp. Tuy
nhin, vic truy xut cc ti liu t bn ngoi c s d liu i hi cc quyn ca siu ngi s
dng (superuser) hoc s h tr ca cc hm c bit, nn iu ny thng t thun tin hn l vic
gi cho tt c cc d liu nm bn trong PostgreSQL. Hn na, vic gi mi iu bn trong c s
d liu cho php d dng truy cp ti cc siu d liu ca ti liu h tr trong vic nh ch s v
hin th.
V cc mc ch tm kim vn bn, tng ti liu phi c gim thiu v nh dng tsvector c
tin x l. Vic tm kim v xp hng c thc hin ton b trong s trnh by mt ti liu ca
tsvector - vn bn gc ch cn c truy xut khi ti liu c chn hin th cho mt ngi s
dng. Chng ti v th thng ni v tsvector nh l ti liu, nhng tt nhin n ch l mt s trnh
by c ng ca ti liu y .

12.1.2. Trng khp vn bn c bn


Vic tm kim ton vn trong PostgreSQL da vo ton t trng khp @@, n tr v ng nu mt
tsvector (ti liu) trng vi tsquery (truy vn). Khng thnh vn dng d liu no c ghi trc:
SELECT a fat cat sat on a mat and ate a fat rat::tsvector @@ cat & rat::tsquery;
?column?
---------t
SELECT fat & cow::tsquery @@ a fat cat sat on a mat and ate a fat rat::tsvector;
?column?
---------f

Nh v d trn gi , mt tsquery khng ch l mt vn bn th, m l bt k vn bn no nhiu


hn mt tsvector. Mt tsquery cha cc khon tm kim, chng phi l cc t v c bnh thng
ha ri, v c th kt hp nhiu khon bng vic s dng cc ton t AND, OR, v NOT. ( c cc
chi tit, xem Phn 8.11). C cc hm to_tsquery v plainto_tsquery l hu ch trong vic bin i vn
bn do ngi s dng vit thnh mt tsquery ph hp, v d bng vic bnh thng ha cc t xut
hin trong vn bn . Tng t, to_tsvector c s dng phn tch v bnh thng ha mt
chui ca ti liu. V th trong thc t mt s trng khp tm kim vn bn c th trng ging hn
th ny:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 306/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

SELECT to_tsvector(fat cats ate fat rats) @@ to_tsquery(fat & rat);


?column?
---------t

Quan st thy rng s trng khp ny c th khng thnh cng nu c vit nh l:


SELECT fat cats ate fat rats::tsvector @@ to_tsquery(fat & rat);
?column?
---------f

v y khng s bnh thng ha no ca t rats s xy ra c. Cc phn t ca mt tsvector l cc


t v, chng c gi thit c bnh thng ha ri, nn rats khng khp vi rat.
Ton t

cng h tr u vo text, cho php s bin i r rng ca mt chui vn bn sang


tsvector hoc tsquery s c b qua trong cc trng hp n gin. Cc bin th sn sng l:
@@

tsvector @@ tsquery
tsquery @@ tsvector
text @@ tsquery
text @@ text

2 dng u ca cc dng trn chng ta thy ri. Vn bn dng text @@ tsquery l tng ng
vi to_tsvector(x) @@ y. Dng text @@ text l tng ng vi to_tsvector(x) @@ plainto_tsquery(y).

12.1.3. Cu hnh
Bn trn l tt c cc v d tm kim vn bn n gin. Nh c nu trc , chc nng tm kim
ton vn bao gm kh nng thc hin nhiu iu hn: b qua vic nh ch s cc t nht nh (cc
t cht), x l cc t ng ngha v s dng vic phn tch phc tp, nh, phn tch da vo nhiu
hn l ch khong trng. Chc nng ny c cc cu hnh tm kim vn bn kim sot. PostgreSQL
i vi cc cu hnh c nh ngha trc cho nhiu ngn ng, v bn c th d dng to cc cu
hnh ca ring bn. (lnh \dF ca psql ch ra tt c cc cu hnh c sn).
Trong qu trnh ci t mt cu hnh ph hp c la chn v default_text_search_config c
thit lp ph hp trong postgresql.conf. Nu bn ang s dng cu hnh tm kim vn bn y ht cho
ton b cm th bn c th s dng gi tr trong postgresql.conf. s dng cc cu hnh khc
thng qua cm nhng cu hnh y ht trong bt k mt c s d liu no, hy s dng ALTER
DATABASE ... SET. Nu khng, bn c th thit lp default_text_search_config trong tng phin.
Mi hm tm kim vn bn ph thuc vo mt cu hnh c mt i s ty chn regconfig, sao cho
cu hnh s s dng c th c ch nh mt cch r rng. default_text_search_config c s dng
ch khi i s ny b b qua.
lm cho n d dng hn xy dng cc cu hnh tm kim vn bn ty bin, mt cu hnh c
xy dng t cc i tng c s d liu n gin hn. C s tm kim vn bn ca PostgreSQL a
ra 4 dng i tng c s d liu c lin quan ti cu hnh:

Cc trnh phn tch tm kim vn bn chia cc ti liu thnh cc th token v phn loi tng
token (v d, nh cc t hoc cc s).

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 307/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Cc t in tm kim vn bn bin i cc th token thnh dng c bnh thng ha v t


chi cc t cht.

Cc mu template tm kim vn bn a ra cc hm cho cc t in nm bn di. (Mt t


in n gin ch nh mt mu template v mt tp hp cc tham s cho mu temlate ).

Cc cu hnh tm kim vn bn la chn mt trnh phn tch v mt tp hp cc t in


s dng bnh thng ha cc th token c trnh phn tch to ra.

Cc trnh phn tch tm kim vn bn v cc mu template c xy dng t cc hm C mc thp;


v th n i hi kh nng lp trnh C pht trin cc hm mi, v cc quyn u tin ca siu
ngi s dng - superuser ci t mt hm vo mt c s d liu. (C cc v d v cc trnh
phn tch v cc mu template b sung trong vng contrib/ ca phn phi PostgreSQL). V cc t
in v cc cu hnh ch tham s ha v kt ni cng vi mt s trnh phn tch v mu template
nm bn di, nn khng quyn u tin c bit no l cn thit to ra mt t in hoc cu hnh
mi. Cc v d v vic to cc t in v cu hnh ty bin xut hin sau trong chng ny.

12.2. Bng v ch s
Cc v d trong phn trc minh ha vic trng khp ton vn bng vic s dng cc chui hng
n gin. Phn ny ch ra cch tm cc d liu ca bng, s dng ty chn cc ch s.

12.2.1. Tm kim bng


C kh nng tin hnh mt tm kim ton vn m khng c mt ch s. Mt truy vn n gin in ra
tiu ca tng hng c cha t friend trong trng thn ca n l:
SELECT title
FROM pgweb
WHERE to_tsvector(english, body) @@ to_tsquery(english, friend);

iu ny cng s tm cc t c lin quan nh friends v friendly, v tt c chng c gim v cng


y ht t v c bnh thng ha.
Truy vn trn ch nh rng cu hnh english s c s dng phn tch v bnh thng ha cc
chui . Nh mt la chn chng ta c th b qua cc tham s cu hnh:
SELECT title
FROM pgweb
WHERE to_tsvector(body) @@ to_tsquery(friend);

Truy vn ny s s dng cu hnh c thit lp bng default_text_search_config.


Mt v d phc tp hn l la chn 10 ti liu gn y nht m c cha
hoc thn:

create

v table trong tiu

SELECT title
FROM pgweb
WHERE to_tsvector(title || || body) @@ to_tsquery(create & table)
ORDER BY last_mod_date DESC
LIMIT 10;

lm r chng ti b qua cc li gi hm coalesce m n c th s cn thit tm cc hng c

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 308/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

cha NULL trong 1 trong 2 trng .


D cc truy vn s lm vic khng c mt ch s, th hu ht cc ng dng s thy tip cn ny
qu chm, ngoi tr c l trong trng hp cc tm kim c bit. S dng thc tin tm kim vn
bn thng i hi vic to mt ch s.

12.2.2. To ch s
Chng ta c th to mt ch s GIN (Phn 12.9) tng tc cc tm kim vn bn:
CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector(english, body));

Lu rng phin bn 2 i s ca to_tsvector c s dng. Ch cc hm tm kim vn bn ch nh


mt tn cu hnh mi c th c s dng trong cc ch s ca biu thc (Phn 11.7). iu ny l v
cc ni dung ch s phi khng b nh hng v default_text_search_config. Nu chng b nh
hng, th cc ni dung ch s c th l khng nht qun v cc khon u vo khc nhau c th bao
gm cc tsvector tng c to ra vi cc cu hnh tm kim vn bn khc nhau, v c th khng c
cch no gi l cu hnh no. C th khng c kh nng b v phc hi ch s nh vy mt
cch ng n.
V phin bn 2 i s ca to_tsvector tng c s dng trong ch s trn, ch mt tham chiu truy
vn m s dng phin bn 2 i s ca to_tsvector vi cng y ht tn cu hnh s s dng ch s .
l, WHERE to_tsvector(english, body) @@ a & b c th s dng ch s , nhng WHERE
to_tsvector(body) @@ a & b th khng th. iu ny m bo rng mt ch s s ch c s dng
vi cng y ht cu hnh c s dng to cc khon u vo ca ch s .
C kh nng thit lp cc ch s biu thc phc tp hn trong khi tn cu hnh c ct khc ch
nh, nh:
CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector(config_name, body));

trong config_name l mt ct trong bng pgweb. iu ny cho php cc cu hnh c trn trong
cng ch s trong khi ghi li cu hnh no tng c s dng cho tng khon u vo ca ch s.
iu ny c th l hu dng, v d, nu s thu thp ti liu c cha cc ti liu trong cc ngn
ng khc. Mt ln na, cc truy vn c ngha s dng ch s phi c cu to thnh cc cm
t trng khp nhau, nh, WHERE to_tsvector(config_name, body) @@ a & b.
Cc ch s c th thm ch ghp ni cc ct:
CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector(english, title || || body));

Mt tip cn khc l to ra mt ct tsvector ring r gi u ra ca to_tsvector. V d ny l


mt s ghp ni title v body, bng vic s dng coalesce m bo rng mt trng vn s c
nh ch s khi trng khc l NULL:
ALTER TABLE pgweb ADD COLUMN textsearchable_index_col tsvector;
UPDATE pgweb SET textsearchable_index_col =
to_tsvector(english, coalesce(title,) || || coalesce(body,));

Sau chng ta to mt ch s GIN tng tc tm kim:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 309/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

CREATE INDEX textsearch_idx ON pgweb USING gin(textsearchable_index_col);

By gi chng ta sn sng thc hin mt tm kim ton vn nhanh:


SELECT title
FROM pgweb
WHERE textsearchable_index_col @@ to_tsquery(create & table)
ORDER BY last_mod_date DESC
LIMIT 10;

Khi s dng mt ct ring r lu tr i din tsvector, iu cn thit phi to ra mt trigger


gi cho ct tsvector l hin hnh bt k khi no title hoc body thay i. Phn 12.4.3 gii thch lm
iu nh th no.
Mt u im ca tip cn ct ring r i vi mt ch s biu thc l n khng cn phi ch nh r
rng cu hnh tm kim vn bn trong cc truy vn s dng ch s . Nh c ch ra trong v
d trn, truy vn c th ph thuc vo default_text_search_config. Mt u im khc l cc tm
kim s l nhanh hn, v n s khng cn phi lm li cc li gi ca to_tsvector kim tra cc
trng khp ch s. (iu ny quan trng hn khi s dng mt ch s GiST hn l mt ch s GIN;
xem Phn 12.9). Tuy nhin, tip cn ch s biu thc l n gin hn thit lp, v n i hi t
khng gian a hn v i din tsvector khng c lu tr r rng.

12.3. Kim sot tm kim ton vn


trin khai tm kim ton vn s phi c mt hm to mt tsvector t mt ti liu v mt
tsquery t mt truy vn ngi s dng. Hn na, chng ta cn phi tr v cc kt qu theo mt trt
t hu dng, nn chng ta cn mt hm so snh cc ti liu vi lu v tnh ph hp ca chng i
vi truy vn . Cng quan trng c kh nng hin th cc kt qu mt cch sng sa.
PostgreSQL a ra s h tr cho tt c cc hm .

12.3.1. Phn tch ti liu


PostgreSQL a ra hm to_tsvector cho vic bin i mt ti liu sang dng d liu tsvector.
to_tsvector([ config regconfig, ] document text) returns tsvector

phn tch mt ti liu vn bn thnh cc th token, gim cc th token thnh cc t v, v


tr v mt tsvector m lit k cc t v cng vi cc v tr ca chng trong ti liu . Ti liu c
x l theo cu hnh tm kim vn bn mc nh hoc c ch nh. y l mt v d n gin:
to_tsvector

SELECT to_tsvector(english, a fat cat sat on a mat - it ate a fat rats);


to_tsvector
----------------------------------------------------ate:9 cat:3 fat:2,11 mat:7 rat:12 sat:4

Trong v d trn chng ta thy rng kt qu


thnh rat, v du gch ngang - b b qua.

tsvector

khng cha cc t a,

on,

hoc it, t

rats

tr

Hm tsvector ban u gi mt trnh phn tch chia vn bn ti liu thnh cc th token v ch nh


mt dng cho tng th . i vi tng th token, mt danh sch cc t in (Phn 12.6) c t
vn, ni m danh sch c th khc nhau ph thuc vo dng th token. T in u tin nhn

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 310/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

thc c th token pht ra mt hoc nhiu t v c bnh thng ha hn i din cho th


token . V d, rats tr thnh rat v mt trong cc t in nhn thc c rng t rats l mt
dng s nhiu ca rat. Mt s t c nhn thc nh l cc t cht (Phn 12.6.1), chng v th b b
qua v chng xy ra qu thng xuyn khng hu dng khi tm kim. Trong v d ca chng ta
l a, on, v it. Nu khng t in no trong danh sch nhn thc c th token th n cng b b
qua. Trong v d ny iu xy ra i vi du gch ngang - v trong thc t khng t in no
c ch nh cho dng th token ca n (cc k t trng), ngha l cc th token trng s khng bao
gi c nh ch s. Cc la chn ca trnh phn tch, cc t in v cc dng no ca cc th
token nh ch s s c cu hnh tm kim vn bn c la chn xc nh (Phn 12.7). C kh
nng c nhiu cu hnh khc nhau trong cng mt c s d liu, v cc cu hnh c xc nh sn
trc l sn sng cho nhiu ngn ng. Trong v d ca chng ta, chng ta s dng cu hnh mc
nh english cho ngn ng ting Anh.
Hm setweight c th c s dng gn nhn cho cc khon u vo ca mt tsvector vi mt
trng s c a ra, ni m mt trng s l mt trong cc k t A, B, C, hoc D. iu ny in hnh
c s dng nh du cc khon u vo ti t cc phn khc nhau ca mt ti liu, nh tiu
so vi thn. Sau , thng tin ny c th c s dng cho vic xp hng cc kt qu tm kim.
V to_tsvector(NULL) s tr v NULL, c khuyn co s dng coalesce bt k khi no mt trng c
th l null. y phng php c khuyn co cho vic to tsvector t mt ti liu c cu trc:
UPDATE tt SET ti =
setweight(to_tsvector(coalesce(title,)), A) ||
setweight(to_tsvector(coalesce(keyword,)), B) ||
setweight(to_tsvector(coalesce(abstract,)), C) ||
setweight(to_tsvector(coalesce(body,)), D);

Chng ta y s dng setweight gn nhn cho ngun ca tng t v trong tsvector c kt


thc, v sau trn cc gi tr ca tsvector c gn nhn bng vic s dng ton t ghp
tsvector l ||. (Phn 12.4.1 a ra cc chi tit v cc hot ng ).

12.3.2. Phn tch truy vn


PostgreSQL a ra cc hm to_tsquery v plainto_tsquery cho vic bin i mt truy vn thnh dng
d liu tsquery. to_tsquery a ra s truy cp ti nhiu chc nng hn plainto_tsquery, nhng t tha
th hn v u vo ca n.
to_tsquery([ config regconfig, ] querytext text) returns tsquery

to ra mt gi tr tsquery t querytext, n phi bao gm cc th token duy nht c cc


ton t & (AND), | (OR) v ! (NOT) tch bch ra. Cc ton t c th c nhm li bng vic s
dng cc du ngoc n. Ni cch khc, u vo i vi to_tsquery phi tun theo ri cc qui tc
chung i vi u vo tsquery, nh c m t trong Phn 8.11. S khc bit l trong khi u vo
c bn tsquery ly th token gi php nh (face value), th to_tsquery bnh thng ha tng th
token thnh mt t v bng vic s dng cu hnh c ch nh hoc mc nh, v hy b bt k
th token no m l cc t cht theo cu hnh . V d:
to_tsquery

SELECT to_tsquery(english, The & Fat & Rats);

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 311/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

to_tsquery
--------------fat & rat

Nh trong u vo c bn tsquery, (cc) trng s c th c gn vo tng t v hn ch n trng


khp ch tsvector cc t v ca (cc) trng s . V d:
SELECT to_tsquery(english, Fat | Rats:AB);
to_tsquery
-----------------fat | rat:AB

Hn na, * cng c gn vo mt t v ch nh vic khp tin t:


SELECT to_tsquery(supern:*A & star:A*B);
to_tsquery
-------------------------supern:*A & star:*AB

Mt t v nh vy s khp vi bt k t no trong mt tsvector m bt u vi chui c a ra.


to_tsquery cng c th chp nhn cc mnh trong cc du ngoc n. Trc ht iu ny l hu
dng khi cu hnh bao gm mt t in cc t ng ngha m c th lm bt ra cc mnh nh
vy. Trong v d bn di, mt t ng ngha c cha qui tc supernovae stars : sn:
SELECT to_tsquery(supernovae stars & !crab);
to_tsquery
--------------sn & !crab

Khng c cc du ngoc, to_tsquery s to ra li c php i vi cc th token m khng c mt


ton t AND hoc OR tch bit nhau.
plainto_tsquery([ config regconfig, ] querytext text) returns tsquery

bin i vn bn khng c nh dng querytext sang tsquery. Vn bn c


phn tch v bnh thng ha nhiu nh i vi to_tsvector, sau ton t & (AND) Boolean s
c chn vo gia cc t ang sng st.
plainto_tsquery

V d:
SELECT plainto_tsquery(english, The Fat Rats);
plainto_tsquery
----------------fat & rat

Lu rng plainto_tsquery khng th nhn bit c cc ton t Boolean, cc nhn trng s hoc
cc nhn khp tin t u vo ca n:
SELECT plainto_tsquery(english, The Fat & Rats:C);
plainto_tsquery
--------------------fat & rat & c

y, tt c cc du ngt u vo tng b b qua nh ang l cc k hiu trng.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 312/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

12.3.3. Xp hng cc kt qu tm kim


Cc c gng o m vic xp hng cc ti liu ph hp th no l i vi mt truy vn c th, sao
cho khi c nhiu s trng khp th cc trng khp ph hp nht c th c trnh by u tin.
PostgreSQL a ra 2 hm xp hng c nh ngha trc, chng tnh ti thng tin v t v, tnh
gn ng v cu trc; l, chng xem xt cc khon ca truy vn thng xuyn xut hin th
no trong ti liu, cc khon trong ti liu gn nhau nh th no, v quan trng th no phn ca
ti liu ni m chng xy ra. Tuy nhin, khi nim v tnh ph hp l m h v rt c th ng
dng. Cc ng dng khc nhau c th i hi thng tin b sung cho vic xp hng, nh, thi gian
sa i ti liu. Cc hm xp hng c xy dng sn ch l nhng v d. Bn c th t mnh vit
cc hm xp hng v/hoc cc kt qu ca chng vi cc yu t b sung thm cho khp vi cc nhu
cu c th.
2 hm xp hng hin sn c l:
ts_rank([ weights float4[], ] vector tsvector,
query tsquery [, normalization integer ]) returns float4

Hm xp hng tiu chun


ts_rank_cd([ weights float4[], ] vector tsvector,
query tsquery [, normalization integer ]) returns float4

Hm ny tnh ton xp hng mt bao trm i vi vector v truy vn ti liu c a ra,


nh c m t trong "Xp hng ph hp cho 1 ti 3 khon truy vn" ca cc tc gi Clarke,
Cormack, v Tudhope trong tp ch "X l v Qun l Thng tin", 1999.
Hm ny i hi thng tin v tr u vo ca n. V th n s khng lm vic trong cc gi
tr b tc b ca tsvector - n s lun tr v 0.
i vi cc hm , i s ty chn weights a ra kh nng nh trng s cc ln xut hin ca t
nhiu hn hoc t hn, ph thuc nhiu vo cch m chng c gn nhn. Cc mng trng s ch
nh cch nh trng s nng th no cho tng chng loi t, theo trt t:
{D-weight, C-weight, B-weight, A-weight}

Nu khng trng s no c a ra, th cc mc nh s c s dng:


{0.1, 0.2, 0.4, 1.0}

Cc trng s in hnh c s dng nh du cc t t cc vng c bit ca ti liu, nh tiu


hoc mt trch on ban u, sao cho chng c th c i x vi nhiu hoc t tm quan trng
hn cc t trong thn ca ti liu .
V mt ti liu di hn c mt c hi ln hn trong vic c mt khon truy vn l hp l tnh ti
kch c ca ti liu, nh, mt ti liu hng trm t vi 5 ln xut hin ca mt t tm kim c th l
ph hp hn so vi mt ti liu hng ngn t vi 5 ln xut hin. Cc hm xp hng ly mt la
chn normalization s nguyn ch nh liu v nh th no di ca mt ti liu s tc ng ti s
xp hng ca n. Ty chn s nguyn s kim sot vi hnh vi, v th l mt mt n bit: bn c
th ch nh mt hoc nhiu hnh vi bng vic s dng | (v d, 2|4).

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 313/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

0 (mc nh) b qua di ti liu

1 chia xp hng cho 1 + logarit ca chiu di ti liu

2 chia xp hng cho di ti liu

4 chia xp hng cho trung bnh khong cch hi ha gia cc m rng (iu ny ch c
trin khai vi ts_rank_cd)

8 chia xp hng cho s cc t duy nht trong ti liu

16 chia xp hng cho 1 + logarit ca s cc t duy nht trong ti liu

32 chia xp hng cho bn thn n + 1

Nu hn mt c bit c ch nh, th cc bin i c p dng trong trt t c lit k.


L khng quan trng lu rng cc hm xp hng khng s dng bt k thng tin tng th no,
nn khng c kh nng to ra mt s bnh thng ha cng bng ti 1% hoc 100% nh i khi
c mong mun. La chn bnh thng ha 32 (rank/(rank+1) ) c th c p dng m rng
phm vi cho tt c cc xp hng trong di t 0 ti 1, nhng tt nhin iu ny ch l mt thay i
nh; n s khng nh hng ti vic xp th t cc kt qu tm kim.
y l mt v d m ch la chn 10 s trng khp c xp hng cao nht:
SELECT title, ts_rank_cd(textsearch, query) AS rank
FROM apod, to_tsquery(neutrino|(dark & matter)) query
WHERE query @@ textsearch
ORDER BY rank DESC
LIMIT 10;
title
| rank
----------------------------------------------------------------------------+---------Neutrinos in the Sun
| 3.1
The Sudbury Neutrino Detector
| 2.4
A MACHO View of Galactic Dark Matter
| 2.01317
Hot Gas and Dark Matter
| 1.91171
The Virgo Cluster: Hot Plasma and Dark Matter
| 1.90953
Rafting for Solar Neutrinos
| 1.9
NGC 4650A: Strange Galaxy and Dark Matter
| 1.85774
Hot Gas and Dark Matter
| 1.6123
Ice Fishing for Cosmic Neutrinos
| 1.6
Weak Lensing Distorts the Universe
| 0.818218

y l v d y ht bng vic s dng xp hng c bnh thng ha:


SELECT title, ts_rank_cd(textsearch, query, 32 /* rank/(rank+1) */ ) AS rank
FROM apod, to_tsquery(neutrino|(dark & matter)) query
WHERE query @@ textsearch
ORDER BY rank DESC
LIMIT 10;
title
| rank
----------------------------------------------------------------------------+------------------Neutrinos in the Sun
| 0.756097569485493
The Sudbury Neutrino Detector
| 0.705882361190954

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 314/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


A MACHO View of Galactic Dark Matter
Hot Gas and Dark Matter
The Virgo Cluster: Hot Plasma and Dark Matter
Rafting for Solar Neutrinos
NGC 4650A: Strange Galaxy and Dark Matter
Hot Gas and Dark Matter
Ice Fishing for Cosmic Neutrinos
Weak Lensing Distorts the Universe

|
|
|
|
|
|
|
|

Xut bn nm 2013

0.668123210574724
0.65655958650282
0.656301290640973
0.655172410958162
0.650072921219637
0.617195790024749
0.615384618911517
0.450010798361481

Vic xp hng c th l t gi v n i hi vic t vn tsvector i vi tng ti liu trng khp, n


c th l rng buc I/O v v th chm. Khng may, hu nh khng c kh nng trnh v cc truy
vn thc tin thng dn ti cc s lng trng khp ln.

12.3.4. Nhn mnh cc kt qu


th hin cc kt qu, l l tng ch ra mt phn ca tng ti liu v cch m n c lin quan
ti truy vn . Thng th cc my tm kim ch ra cc on ti liu vi cc khon tm kim c
nh du. PostgreSQL a ra mt hm ts_headline, n trin khai chc nng ny.
ts_headline([ config regconfig, ] document text, query tsquery [, options text ]) returns text

chp nhn mt ti liu i vi mt truy vn, v tr v mt trch on t ti liu trong


cc khon t truy vn c nhn mnh. Cu hnh s c s dng phn tch ti liu c th c
ch nh bng config; Nu config b lm m i, th cu hnh default_text_search_config c s dng.
ts_headline

Nu mt chui options c ch nh th n phi bao gm mt danh sch tch bch nhau bng du
phy ca mt hoc nhiu cp option=value. Cc la chn sn sng l:

StartSel , StopSel:

cc chui vi chng b hn ch cc t truy vn xut hin trong ti liu,


phn bit chng vi cc t c trch on khc. Bn phi a cc chui vo cc du
ngoc kp nu chng c cha cc khong trng hoc cc du phy.

MaxWords, MinWords:

ShortWord:

HighlightAll:

MaxFragments:

cc s xc nh cc u di nht v ngn nht cho u ra.

cc t c di ny hoc t hn s b b i u v cui ca mt u . Gi tr
mc nh l 3 loi b cc bi ting Anh ph bin.
c Boolean; nu l
qua 3 tham s i u.

true

th ton b ti liu s c s dng nh l u , b

s lng ti a cc trch on hoc on vn bn c hin th. Gi tr mc


nh l 0 s la chn mt phng php to u hng ti khng c on no. Mt gi tr
ln hn 0 chn s to ra u da vo s phn on. Phng php ny thy cc phn on
vn bn vi cng nhiu t truy vn cng tt v tri cc on xung quanh cc t truy vn.
Kt qu l cc t truy vn nm gn gia ca tng on v c cc t nm v cc bn. Mi
on s c hu ht MaxWords v cc t di ShortWord hoc nh hn s b b i u v
cui ca tng on. Nu khng phi tt c cc t truy vn c thy trong ti liu, th mt
on duy nht ca MinWords u tin trong ti liu s c hin th.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 315/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

FragmentDelimiter:

Xut bn nm 2013

Khi nhiu hn 1 on c hin th, th cc on s c cch nhau bng

chui ny.
Bt k la chn khng c ch nh no cng nhn cc mc nh :
StartSel=<b>, StopSel=</b>,
MaxWords=35, MinWords=15, ShortWord=3, HighlightAll=FALSE,
MaxFragments=0, FragmentDelimiter=" ... "

V d:
SELECT ts_headline(english,
The most common type of search
is to find all documents containing given query terms
and return them in order of their similarity to the
query.,
to_tsquery(query & similarity));
ts_headline
-----------------------------------------------------------containing given <b>query</b> terms
and return them in order of their <b>similarity</b> to the
<b>query</b>.
SELECT ts_headline(english,
The most common type of search
is to find all documents containing given query terms
and return them in order of their similarity to the
query.,
to_tsquery(query & similarity),
StartSel = <, StopSel = >);
ts_headline
------------------------------------------------------containing given <query> terms
and return them in order of their <similarity> to the
<query>.

s dng ti liu gc ban u, ch khng phi mt tm tt tsvector, nn n c th l chm


v nn c s dng thn trng. Mt sai st in hnh l gi ts_headline cho tng ti liu trng khp
khi ch 10 ti liu s c hin th. Cc truy vn ph SQL c th gip: y l mt v d:
ts_headline

SELECT id, ts_headline(body, q), rank


FROM (SELECT id, body, q, ts_rank_cd(ti, q) AS rank
FROM apod, to_tsquery(stars) q
WHERE ti @@ q
ORDER BY rank DESC
LIMIT 10) AS foo;

12.4. Tnh nng b sung


Phn ny m t cc hm v ton t b sung m l hu dng trong s kt ni vi tm kim vn bn.

12.4.1. iu khin ti liu


Phn 12.3.1 ch ra cch m cc ti liu vn bn th c th c bin i thnh cc gi tr tsvector.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 316/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

PostgreSQL cng a ra cc hm v ton t c th c s dng iu khin cc ti liu m


trong dng tsvector ri.
tsvector || tsvector

Ton t ghp ni tsvector tr v mt vector kt ni cc t v v thng tin v tr ca 2 vector


c a ra nh l cc i s. Cc v tr v cc nhn trng s c gi li trong qu trnh
ghp ni. Cc v tr xut hin trong vector bn tay phi c b tr bng v tr rng ln nht
c nhc ti trong vector bn tay tri, sao cho kt qu l gn tng ng vi kt qu ca
vic thc hin to_tsvector trong s ghp ni ca 2 chui trong ti liu ban u. (S ngang
bng l khng chnh xc, v bt k cc t cht no b loi b khi cui ca i s bn tay
tri cng s khng nh hng ti kt qu, trong khi chng c th nh hng ti cc v tr
ca cc t v trong i s bn tay phi nu s ghp ni vn bn c s dng).
Mt u im ca vic s dng ghp ni dng vector, thay v vic ghp ni vn bn trc
khi p dng to_tsvector, l bn c th s dng cc cu hnh khc nhau phn tch cc phn
khc nhau ca ti liu. Hn na, v hm setweight nh du tt c cc t v ca vector c
a ra theo cng cch y ht, l cn thit phn tch vn bn v thc hin setweight trc
vic ghp ni nu bn mun gn nhn cho cc phn khc nhau ca ti liu bng cc trng s
khc nhau.
setweight(vector tsvector, weight "char") returns tsvector

tr v mt bo sao ca vector u vo trong mi v tr c gn nhn vi


weight c a ra, hoc A, B, C, hoc D. (D l mc nh cho cc vector mi v nh vy l
khng c hin th u ra). Cc nhn c gi li khi cc vector c ghp ni, cho
php cc t t cc phn khc nhau ca mt ti liu s c nh trng s khc nhau bng
vic xp hng cc hm.
setweight

Lu rng cc nhn trng s p dng cho cc v tr, khng cho cc t v. Nu vector u


vo tng b tc mt cc v tr th setweight khng lm g c.
length(vector tsvector) returns integer

Tr v s t v c lu tr trong vector .
strip(vector tsvector) returns tsvector

Tr v mt vector lit k cc t v y ht nh vector c a ra, nhng thiu bt k v tr


hoc thng tin trng s no. Trong khi vector c tr v l t hu dng hn nhiu so vi
mt vector khng b tc b v xp hng tng ng, th n thng s l nh hn nhiu.

12.4.2. iu khin truy vn


Phn 12.3.2 ch ra cch m cc truy vn th c th c bin i thnh cc gi tr tsquery.
PostgreSQL cng a ra cc hm v ton t c th c s dng iu khin cc truy vn nm
dng tsquery ri.
tsquery && tsquery

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 317/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Tr v s kt hp AND ca 2 truy vn c a ra.


tsquery || tsquery

Tr v s kt hp OR ca 2 truy vn c a ra.
!! tsquery

Tr v ph nh (NOT) ca truy vn c a ra.


numnode(query tsquery) returns integer

Tr v s nt (cc t v cng vi cc ton t) trong mt tsquery. Hm ny l hu dng xc


nh liu query c ngha (tr v > 0), hay ch bao gm cc t cht (tr v 0).
Cc v d:
SELECT numnode(plainto_tsquery(the any));
NOTICE: query contains only stopword(s) or doesnt contain lexeme(s), ignored
numnode
--------0

SELECT numnode(foo & bar::tsquery);


numnode
--------3
querytree(query tsquery) returns text

Tr v v tr ca mt tsquery m c th c s dng cho vic tm kim mt ch s. Hm ny


l hu dng cho vic d tm cc truy vn khng c nh ch s, v d cc truy vn ch
cha cc t cht hoc ch cc khon ph nh. V d:
SELECT querytree(to_tsquery(!defined));
querytree
-----------

12.4.2.1. Vit truy vn

H cc hm ts_rewrite tm kim mt tsquery c a ra cho cc ln xut hin ca mt truy vn con


ch, v thay th tng ln xut hin bng mt truy vn con thay th. V c bn hot ng ny l mt
phin bn c bit ca tsquery i vi s thay th cc chui con. Mt s kt hp ch v thay th c
th c ngh nh mt quy tc vit li truy vn. Mt tp hp cc qui tc vit li nh vy c th l
mt s tr gip tm kim mnh. V d, bn c th m rng s tm kim bng vic s dng cc t
ng ngha (nh, new york, big apple, nyc, gotham) hoc lm hp li tm kim hng ngi s
dng vo mt s ch nng. C mt s s chng ln trng chc nng gia tnh nng ny v cc t
in t ng ngha (Phn 12.6.4). Tuy nhin, bn c th sa mt tp hp cc qui nh vit li khi
lm vic m khng phi nh ch s li, trong khi vic cp nht mt t in t ng ngha i hi
vic nh ch s li phi c thc hin.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 318/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ts_rewrite (query tsquery, target tsquery, substitute tsquery) returns tsquery

Dng ny ca ts_rewrite n gin p dng mt qui tc vit li duy nht:


bng substitute bt k khi no n xut hin trong query. V d:

target

c thay th

SELECT ts_rewrite(a & b::tsquery, a::tsquery, c::tsquery);


ts_rewrite
-----------b & c
ts_rewrite (query tsquery, select text) returns tsquery

Dng ts_rewrite ny chp nhn mt s khi u query v mt lnh SQL select, n c a


ra nh mt chui vn bn. select phi c 2 ct dng tsquery. i vi tng hng ca kt qu
select, cc ln xut hin ca gi tr ct u tin (ch) c thay th bng gi tr ct th 2
(thay th) trong gi tr query hin hnh. V d:
CREATE TABLE aliases (t tsquery PRIMARY KEY, s tsquery);
INSERT INTO aliases VALUES(a, c);
SELECT ts_rewrite(a & b::tsquery, SELECT t,s FROM aliases);
ts_rewrite
-----------b & c

Lu rng khi nhiu qui tc vit li c p dng theo cch ny, th trt t ng dng c th
l quan trng; nn trong thc t bn s mun truy vn ngun i vi ORDER BY mt vi kha
xp th t.
Hy xem xt mt v d khm ph v tr cuc sng thc. Chng ti s m rng truy vn
bng vic s dng cc qui tc vit li do bng dn dt:

supernovae

CREATE TABLE aliases (t tsquery primary key, s tsquery);


INSERT INTO aliases VALUES(to_tsquery(supernovae), to_tsquery(supernovae|sn));
SELECT ts_rewrite(to_tsquery(supernovae & crab), SELECT * FROM aliases);
ts_rewrite
--------------------------------crab & ( supernova | sn )

Chng ta c th thay i cc qui nh vit li ch bng vic cp nht bng :


UPDATE aliases
SET s = to_tsquery(supernovae|sn & !nebulae)
WHERE t = to_tsquery(supernovae);
SELECT ts_rewrite(to_tsquery(supernovae & crab), SELECT * FROM aliases);
ts_rewrite
--------------------------------------------crab & ( supernova | sn & !nebula )

Vic vit li c th l chm khi c nhiu qui tc vit li, v n kim tra tng qui tc cho s trng
khp c kh nng. lc ra cc qui tc khng phi l ng vin r rng th chng ta c th s dng

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 319/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

cc ton t ghp ni cho dng tsquery. Trong v d bn di, chng ta ch chn cc qui tc no c
th trng khp vi truy vn ban u:
SELECT ts_rewrite(a & b::tsquery,
SELECT t,s FROM aliases WHERE a & b::tsquery @> t);
ts_rewrite
-----------b & c

12.4.3. Trigger cho cp nht t ng


Khi s dng mt ct ring r lu tr i din tsvector cc ti liu ca bn, cn thit phi to ra
mt trigger cp nht ct tsvector khi thay i cc ct ni dung ti liu. 2 hm trigger c xy
dng sn l c sn cho iu ny, hoc bn c th vit cho ring bn.
tsvector_update_trigger(tsvector_column_name, config_name, text_column_name [, ... ])
tsvector_update_trigger_column(tsvector_column_name, config_column_name, text_column_name [, ...

Cc hm trigger t ng tnh ton mt ct tsvector t mt hoc nhiu ct vn bn, di s kim


sot cc tham s c ch nh trong lnh CREATE TRIGGER. Mt v d s dng chng l:
CREATE TABLE messages (
title text,
body text,
tsv tsvector
);
CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON messages FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger(tsv, pg_catalog.english, title, body);
INSERT INTO messages VALUES(title here, the body text is here);
SELECT * FROM messages;
title
| body
| tsv
---------------------+-------------------------------+------------------------------title here
| the body text is here | bodi:4 text:5 titl:1
SELECT title, body FROM messages WHERE tsv @@ to_tsquery(title & body);
title
| body
---------------------+------------------------------title here
| the body text is here

Khi to ra c trigger ny th bt k s thay i no trong


nh trong tsv, m ng dng khng phi lo v n na.

title

hoc body s t ng c phn

i s u tin ca trigger phi l tn ca ct tsvector s c cp nht. i s th 2 ch nh cu


hnh tm kim vn bn s c s dng thc hin s bin i. i vi tsvector_update_trigger, tn
cu hnh n gin c a ra nh l i s th 2 ca trigger. N phi iu kin theo s nh
c nu trn, sao cho hnh vi ca trigger s khng thay i vi cc thay i trong
search_path. i vi tsvector_update_trigger_column, i s th 2 ca trigger l tn ca ct khc ca
bng, n phi dng regconfig. iu ny cho php mt la chn cu hnh theo tng hng c thc
hin. (Cc) i s cn li l cc tn ca cc ct vn bn (dng text, varchar hoc char). Chng s

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 320/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

c a vo trong ti liu theo trt t c a ra. Cc gi tr NULL s c b qua (nhng cc


ct khc vn s c nh ch s).
Mt hn ch ca cc trigger c xy dng sn l chng i x vi tt c cc ct u vo nh
nhau. x l cc ct mt cch khc nhau - v d, nh trng s tiu khc nhau i vi thn cn thit phi vit mt trigger ty bin. y l mt v d bng vic s dng PL/pgSQL nh l ngn
ng ca trigger :
CREATE FUNCTION messages_trigger() RETURNS trigger AS $$
begin
new.tsv :=
setweight(to_tsvector(pg_catalog.english, coalesce(new.title,)), A) ||
setweight(to_tsvector(pg_catalog.english, coalesce(new.body,)), D);
return new;
end
$$ LANGUAGE plpgsql;
CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON messages FOR EACH ROW EXECUTE PROCEDURE messages_trigger();

Gi trong u rng iu quan trng ch nh tn cu hnh r rng khi to cc gi tr tsvector bn


trong cc trigger, sao cho cc ni dung ct s khng b nh hng v nhng thay i i vi
default_text_search_config. Khng lm c iu ny c kh nng dn ti cc vn nh cc kt qu
tm kim thay i sau mt s hng v ti li.

12.4.4. Thu thp thng k ti liu


Hm ts_stat l hu dng cho vic kim tra cu hnh ca bn v cho vic tm kim cc ng vin l
cc t cht:
ts_stat(sqlquery text, [ weights text, ]
OUT word text, OUT ndoc integer,
OUT nentry integer) returns setof record

l gi tr vn bn bao gm mt truy vn SQL m n phi tr v mt ct tsvector duy nht.


ts_stat thc thi truy vn v tr v cc thng k v tng t v (t) khc nhau c trong cc d liu
tsvector. Cc ct c tr v l:
sqlquery

- gi tr ca mt t v

word text

ndoc integer

nentry integer

- s cc ti liu (tsvectors) m t xut hin trong


- tng s cc ln xut hin ca t

Nu weights c cung cp, th ch cc ln xut hin c mt trong cc trng s c tnh.


V d, tm kim 10 t thng xuyn nht trong mt b cc ti liu:
SELECT * FROM ts_stat(SELECT vector FROM apod)
ORDER BY nentry DESC, ndoc DESC, word
LIMIT 10;

Y ht, nhng ch tnh cc trng hp t vi trng s A hoc B:

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 321/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

SELECT * FROM ts_stat(SELECT vector FROM apod, ab)


ORDER BY nentry DESC, ndoc DESC, word
LIMIT 10;

12.5. Trnh phn tch


Cc trnh phn tch tm kim vn bn c trch nhim cho vic tch cc vn bn ti liu th thnh cc
th token v vic nhn din tng dng th token ni m tp hp cc dng c th c bn thn trnh
phn tch xc nh. Lu l mt trnh phn tch hon ton khng sa vn bn - n n gin nhn
din cc bin gii t tht ng. V phm vi c gii hn ny, c t nhu cu cho cc trnh phn tch ty
bin c th ng dng hn l c cc t in ty bin. Hin ti PostgreSQL ch a ra mt trnh
phn tch c xy dng sn, n tng c thy l hu dng cho mt di rng ln cc ng dng.
Trnh phn tch c xy dng sn c t tn l
th token:

pg_catalog.default.

N nhn thc c 23 dng

Bng 12-1. Cc dng th token ca cc trnh phn tch mc nh


Tn hiu (Alias)

M t

V d

asciiword

T, tt c cc k t ASCII

elephant

word

T, tt c cc k t

maana

numword

T, cc k t v ch s

beta1

asciihword

T ni, tt c ASCII

up-to-date

hword

T ni, tt c cc k t

lgico-matemtica

numhword

T ni, cc k t v ch s

postgresql-beta1

hword_asciipart Phn ca t ni, tt c ASCII

postgresql in the context postgresql-beta1

hword_part

Phn ca t ni, tt c cc k t

lgico or matemtica in the context lgico-matemtica

hword_numpart

Phn ca t ni, cc k t v ch s

beta1 in the context postgresql-beta1

email

a ch th in t

foo@example.com

protocol

u ca giao thc

http://

url

URL

example.com/stuff/index.html

host

Host

example.com

url_path

ng dn URL

/stuff/index.html, in the context of a URL

file

Tp hoc tn ng dn

/usr/local/foo.txt, if not within a URL

sfloat

K hiu khoa hc

-1.234e56

float

K hiu thp phn

-1.234

int

S nguyn c k

-1234

uint

S nguyn khng c k

1234

version

S phin bn

8.3.0

tag

Th XML

<a href="dictionaries.html">

entity

Thc th XML

&amp;

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 322/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Lu : K hiu ca trnh phn tch ca mt k t c thit lp bn a ca c s d liu


xc nh, c bit lc_ctype. Cc t ch cha cc k t ASCII c bn c nu nh mt dng
th token ring r, v i khi l hu dng phn bit chng. Trong hu ht cc ngn ng
chu u, cc dng th token word v asciiword s c i x nh nhau. email khng h tr tt
c cc k t th in t hp l nh c RFC 5322 nh ngha. c bit, ch cc k t
khng phi abc c h tr cho cc tn ngi s dng th in t l du chm, du gch
ngang v du gch chn.
C kh nng i vi trnh phn tch to ra cc th token chng ln nhau t cng cc mu vn
bn. Nh mt v d, mt t ni s c nu c nh ton b t v nh tng thnh phn:
SELECT alias, description, token FROM ts_debug(foo-bar-beta1);
alias
| description
| token
----------------------+--------------------------------------------------------------+-------------------numhword
| Hyphenated word, letters and digits
| foo-bar-beta1
hword_asciipart | Hyphenated word part, all ASCII
| foo
blank
| Space symbols
|hword_asciipart | Hyphenated word part, all ASCII
| bar
blank
| Space symbols
|hword_numpart | Hyphenated word part, letters and digits
| beta1

Hnh vi ny l mong mun v n cho php cc tm kim lm vic cho c ton b t t hp v cho
cc thnh phn. y l v d trc quan khc:
SELECT alias, description, token FROM ts_debug(http://example.com/stuff/index.html);
alias
| description
| token
---------------------+--------------------+-----------------------------------------protocol
| Protocol head | http://
url
| URL
| example.com/stuff/index.html
host
| Host
| example.com
url_path
| URL path
| /stuff/index.html

12.6. T in
Cc t in c s dng loi b cc t s khng c xem xt trong mt tm kim ( cc t
cht), v bnh thng ha cc t sao cho cc dng dn xut khc nhau ca t y ht s khp. Mt
t c bnh thng ha thnh cng c gi l mt t v. Ngoi vic ci thin cht lng tm
kim, s bnh thng ha v loi b cc t cht lm gim kch c ca i din tsvector ca mt ti
liu, v th ci thin c hiu nng. Bnh thng ha khng lun c ngha v ngn ng hc v
thng ph thuc vo ng ngha ca ng dng.
Mt s v d ca s bnh thng ha:

Theo ngn ng hc - cc t in Ispell c lm gim cc t u vo ti mt dng c bnh


thng ha; cc t in cng (stemmer) loi b cc ui t

Cc v tr URL c th c kinh in ha lm cho cc URL tng ng khp:


http://www.pgsql.ru/db/mw/index.html
http://www.pgsql.ru/db/mw/
http://www.pgsql.ru/db/../db/mw/index.html

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 323/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Cc tn mu c th c cc gi tr h 16 (hexadecimal) thay th, nh,

Xut bn nm 2013
red, green, blue,

magenta FF0000, 00FF00, 0000FF, FF00FF

Nu nh ch s cc s, th chng ta c th loi b vi ch s thp phn gim di cc s


c kh nng, v d 3.14159265359, 3.1415926, 3.14 s l ht nhau sau s bnh thng ha
nu ch 2 ch s c gi li sau du thp phn.

Mt t in l mt chng trnh chp nhn mt th token nh l u vo v tr v:

mt mng cc t v nu th token u vo c bit i vi t in (lu rng mt th


token c th to ra nhiu hn 1 t v)

mt t v duy nht vi c TSL_FILTER c thit lp, thay th th token gc bng mt th


token s c thng qua ti cc t in sau (mt t in lm iu ny c gi l mt t
in lc)

mt mng rng nu t in bit th token , nhng l mt t cht

NULL nu t in khng nhn bit c th token u vo

PostgreSQL a ra cc t in c xc nh trc cho nhiu ngn ng. Cng c vi mu template


c xc nh trc c th c s dng to ra cc t in mi vi cc tham s ty bin. Mi
mu template t in c xc nh trc c m t bn di. Nu khng mu template ang tn
ti no l ph hp, th c kh nng phi to ra cc mu mi; xem vng contrib/ ca pht tn
PostgreSQL c cc v d.
Mt cu hnh tm kim vn bn rng buc mt trnh phn tch cng vi mt tp hp cc t in
x l cc th token u ra ca trnh phn tch. i vi tng dng th token m trnh phn tch c
th tr v, mt danh sch ring r cc t in c cu hnh ch nh. Khi mt th token ca
dng c trnh phn tch tm thy, th tng t in trong danh sch c t vn ln lt,
cho ti khi mt s t in nhn bit c n nh mt t bit ri. Nu n c nhn din nh l mt
t cht, hoc nu khng t in no nhn bit c th token , th n s b loi b v khng c
nh ch s hoc khng c tm kim.
Thng thng, t in u tin tr v mt u ra khng NULL s xc nh kt qu, v bt k t
in no cn li cng s khng c t vn; nhng mt vic lc t in c th thay th t c a
ra bng mt t c sa i, n sau c thng qua ti cc t in tip sau.
Qui tc chung cho vic thit lp cu hnh mt danh sch cc t in l t ln trc t in hp
nht, c th nht, sau l cc t in ph bin hn, kt thc bng mt t in rt chung, nh mt
cng bng tuyt (Snowball stemmer) hoc simple, n nhn bit c mi iu. V d, i vi mt
tm kim c th thin vn hc (cu hnh astro_en) th mt t in c th rng buc dng th token
asciiword (t ASCII) cho mt t in ng ngha i vi cc khi nim v thin vn hc, mt t in
chung ting Anh v mt t in dng cng bng tuyt ting Anh:
ALTER TEXT SEARCH CONFIGURATION astro_en
ADD MAPPING FOR asciiword WITH astrosyn, english_ispell, english_stem;

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 324/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Mt t in lc c th c thay th bt k u trong danh sch, ngoi tr cui ni m n c th


l v dng. Vic lc cc t in l hu dng bnh thng ha mt phn cc t n gin ha
tc v ca cc t in sau . V d, mt t in lc c th c s dng loi b cc du khi
cc k t c du, nh c thc hin bng module m rng contrib/unaccent.

12.6.1. T cht
Cc t cht l cc t rt ph bin, xut hin trong hu ht tng ti liu, v khng c gi tr phn
bit. V th, chng c th b b qua trong ng cnh ca tm kim ton vn. V d, mi vn bn ting
Anh u c cc t nh a v the, nn l v dng lu tr chng trong mt ch s. Tuy nhin, cc t
cht nh hng ti cc v tr trong tsvector, ti lt n nh hng ti vic xp hng:
SELECT to_tsvector(english,in the list of stop words);
to_tsvector
---------------------------list:3 stop:5 word:6

Cc v tr b mt 1, 2, 4 l v cc t cht. Cc xp hng c tnh ton cho cc ti liu vi v khng


vi cc t cht l hon ton khc nhau:
SELECT ts_rank_cd (to_tsvector(english,in the list of stop words), to_tsquery(list & ts_rank_cd
-----------0.05
SELECT ts_rank_cd (to_tsvector(english,list stop words), to_tsquery(list & stop));
ts_rank_cd
-----------0.1

Ty vo t in c th ng x th no vi cc t cht. V d, cc t in ispell trc ht bnh


thng ha cc t v sau xem xt danh sch cc t cht, trong khi cc t in cng bng tuyt
trc ht kim tra danh sch cc t cht. L do hnh x khc nhau ny l nh lm gim nhiu.

12.6.2. T in n gin
Mu template t in simple vn hnh bng vic bin i th u vo sang ch thng v kim tra
n i vi mt tp cc t cht. Nu n c thy trong tp th sau mt mng rng c tr
v, lm cho th token s b hy b. Nu khng, dng ch thng ca t c tr v nh l t
v c bnh thng ha. Nh mt la chn, t in c th c thit lp cu hnh nu cc t
khng cht nh khng c nhn bit, cho php chng c truyn qua ti t in tip sau trong
danh sch.
y l mt v d nh ngha mt t in bng vic s dng mu template simple:
CREATE TEXT SEARCH DICTIONARY public.simple_dict (
TEMPLATE = pg_catalog.simple,
STOPWORDS = english
);

y,

l tn c bn ca mt tp cc t cht. Tn y ca tp s l
$SHAREDIR/tsearch_data/english.stop, trong $SHAREDIR c ngha l th mc d liu c chia s
english

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 325/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ca ci t PostgreSQL , thng l /usr/local/share/postgresql (s dng pg_config--sharedir xc


nh n nu bn khng chc chn). nh dng tp n gin l mt danh sch cc t, tng dng
mt. Cc dng trng v cc khng gian trng theo sau s b b qua, v ch hoa c bin i thnh
ch thng, nhng khng x l no khc c thc hin trong cc ni dung tp .
By gi chng ta c th kim th th mc ca chng ta:
SELECT ts_lexize(public.simple_dict,YeS);
ts_lexize
----------{yes}
SELECT ts_lexize(public.simple_dict,The);
ts_lexize
----------{}

Chng ta cng c th chn tr v NULL, thay v mt t vi ch thng, nu n c thy trong tp


cc t cht. Hnh vi ny c chn bng vic thit lp tham s Accept ca t in v false.
Tip tc v d:
ALTER TEXT SEARCH DICTIONARY public.simple_dict ( Accept = false );
SELECT ts_lexize(public.simple_dict,YeS);
ts_lexize
----------SELECT ts_lexize(public.simple_dict,The);
ts_lexize
----------{}

Vi thit lp mc nh ca Accept = true, ch hu dng t mt t in simple cui ca mt


danh sch cc t in, v n s khng bao gi truyn qua bt k th token no ti mt t in tip
sau c. Ngc li, Accept = false ch hu dng khi c t nht mt t in ng ng sau.
Ch
Hu ht cc dng t in u da vo cc tp cu hnh, nh cc tp cc t cht.
Cc tp phi c lu tr m UTF-8. Chng s c dch sang m c s d
liu thc t, nu iu l khc nhau, khi chng c c trong my ch.

Ch
Thng thng, mt phin c s d liu s c tp cu hnh ca mt th mc ch
mt ln, khi n ln u tin c s dng trong phin . Nu bn sa i mt tp
cu hnh v mun p cc phin ang tn ti chn cc ni dung mi , hy a ra
mt lnh ALTER TEXT SEARCH DICTIONARY trong t in . iu ny c th l mt cp
nht gi to thc s khng lm thay i bt k gi tr tham s no.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 326/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

12.6.3. T in t ng ngha
Mu template t in ny c s dng to ra cc t in thay th cho mt t bng mt t ng
ngha. Cc cm t khng c h tr (s dng mu template t in ng ngha (Phn 12.6.4) cho
iu ). Mt t in cc t ng ngha c th c s dng khc phc cc vn v ngn ng,
v d, ngn nga mt t in cng ting Anh khi vic lm gim t 'Paris' thnh 'pari'. c
mt dng Paris paris trong t in ng ngha v t n trc t in english_stem. V d:
SELECT * FROM ts_debug(english, Paris);
alias
| description
| token | dictionaries
| dictionary
| lexemes
---------------------+--------------------+--------+----------------------+-------------------+------------asciiword
| Word, all ASCII | Paris | {english_stem} | english_stem | {pari}
CREATE TEXT SEARCH DICTIONARY my_synonym (
TEMPLATE = synonym,
SYNONYMS = my_synonyms
);
ALTER TEXT SEARCH CONFIGURATION english
ALTER MAPPING FOR asciiword
WITH my_synonym, english_stem;
SELECT * FROM ts_debug(english, Paris);
alias
| description
| token | dictionaries
| dictionary
| lexemes
---------------------+-------------------- +-------- +----------------------------------------- +------------------- +-----------asciiword
| Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris}

Tham s duy nht c mu template t ng ngha yu cu l SYNONYMS, n l tn c bn ca tp


cu hnh ca n - my_synonyms trong v d trn. Tn y ca tp s l
$SHAREDIR/tsearch_data/my_synonyms.syn (trong $SHAREDIR c ngha l th mc d liu chia s
ca ci t PostgreSQL). nh dng tp ch l mt t mi dng s c thay th, bng t ng
ngha ca n theo sau, c tch bch nhau bng mt du trng. Cc dng trng v cc du trng i
theo sau s b b qua.
Mu template synonym cng c mt tham s ty CaseSensitive, n mc nh l sai false. Khi
CaseSensitive l false, cc t trong tp ng ngha c tr v ch thng, nh cc th token u
vo. Khi n l ng true, th cc t v cc th token khng tr v ch thng, m s c so snh
nh chng c.
Mt du sao (*) c th c thay th cui ca mt t ng ngha trong tp cu hnh. iu ny ch
rng t ng ngha l mt tin t. Du * c b qua khi khon u vo c s dng trong
to_tsvector(), nh khi n c s dng trong to_tsquery(), th kt qu s l mt khon ca mt truy
vn vi con nh du tin t trng khp (xem Phn 12.3.2). V d, gi thit chng ta c cc khon
u vo trong $SHAREDIR/tsearch_data/synonym_sample.syn:
postgres
pgsql
postgresql
pgsql
postgre pgsql
gogle googl
indices index*

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 327/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Ri chng ta s c cc kt qu ny:
mydb=# CREATE TEXT SEARCH DICTIONARY syn (template=synonym, synonyms=synonym_sample);
mydb=# SELECT ts_lexize(syn,indices);
ts_lexize
----------{index}
(1 row)
mydb=# CREATE TEXT SEARCH CONFIGURATION tst (copy=simple);
mydb=# ALTER TEXT SEARCH CONFIGURATION tst ALTER MAPPING FOR asciiword WITH syn;
mydb=# SELECT to_tsvector(tst,indices);
to_tsvector
------------index:1
(1 row)
mydb=# SELECT to_tsquery(tst,indices);
to_tsquery
-----------index:*
(1 row)
mydb=# SELECT indexes are very useful::tsvector;
tsvector
--------------------------------are indexes useful very
(1 row)
mydb=# SELECT indexes are very useful::tsvector @@ to_tsquery(tst,indices);
?column?
---------t
(1 row)

12.6.4. T in t ng ngha
Mt t in t ng ngha (i khi vit tt nh l TZ) l mt tp hp cc t m bao gm thng tin
v cc mi quan h ca cc t hoc cc cm t, nh, cc khon rng ln hn BT (broader terms),
cc khon thu hp hn NT (narrower terms), cc khon c u tin, cc khon khng c u
tin, cc khon c lin quan,
V c bn mt t in t ng ngha thay th cho tt c cc khon khng c u tin bng mt
khon c u tin v, nh mt ty chn, cng gi li cc khon gc cho vic nh ch s. Trin
khai hin hnh ca PostgreSQL t in t ng ngha l mt s m rng ca t in ng ngha vi
s h tr cc cm t c b sung thm vo. Mt t in t ng ngha i hi mt tp cu hnh c
nh dng sau:
# this is a comment
sample word(s) : indexed word(s)
more sample word(s) : more indexed word(s)
...

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 328/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

trong du hai chm (:) hnh ng nh mt du ngt gia mt cm t v s thay th ca n.


Mt t in t ng ngha s dng mt t in con (n c ch nh trong cu hnh ca t in )
bnh thng ha vn bn u vo trc khi kim tra cc cm t trng khp. Ch c kh nng
la chn mt t in con. Mt li c nu nu t in con khng nhn bit c mt t. Trong
trng hp , bn nn loi b s dng t hoc dy cho t in con v t . Bn c th thay
th mt du sao (*) u ca mt t c nh ch s b qua vic p dng t in con vi
n, nhng tt c cc t mu phi c bit i vi t in con .
T in t ng ngha chn s trng khp di nht nu c nhiu cm t khp vi u vo, v cc
mi lin h s b v bng vic s dng nh ngha cui cng.
Cc t cht c bit c t in con tha nhn khng th c ch nh; thay vo hy s dng
du hi (?) nh du v tr ni m bt k t cht no c th xut hin. V d, gi thit rng a v
the l cc t cht theo t in con .
? one ? two : swsw

khp vi a one the two v the one a two; c 2 c th c thay th bng swsw.
V mt t in cc t ng ngha c kh nng nhn bit c cc cm t m n phi nh tnh trng
ca n v tng tc vi trnh phn tch. Mt t in t ng ngha s dng cc ch nh kim
tra liu n c nn iu khin t tip sau hay dng s tch ly. T in t ng ngha phi c thit
lp cu hnh mt cch thn trng. V d, nu t in t ng ngha c ch nh iu khin ch
th token asciiword, th mt nh ngha t in t ng ngha ging nh one 7 s khng lm vic v
dng th token uint khng c ch nh cho t in t ng ngha .
Ch
Cc t in ng ngha c s dng trong qu trnh nh ch s nn bt k s
thay i no trong cc tham s t in t ng ngha i hi vic nh ch s
li. i vi hu ht cc dng t in khc, nhng thay i nh nh vic thm hoc
bt cc t cht khng buc phi nh ch s li.

12.6.4.1. Cu hnh t in t ng ngha

nh ngha mt t in t ng ngha, hy s dng mu template thesaurus. V d:


CREATE TEXT SEARCH DICTIONARY thesaurus_simple (
TEMPLATE = thesaurus,
DictFile = mythesaurus,
Dictionary = pg_catalog.english_stem
);

y:

thesaurus_simple

l tn t in mi

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 329/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

l tn c bn ca tp cu hnh t in ng ngha. (Tn y ca n s l


$SHAREDIR/tsearch_data/mythesaurus.ths, trong $SHAREDIR c ngha l th mc d liu
c chia s ca ci t ).

mythesaurus

pg_catalog.english_stem

l t in con ( y, mt cng bng tuyt ting Anh) s s dng


cho s bnh thng ha ca t in ng ngha. Lu rng t in con s c cu hnh
ring ca n (v d, cc t cht), n khng c nu y.

By gi c kh nng rng buc t in t ng ngha


mong mun trong mt cu hnh, v d:

thesaurus_simple

vi cc dng th token

ALTER TEXT SEARCH CONFIGURATION russian


ALTER MAPPING FOR asciiword, asciihword, hword_asciipart
WITH thesaurus_simple;

12.6.4.2. V d v t in t ng ngha

Xem xt mt t in ng ngha v thin vn hc n gin


hp t thin vn hc:

thesaurus_astro,

n bao gm mt s kt

supernovae stars : sn
crab nebulae : crab

Bn di chng ta to mt t in v rng buc mt s dng th token vo mt t in ng ngha


thin vn hc v cng ting Anh:
CREATE TEXT SEARCH DICTIONARY thesaurus_astro (
TEMPLATE = thesaurus,
DictFile = thesaurus_astro,
Dictionary = english_stem
);
ALTER TEXT SEARCH CONFIGURATION russian
ALTER MAPPING FOR asciiword, asciihword, hword_asciipart
WITH thesaurus_astro, english_stem;

By gi chng ta c th thy cch m n lm vic. ts_lexize l khng tht hu dng cho vic kim
th mt t in ng ngha, v n i x vi u vo ca n nh mt th token duy nht. Thay vo
chng ta c th s dng plainto_tsquery v to_tsvector m chng s chia cc chui u vo ca
chng thnh nhiu th token:
SELECT plainto_tsquery(supernova star);
plainto_tsquery
----------------sn
SELECT to_tsvector(supernova star);
to_tsvector
------------sn:1

Theo nguyn tc, ngi ta c th s dng to_tsquery nu bn a vo ngoc kp i s:


SELECT to_tsquery(supernova star);

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 330/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

to_tsquery
-----------sn

Lu rng supernova star trng khp vi supernovae stars trong thesaurus_astro v chng ta ch
nh t in cng english_stem trong nh ngha ca t in t ng ngha. Cng b i e v s.
nh ch s cc cm t gc cng nh cc thay th, ch cn a n vo phn bn tay phi ca
nh ngha :
supernovae stars : sn supernovae stars
SELECT plainto_tsquery(supernova star);
plainto_tsquery
----------------------------sn & supernova & star

12.6.5. T in Ispell
Mu template ca t in Ispell h tr cc t in hnh thi hc, n c th bnh thng ha nhiu
dng ngn ng khc nhau ca mt t thnh t v y ht. V d, mt t in Ispell ting Anh c th
khp vi tt c cc bin cch v cc kt hp ca khon tm kim bank, nh, banking, banked, banks,
banks, v banks.
Phn phi PostgreSQL tiu chun khng bao gm bt k tp cu hnh Ispell no. Cc t in cho
mt s lng ln cc ngn ng l sn sng t Ispell 1. Hn na, mt s nh dng tp th mc hin
i hn c h tr - MySpell 2 (OO < 2.0.1) v Hunspell 3 (OO >= 2.0.2). Mt danh sch cc t
in l sn sng trn OpenOffice Wiki4.
to mt t in Ispell, hy s dng mu c xy dng sn ispell v ch nh vi tham s:
CREATE TEXT SEARCH DICTIONARY english_ispell (
TEMPLATE = ispell,
DictFile = english,
AffFile = english,
StopWords = english
);

y, DictFile, AffFile, v StopWords ch nh cc tn c bn ca t in, cc ph t v cc tp t


cht. Tp cc t cht c nh dng y ht c gii thch trn cho dng t in simple. nh dng
ca cc tp khc khng c ch nh y nhng l sn sng t cc website c nu trn.
Cc t in Ispell thng nhn ra mt tp hp hn ch cc t, nn chng nn c t in rng hn
khc i sau; v d, mt t in bng tuyt, n nhn bit c mi iu.
Cc t in Ispell h tr vic chia cc t t hp; mt chc nng hu dng. Lu rng tp cc ph
t nn ch nh mt c c bit bng vic s dng lnh compoundwords controlled m nh du cc
t ca t in c th tham gia trong s hnh thnh t hp .
1
2
3
4

http://ficus-www.cs.ucla.edu/geoff/ispell.html
http://en.wikipedia.org/wiki/MySpell
http://sourceforge.net/projects/hunspell/
http://wiki.services.openoffice.org/wiki/Dictionaries

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 331/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

compoundwords controlled z

y l mt s v d cho ngn ng Nauy:


SELECT ts_lexize(norwegian_ispell, overbuljongterningpakkmesterassistent);
{over,buljong,terning,pakk,mester,assistent}
SELECT ts_lexize(norwegian_ispell, sjokoladefabrikk);
{sjokoladefabrikk,sjokolade,fabrikk}

Lu : MySpell khng h tr cc t t hp. Hunspell c s h tr phc tp cho cc t t


hp. Hin ti, PostgreSQL ch trin khai cc hot ng t t hp ca Hunspell.

12.6.6. T in bng tuyt (Snowball)


Mu ca t in bng tuyt (Snowball) da vo mt d n ca Martin Porter, ngi sng ch ra
thut ton tc cng ni ting Porter cho ting Anh. Bng tuyt by gi a ra cc thut ton tc
cng cho nhiu ngn ng (xem site Snowball 5 c thm thng tin). Tng thut ton hiu cch lm
gim cc dng bin th ph bin ca cc t v mt c s, hoc cng, s nh vn trong ngn ng
. Mt t in bng tuyt i hi mt tham s ngn ng language nhn din cng no s s
dng, v mt cch ty chn c th ch nh tn mt tp t cht stopword m trao mt danh sch cc
t loi b. (Cc danh sch t tiu chun ca PostgreSQL cng c d n Snowball a ra). V
d, c mt nh ngha c xy dng sn tng ng vi:
CREATE TEXT SEARCH DICTIONARY english_stem (
TEMPLATE = snowball,
Language = english,
StopWords = english
);

nh dng tp cc t cht l y ht nh c gii thch ri.


Mt t in bng tuyt nhn bit c mi iu, d c hay khng c kh nng n gin ha t
, nn n s c t cui ca danh sch t in. L v dng t n ng trc bt k t in
no khc v mt th token s khng bao gi truyn qua n ti c t in tip sau.

12.7. V d cu hnh
Mt cu hnh tm kim vn bn ch nh tt c cc la chn cn thit bin mt ti liu thnh mt
tsvector: trnh phn tch s s dng chia vn bn thnh cc th token, v cc t in s s dng
bin tng th token thnh mt t v. Tng li gi ca to_tsvector hoc to_tsquery cn 1 cu hnh
tm kim vn bn thc hin vic x l ca n. Tham s cu hnh default_text_search_config ch
nh tn ca cu hnh mc nh, n l cu hnh c cc hm tm kim vn bn s dng nu mt
tham s cu hnh r rng b b qua. N c th c thit lp trong postgresql.conf, hoc c thit
lp cho mt phin ring r bng vic s dng lnh SET.
Vi cu hnh tm kim vn bn c nh ngha sn trc l sn sng, v bn c th to ra cc cu
hnh ty bin mt cch d dng. to thun li cho qun l cc i tng tm kim vn bn, mt
tp hp cc lnh SQL l sn sng, v c vi lnh psql hin th thng tin v cc i tng tm kim
5

http://snowball.tartarus.org

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 332/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

vn bn (Phn 12.10).
Nh mt v d, chng ta s to ra mt cu hnh
dng sn english:

pg,

bt u bng vic p bn cu hnh c xy

CREATE TEXT SEARCH CONFIGURATION public.pg ( COPY = pg_catalog.english );

Chng ta s s dng mt danh sch t ng ngha c th PostgreSQL v lu tr n trong


$SHAREDIR/tsearch_data/pg_dict.syn. Cc ni dung ca tp trng ging nh:
postgres pg
pgsql pg
postgresql pg

Chng ta nh ngha t in t ng ngha ging th ny:


CREATE TEXT SEARCH DICTIONARY pg_dict (
TEMPLATE = synonym,
SYNONYMS = pg_dict
);

Tip theo chng ta ng k t in Ispell english_ispell, n c cc tp cu hnh ca ring n:


CREATE TEXT SEARCH DICTIONARY english_ispell (
TEMPLATE = ispell,
DictFile = english,
AffFile = english,
StopWords = english
);

By gi chng ta c th thit lp cc nh x cho cc t trong cu hnh pg:


ALTER TEXT SEARCH CONFIGURATION pg
ALTER MAPPING FOR asciiword, asciihword, hword_asciipart,
word, hword, hword_part
WITH pg_dict, english_ispell, english_stem;

Chng ta chn khng nh ch s hoc tm kim cc dng th token m cu hnh c xy dng sn


ang iu khin:
ALTER TEXT SEARCH CONFIGURATION pg
DROP MAPPING FOR email, url, url_path, sfloat, float;

By gi chng ta c th kim th cu hnh ca chng ta:


SELECT * FROM ts_debug(public.pg,
PostgreSQL, the highly scalable, SQL compliant, open source object-relational
database management system, is now undergoing beta testing of the next
version of our software.
);

Bc tip sau l thit lp phin s dng cu hnh mi, n tng c to ra trong s public:
=> \dF

Lit k cc cu hnh tm kim vn bn


Schema | Name | Description
-----------+---------+------------public | pg
|
SET default_text_search_config = public.pg;

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 333/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

SET
SHOW default_text_search_config;
default_text_search_config
---------------------------public.pg

12.8. Kim th v g li tm kim vn bn


Hnh vi ca mt cu hnh tm kim vn bn ty bin c th d dng tr nn lng tng. Cc hm
c m t trong phn ny l hu dng cho vic kim th cc i tng tm kim vn bn. Bn c
th kim th mt cu hnh hon chnh, hoc tch bch kim th cc trnh phn tch v cc t in.

12.8.1. Kim th cu hnh


Hm ts_debug cho php kim th d dng mt cu hnh tm kim vn bn.
ts_debug([ config regconfig, ] document text,
OUT alias text,
OUT description text,
OUT token text,
OUT dictionaries regdictionary[],
OUT dictionary regdictionary,
OUT lexemes text[])
returns setof record

hin th thng tin v tng th token ca document nh c trnh phn tch to ra v c


cc t in c cu hnh x l. N s dng cu hnh c config hoc default_text_search_config ch
nh nu i s b b qua.
ts_debug

tr v mt hng cho tng th token c trnh phn tch nhn din trong vn bn. Cc ct
c tr v l
ts_debug

- tn ngn gn ca dng th token

alias text

description text

token text

dictionaries regdictionary[]

dictionary regdictionary

lexemes text[]

- m t dng th token

- vn bn ca th token
- cc th mc c cu hnh chn cho dng th token

- t in nhn bit c th token , hoc NULL nu khng nhn ra

- (cc) t v c t in to ra m nhn bit c th token , hoc


NULL nu khng nhn ra; mt mng rng ({}) c ngha l n tng c nhn bit nh l
mt t cht

y l mt v d n gin:
SELECT * FROM ts_debug(english,a fat cat sat on a mat - it ate a fat rats);
alias
| description
| token | dictionaries
| dictionary
| lexemes
---------------------+------------------------------+---------+----------------------+-------------------+------------asciiword
| Word, all ASCII
|a
| {english_stem} | english_stem | {}

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 334/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


blank
asciiword
blank
asciiword
blank
asciiword
blank
asciiword
blank
asciiword
blank
asciiword
blank
blank
asciiword
blank
asciiword
blank
asciiword
blank
asciiword
blank
asciiword

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

Space symbols
Word, all ASCII
Space symbols
Word, all ASCII
Space symbols
Word, all ASCII
Space symbols
Word, all ASCII
Space symbols
Word, all ASCII
Space symbols
Word, all ASCII
Space symbols
Space symbols
Word, all ASCII
Space symbols
Word, all ASCII
Space symbols
Word, all ASCII
Space symbols
Word, all ASCII
Space symbols
Word, all ASCII

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

fat
cat
sat
on
a
mat
it
ate
a
fat
rats

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

{}
{english_stem}
{}
{english_stem}
{}
{english_stem}
{}
{english_stem}
{}
{english_stem}
{}
{english_stem}
{}
{}
{english_stem}
{}
{english_stem}
{}
{english_stem}
{}
{english_stem}
{}
{english_stem}

Xut bn nm 2013
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
english_stem |
|
english_stem |
|
english_stem |
|
english_stem |
|
english_stem |
|
english_stem |
|
|
english_stem |
|
english_stem |
|
english_stem |
|
english_stem |
|
english_stem |

c s trnh din rng m hn, chng ta trc ht to mt cu hnh


cho ngn ng ting Anh:

{fat}
{cat}
{sat}
{}
{}
{mat}
{}
{ate}
{}
{fat}
{rat}

public.english

v t in Ispell

CREATE TEXT SEARCH CONFIGURATION public.english ( COPY = pg_catalog.english );


CREATE TEXT SEARCH DICTIONARY english_ispell (
TEMPLATE = ispell,
DictFile = english,
AffFile = english,
StopWords = english
);
ALTER TEXT SEARCH CONFIGURATION public.english
ALTER MAPPING FOR asciiword WITH english_ispell, english_stem;
SELECT * FROM ts_debug(public.english,The Brightest supernovaes);
alias
| description
| token
| dictionaries
| dictionary
---------------------+------------------------------+--------------------+-----------------------------------------+---------------------asciiword
| Word, all ASCII
| The
| {english_ispell,english_stem} | english_ispell
blank
| Space symbols
|
| {}
|
asciiword
| Word, all ASCII
| Brightest
| {english_ispell,english_stem} | english_ispell
blank
| Space symbols
|
| {}
|
asciiword
| Word, all ASCII
| supernovaes | {english_ispell,english_stem} | english_stem

Trong v d ny, t Brightest c trnh phn tch nhn ra nh l mt t ASCII (tn hiu
asciiword). i vi dng th token ny th danh sch cc t in l english_ispell v english_stem. T
c english_ispell nhn ra, n lm gim t xung thnh danh t bright. T supernovaes
khng c t in english_ispell nhn ra nn n c truyn ti t in tip sau, v, may thay,
c nhn ra (trong thc t, english_stem l mt t in bng tuyt m nhn ra c mi iu; iu
gii thch v sao n c t cui ca danh sch cc t in).
T

The

c t in

english_ispell

nhn ra nh l mt t cht (Phn 12.6.1) v s khng c

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 335/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

nh ch s. Cc khong trng cng c b qua, v cu hnh hon ton khng a ra cc t in


cho chng.
Bn c th gim rng ca u ra bng vic ch nh r rng cc ct no bn mun thy:
SELECT alias, token, dictionary, lexemes
FROM ts_debug(public.english,The Brightest supernovaes);
alias
| token
| dictionary
| lexemes
---------------------+--------------------+-------------------+------------------asciiword
| The
| english_ispell | {}
blank
|
|
|
asciiword
| Brightest
| english_ispell | {bright}
blank
|
|
|
asciiword
| supernovaes | english_stem | {supernova}

12.8.2. Kim th trnh phn tch


Cc hm sau cho php kim th trc tip mt trnh phn tch tm kim ton vn.
ts_parse(parser_name text, document text,
OUT tokid integer, OUT token text) returns setof record
ts_parse(parser_oid oid, document text,
OUT tokid integer, OUT token text) returns setof record

phn tch document c a ra v tr v mt lot cc bn ghi, mi bn ghi cho tng th


token c phn tch to ra. Tng bn ghi bao gm mt m tokid ch ra dng th token c ch
nh v mt th token l vn bn ca th token . V d:
ts_parse

SELECT * FROM ts_parse(default, 123 - a number);


tokid | token
-------+-------22 | 123
12 |
12 | 1|a
12 |
1 | number

ts_token_type(parser_name text, OUT tokid integer,


OUT alias text, OUT description text) returns setof record
ts_token_type(parser_oid oid, OUT tokid integer,
OUT alias text, OUT description text) returns setof record

tr v mt bng m t tng dng th token m trnh phn tch c ch nh c th


nhn ra. i vi tng dng th token, bng a ra tokid s nguyn m trnh phn tch s dng
gn nhn cho mt th token ca dng , alias m t tn cho dng th token trong cc lnh cu
hnh, v mt description ngn gn. V d:
ts_token_type

SELECT * FROM ts_token_type(default);


tokid | alias
| description
----------+-------------------------------+---------------------------------------------------------------1 | asciiword
| Word, all ASCII
2 | word
| Word, all letters
3 | numword
| Word, letters and digits
4 | email
| Email address
5 | url
| URL
6 | host
| Host
7 | sfloat
| Scientific notation

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 336/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

version
hword_numpart
hword_part
hword_asciipart
blank
tag
protocol
numhword
asciihword
hword
url_path
file
float
int
uint
entity

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

Xut bn nm 2013

Version number
Hyphenated word part, letters and digits
Hyphenated word part, all letters
Hyphenated word part, all ASCII
Space symbols
XML tag
Protocol head
Hyphenated word, letters and digits
Hyphenated word, all ASCII
Hyphenated word, all letters
URL path
File or path name
Decimal notation
Signed integer
Unsigned integer
XML entity

12.8.3. Kim th t in
Hm ts_lexize to thun li cho kim th t in.
ts_lexize(dict regdictionary, token text) returns text[]

tr v mt mng cc t v nu u vo token c bit i vi t in , hoc mt mng


rng nu th token c bit i vi t in nhng n l mt t cht, hoc NULL nu n l
mt t khng c bit. V d:
ts_lexize

SELECT ts_lexize(english_stem, stars);


ts_lexize
----------{star}
SELECT ts_lexize(english_stem, a);
ts_lexize
----------{}

Lu : Hm ts_lexize k vng mt th token duy nht, khng phi vn bn


hp ni m iu ny c th lm bi ri:

text.

y l mt trng

SELECT ts_lexize(thesaurus_astro,supernovae stars) is null;


?column?
---------t

T in cc t ng ngha thesaurus_astro nhn ra cm t supernovae stars, nhng ts_lexize th khng v


n khng phn tch vn bn u vo m ng x vi n nh mt th token duy nht. Hy s dng
plainto_tsquery hoc to_tsvector kim th cc t in t ng ngha, v d:
SELECT plainto_tsquery(supernovae stars);
plainto_tsquery
----------------sn

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 337/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

12.9. Dng ch s GiST v GIN


C 2 dng ch s c th c s dng tng tc cc tm kim ton vn. Lu rng cc ch s
khng bt buc i vi vic tm kim vn bn, nhng trong cc trng hp mt ct c tm
kim thng xuyn, th mt ch s thng l mong mun.
CREATE INDEX name ON table USING gist(column);

To mt ch s da vo cy o ngc tng qut - GiST (Generalized Search Tree). Ct


c th l dng tsvector hoc tsquery.
CREATE INDEX name ON table USING gin(column);

To mt ch s da vo o ngc tng qut - GIN (Generalized Inverted Index). Ct


column phi l dng tsvector.
C nhng khc bit hiu nng ng k gia 2 dng ch s , nn iu quan trng phi hiu cc c
tnh ca chng.
Ch s GiST l mt mt (lossy), ngha l ch s c th to ra cc trng khp sai, v cn thit phi
kim tra hng thc s ca bng loi b cc trng khp sai nh vy. (PostgreSQL lm iu ny t
ng khi cn). Cc ch s GiST l mt mt v tng ti liu c th hin trong ch s bng mt
ch k c di c nh. Ch k c to ra bng vic bm tng t thnh mt bit duy nht
trong mt chui n bit, vi tt c cc bit c hoc (OR) cng nhau to ra mt ch k ti liu n
bit. Khi 2 t bm cng v tr bit nh y ht th s c mt s khp sai. Nu tt c cc t trong truy vn
c cc s trng khp (thc hoc sai) th hng ca bng phi c truy xut xem liu s trng
khp c l ng hay khng.
S mt mt lm gim hiu nng v nhng lc li khng cn thit cc bn ghi ca bng m ha ra
l nhng trng khp sai. V s truy cp ngu nhin ti cc bn ghi ca bng l chm, iu ny hn
ch tnh hu dng ca cc ch s GiST. Kh nng cc trng khp sai ph thuc vo vi yu t, c
bit s cc t duy nht, nn vic s dng cc t in lm gim s lng ny l c khuyn co.
Cc ch s GIN l khng mt mt i vi cc truy vn tiu chun, nhng hiu nng ca n ph
thuc mt cch logarit vo s cc t duy nht. (Tuy nhin, cc ch s GIN ch lu tr cc t (cc t
v) ca cc gi tr tsvector, v khng i vi cc nhn trng s ca chng. V th kim tra li hng
ca mt bng l cn thit khi s dng mt truy vn m c lin quan ti cc trng s).
Khi chn dng ch s no s dng, GiST hay GIN, hy cn nhc cc khc bit hiu nng :

Cc tra cu ch s GIN l 3 ln nhanh hn so vi GiST

Cc ch s GIN mt 3 ln thi gian lu hn xy dng so vi GiST

Cc ch s GIN l chm hn mt cch va phi cp nhn so vi cc ch s GiST, nhng


khong 10 ln chm hn nu s h tr cp nht nhanh b v hiu ha (xem Phn 53.3.1
c thm chi tit).

Cc ch s GIN l t 2-3 ln ln hn so vi cc ch s GiST

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 338/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Nh mt qui tc ngn tay ci, cc ch s GIN l tt nht cho cc d liu tnh v cc tra cu l nhanh
hn. i vi cc d liu ng, cc ch s GiST l nhanh hn cp nht. c bit, cc ch s GiST
rt tt cho cc d liu ng v nhanh nu s lng cc t duy nht (cc t v) t hn 100.000, trong
khi cc ch s GIN s iu khin 100.000 + cc t v tt hn nhng cp nht s chm hn.
Lu rng thi gian xy dng ch s GNI thng c th c ci thin bng vic gia tng
maintenance_work_mem, trong khi thi gian xy dng ch s GiST l khng ph thuc vo tham
s .
Vic phn vng ca cc b su tp ln v s dng ng ph hp cc ch s GiST v GIN cho php
s trin khai cc tm kim rt nhanh vi cp nht trc tuyn. Vic phn vng c th c thc hin
mc c s d liu bng vic s dng di sn ca bng, hoc bng vic phn phi cc ti liu qua
cc my ch v vic thu thp cc kt qu tm kim bng vic s dng module m rng
contrib/dblink. Ci sau l c kh nng v cc hm xp hng ch s dng thng tin cc b.

12.10. H tr psql
Thng tin v cc i tng cu hnh tm kim vn bn c th c c trong psql bng vic s dng
mt tp hp cc lnh:
\dF{d,p,t}[+] [PATTERN]

Mt la chn + cc th tc chi tit hn.


Tham s ty chn PATTERN c th l tn ca mt i tng tm kim vn bn, iu kin theo s
mt cch ty chn. Nu PATTERN b b qua th thng tin v tt c cc i tng c th thy c
s c hin th. PATTERN c th l mt biu thc thng thng v c th a ra cc mu ring r
cho cc tn s v i tng . Cc v d sau minh ha cho iu ny:
=> \dF *fulltext*

Lit k cc cu hnh tm kim vn bn:


Schema | Name
| Description
-----------+-------------------+------------public | fulltext_cfg |
=> \dF *.fulltext*

Lit k cc cu hnh tm kim vn bn:


Schema | Name
| Description
-----------+-------------------+----------------fulltext | fulltext_cfg |
public | fulltext_cfg |

Cc lnh sn sng l:
\dF[+] [PATTERN]

Lit k cc cu hnh tm kim vn bn (b sung + nhiu chi tit hn).


=> \dF russian

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 339/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Lit k cc cu hnh tm kim vn bn


Schema
| Name | Description
---------------------+----------+-------------------------------------------------pg_catalog
| russian | configuration for russian language
=> \dF+ russian

Cu hnh tm kim pg_catalog.russian


Trnh phn tch: pg_catalog.default
Token
| Dictionaries
----------------------+-------------asciihword
| english_stem
asciiword
| english_stem
email
| simple
file
| simple
float
| simple
host
| simple
hword
| russian_stem
hword_asciipart | english_stem
hword_numpart | simple
hword_part
| russian_stem
int
| simple
numhword
| simple
numword
| simple
sfloat
| simple
uint
| simple
url
| simple
url_path
| simple
version
| simple
word
| russian_stem
\dFd[+] [PATTERN]

Lit k cc th mc tm kim vn bn (b sung + nhiu chi tit hn)


=> \dFd

Lit k cc th mc tm kim vn bn
Schema
| Name
| Description
---------------+--------------------------+-----------------------------------------------------------------------------------pg_catalog | danish_stem
| snowball stemmer for danish language
pg_catalog | dutch_stem
| snowball stemmer for dutch language
pg_catalog | english_stem
| snowball stemmer for english language
pg_catalog | finnish_stem
| snowball stemmer for finnish language
pg_catalog | french_stem
| snowball stemmer for french language
pg_catalog | german_stem
| snowball stemmer for german language
pg_catalog | hungarian_stem | snowball stemmer for hungarian language
pg_catalog | italian_stem
| snowball stemmer for italian language
pg_catalog | norwegian_stem | snowball stemmer for norwegian language
pg_catalog | portuguese_stem | snowball stemmer for portuguese language
pg_catalog | romanian_stem
| snowball stemmer for romanian language
pg_catalog | russian_stem
| snowball stemmer for russian language
pg_catalog | simple
| simple dictionary: just lower case and check for stopword
pg_catalog | spanish_stem
| snowball stemmer for spanish language
pg_catalog | swedish_stem
| snowball stemmer for swedish language
pg_catalog | turkish_stem
| snowball stemmer for turkish language

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 340/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

\dFp[+] [PATTERN]

Lit k cc trnh phn tch tm kim vn bn (b sung + nhiu chi tit hn)
=> \dFp

Lit k cc trnh phn tch tm kim vn bn


Schema
| Name | Description
---------------------+----------+-----------------------------pg_catalog
| default | default word parser
=> \dFp+

Trnh phn tch tm kim vn bn pg_catalog.default


Method
| Function
| Description
--------------------------------+------------------------------+------------Start parse
| prsd_start
|
Get next token
| prsd_nexttoken
|
End parse
| prsd_end
|
Get headline
| prsd_headline
|
Get token types
| prsd_lextype
|
Token types for parser "pg_catalog.default"
Token name
| Description
--------------------------------+-----------------------------------------asciihword
| Hyphenated word, all ASCII
asciiword
| Word, all ASCII
blank
| Space symbols
email
| Email address
entity
| XML entity
file
| File or path name
float
| Decimal notation
host
| Host
hword
| Hyphenated word, all letters
hword_asciipart
| Hyphenated word part, all ASCII
hword_numpart
| Hyphenated word part, letters and digits
hword_part
| Hyphenated word part, all letters
int
| Signed integer
numhword
| Hyphenated word, letters and digits
numword
| Word, letters and digits
protocol
| Protocol head
sfloat
| Scientific notation
tag
| XML tag
uint
| Unsigned integer
url
| URL
url_path
| URL path
version
| Version number
word
| Word, all letters
(23 rows)
\dFt[+] [PATTERN]

Lit k cc mu template tm kim vn bn (b sung + nhiu chi tit hn)


=> \dFt

Lit k cc mu template tm kim vn bn

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 341/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Schema
| Name
| Description
---------------+---------------+------------------------------------------------------------------------------------pg_catalog | ispell
| ispell dictionary
pg_catalog | simple
| simple dictionary: just lower case and check for stopword
pg_catalog | snowball | snowball stemmer
pg_catalog | synonym | synonym dictionary: replace word by its synonym
pg_catalog | thesaurus | thesaurus dictionary: phrase by phrase substitution

12.11. Hn ch
Cc hn ch hin hnh ca cc chc nng tm kim vn bn ca PostgreSQL l:

di ca tng t v phi t hn 2K byte

di ca mt tsvector (cc t v + cc v tr) phi t hn 1 MB

S lng cc t v phi nh hn 264

Cc gi tr v tr trong tsvector phi ln hn 0 v khng ln hn 16.383

Khng ln hn 256 v tr cho tng t v

S lng cc nt (cc t v + cc ton t) trong mt tsquery phi t hn 32.768

so snh, ti liu ca PostgreSQL 8.1 cha 10.441 t duy nht, tng s 335.420 t, v t thng
xuyn nht postgresql c nhc ti 6.127 ln trong 655 ti liu.
Mt v d khc - ti liu ca PostgreSQL 8.1 c cha 910.989 t duy nht vi 57.491.343 t v
trong 461.020 thng ip.

12.12. Chuyn tm kim vn bn khi phin bn trc 8.3

Mt s hm tng c i tn hoc c cc tinh chnh nh trong cc danh sch i s ca


chng, v tt c chng by gi l trong s pg_catalog, trong khi mt ci t trc
chng c th nm trong s public hoc s khng h thng. C mt phin bn mi ca
contrib/tsearch2 (xem Phn F.38), n a ra mt lp tng thch gii quyt hu ht cc
vn trong lnh vc ny.

Cc hm c contrib/tsearch2 v cc i tng khc phi c p khi ti u ra pg_dump t


mt c s d liu trc phin bn 8.3. Trong khi nhiu trong s chng s khng ti c bt
k cch g, th mt t s v sau gy ra cc vn . Mt cch n gin lm vic vi iu
ny l ti module mi contrib/tsearch2 trc khi phc hi s hng hc; sau n s kha cc
i tng c khi c ti ln. Cc ng dng s dng module b sung contrib/tsearch2
cho vic tm kim vn bn s cn mt s tinh chnh lm vic vi cc chc nng c xy
dng sn:

Thit lp cu hnh tm kim vn bn hon ton l khc by gi. Thay v vic chn bng tay
cc hng vo cc bng cu hnh, th s tm kim c cu hnh thng qua cc lnh SQL
c chuyn mn ha c ch ra trc trong chng ny. Khng c s h tr t ng

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 342/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

cho vic bin i mt cu hnh ty bin ang tn ti cho phin bn 8.3; t bn c ca ring
bn y.

Hu ht cc dng t in da vo mt s tp cu hnh bn ngoi c s d liu. Chng phn


ln l tng thch vi s dng trc phin bn 8.3, nhng lu nhng khc bit sau y:
Cc tp cu hnh phi c t trong mt th mc duy nht c ch nh
($SHAREDIR/tsearch_data), v phi c mt m rng c th ph thuc vo dng tp ,
nh c nu trc trong cc m t ca cc dng t in khc nhau. Hn ch ny
tng c thm vo cho cc vn an ninh lm trc.
Cc tp cu hnh phi c m ha theo UTF-8, bt k vic m ha no ca c s d
liu c s dng.
Trong cc tp cu hnh ca t in t ng ngha, cc t cht phi c nh du vi ?.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 343/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Chng 13. Kim sot ng thi


Chng ny m t hnh vi ca h c s d liu PostgreSQL khi 2 hoc nhiu hn phin lm vic c
gng truy cp cng cc d liu cng mt lc. Cc mc tiu trong tnh hung ny l cho php s
truy cp c hiu qu cho tt c cc phin trong khi duy tr c tnh ton vn ca d liu mt cch
nghim ngt. Mi lp trnh vin cc ng dng c s d liu nn lm quen vi cc ch c
cp ti trong chng ny.

13.1. Gii thiu


PostgreSQL a ra mt tp hp giu c cc cng c cho cc lp trnh vin qun l s truy cp
ng thi ti cc d liu. Mt cch ni b, tnh nht qun ca d liu c duy tr bng vic s
dng mt m hnh nhiu phin bn (Kim sot ng thi Nhiu phin bn MVCC [MultiVersion
Concurrency Control]). iu ny c ngha l trong khi truy vn mt c s d liu th tng giao dch
thy mt hnh chp cc d liu (mt phin bn c s d liu) khi n tng xy ra lc no trong
qu kh, bt k tnh trng hin hnh ca d liu nm bn di. iu ny bo v giao dch khi vic
thy cc d liu khng nht qun m c th xy ra v cc cp nht giao dch ng thi (khc) trong
cng cc hng d liu y ht , a ra s cch li giao dch cho tng phin c s d liu. MVCC,
bng vic t chi cc phng php kha c quyn ca cc h thng c s d liu truyn thng,
lm gim s tranh kha cho php hiu nng hp l trong cc mi trng nhiu ngi s dng.
u im chnh ca vic s dng m hnh MVCC i vi kim sot ng thi hn l vic kha l
ch cc kha MVCC c yu cu truy vn (c) cc d liu khng xung t vi cc kha c
yu cu ghi cc d liu, v v th vic c khng bao gi kha vic ghi v vic ghi khng bao gi
kha vic c.
Cc c s kha mc bng v hng cng sn sng trong PostgreSQL cho cc ng dng m khng th
p dng d dng i vi hnh vi ca MVCC. Tuy nhin, s dng ng ph hp ca MVCC s
thng cung cp hiu nng tt hn so vi cc kha. Hn na, cc kha c vn do cc ng dng
nh ngha a ra c ch cho vic c c cc kha khng b rng buc vo mt giao dch duy nht.

13.2. S cch li giao dch


Tiu chun SQL nh ngha 4 mc cch li giao dch i vi 3 hin tng phi c ngn chn gia
cc giao dch ng thi. Cc hin tng khng mong mun l:
c bn
Mt giao dch c cc d liu c mt giao dch ng thi khng thc hin c ghi li
c khng lp li
Mt giao dch c li cc d liu c ri trc v thy cc d liu tng b mt giao
dch khc (m thc hin k t ln c u tin) sa i.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 344/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

c ma
Mt giao dch thc hin li mt truy vn tr v mt tp hp cc hng lm tha mn mt iu
kin tm kim v thy rng tp hp cc hng lm tha mn iu kin thay i v giao
dch c thc hin gn y.
4 mc cch li giao dch v cc hnh vi tng ng c m t trong Bng 13-1.
Bng 13-1. Cc mc cch li giao dch SQL
Mc cch li

c bn

c khng lp li

c ma

Read uncommitted - c khng thc


hin c

Possible - C th

Possible - C th

Possible - C th

Read committed - c thc hin c

Not possible - Khng th Possible - C th

Possible - C th

Repeatable read - c lp li

Not possible - Khng th Not possible - Khng th Possible - C th

Serializable - C kh nng tun t

Not possible - Khng th Not possible - Khng th Not possible - Khng th

Trong PostgreSQL, bn c th yu cu bt k mc no trong 4 mc cch li giao dch tiu chun.


Nhng trong ni b, ch c 2 mc cch li phn bit, tng ng vi cc mc c thc hin c
(Read Committed) v C kh nng tun t (Serializable). Khi bn chn mc c khng thc hin
c (Read Uncommitted) th bn thc t s c thc hin c (Read Committed), v khi bn
chn c lp li c th thc t bn C kh nng tun t (Serializable), nn mc cch li thc s c
th l kht khe hn so vi bn chn. iu ny c tiu chun SQL cho php: 4 mc cch li ch
nh ngha hin tng no phi khng xy ra, chng khng nh ngha hin tng no phi xy ra.
L do l PostgreSQL ch a ra 2 mc cch li l iu ny ch l cch nhy cm nh x cc mc
cch li tiu chun vi kin trc kim sot ng thi nhiu phin bn. Hnh vi ca cc mc cch li
c sn c chi tit ha trong cc phn sau.
thit lp mc cch li ca mt giao dch, hy s dng lnh SET TRANSACTION.

13.2.1. Mc cch li c thc hin c


c thc hin c l mc cch li mc nh trong PostgreSQL. Khi mt giao dch s dng mc
cch li ny, th mt truy vn SELECT (khng c mnh FOR UPDATE/SHARE) ch xem cc d liu
c thc hin trc khi truy vn bt u; n khng bao gi xem hoc cc d liu khng
c thc hin, hoc cc thay i c thc hin trong qu trnh thc hin truy vn ca cc giao
dch ng thi. c hiu lc, mt truy vn SELECT xem mt nh chp c s d liu ngay khi truy
vn bt u chy. Tuy nhin, SELECT s xem cc tc ng ca cc cp nht trc c thc
hin trong giao dch ca ring n, thm ch d chng cn cha c thc hin xong. Hn na lu
rng 2 lnh SELECT k tip c th xem cc d liu khc nhau, thm ch d chng l trong mt giao
dch duy nht, nu cc giao dch khc thc hin cc thay i trong qu trnh thc thi lnh SELECT
u tin.
Cc lnh UPDATE, DELETE, SELECT FOR UPDATE, v SELECT FOR SHARE hnh x y ht nh lnh SELECT

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 345/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

trong vic tm kim cc hng ch: chng s ch tm cc hng ch m c thc hin ti thi
im bt u ca lnh . Tuy nhin, mt hng ch nh vy c th c cp nht ri (hoc c
xa hoc b kha) v mt giao dch ng thi khc vo thi im n c tm thy. Trong trng
hp ny, vic cp nht c th s ch cho giao dch cp nht u tin thc hin xong hoc quay li
(nu n vn cn din ra). Nu vic cp nht u tin quay li, th cc tc ng ca n b ph nh v
vic cp nht th 2 c th tin hnh vi vic cp nht cho hng ban u c tm thy. Nu vic cp
nht u tin thc hin, th vic cp nht th 2 s b qua hng nu vic cp nht u tin xa
n, nu khng th n s c p dng hnh ng ca n cho phin bn c cp nht ca hng .
iu kin tm kim ca lnh (mnh WHERE) c nh gi li xem liu phin bn c cp
nht ca hng cn trng khp vi iu kin tm kim hay khng. Nu c, th vic cp nht th 2
tin hnh hot ng ca n bng vic s dng phin bn c cp nht ca hng . Trong trng
hp cc lnh SELECT FOR UPDATE v SELECT FOR SHARE, iu ny c ngha l phin bn c cp
nht ca hng b kha v c tr v cho my trm.
V qui tc trn, c kh nng cho mt lnh cp nht xem mt hnh chp khng nht qun: n c th
xem cc tc ng ca cc lnh cp nht ng thi ln cc hng y ht m n ang c gng cp nht,
nhng n khng xem cc tc ng ca cc lnh ln cc hng khc trong c s d liu. Hnh vi
ny lm cho ch c thc hin c khng ph hp vi cc lnh c lin quan vi cc iu kin
tm kim phc tp; tuy nhin, iu l ng cho cc trng hp n gin hn. V d, hy cn
nhc vic cp nht cc bng cn i ngn hng vi cc giao dch nh:
BEGIN;
UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 12345;
UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 7534;
COMMIT;

Nu 2 giao dch nh vy ng thi c gng thay i bng cn i ti khon 12345, th chng ta r


rng mun giao dch th 2 bt u vi phin bn c cp nht hng ca ti khon . V tng lnh
ang c tc ng ch cho mt hng c xc nh trc , hy n xem phin bn c cp nht
ca hng khng to ra bt k s khng nht qun ng lo ngi no.
S dng phc tp hn c th to ra cc kt qu khng mong mun trong ch c thc hin
c. V d, hy cn nhc vic hot ng ca mt lnh DELETE i vi cc d liu ang va c
b sung thm v va c loi b khi cc tiu ch hn ch ca n bng mt lnh khc, nh, gi
thit website l mt bng 2 hng vi website.hits bng 9 v 10:
BEGIN;
UPDATE website SET hits = hits + 1;
-- chy t phin khc: DELETE FROM website WHERE hits = 10;
COMMIT;

s khng c tc ng thm ch d c mt hng website.hits = 10 trc v sau UPDATE. iu


ny xy ra v gi tr 9 ca hng trc cp nht, v khi UPDATE hon thnh v DELETE c mt s kha,
th gi tr hng mi khng cn l 10 m l 11, n khng cn trng khp vi cc tiu ch na.
DELETE

V ch c thc hin c bt u tng lnh vi mt hnh chp mi m bao gm tt c cc giao


dch c thc hin ty thuc vo s tc th , cc lnh tip sau trong cng giao dch s thy cc

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 346/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

tc ng ca giao dch ng thi c thc hin trong bt k trng hp no. im mu cht trong
vn trn l liu c hay khng mt lnh duy nht thy mt kiu nhn nht qun tuyt i c s
d liu .
S cch li giao dch mt phn c ch c thc hin c cung cp l ph hp cho nhiu ng
dng, v ch ny l nhanh v n gin s dng; tuy nhin, n l khng cho tt c cc
trng hp. Cc ng dng m thc hin cc truy vn v cc cp nht phc tp c th i hi mt
kiu nhn nht qun cht ch ca c s d liu hn l ch c thc hin c a ra.

13.2.2. Mc cch li c kh nng tun t


Mc cch li c kh nng tun t a ra s cch li giao dch cht ch nht. Mc ny gi lp thc thi
giao dch tun t, dng nh cc giao dch tng c thc thi ci ny sau ci kia, mt cch tun t,
thay v ng thi. Tuy nhin, cc ng dng s dng mc ny phi c chun b th li cc giao
dch khi s tun t b hng.
Khi mt giao dch ang s dng mc tun t, mt truy vn SELECT ch thy cc d liu c thc
hin trc khi giao dch bt u; n khng bao gi thy hoc cc d liu khng c thc hin
hoc nhng thay i c thc hin trong qu trnh thc thi giao dch ca cc giao dch ng
thi. (Tuy nhin, truy vn thy cc hiu ng ca cc cp nht trc c thc thi bn trong
giao dch ca ring n, thm ch d chng cn cha c thc hin xong). iu ny khc vi c
thc hin c theo mt truy vn trong mt giao dch tun t thy mt hnh chp nh lc bt
u giao dch, khng nh lc bt u ca truy vn hin hnh trong giao dch . V th, cc lnh
SELECT tip sau trong mt giao dch duy nht thy cc d liu y ht, ngha l, chng khng thy cc
thay i c cc giao dch khc lm m thc hin xong sau khi giao dch ca ring chng
bt u. (Hnh vi ny c th l l tng cho vic bo co cc ng dng).
Cc lnh UPDATE, DELETE, SELECT FOR UPDATE, v SELECT FOR SHARE hnh x y ht nh SELECT v
vic tm kim cc hng ch: chng s ch tm cc hng ch m c thc hin xong nh ca
thi im bt u giao dch. Tuy nhin, mt hng ch nh vy c th c cp nht ri (hoc b
xa hoc kha ri) v giao dch ng thi khc vo thi im n c tm thy. Trong trng hp
ny, giao dch tun t s ch cho giao dch cp nht u tin thc hin xong hoc quay li (nu n
vn cn din ra). Nu cp nht u tin quay li, th cc tc ng ca n s b ph nh v giao dch
tun t c th x l bng vic cp nht hng c thy ban u. Nhng nu cp nht u tin thc
hin (v thc t cp nht hoc xa hng ri, th s khng kha n) ri sau giao dch tun t
s b quay li vi thng ip li
ERROR: could not serialize access due to concurrent update (Li: khng th truy cp tun t v cp nht
ng thi)

v mt giao dch tun t khng th sa hoc kha cc hng b cc giao dch khc lm thay i sau
khi giao dch tun t bt u.
Khi mt ng dng nhn c thng ip li ny, n s hy b giao dch hin hnh v th li ton
b giao dch t u. Ln th 2 tri qua, giao dch s thy s thay i c thc hin ri trc

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 347/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

nh mt phn ca kiu nhn ban u ca n i vi c s d liu, nn s khng c xung t


logic trong vic s dng phin bn mi ca hng nh im bt u i vi s cp nht ca giao
dch mi.
Lu rng ch vic cp nht cc giao dch c th cn phi c th li; cc giao dch ch c s
khng bao gi c cc xung t tun t.
Ch tun t a ra mt m bo cht ch rng tng giao dch thy ton b mt kiu nhn nht
qun ca c s d liu. Tuy nhin, ng dng phi c chun b th li cc giao dch khi cc cp
nht ng thi lm cho n khng c kh nng duy tr bn vng o tng i vi s thc thi tun t.
V chi ph ca vic hon thc hin cc giao dch phc tp c th l ng k, nn ch tun t ch
c khuyn co khi vic cp nht cc giao dch c s phc tp logic ng k m chng c th a
ra cc cu tr li sai trong ch c thc hin c. Ph bin nht, ch tun t l cn thit khi
mt giao dch thc thi vi lnh tip sau m phi thy cc kiu nhn y ht nhau ca c s d liu.
13.2.2.1. Cch li tun t so vi s tun t ng

ngha trc quan (v nh ngha ton hc) ca s thc thi tun t l bt k 2 giao dch ng thi
c thc hin thnh cng no cng s dng nh s phi thc thi tun t mt cch cht ch, ci
ny sau ci kia - d ci no xy ra trc u c th khng on trc c trc . iu ny quan
trng nhn thc c rng vic cm cc hnh vi khng mong mun c lit k trong Bng 13-1
l khng m bo tnh tun t ng, v trong thc t ch tun t c ca PostgreSQL
khng m bo s thc thi c th tun t c theo ngha ny. Nh mt v d, hy cn nhc mt
bng mytab, ban u bao gm:
class | value
-------+------1 | 10
1 | 20
2 | 100
2 | 200

Gi thit giao dch tun t A tnh:


SELECT SUM(value) FROM mytab WHERE class = 1;

v sau chn kt qu (30) l value vo 1 hng vi class = 2. ng thi, giao dch tun t B tnh:
SELECT SUM(value) FROM mytab WHERE class = 2;

v c kt qu 300, m n chn vo mt hng vi class = 1. Sau c 2 giao dch thc hin xong.
Khng hnh vi khng mong mun no c lit k xy ra, vng chng ta c mt kt qu c th
khng xy ra trong c trt t mt cch tun t. Nu A thc thi trc B, th B c th tnh
tng 330, ch khng phi l 300, v tng t trt t khc c th dn ti mt tng s khc c A
tnh ton.
m bo tnh tun t ton hc ng, cn thit i vi mt h thng c s d liu p tun th
vic kha ui, n c ngha l mt giao dch khng th chn hoc sa i mt hng m c th
trng khp iu kin WHERE ca mt truy vn trong giao dch ng thi khc. V d, mt khi giao

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 348/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

dch A thc thi truy vn SELECT ... WHERE class = 1, th mt h thng kha ui c th cm giao
dch B chn bt k hng mi no vi class = 1 cho ti khi A thc hin xong 1. Mt h thng kha
nh vy l phc tp trin khai v cc k t trong thc thi, v tng phin phi nhn thc c
cc chi tit ca tng truy vn c tng giao dch ng thi thc thi. V chi ph ln ny hu ht l
ph phm, v trong thc t hu ht cc ng dng khng tin hnh sp xp nhng th m c th gy
ra cc vn . (Chc chn v d trn l c t ra v c l khng i din cho phn mm thc t).
V cc l do , PostgreSQL khng trin khai kha ui.
Trong cc trng hp ni m kh nng thc thi khng tun t l mt mi nguy c thc, th cc vn
c th c ngn chn bng vic s dng kha c quyn ph hp. Tho lun tip trong cc
phn tip sau.

13.3. Kha c quyn


PostgreSQL a ra cc ch kha khc nhau kim sot s truy cp ng thi ti d liu trong
cc bng. Cc ch c th c s dng cho vic kha c ng dng kim sot trong cc tnh
hung ni m MVCC khng a ra hnh vi mong mun. Hn na, hu ht cc lnh PostgreSQL t
ng c c cc kha ca cc ch ph hp m bo rng cc bng tham chiu khng b b
i hoc b sa i theo cc cch thc khng tng thch trong khi lnh thc thi. (V d, ALTER
TABLE khng th c chy an ton ng thi vi cc hot ng khc trong cng y ht mt bng,
nn n c c mt kha c quyn trong bng p tun th iu ).
kim tra mt danh sch cc kha ph bin hin nay trong mt my ch c s d liu, hy s
dng kiu nhn h thng pg_locks. c thm thng tin v vic gim st tnh trng h thng con ca
ngi qun l kha, hy tham chiu ti Chng 27.

13.3.1. Kha mc bng


Danh sch bn di ch ra cc ch kha c sn v cc ng cnh trong chng c
PostgreSQL s dng t ng. Bn cng c th c c bt k kha r rng no vi lnh LOCK. Hy
nh rng tt c cc ch kha l cc kha mc bng, thm ch nu tn c t hng; tn cc
ch kha l theo lch s. mt s mc no th cc tn phn nh s s dng in hnh ca
tng ch kha - nhng ng ngha tt c l nh nhau. S khc bit thc t duy nht gia ch
kha ny vi ch kha kia l tp hp cc ch kha vi n tng ch xung t (xem Bng
13-2). 2 giao dch khng th c cc kha ca cc ch xung t trong cng mt bng cng mt
thi im. (Tuy nhin, mt giao dch khng bao gi xung t vi bn thn n. V d, n c th c
kha ACCESS EXCLUSIVE v sau c kha ACCESS SHARE trong cng y ht bng ). Cc ch
kha khng xung t c th c nhiu giao dch nm ng thi. Lu c bit rng mt s ch
kha l t xung t (v d, mt kha ACCESS EXCLUSIVE khng th c nhiu hn mt giao dch ti
mt thi im nm gi), trong khi cc kha khc l khng t xung t (v d, mt kha ACCESS
1

V c bn, mt h thng kha ui ngn chn cc c ma bng vic hn ch nhng g c vit, trong khi MVCC
ngn chn chng bng vic hn ch nhng g c c.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 349/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL


SHARE

Xut bn nm 2013

c th c nhiu giao dch nm gi).

Cc ch kha mc bng
ACCESS SHARE

Ch xung t vi ch kha ACCESS EXCLUSIVE.


Lnh SELECT c mt kha ca ch ny trong cc bng c tham chiu. Ni chung, bt
k truy vn no m ch c mt bng v khng sa i th n s c ch kha ny.
ROW SHARE

Xung t vi cc ch kha EXCLUSIVE v ACCESS EXCLUSIVE.


Cc lnh SELECT FOR UPDATE v SELECT FOR SHARE c mt kha ch ny trong (cc) bng
ch (b sung thm vo cc kha ACCESS SHARE trong bt k bng no khc m c tham
chiu nhng khng c la chn FOR UPDATE/FOR SHARE).
ROW EXCLUSIVE

Xung t vi cc ch kha
EXCLUSIVE.

SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE,

ACCESS

Cc lnh UPDATE, DELETE, v INSERT c ch kha ny trong bng ch (b sung thm vo


cc kha ACCESS SHARE trong bt k bng c tham chiu no khc). Ni chung, ch
kha ny s c c t bt k lnh no m sa i d liu trong mt bng.
SHARE UPDATE EXCLUSIVE

Xung t vi cc ch kha SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE,


EXCLUSIVE, v ACCESS EXCLUSIVE. Ch ny bo v mt bng chng li nhng thay i s
ng thi v chy VACUUM.
C c t cc lnh VACUUM (khng c FULL), ANALYZE, v CREATE INDEX CONCURRENTLY.
SHARE

Xung t vi cc ch kha ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE ROW


EXCLUSIVE, EXCLUSIVE, v ACCESS EXCLUSIVE. Ch ny bo v bng i vi cc thay i
d liu ng thi.
C c bng lnh CREATE INDEX (khng c CONCURRENTLY).
SHARE ROW EXCLUSIVE

Xung t vi cc ch kha ROW EXCLUSIVE,


ROW EXCLUSIVE, EXCLUSIVE, v ACCESS EXCLUSIVE.

SHARE UPDATE EXCLUSIVE, SHARE, SHARE

Ch kha ny khng t ng c c bng lnh PostgreSQL.


EXCLUSIVE

Xung t vi cc ch kha

ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE,

SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE,

ACCESS EXCLUSIVE.

Ch ny ch cho php

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 350/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

cc kha ng thi, ngha l, ch c t bng c th c x l song song vi mt giao dch


nm gi ch kha ny.
Ch kha ny khng t ng c c trong cc bng ca ngi s dng bng bt k lnh
PostgreSQL no. Tuy nhin n c trong cc catalog h thng nht nh mt s hot ng.
ACCESS EXCLUSIVE

Xung t vi cc kha ca tt c cc ch

ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE,

v ACCESS EXCLUSIVE.
Ch ny m bo rng ngi nm gi l giao dch duy nht truy cp c bng theo bt
k cch g.
SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE,

C c bng cc lnh ALTER TABLE, DROP TABLE, TRUNCATE, REINDEX, CLUSTER, v VACUUM
FULL. y cng l ch kha mc nh cho cc lnh LOCK TABLE m khng ch nh mt
ch r rng.
Mo: Ch khi ACCESS EXCLUSIVE kha mt lnh SELECT (khng c FOR UPDATE/SHARE).
Mt khi c c, mt kha thng c gi cho ti khi kt thc giao dch. Nhng nu mt kha c
c sau vic thit lp mt im an ton, th kha c nh ra ngay lp tc nu im an ton
c quay li. iu ny l nht qun vi nguyn tc rng ROLLBACK hon tt c cc tc ng ca
cc lnh k t im an ton. iu y ht gi cho cc kha c c bn trong mt khi ngoi l
PL/pgSQL: mt li thot khi khi nh ra cc kha c c bn trong n.
Bng 13-2. Cc ch kha xung t
Ch
kha c
yu cu

Ch kha hin hnh


ACCESS
SHARE

ROW
SHARE

ROW
EXCLUSIVE

SHARE
UPDATE
EXCLUSIVE

SHARE

SHARE
ROW
EXCLUSIVE

EXCLUSIVE

ACCESS
SHARE

ACCESS
EXCLUSIVE

ROW
SHARE
ROW
EXCLUSIVE
SHARE
UPDATE
EXCLUSIVE

SHARE

SHARE
ROW
EXCLUSIVE

EXCLUSIVE
ACCESS
EXCLUSIVE

13.3.2. Cc kha mc hng


B sung thm vo cc kha mc bng, c cc kha mc hng, chng c th l cc kha c quyn

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 351/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

hoc c chia s. Mt kha c quyn mc hng trong mt hng c th s t ng c c khi


hng c cp nht hoc b xa. Kha c gi cho ti khi giao dch thc hin xong hoc
quay li, ging ht nh cc kha mc bng. Cc kha mc hng khng nh hng ti vic truy vn
d liu; chng ch kha vic ghi vo cng mt hng.
c c mt kha c quyn mc hng trong mt hng m khng thc s sa i hng , hy
chn hng bng lnh SELECT FOR UPDATE. Lu l mt khi kha mc hng c c, th giao
dch c th cp nht hng nhiu ln m khng s c cc xung t.
c c mt kha mc hng c chia s trong mt hng, hy chn hng bng lnh SELECT
FOR SHARE. Mt kha c chia s khng cn tr cc giao dch khc khi vic c cng y ht kha
c chia s . Tuy nhin, khng giao dch no c php cp nht, xa, hoc kha c quyn
mt hng theo bt k giao dch no khc nm gi mt kha c chia s. Bt k c gng no
lm nh vy s kha cho ti khi (cc) kha chia s c nh ra.
PostgreSQL khng nh bt k thng tin no v cc hng c sa i trong b nh, nn khng c
gii hn v s lng cc hng b kha ti mt thi im. Tuy nhin, vic kha mt hng c th gy
ra mt s ghi a, ngha l, SELECT FOR UPDATE sa i cc hng c chn nh du chng b
kha, v v th s gy ra vic ghi a.
B sung thm vo cc kha hng v bng, cc kha chia s/c quyn mc trang c s dng
kim sot truy cp c/ghi vo cc trang ca bng trong kho b nh m (buffer) c chia s. cc
kha c nh ra ngay lp tc sau khi mt hng c ly hoc c cp nht. Cc lp trnh vin
ng dng thng khng cn quan tm vi cc kha mc trang, m chng c nhc y cho .

13.3.3. Kha cht


S dng vic kha r rng c th lm gia tng kh nng cc kha cht, trong 2 (hoc nhiu hn)
giao dch, mi giao dch nm cc kha m giao dch kia mun. V d, nu giao dch 1 i hi mt
kha c quyn trong bng A v sau c c c mt kha c quyn trong bng B, trong khi
giao dch 2 c ri bng B c kha c quyn v by gi mun mt kha c quyn trong bng A,
th khng c giao dch no c th tin hnh c. PostgreSQL t d tm ra cc tnh hung kha cht
v gii quyt chng bng vic hy b mt trong cc giao dch c lin quan, cho php (cc) giao dch
khc hon tt. (Chnh xc giao dch no s b hy b l kh on trc v khng nn da vo ).
Lu rng cc kha cht cng c th xy ra nh l kt qu ca cc kha mc hng (v v th,
chng c th xy ra thm ch nu vic kha r rng khng c s dng). Hy cn nhc trng hp
trong 2 giao dch ng thi cng sa mt bng. Giao dch u thc thi:
UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 11111;

iu ny lm cho c mt kha mc hng trong hng vi s ti khon c ch nh. Sau , giao


dch th 2 thc thi:
UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 22222;
UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 11111;

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 352/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Lnh UPDATE u tin c s thnh cng mt kha mc hng trong hng c ch nh, nn n thnh
cng trong vic cp nht hng . Tuy nhin, lnh UPDATE th 2 thy rng hng m n nh cp nht
b kha ri, nn n ch cho giao dch m c kha hon tt. Giao dch th 2 by gi ang ch
giao dch th nht hon tt trc khi n tip tc thc thi. By gi, giao dch 1 thc thi:
UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 22222;

Giao dch 1 c c mt kha mc hng trong hng c ch nh, nhng n khng th: giao dch
2 gi ri mt kha nh vy. Nn n ch cho giao dch 2 hon tt. V th, giao dch 1 b kha trong
giao dch 2, v giao dch 2 b kha trong giao dch 1: mt iu kin kha cht. PostgreSQL s d
tm ra tnh hung ny v hy b mt trong cc giao dch .
S phng v tt nht chng li cc kha cht thng l trnh chng bng vic chc chn rng tt c
cc ng dng ang s dng mt c s d liu c cc kha trong nhiu i tng theo mt trt t
nht qun. Trong v d trn, nu c 2 giao dch cp nht cc hng theo cng y ht mt trt t,
th kha cht c th khng xy ra. Bn cng nn m bo rng kha u c c trong mt i
tng trong mt giao dch l ch hn ch nht m s cn thit cho i tng . Nu khng kh
thi kim tra iu ny trc, th cc kha cht c th c nm gi trong qu trnh x l bng
vic c gng lm li cc giao dch hy b v cc kha cht .
Min l khng tnh hung kha tri no c d tm ra, mt giao dch tm cch hoc mt kha mc
bng hoc mc hng s ch mt cch xc nh cho cc kha xung t s c thay th. iu ny c
ngha y l mt tng ti cho cc ng dng gi cc giao dch m trong cc giai on thi
gian di (nh, trong khi ch u vo ca ngi s dng).

13.3.4. Kha c vn
PostgreSQL a ra mt cng c to cc kha m c cc ngha do cc ng dng nh ngha.
Chng c gi l cc kha c vn, v h thng khng p s dng chng - n l ty thuc vo ng
dng s dng chng mt cch ng n. Cc kha c vn c th l hu dng cho cc chin lc
kha m l mt s ph hp vng v i vi m hnh MVCC. Mt khi c c, mt kha c vn
c gi cho ti khi c nh ra r rng hoc kt thc phin. Khng ging nh cc kha tiu
chun, cc kha c vn khng tn trng cc ng ngha ca cc giao dch: mt kha c c trong
qu trnh mt giao dch m sau c quay li s vn c gi theo sau s quay li , v hn
na mt s m kha l c hiu lc thm ch nu vic gi giao dch tht bi sau . Kha y ht c
th c c nhiu ln bng qui trnh ca ring n: i vi tng yu cu kha s phi c mt yu cu
m kha tng ng trc khi kha thc s c nh ra. (Nu mt phin gi ri mt kha c
a ra, th cc yu cu b sung s lun thnh cng, thm ch nu cc phin khc ang ch kha ).
Ging nh tt c cc kha trong PostgreSQL, mt danh sch hon chnh cc kha c vn hin c
bt k phin no nm gi c th c thy trong kiu nhn h thng pg_locks.
Cc kha c vn c phn b ngoi kho b nh c chia s m kch c ca n c xc nh
bng cc bin cu hnh max_locks_per_transaction v max_connections. iu ny t ra mt gii
hn trn trong s cc kha c vn c my ch trao, in hnh trong s hng chc ti hng trm

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 353/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ngn, ph thuc vo cch m my ch c thit lp cu hnh.


S dng ph bin cc kha c vn l gi lp cc chin lc kha bi quan thng ca ci gi l
cc h thng qun l d liu tp phng (flat file). Trong khi mt c c lu gi trong mt bng
c th c s dng cho cng y ht mc ch, th cc kha c vn l nhanh hn, trnh s bung n
ca MVCC, v t ng c my ch lm sch vo cui phin. Trong cc trng hp nht nh
vic s dng phng php kha ny, c bit theo cc yu cu c lin quan ti trt t r rng v cc
mnh LIMIT, s thn trng phi c thc hin kim sot cc kha c c v trt t m theo
cc biu thc SQL c nh gi. V d:
SELECT pg_advisory_lock(id) FROM foo WHERE id = 12345; -- ok
SELECT pg_advisory_lock(id) FROM foo WHERE id > 12345 LIMIT 100; -- danger!
SELECT pg_advisory_lock(q.id) FROM
(
SELECT id FROM foo WHERE id > 12345 LIMIT 100
) q; -- ok

Trong cc truy vn trn, dng th 2 l nguy him v LIMIT khng c m bo s c p dng


trc khi vic kha hm c thc thi. iu ny c th dn ti mt s kha s c c m ng
dng tng khng k vng, v v th c th hng nh ra (cho ti khi n kt thc phin). T quan
im ca ng dng, cc kha nh vy c th l lng thng, d vn thy c trong pg_locks.
Cc hm c a ra iu khin cc kha c vn c m t trong Bng 9-61.

13.4. Kim tra s nht qun ca d liu mc ng dng


V cc c gi trong PostgreSQL khng kha d liu, bt chp mc cch li giao dch, cc d liu
c giao dch c c c th b giao dch ng thi khc ghi . Ni cch khc, nu mt hng
c lnh SELECT tr v th n khng c ngha l hng vn hin hnh thi im m n c tr
v (ngha l, lc no sau khi truy vn hin hnh bt u). Hng c th c sa i
hoc b xa t mt giao dch c thc hin xong ri m thc hin sau khi lnh SELECT bt
u. Thm ch nu hng vn cn hp l by gi, th n c th b thay i hoc b xa trc
khi giao dch hin hnh tin hnh mt thc hin xong hoc quay li.
Cch khc ngh v n l tng giao dch thy mt hnh chp cc ni dung c s d liu, v vic
ng thi thc thi cc giao dch c th nhn tht rt tt cc hnh chp khc. V th ton b khi nim
by gi l th g c xc nh ti bng mi cch. iu ny khng thng l mt vn ln
nu cc ng dng my trm c cch li vi nhau, nhng nu cc my trm c th giao tip thng
qua cc knh bn ngoi c s d liu th s lng tng nghim trng c th din ra sau .
m bo tnh hp l hin hnh ca mt hng v bo v n khi cc cp nht ng thi th phi
s dng cc lnh SELECT FOR UPDATE, SELECT FOR SHARE, hoc mt lnh LOCK TABLE ph hp. (kha
SELECT FOR UPDATE and SELECT FOR SHARE ch kha cc hng c tr v i vi cc cp nht ng
thi, trong khi LOCK TABLE kha ton b bng). iu ny phi c tnh ti khi chuyn cc ng
dng sang PostgreSQL t cc mi trng khc.
Cc kim tra hp l tng th i hi suy ngh thm theo MVCC. V d, mt ng dng ngn hng c

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 354/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

th mun kim tra rng tng tt c cc tn dng trong mt bng bng tng cc khon n trong bng
khc, khi c 2 bng u ang c cp nht tch cc. So snh cc kt qu ca 2 lnh SELECT sum(...)
k tip s khng lm vic tin cy trong ch c thc hin c, v truy vn th 2 c kh nng s
bao gm cc kt qu ca cc giao dch khng c truy vn u tnh ti. Vic tnh c 2 tng trong
mt giao dch tun t duy nht s trao mt bc tranh chnh xc ca ch cc hiu ng ca cc giao
dch c thc hin xong ri trc khi giao dch tun t bt u - nhng bn c th nghi ng hp
l liu cu tr li c vn cn ph hp vo thi im n c phn phi hay khng. Nu bn thn
giao dch tun t p dng mt s thay i trc khi c gng thc hin s kim tra nht qun
, th tnh hu dng ca kim tra thm ch tr nn tranh ci hn, v by gi n bao gm mt s
nhng khng phi tt c cc thay i sau khi giao dch bt u. Trong cc trng hp nh vy th
mt ngi cn thn c th mun kha tt c cc bng cn thit kim tra, c c mt bc
tranh khng gy tranh ci v thc t hin hnh. Mt kha ch SHARE (hoc cao hn) m bo
rng khng c nhng thay i khng c thc hin trong bng b kha , khc vi nhng thay
i ca giao dch hin hnh.
Cng lu l rng nu bn ang da vo vic kha r rng ngn chn cc thay i ng thi, th
bn nn hoc s dng ch c thc hin c, hoc ch tun t v hy thn trng c c
cc kha trc khi tin hnh cc truy vn. Mt kha c c bng mt giao dch tun t m bo
rng khng giao dch no khc sa i c bng vn cn ang chy, nhng nu hnh chp thy
c t giao dch c trc khi ginh c kha , th n c th c trc mt s thay i by gi
c thc hin trong bng . Mt hnh chp cc giao dch tun t thc s b ng bng u truy
vn u tin hoc lnh sa i d liu ca n ( SELECT, INSERT, UPDATE, hoc DELETE), nn c kh
nng ginh c cc kha r rng trc khi hnh chp c ng bng.

13.5. Kha v ch s
D PostgreSQL a ra s truy cp c/ghi khng kha cho d liu bng, th s truy cp c/ghi
khng kha hin khng c cho cho mi phng php truy cp ch s c trin khai trong
PostgreSQL. Cc dng ch s khc nhau c iu khin nh sau:
Cc ch s B-tree v GiST
Cc kha mc trang chia s/c quyn ngn hn c s dng cho truy cp c/ghi. Cc
kha s c nh ra ngay lp tc sau khi tng hng ch s c ly hoc c chn. Cc
dng ch s a ra s ng thi cao nht m khng c cc iu kin kha cht.
Cc ch s Hash (bm)
Cc kha mc x (bucket) bm chia s/c quyn c s dng cho truy cp c/ghi. Cc
kha s c nh ra sau khi ton b x c x l. Cc kha mc x a ra s ng thi tt
hn so vi cc kha mc ch s, nhng kha cht l c kh nng v cc kha c gi lu
hn so vi mt hot ng ch s.
Cc ch s GIN

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 355/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Cc kha mc trang chia s/c quyn ngn hn c s dng cho truy cp c/ghi. Cc
kha c nh ra ngay lp tc sau khi tng hng ch s c ly hoc c chn. Nhng lu
rng s chn mt gi tr c nh ch s GIN thng to ra vi s chn kha ch s cho
mt hng, nn GIN c th tin hnh cng vic ng k cho mt s chn gi tr duy nht.
Hin hnh, cc ch s B-tree a ra hiu nng tt nht cho cc ng dng ng thi; v chng cng
c cc chc nng nhiu hn so vi cc ch s bm - hash, chng l dng ch s c khuyn co
cho cc ng dng ng thi m cn phi nh ch s cho cc d liu v hng. Khi lm vic vi
cc d liu khng v hng, cc B-tree s khng hu dng, v cc ch s GiST v GIN s c s
dng thay vo .

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 356/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Chng 14. Mo cho hiu nng


Hiu nng ca truy vn c th b nh hng v nhiu th. Mt s chng c th c ngi s dng
kim sot, trong khi nhng th khc l c bn i vi thit k nm bn di ca h thng. Chng
ny a ra mt s gi v vic hiu v tinh chnh hiu nng ca PostgreSQL.

14.1. S dng EXPLAIN


PostgreSQL sp t mt k hoch ca cc truy vn cho tng truy vn n nhn c. Vic chn k
hoch ng khp vi cu trc truy vn v cc thuc tnh d liu l tuyt i sng cn cho hiu
nng tt, v th h thng bao gm mt trnh hoch nh phc tp m c chn cc k hoch tt. Bn
c th s dng lnh EXPLAIN xem k hoch truy vn g trnh hoch nh to ra cho bt k truy
vn no. Vic c k hoch l mt ngh thut m ng mt sch ch dn tng cng; m y c
mt s thng tin c bn.
Cu trc k hoch ca mt truy vn l mt cy cc nt k hoch. Cc nt mc y ca cy l cc
nt qut bng: chng tr v cc hng th t mt bng. C cc dng khc nhau ca cc nt qut cho
cc phng php truy cp bng khc nhau: cc qut tun t, qut ch s v qut ch s bitmap. Nu
truy vn i hi cc hot ng chung, tng hp, sp xp hoc khc trong cc hng th, th s c
cc nt b sung thm trn m cc nt qut s thc hin cc hot ng . Mt ln na, thng c
nhiu hn 1 cch thc c th thc hin cc hot ng , nn cc dng nt khc nhau c th
cng xut hin y. u ra ca EXPLAIN c mt dng cho tng nt trong cy k hoch , ch ra
dng nt c bn cng vi cc c tnh chi ph m trnh hoch nh thc hin cho s thc thi nt k
hoch . Dng u tin (nt nh) c chi ph thc thi tng c c lng cho k hoch ;
l s lng m trnh hoch nh tm cch lm gim thiu.
y l mt v d tm thng, ch ch ra nhng g u ra trng ging1:
EXPLAIN SELECT * FROM tenk1;
QUERY PLAN
------------------------------------------------------------Seq Scan on tenk1 (cost=0.00..458.00 rows=10000 width=244)

Cc s nm trong ngoc ca EXPLAIN l (t tri qua phi):

chi ph khi u c tnh (thi gian b ra trc khi qut u ra c th bt u, ngha l, thi
gian thc hin vic sp xp trong mt nt sp xp).

chi ph tng c tnh (nu tt c cc hng c truy xut, d chng c th s khng; ngha
l, mt truy vn vi mt mnh LIMIT s sm dng vic thanh ton chi ph tng ca nt u
ra ca nt k hoch Limit.

Cc v d trong phn ny c thit k t c s d liu kim th s thoi lui sau khi thc hin mt VACUUM
ANALYZE, bng vic s dng cc ngun pht trin phin bn 8.2. Bn nn c kh nng c cc kt qu tng t
nu bn t mnh th cc v d , nhng cc chi ph c lng v cc tnh ton hng ca bn c th hi khc v cc
s liu thng k ca ANALYZE l cc mu ngu nhin hn l chnh xc.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 357/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

s cc hng u ra c c tnh ca nt k hoch ny (mt ln na, ch nu c thc thi


ti hon tt).

rng trung bnh c tnh (theo byte) cc hng u ra ca nt k hoch ny.

Cc chi ph c o m trong cc n v ty c cc tham s chi ph ca trnh hoch nh xc


nh (xem Phn 18.6.2). Thc tin truyn thng l o m cc chi ph trong cc n v ly cc
trang ca a; l, seq_page_cost l tp hp theo qui c ti 1.0 v cc tham s chi ph khc
c thit lp tng i vi iu . (Cc v d trong phn ny c chy vi cc tham s chi ph
mc nh).
iu quan trng lu rng chi ph ca mt nt mc cao hn bao gm chi ph ca tt c cc nt
con ca n. Cng quan trng nhn thc c rng chi ph ch phn nh nhng iu m trnh
hoch nh quan tm. Trong thc t, chi ph khng xem xt thi gian b ra cho vic truyn cc
hng kt qu ti my trm, n c th l mt yu t quan trng trong thi gian thc tri qua;
nhng trnh hoch nh b qua n v n khng th thay i n bng vic iu chnh k hoch. (Mi
k hoc ng s a ra kt qu tp hp y ht cc hng, chng ta tin tng th).
Gi tr cc hng l mt mo v n khng phi l s hng c nt k hoch x l hoc qut. N
thng t hn, phn nh kh nng la chn c c lng ca bt k iu kin mnh WHERE
no m ang c p dng nt . L tng l c tnh cc hng mc nh s xp x s lng cc
hng thc s c tr v, c cp nht hoc b xa bi truy vn .
Chy vi v d ca chng ti:
EXPLAIN SELECT * FROM tenk1;
QUERY PLAN
------------------------------------------------------------Seq Scan on tenk1 (cost=0.00..458.00 rows=10000 width=244)

iu ny l n gin nh n c. Nu bn lm:
SELECT relpages, reltuples FROM pg_class WHERE relname = tenk1;

th bn s thy rng tenk1 c 358 trang a v 10.000 hng. Chi ph c c lng c tnh
ton nh l (cc trang a c c * seq_page_cost) + (cc hng c qut * cpu_tuple_cost).
Mc nh, seq_page_cost bng 1.0 v cpu_tuple_cost bng 0.01, nn chi ph c c lng l:
(358 * 1.0) + (10.000 * 0.01) = 458.
By gi hy sa truy vn gc b sung thm mt iu kin WHERE:
EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 7000;
QUERY PLAN
-----------------------------------------------------------Seq Scan on tenk1 (cost=0.00..483.00 rows=7033 width=244)
Filter: (unique1 < 7000)

Lu rng u ra EXPLAIN ch mnh WHERE ang c p dng nh mt iu kin b lc; iu


ny c ngha l nt k hoch kim tra iu kin cho tng hng m n qut, v cc u ra ch l cc

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 358/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

hng vt qua c iu kin . c lng cc hng u ra gim v mnh WHERE. Tuy


nhin, s qut s vn phi ti tt c 10.000 hng, nn chi ph s khng gim; trong thc t n
vt qua c mt cht (bng 10.000 * cpu_operator_cost, mt cch chnh xc) phn nh thi
gian di d m CPU b ra kim tra iu kin WHERE.
S hng thc s truy vn ny c th la chn l 7.000, nhng c lng rows ch l gn ng. Nu
bn c p bn th im ny, th bn s c kh nng c mt c lng hi khc; hn na, n s thay
i sau tng lnh ANALYZE, v cc s liu thng k c ANALYZE to ra c ly t mt mu ca
bng c ty bin.
By gi, hy thc hin iu kin cht ch hn:
EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;
QUERY PLAN
-----------------------------------------------------------------------------Bitmap Heap Scan on tenk1 (cost=2.37..232.35 rows=106 width=244)
Recheck Cond: (unique1 < 100)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..2.37 rows=106 width=0)
Index Cond: (unique1 < 100)

Trnh hoch nh ny quyt nh s dng mt k hoch 2 bc: nt k hoch y ving thm


mt ch s tm cc v tr cc hng khp vi iu kin ca ch s , v sau nt k hoch cao
hn thc s ly cc hng t bn thn bng . Vic ly cc hng mt cch ring r s t gi hn
so vi vic c chng tun t, nhng v khng phi tt c cc trang ca bng phi c ving thm,
nn nt k hoch cao hn s sp xp cc v tr hng c ch s nhn din theo trt t vt l trc
khi c chng, lm gim thiu chi ph ly c ring r. Bitmap c nhc ti trong cc tn
nt l c ch thc hin vic sp xp.
Nu iu kin WHERE l la chn , th trnh hoch nh c th chuyn sang mt k hoch qut ch
s n gin:
EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 3;
QUERY PLAN
-----------------------------------------------------------------------------Index Scan using tenk1_unique1 on tenk1 (cost=0.00..10.00 rows=2 width=244)
Index Cond: (unique1 < 3)

Trong trng hp ny cc hng ca bng c ly theo trt t ch s, n lm cho chng thm ch


t gi hn c, nhng c qu t hng m cc chi ph d tha sp xp v tr hng l khng
ng iu ny. Bn hu nh thng thy dng k hoch ny i vi cc truy vn m ch ly mt
hng duy nht, v cho c cc truy vn m c iu kin ORDER BY khp vi trt t ch s .
B sung thm iu kin khc vo mnh WHERE:
EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 3 AND stringu1 = xxx;
QUERY PLAN
-----------------------------------------------------------------------------Index Scan using tenk1_unique1 on tenk1 (cost=0.00..10.01 rows=1 width=244)
Index Cond: (unique1 < 3)
Filter: (stringu1 = xxx::name)

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 359/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

iu kin c b sung thm stringu1 = xxx lm gim c lng cc hng u ra, nhng khng
phi l chi ph v chng ta vn phi ving thm tp hp cc hng y ht. Lu rng mnh stringu1
khng th c p dng nh mt iu kin ch s (v ch s ny ch trong ct unique1). Thay vo
n c p dng nh mt b lc trong cc hng c ch s truy xut. V th chi ph thc s
hi ln mt cht phn nh vic kim tra thm ny.
Nu c cc ch s trong vi ct c tham chiu trong WHERE, th trnh hoch nh c th chn
s dng s kt hp ca mt AND hoc OR ca cc ch s:
EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND unique2 > 9000;
QUERY PLAN
------------------------------------------------------------------------------------Bitmap Heap Scan on tenk1 (cost=11.27..49.11 rows=11 width=244)
Recheck Cond: ((unique1 < 100) AND (unique2 > 9000))
-> BitmapAnd (cost=11.27..11.27 rows=11 width=0)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..2.37 rows=106 width=0)
Index Cond: (unique1 < 100)
-> Bitmap Index Scan on tenk1_unique2 (cost=0.00..8.65 rows=1042 width=0)
Index Cond: (unique2 > 9000)

Nhng iu ny i hi vic ving thm c hai ch s, v vy khng nht thit phi l mt chin
thng so vi vic s dng ch mt ch s v i x vi iu kin khc nh vi mt b lc. Nu bn
lm thay i cc di c lin quan th bn s thy s thay i k hoch mt cch tng ng.
Hy th gp 2 bng, bng vic s dng cc ct m chng ta v ang tho lun:
EXPLAIN SELECT *
FROM tenk1 t1, tenk2 t2
WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2;
QUERY PLAN
-------------------------------------------------------------------------------------Nested Loop (cost=2.37..553.11 rows=106 width=488)
-> Bitmap Heap Scan on tenk1 t1 (cost=2.37..232.35 rows=106 width=244)
Recheck Cond: (unique1 < 100)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..2.37 rows=106 width=0)
Index Cond: (unique1 < 100)
-> Index Scan using tenk2_unique2 on tenk2 t2 (cost=0.00..3.01 rows=1 width=244)
Index Cond: (t2.unique2 = t1.unique2)

Trong kt hp c vng lp lng ny, s qut ngoi (cao hn) l s qut ch s bitmap y ht m
chng ta thy trc , v v th chi ph v tnh ton hng ca n l y ht v chng ta ang p
dng mnh WHERE cho unique1 < 100 nt . Mnh t1.unique2 = t2.unique2 l cha ph
hp, nn n khng nh hng ti tnh hng ca s qut ngoi. i vi s qut trong (thp hn), th
gi tr unique2 ca hng qut ngoi c ci cm vo s qut ch s bn trong to ra mt iu
kin ch s nh t2.unique2 = constant. V th chng ta c k hoch qut bn trong y ht v cc chi ph
m chng ta c t EXPLAIN SELECT * FROM tenk2 WHERE unique2 = 42 . Cc chi ph ca nt lp sau
c thit lp trn c s chi ph ca s qut ngoi, cng vi s lp li ca s qut trong cho tng
hng ngoi (106 * 3.01 y), cng vi mt cht thi gian CPU cho vic x l chung.
Trong v d ny s tnh hng u ra chung l y ht nh sn phm ca 2 s tnh ton hng qut, m
iu khng ng trong tt c cc trng hp v bn c th c cc mnh WHERE m nhc ti c

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 360/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

2 bng v v th ch c th c p dng im chung, khng cho s qut u vo. V d, nu


chng ta thm WHERE AND t1.hundred < t2.hundred, th iu c th lm gim s tnh hng
u ra ca nt chung , nhng khng thay i s qut u vo.
Mt cch xem xt cc k hoch khc nhau l hy p trnh hoch nh b qua bt k chin lc
no m n ngh tng l r nht, bng vic s dng cc c c/khng hiu lc (enable/disable) c
m t trong Phn 18.6.1. (y l mt cng c th, nhng hu dng. Xem thm Phn 14.3).
SET enable_nestloop = off;
EXPLAIN SELECT *
FROM tenk1 t1, tenk2 t2
WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2;
QUERY PLAN
-----------------------------------------------------------------------------------------Hash Join (cost=232.61..741.67 rows=106 width=488)
Hash Cond: (t2.unique2 = t1.unique2)
-> Seq Scan on tenk2 t2 (cost=0.00..458.00 rows=10000 width=244)
-> Hash (cost=232.35..232.35 rows=106 width=244)
-> Bitmap Heap Scan on tenk1 t1 (cost=2.37..232.35 rows=106 width=244)
Recheck Cond: (unique1 < 100)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..2.37 rows=106 width=0)
Index Cond: (unique1 < 100)

K hoch ny x l trch ra 100 hng c quan tm ca tenk1 bng vic s dng s qut ch s c
y ht, ct chng vo mt bng bm trong b nh, v sau tin hnh mt s qut tun t ca tenk2,
thm d trong bng bm i vi kh nng ly ca t1.unique2 = t2.unique2 i vi tng hng tenk2.
Chi ph c tenk1 v thit lp bng bm l mt chi ph khi u cho s kt hp bm, v s khng
c u ra cho ti khi chng ta c th bt u c tenk2. c tnh thi gian tng cho s kt hp cng
bao gm mt khon chi ph khng l cho thi gian CPU thm d bng bm 10.000 ln. Tuy
nhin, hy lu rng chng ta khng ang ly 10.000 ln ca 232.35; thit lp bng bm ch c
thc hin mt ln theo dng k hoch ny.
C kh nng kim tra chnh xc cc chi ph c lng ca trnh hoch nh bng vic s dng
EXPLAIN ANALYZE. Lnh ny thc s thc thi truy vn, v sau hin th thi gian chy ng c
tch t bn trong tng nt k hoch cng vi cc chi ph y ht c c lng m mt k hoch
EXPLAIN ch ra. V d, chng ta c th c mt kt qu nh th ny:
EXPLAIN ANALYZE SELECT *
FROM tenk1 t1, tenk2 t2
WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------Nested Loop (cost=2.37..553.11 rows=106 width=488) (actual time=1.392..12.700 rows=100
-> Bitmap Heap Scan on tenk1 t1 (cost=2.37..232.35 rows=106 width=244) (actual
time=Recheck Cond: (unique1 < 100)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..2.37 rows=106 width=0) (actual
Index Cond: (unique1 < 100)
-> Index Scan using tenk2_unique2 on tenk2 t2 (cost=0.00..3.01 rows=1 width=244) (actual
Index Cond: (t2.unique2 = t1.unique2)
Total runtime: 14.452 ms

Lu rng cc gi tr thi gian thc l theo mili giy ca thi gian thc, trong khi cc c tnh

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 361/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

chi ph c th hin theo cc n v ty ; v th chng c l khng khp. iu phi ch ti l


liu cc t l thi gian thc v cc chi ph c c lng c l nht qun hay khng.
Trong mt s k hoch truy vn, l khng th i vi mt nt k hoch con s c thc thi hn
mt ln. V d, s qut ch s bn trong c thc thi mt ln cho tng hng bn ngoi trong k
hoch c lp lng nhau trn. Trong cc trng hp nh vy, gi tr loops nu ln tng s cc thc
thi ca nt , v thi gian thc s v cc gi tr hng c trnh by l trung bnh cho mi s thc
thi. iu ny c thc hin lm cho cc s so snh c vi cch thc m cc c tnh chi ph
c trnh by. Nhn vi gi tr loops c c tng thi gian thc s c b ra trong nt .
For INSERT , UPDATE , and DELETE commands, the time spent applying the table changes is
charged to a top-level Insert, Update, or Delete plan node

Tng thi gian Total runtime c EXPLAIN ANALYZE ch ra bao gm thi gian khi ng v tt ca
trnh thc thi, ch khng phi ca vic phn tch, vit li, hay thi gian ln k hoch. i vi cc
lnh INSERT, UPDATE, v DELETE, thi gian b ra cho vic p dng nhng thay i ca bng c p
cho nt k hoch ca mt mc nh cc lnh Insert, Update hoc Delete. (Cc nt k hoch bn
di nt ny trnh by cng vic nh v cc hng v/hoc vic tnh cc hng mi). Thi gian b ra
cho vic thc thi BEFORE cc trigger, nu c, c ly chi ph i vi nt Insert, Update hoc Delete
c lin quan, d thi gian b ra cho vic thc thi AFTER cc trigger l khng ly. Thi gian b ra
trong tng trigger (hoc BEFORE hoc AFTER) cng c by ra ring r v c a vo trong thi
gian chy tng. Tuy nhin, lu rng cc trigger rng buc b hon li s khng c thc thi cho
ti kt thc giao dch v v th khng c EXPLAIN ANALYZE by ra.
C 2 cch ng k trong cc thi gian chy c EXPLAIN ANALYZE o m c th i chch khi
s thc thi thng thng ca truy vn y ht. Trc ht, v khng hng u ra no c phn phi
cho my trm, nn cc chi ph truyn qua mng v cc chi ph nh dng I/O khng c a vo.
Th 2, tng chi ph c EXPLAIN ANALYZE thm vo c th l ng k, c bit trong cc my vi
cc li gi nhn (kernel) gettimeofday() chm.
ng lu rng cc kt qu ca EXPLAIN nn khng b ngoi suy ti cc tnh hung khc vi tnh
hung m bn thc s ang kim th; v d, cc kt qu trong mt bng kch c tr chi khng th
c gi thit p dng cho cc bng ln. Cc c tnh chi ph ca trnh hoch nh l khng
tuyn tnh v v th n c th chn mt k hoch khc i vi mt bng ln hn hoc nh hn. Mt
v d cc k l trong mt bng m ch chim mt trang a, bn s gn nh lun c mt k hoch
qut tun t bt k cc ch s l sn sng hay khng. Trnh hoch nh nhn thc c rng n s
ly mt trang a c x l bng trong bt k trng hp no, nn khng c gi tr no trong
trang thm vo c xem mt ch s.

14.2. S liu thng k c trnh hoch nh s dng


Nh chng ta thy trong phn trc, trnh hoch nh truy vn cn c lng s cc hng c
mt truy vn truy xut tin hnh cc la chn tt i vi cc k hoch truy vn. Phn ny lt
nhanh qua cc s liu thng k m h thng s dng cho cc c tnh .

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 362/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Mt thnh phn ca s liu thng k l tng s cc khon u vo trong tng bng v ch s, cng
nh s lng cc khi a b tng bng v ch s chim. Thng tin ny c gi trong pg_class ca
bng, trong cc ct reltuples v relpages. Chng ta c th xem n vi cc truy vn tng t th ny:
SELECT relname, relkind, reltuples, relpages
FROM pg_class
WHERE relname LIKE tenk1%;
relname
| relkind | reltuples | relpages
--------------------------------+----------+------------+------------tenk1
|r
| 10000 | 358
tenk1_hundred
|i
| 10000 | 30
tenk1_thous_tenthous | i
| 10000 | 30
tenk1_unique1
|i
| 10000 | 30
tenk1_unique2
|i
| 10000 | 30
(5 rows)

y chng ta c th thy rng tenk1 cha 10.000 hng, cc ch s ca n cng vy, nhng cc ch
s l (khng ngc nhin) nh hn nhiu so vi bng.
V cc l do hiu qu, reltuples v relpages khng c cp nht lc ang chy, v v th chng
thng bao gm th g nh cc d liu li thi. Chng c VACUUM, ANALYZE v mt t lnh
DDL nh CREATE INDEX cp nht. Mt lnh ANALYZE ng mt mnh, n l mt phn ca VACUUM,
sinh ra mt gi tr gn vi reltuples v n khng c mi hng trong bng. Trnh hoch nh s m
rng phm vi cc gi tr m n thy trong pg_class khp vi kch c bng vt l hin hnh, v th
c c s gn ng st hn.
Hu ht cc truy vn ch truy xut mt phn cc hng trong mt bng, v cc mnh WHERE hn
ch cc hng s c kim tra. Trnh hoch nh v th cn phi thc hin mt c lng kh nng
la chn cc mnh WHERE, l, mt phn cc hng khp vi tng iu kin trong mnh
WHERE. Thng tin ny c s dng cho tc v ny c lu gi trong catalog h thng pg_statistic.
Cc khon u vo pg_statistic c cc lnh ANALYZE v VACUUM ANALYZE cp nht, v lun gn
ng thm ch khi c cp nht ti mi.
Thay v xem trc tip pg_statistic, l tt hn xem kiu nhn pg_stats ca n khi xem xt cc s
liu thng k mt cch th cng. pg_stats c thit k c c d dng hn. Hn na, ai cng
c c pg_stats, trong khi ch mt mnh siu ngi s dng (superuser) c c pg_statistic.
(iu ny ngn cn nhng ngi s dng khng c quyn khi vic hc th g v cc ni dung
cc bng ca nhng ngi khc t cc s liu thng k . Kiu nhn pg_stats c ng k ch
ra ch cc hng v cc bng m ngi s dng hin hnh c th c). V d, chng ta c th lm:
SELECT attname, inherited, n_distinct,
array_to_string(most_common_vals, E\n) as most_common_vals
FROM pg_stats
WHERE tablename = road;
attname | inherited | n_distinct
| most_common_vals
------------+-------------+------------------------+-----------------------------------name
|f
|
-0.363388 | I- 580 Ramp+
|
|
| I- 880 Ramp+
|
|
| Sp Railroad +
|
|
| I- 580 +

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 363/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

name

|
|t
|
|
|
|

|
|
|
|
|
|

|
-0.284859 |
|
|
|
|

Xut bn nm 2013

I- 680 Ramp
I- 880 Ramp+
I- 580 Ramp+
I- 680 Ramp+
I- 580 +
State Hwy 13 Ramp

(2 rows)

Lu rng 2 hng c hin th cho cng ct y ht, mt hng tng ng vi h thng phn cp k
tha hon chnh bt u bng road (inherited=t), v hng khc ch bao gm bn thn bng road
(inherited=f).
Lng thng tin c ANALYZE lu tr trong pg_statistic, c bit s lng ti a cc khon u vo
trong cc mng most_common_vals v histogram_bounds cho tng ct, c th c thit lp trn c
s tng ct mt bng vic s dng lnh ALTER TABLE SET STATISTICS, hoc ton th bng vic thit
lp bin cu hnh default_statistics_target. Gii hn mc nh hin hnh l 100 khon u vo.
Vic nng ln gii hn ny c th cho php nhiu c tnh chnh xc hn ca trnh hoch nh c
thc hin, c bit cho cc ct vi cc phn phi d liu bt thng, vi gi thnh ca vic tiu
dng nhiu khng gian hn trong pg_statistic v hi nhiu thi gian hn mt cht tnh ton cc
c lng . Ngc li, mt gii hn thp hn c th l cho cc ct vi cc phn phi d liu
n gin.
Chi tit xa hn v s dng cc s liu thng k ca trnh hoch nh c th thy trong Chng 56.

14.3. Kim sot trnh hoch nh vi mnh r rng JOIN


C kh nng kim sot trnh hoch nh truy vn mt vi mc bng vic s dng c php r
rng JOIN. xem v sao iu ny l cn thit, trc ht chng ta cn mt s nn tng c bn.
Trong mt truy vn lin kt n gin, nh:
SELECT * FROM a, b, c WHERE a.id = b.id AND b.ref = c.id;

trnh hoch nh l t do kt ni cc bng c a ra theo bt k th t no. V d, n c th


to mt k hoch truy vn m kt ni A vi B, bng vic s dng iu kin WHERE a.id = b.id, sau
kt ni C vi bng c kt ni ny, bng vic s dng iu kin WHERE khc. Hoc n c th
kt ni B vi C v sau kt ni A vo kt qu . Hoc n c th kt ni A vi C v sau kt ni
chng vi B - nhng iu c th l khng , v sn phm cc (Cartesian) ca A v C c th
phi c hnh thnh, ang khng c iu kin p dng c trong mnh WHERE cho php s
ti u ha lin kt . (Tt c cc lin kt trong trnh thc thi PostgreSQL xy ra gia 2 bng u
vo, nn l cn thit xy dng kt qu theo mt trong cc cch thc ). im quan trng l
nhng kh nng lin kt a ra cc kt qu tng ng v ng ngha nhng c th c cc chi
ph thc thi khc nhau khng l. V th, trnh hoch nh s khai thc tt c chng c tm ra k
hoch truy vn c hiu qu nht.
Khi mt truy vn ch lin quan ti 2 hoc 3 bng, th s khng c nhiu th t lin kt lo lng.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 364/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Nhng s lng cc th t c kh nng lin kt tng theo hm m khi s lng cc bng gia tng.
Ngoi khong 10 bng u vo th khng cn l thc t na thc hin mt tm kim y ca
tt c cc kh nng, v thm ch i vi 6 hoc 7 bng th vic ln k hoch c th mt kh nhiu
thi gian. Khi c qu nhiu cc bng u vo, th trnh hoch nh ca PostgreSQL s chuyn t tm
kim y sang mt tm kim chung xc sut thng qua mt s kh nng gii hn. (Ngng
chuyn qua c tham s thi gian chy geqo_threshold thit lp). Tm kim chung mt t thi gian
hn, nhng n s khng nht thit tm k hoch c kh nng tt nht.
Khi truy vn lin quan ti cc lin kt, th trnh hoch nh c t s t do hn so vi n c cho cc
lin kt th (ni b). V d, hy xem xt:
SELECT * FROM a LEFT JOIN (b JOIN c ON (b.ref = c.id)) ON (a.id = b.id);

D cc hn ch ca truy vn ny l hi tng t vi v d trc, th ng ngha l khc v mt hng


phi c a ra cho tng hng ca A m khng c hng trng khp trong lin kt ca B v C. V
th trnh hoch nh khng c s la chn th t lin kt y: n phi lin kt B vi C v sau
lin kt A vo kt qu . Tng t, truy vn ny ly t thi gian hn so vi truy vn trc .
Trong cc trng hp khc, trnh hoch nh c kh nng xc nh rng hn mt th t lin kt l
an ton. V d, a ra:
SELECT * FROM a LEFT JOIN b ON (a.bid = b.id) LEFT JOIN c ON (a.cid = c.id);

l hp l lin kt A vi hoc B hoc C trc. Hin hnh, ch FULL JOIN hon ton rng buc th t
lin kt. Hu ht cc trng hp thc tin c lin quan ti LEFT JOIN hoc RIGHT JOIN c th c
dn xp mt vi mc no .
C php lin kt ni b r rng ( INNER JOIN, CROSS JOIN, hoc unadorned JOIN), v mt ng ngha
l y ht nh vic lit k cc quan h u vo trong FROM, v th khng rng buc th t lin kt.
Thm ch d hu ht cc dng JOIN khng hon ton rng buc th t lin kt, c kh nng ra lnh
cho trnh hoch nh truy vn ca PostgreSQL i x vi tt c cc mnh JOIN nh vic rng
buc th t lin kt vy. V d, 3 truy vn sau l tng ng nhau v logic:
SELECT * FROM a, b, c WHERE a.id = b.id AND b.ref = c.id;
SELECT * FROM a CROSS JOIN b CROSS JOIN c WHERE a.id = b.id AND b.ref = c.id;
SELECT * FROM a JOIN (b JOIN c ON (b.ref = c.id)) ON (a.id = b.id);

Nhng nu chng ta ni cho trnh hoch nh tn trng th t JOIN, th dng 2 v 3 mt thi gian
ln k hoch hn so vi dng 1. Hiu ng ny l khng ng lo ngi v ch c 3 bng, nhng n c
th l mt s cu sinh vi nhiu bng.
p trnh hoch nh tun theo th t lin kt c t ra t cc JOIN r rng, hy thit lp tham
s thi gian chy join_collapse_limit v 1. (Cc gi tr c th khc c tho lun bn di).
Bn khng cn rng buc th t lin kt hon ton ct b thi gian tm kim, v l OK s
dng cc ton t JOIN vi cc khi nim ca mt danh sch y FROM. V d, hy xem xt:
SELECT * FROM a CROSS JOIN b, c, d, e WHERE ...;

Vi

join_collapse_limit = 1,

iu ny p trnh hoch nh phi lin kt A vi B trc vic lin kt

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 365/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

chng vi cc bng khc, nhng khng rng buc cc la chn ca n. Trong v d ny, s cc th
t lin kt c th c gim v mt yu t ca 5.
Vic rng buc tm kim ca trnh hoch nh theo cch ny l mt k thut hu dng cho vic
gim thi gian ln k hoch v cho vic dn hng cho trnh hoch nh ti mt k hoch truy vn
tt. Nu trnh hoch nh chn mt th t lin kt ti mt cch mc nh, th bn c th p n chn
mt th t tt hn thng qua c php JOIN gi thit l bn bit mt th t tt hn, l th. S kim
th c khuyn co.
Mt vn c lin quan st sao nh hng ti thi gian ln k hoch l vic sp cc truy vn con
bn trong truy vn cha.
V d, hy xem xt:
SELECT *
FROM x, y,
(SELECT * FROM a, b, c WHERE something) AS ss
WHERE somethingelse;

Tnh hung ny c th ny sinh t s dng mt kiu nhn m rng buc mt lin kt; qui tc SELECT
ca mt kiu nhn s c chn vo ch ca tham chiu kiu nhn , bng vic ly mt truy vn rt
ging trn. Thng thng, trnh hoch nh s c sp truy vn con trong truy vn cha, c:
SELECT * FROM x, y, a, b, c WHERE something AND somethingelse;

iu ny thng dn ti mt k hoch tt hn so vi vic ln k hoch cho truy vn con mt cch


ring r. (V d, cc iu kin WHERE bn ngoi c th l cc iu kin nh vic lin kt X vi A
trc s loi b nhiu hng ca A, v th trnh c nhu cu hnh thnh u ra y logic ca truy
vn con ). Nhng cng lc, chng ta lm gia tng thi gian ln k hoch; y, chng ta c
vn lin kt 5 cch thc ang thay th 2 vn lin kt 3 cch thc ring r.
V s tng trng hm m ca s lng cc kh nng, iu ny to ra s khc bit ln. Trnh hoch
nh c trnh b kt trong cc vn tm kim lin kt khng l bng vic khng lm sp mt truy
vn con nu nhiu hn cc khi nim from_collapse_limit FROM c th dn ti truy vn cha . Bn
c th cn i gia thi gian ln k hoch v cht lng k hoch bng vic tinh chnh tham s
thi gian chy ny ln hoc xung.
v join_collapse_limit c t tn tng t v chng lm hu ht iu y ht:
mt ci kim sot khi trnh hoch nh s dn bt cc truy vn con, cn ci kia kim sot khi n
dn bt cc lin kt r rng. in hnh l bn c th hoc thit lp join_collapse_limit ngang bng vi
from_collapse_limit (sao cho cc lin kt r rng v cc truy vn con hnh ng tng t) hoc thit
lp join_collapse_limit v 1 (nu bn mun kim sot th t lin kt bng cc lin kt r rng).
Nhng bn c th thit lp chng khc nhau nu bn ang c gng tinh chnh s cn nhc gia thi
gian ln k hoch v thi gian chy.
from_collapse_limit

14.4. a d liu vo c s d liu


Bn c th cn chn mt lng ln d liu khi ln u a d liu vo c s d liu. Phn ny bao

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 366/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

gm mt s gi v cch tin hnh qui trnh ny c hiu qu nht c th.

14.4.1. V hiu ha thc hin t ng (Autocommit)


Khi s dng nhiu lnh chn INSERT, hy tt t ng thc hin (autocommit) v ch tin hnh mt
thc hin (commit) lc kt thc. (Trong SQL thng thng, iu ny c ngha l a ra BEGIN u
v COMMIT cui. Mt s th vin my trm c th lm iu ny sau lng bn, trong trng hp
bn cn chc chn th vin thc hin iu khi bn mun n c thc hin). Nu bn cho
php tng s chn c thc hin ring r, th PostgreSQL ang lm nhiu cng vic cho tng hng
m c b sung thm vo. Mt li ch b sung ca vic tin hnh tt c s chn trong mt giao
dch l nu s chn mt hng tng hng th sau s chn ca tt c cc hng c chn vo ti
im c th phi quay li, sao cho bn s khng b kt vi cc d liu c ti ln mt phn.

14.4.2. S dng COPY


Hy s dng COPY ti tt c cc hng trong mt lnh, thay v s dng mt lot cc lnh INSERT.
Lnh COPY c ti u ha cho vic ti s lng ln cc hng; l t mm do hn so vi INSERT,
nhng chu t hn ng k tng chi ph cho cc ti d liu ln. V COPY l mt lnh duy nht, nn
khng cn v hiu ha autocommit nu bn s dng phng php ny a d liu vo mt bng.
Nu bn khng th s dng COPY, c th gip s dng PREPARE to mt lnh INSERT c chun
b trc, v sau s dng EXECUTE bao nhiu ln ty theo yu cu. iu ny trnh c mt s
tng chi ph ca vic phn tch lp i lp li v ln k hoch cho lnh INSERT. Cc giao din khc
nhau a ra c s ny theo cc cch thc khc nhau; hy tm kim prepared statements (cc lnh
c chun b) trong ti liu giao din.
Lu rng vic ti mt s lng ln cc hng bng vic s dng COPY hu nh lun nhanh hn so
vi vic s dng INSERT, thm ch nu PREPARE c s dng v nhiu s chn c to thnh b
trong mt giao dch duy nht.
l nhanh nht khi c s dng trong giao dch y ht nh mt lnh CREATE TABLE hoc
TRUNCATE trc . Trong cc trng hp nh vy khng WAL no cn phi c vit, v trong
trng hp c mt li, th cc tp cha cc d liu mi c ti s b loi b bng mi cch. Tuy
nhin, s xem xt ch p dng khi wal_level l minimal nh tt c cc lnh nu khng phi vit WAL.
COPY

14.4.3. Loi b ch s
Nu bn ang ti mt bng c to mi, th phng php nhanh nht l to bng , ti theo b
cc d liu bng bng vic s dng COPY, ri to cc ch s bt k cn thit cho bng . Vic to
mt ch s trong cc d liu tn ti trc l nhanh hn so vi vic cp nht n tng cht mt khi
tng hng c ti.
Nu bn ang thm cc lng ln cc d liu vo mt bng ang tn ti, c th l mt thnh cng
loi b cc ch s, ti bng , v sau to li cc ch s. Tt nhin, hiu nng ca c s d liu

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 367/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

i vi nhng ngi s dng khc c th phi chu trong thi gian cc ch s khng c. Bn cng
nn ngh 2 ln trc khi b mt ch s duy nht, v vic kim tra li kham c bng s rng buc
duy nht s b mt trong khi ch s khng cn.

14.4.4. Loi b rng buc kha ngoi


Ht nh vi cc ch s, mt rng buc kha ngoi c th c kim tra theo b hiu qu hn so
vi theo tng hng mt. V th c th l hu dng b cc rng buc kha ngoi, ti d liu, v ti
to li cc rng buc. Mt ln na, c mt s b tr gia tc ti d liu v mt kim tra li khi
khng c rng buc.
Hn na, khi bn ti d liu vo mt bng vi cc rng buc kha ngoi ang tn ti, th tng hng
mi i hi mt khon u vo trong danh sch my ch ca cc s kin treo trigger (v n l s
pht ha ca mt trigger m kim tra rng buc kha ngoi ca hng). Vic ti nhiu triu hng c
th lm cho hng i cc s kin trigger gy qu ti cho b nh c sn, dn ti vic hon i khng
chu ni hoc thm ch tht bi hon ton ca lnh. V th c th l cn thit, khng ch mong mun,
b v p dng li cc kha ngoi khi ti cc lng ln d liu. Nu vic loi b tm thi rng buc
l khng chp nhn c, ch qu trnh khc c th chia hot ng ti thnh cc giao dch nh hn.

14.4.5. Gia tng maintenance_work_mem


Tng tm thi bin cu hnh maintenance_work_mem khi ti lng ln cc d liu c th dn ti
hiu nng c ci thin. iu ny s gip tng tc cc lnh CREATE INDEX v cc lnh ALTER
TABLE ADD FOREIGN KEY. N s khng lm nhiu cho bn thn lnh COPY, nn t vn ny ch hu
dng khi bn ang s dng 1 hoc 2 k thut trn.

14.4.6. Tng checkpoint_segments


Tng tm thi bin cu hnh checkpoint_segments cng c th lm cho d liu ln ti nhanh hn.
iu ny l v vic ti mt lng d liu ln vo PostgreSQL s lm cho cc im kim tra xy ra
thng xuyn hn so vi tn sut kim tra im thng thng (c bin checkpoint_timeout ch
nh). Bt k khi no mt im kim tra xy ra, tt c cc trang bn phi c phun ra a. Bng
vic tng tm thi checkpoint_segments trong qu trnh b d liu ti ln, s lng cc im kim
tra c yu cu c th s b gim i.

14.4.7. Nhn bn dng v lu tr WAL v hiu ha c


Khi ti lng ln cc d liu vo mt ci t m s dng nhn bn dng hoc lu tr WAL, c th
l nhanh hn thc hin mt sao lu c bn mi sau khi ti hon tt so vi x l mt
lng ln cc d liu WAL tng cht mt. ngn chn vic lu k WAL tng cht mt trong khi
ti, v hiu ha nhn bn dng v lu tr, bng vic thit lp wal_level v minimal, archive_mode
v off, v max_wal_senders v 0. Nhng hy lu rng vic thay i cc thit lp i hi mt
s khi ng li my ch.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 368/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Ngoi vic trnh thi gian cho lu tr hoc gi WAL x l cc d liu WAL, lm th ny cng s
thc s tin hnh cc lnh nht nh nhanh hn, v chng c thit k khng vit WAL hon
ton nu wal_level l minimal. (Chng c th m bo s mt an ton r hn bng vic thc hin mt
fsync cui hn l bng vic vit WAL). iu ny p dng cho cc lnh sau:

CREATE TABLE AS SELECT


CREATE INDEX (and variants such as ALTER TABLE ADD PRIMARY KEY)
ALTER TABLE SET TABLESPACE
CLUSTER

COPY FROM,

khi bng ch tng c to ra hoc ct bt trc trong cng giao dch y ht.

14.4.8. Chy ANALYZE sau


Bt k khi no bn ty bin ng k s phn phi d liu trong mt bng, th vic chy ANALYZE
c khuyn co mnh m. iu ny bao gm vic ti theo ng lng d liu ln vo bng .
Vic chy ANALYZE (hoc VACUUM ANALYZE) m bo rng trnh hoch nh c cc s liu cp nht
v bng . Nu khng c cc s liu thng k hoc chng li thi, th trnh hoch nh c th a
ra quyt nh ngho nn trong vic ln k hoch truy vn, dn ti hiu nng ngho nn trong bt k
bng no vi cc s liu thng k khng chnh xc hoc khng tn ti. Lu rng nu autovacuum
daemon c kch hot, th n c th chy ANALYZE mt cch t ng; xem Phn 23.1.3 v Phn
23.1.5 c thm thng tin.

14.4.9. Vi lu v pg_dump
Cc scripts cha b c pg_dump sinh ra t ng p dng mt vi, nu khng ni l tt c, cc
ch dn trn. ti li mt s v pg_dump nhanh nht c th, bn cn lm thm vi iu bng
tay. (Lu l cc im p dng khi phc hi mt v, khng phi khi to ra n. Cc im y
ht p dng hoc vic ti mt v vn bn vi psql hoc vic s dng pg_restore ti t mt tp
lu tr pg_dump).
Mc nh, pg_dump s dng COPY, v khi n ang sinh ra mt s v s v d liu, hy cn
thn ti d liu trc khi to ra cc ch s v cc kha ngoi. V th trong trng hp ny vi ch
dn c iu khin t ng. Nhng g cn li bn phi lm l:

Thit lp cc gi tr ph hp (nh, ln hn l bnh thng) cho


checkpoint_segments.

Nu vic s dng nhn bn dng hoc lu tr WAL, hy cn nhc vic v hiu ha chng
trong qu trnh phc hi. lm iu , hy thit lp archive_mode v off, wal_level v
minimal, v max_wal_senders v 0 trc khi ti s v . Sau , hy thit lp chng
ngc v cc gi tr ng v tin hnh sao lu c bn mi li.

Cn nhc liu ton b s v c nn c phc hi li nh mt giao dch duy nht hay


khng. lm iu , hy truyn la chn dng lnh -1 hoc --single-transaction ti psql
hoc pg_restore. Khi s dng ch ny, thm ch cc li nh nht s quay li phc hi

maintenance_work_mem

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 369/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

ton b, c kh nng hy b nhiu gi x l. Ph thuc vo cch d liu c lin quan ti


nhau nh th no, iu c th coi l c u tin lm sch bng tay, hay l khng.
Cc lnh COPY s chy nhanh nht nu bn s dng mt giao dch duy nht v c lu tr
WAL c tt.

Nu nhiu CPU l sn sng trong my ch c s d liu, hy cn nhc s dng la chn


--jobs ca pg_restore. iu ny cho php ti cc d liu hin hnh v to ch s.

Chy ANALYZE sau .

Mt s v ch d liu s vn s dng COPY, nhng n khng b hoc ti to li cc ch s, v n


thng khng ng chm ti cc kha ngoi2. V th khi ti mt v ch d liu, ty bn b v ti
to li cc ch s v cc kha ngoi nu bn mun s dng cc k thut . Vn l hu dng tng
checkpoint_segments trong khi ti cc d liu , nhng ng c bn tm ti vic gia tng
maintenance_work_mem; thay vo , bn nn lm th trong khi ti to bng tay cc ch s v cc
kha ngoi sau . V ng qun ANALYZE khi bn thc hin xong; xem Phn 23.1.3 v Phn 23.1.5
c thm thng tin.

14.5. Thit lp khng bn vng


Tnh bn vng l mt chc nng ca c s d liu m m bo vic ghi cc giao dch c thc
hin xong thm ch nu my ch hng hoc mt in. Tuy nhin, tnh bn vng b sung thm tng
chi ph ng k cho c s d liu, nn nu site ca bn khng i hi mt s m bo nh vy, th
PostgreSQL c th c thit lp cu hnh chy nhanh hn nhiu. Sau y l nhng thay i cu
hnh m bn c th lm ci thin hiu nng trong cc trng hp nh vy; chng khng v hiu
ha thc hin cc m bo c lin quan ti cc hng hc c s d liu, ch t ngt dng h iu
hnh, ngoi tr nh c nhc di:

t th mc d liu ca b c s d liu trong mt h thng tp c b nh h tr (nh


a RAM). iu ny loi b tt c I/O a c s d liu, nhng hn ch lu tr d liu v
lng b nh sn sng (v c th l hon i swap).

Tt fsync; khng c nhu cu phng d liu ra a.

Tt full_page_writes; khng c nhu cu canh phng chng ghi trang mt phn.

Gia tng checkpoint_segments v checkpoint_timeout; iu ny lm gim tn sut ca cc


im kim tra, nhng lm gia tng cc yu cu lu tr ca /pg_xlog.

Tt synchronous_commit; c th khng c nhu cu ghi WAL ln a trong mi ln thc hin


xong. iu ny nh hng ti bn giao dch khi hng c s d liu.

Bn c th c hiu ng v hiu ha cc kha ngoi bng vic s dng la chn --disable-triggers - nhng nhn thy
rng n loi tr, thay v ch tr hon, kim tra hp l kha ngoi, v v th c kh nng chn cc d liu xu nu bn
s dng n.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 370/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Tham kho th loi


Cc tham chiu c la chn c v SQL v PostgreSQL
Mt s sch trng v bo co k thut t i pht trin gc ban u POSTGRES l sn sng ti
webiste ca Phng Khoa hc My tnh, i hc California, Berkeley11.

Cc sch SQL tham kho


Judith Bowman, Sandra Emerson, and Marcy Darnovsky, The Practical SQL Handbook: Using SQL
Variants , Fourth Edition, Addison-Wesley Professional, ISBN 0-201-70309-2, 2001.
C. J. Date and Hugh Darwen, A Guide to the SQL Standard: A users guide to the standard database
language SQL , Fourth Edition, Addison-Wesley, ISBN 0-201-96426-0, 1997.
C. J. Date, An Introduction to Database Systems , Eighth Edition, Addison-Wesley, ISBN 0-32119784-4, 2003.
Ramez Elmasri and Shamkant Navathe, Fundamentals of Database Systems , Fourth Edition,
Addison-Wesley, ISBN 0-321-12226-7, 2003.
Jim Melton and Alan R. Simon, Understanding the New SQL: A complete guide , Morgan
Kaufmann, ISBN 1-55860-245-3, 1993.
Jeffrey D. Ullman, Principles of Database and Knowledge: Base Systems , Volume 1, Computer
Science Press, 1988.

Ti liu PostgreSQL c th
Stefan Simkovics, Enhancement of the ANSI SQL Implementation of PostgreSQL , Department of
Information Systems, Vienna University of Technology, November 29, 1998.
Discusses SQL history and syntax, and describes the addition of INTERSECT and EXCEPT
constructs into PostgreSQL. Prepared as a Masters Thesis with the support of O. Univ. Prof.
Dr. Georg Gottlob and Univ. Ass. Mag. Katrin Seyr at Vienna University of Technology.
A. Yu and J. Chen, The POSTGRES Group, The Postgres95 User Manual , University of California,
Sept. 5, 1995.
Zelaine Fong, The design and implementation of the POSTGRES query optimizer 12, University of
California, Berkeley, Computer Science Department.

11 http://db.cs.berkeley.edu/papers/
12 http://db.cs.berkeley.edu/papers/UCB-MS-zfong.pdf

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 371/372

Ti liu PostgreSQL 9.0.13 ca nhm pht trin ton cu PostgreSQL

Xut bn nm 2013

Cc k yu v bi bo
Nels Olson, Partial indexing in POSTGRES: research project , University of California, UCB Engin
T7.49.1993 O676, 1993.
L. Ong and J. Goh, A Unified Framework for Version Modeling Using Production Rules in a
Database System, ERL Technical Memorandum M90/33 , University of California, April,
1990.
L. Rowe and M. Stonebraker, The POSTGRES data model 3 , Proc. VLDB Conference, Sept.
1987.
P. Seshadri and A. Swami, Generalized Partial Indexes (cached version) 4 , Proc. Eleventh
International Conference on Data Engineering, 6-10 March 1995, IEEE Computer Society
Press, Cat. No.95CH35724, 1995, 420-7.
M. Stonebraker and L. Rowe, The design of POSTGRES 5 , Proc. ACM-SIGMOD Conference
on Management of Data, May 1986.
M. Stonebraker, E. Hanson, and C. H. Hong, The design of the POSTGRES rules system, Proc.
IEEE Conference on Data Engineering, Feb. 1987.
M. Stonebraker, The design of the POSTGRES storage system 6 , Proc. VLDB Conference, Sept.
1987.
M. Stonebraker, M. Hearst, and S. Potamianos, A commentary on the POSTGRES rules system 7
, SIGMOD Record 18(3) , Sept. 1989.
M. Stonebraker, The case for partial indexes 8 , SIGMOD Record 18(4) , Dec. 1989, 4-11.
M. Stonebraker, L. A. Rowe, and M. Hirohama, The implementation of POSTGRES 9 ,
Transactions on Knowledge and Data Engineering 2(1) , IEEE, March 1990.
M. Stonebraker, A. Jhingran, J. Goh, and S. Potamianos, On Rules, Procedures, Caching and
Views in Database Systems 10 , Proc. ACM-SIGMOD Conference on Management of
Data, June 1990.

Vn phng Phi hp Pht trin Mi trng Khoa hc v Cng ngh, B Khoa hc v Cng ngh

Trang 372/372

You might also like