You are on page 1of 19

PostgreSQL ve Sunduklar

PostgreSQL'de SQL Sorgulama Dili Devrim GNDZ - devrim@gunduz.org

PostgreSQL'de SQL Sorgulama Dili


Son Gncelleme: 08 Mart 2009 Perembe, 17:21

SQL Nedir?
SQL (Structured Query Language), bir veritaban dilidir. Program gelitiricileri ve Veritaban kullanclar, bir veritabanna veri eklerken, silerken, gncellerken veya sorgularken bu dili kullanrlar. Hem ANSI hem de ISO standard olmasna ramen, ou veritaban program standart dillere ekleme yaparak bu dili kullanmaktadrlar. Kitabn bu blmnde PostgreSQL'in SQL komutlarn inceleyeceiz.

CREATE
PostgreSQL' de nesneleri yaratmak iin CREATE anahtar szcn kullanabilirsiniz. Biz bu blmde temel ilemler olan veritaban ve tablo yaratmay inceleyeceiz. Role/group, fonksiyon, index, schema, sequence, tablespace ve trigger yaratmak ile ilgili szdizimlerini kitabn ilgili blmlerinde ayr ayr bulabilirsiniz. e veritaban yaratmakla balayalm:

CREATE DATABASE
Syntax: CREATE DATABASE name [ [ WITH ] [ OWNER [=] dbowner ] [ TEMPLATE [=] template ] [ ENCODING [=] encoding ] [ COLLATE [=] collate ] [ CTYPE [=] ctype ] [ TABLESPACE [=] tablespace ] [ CONNECTION LIMIT [=] connlimit ] ]

COLLATE ve CTYPE parametresi 8.4 ile gelen yeni bir zelliktir. Parametreleri inceleyelim: OWNER: Bu parametre ile veritabannn sahibini belirtebilirsiniz. Kullanc yaratma ile ilgili bilgileri kitabn Kullanc ve Yetkilendirme blmnde bulabilirsiniz. TEMPLATE: Bu parametre ile ablon olarak kullanlacak veritabann belirtebilirsiniz. ablon veritabanlar ile ilgili konuyu kitabmzn PostgreSQL Temelleri blmnde bulabilirsiniz. ENCODING: Veritabannn dil kodlamasn verir. COLLATE: Sralama (ORDER BY) ileminde kullanlacak dili belirtir. LC_COLLATE ayarn verir. CTYPE: LC_CTYPE ayarnn yaplmasn salar. Lower(), upper() vs ilemleri iin geerlidir.

TABLESPACE: Veritabannn yaratlaca tablespace'i belirtebilirsiniz. kitabmzn tablespaceler ile ilgili blmnde bulailirsiniz.

Ayrntl bilgiyi

CONNECTION LIMIT: Veritabanna yaplacak e zamanl balant saysn belirtir. imdi de tablo yaratmay renelim:

CREATE TABLE
PostgreSQL' de tablolar rnekleyelim: yaratmak iin CREATE TABLE komutunu kullanabilirsiniz.

pagila=# CREATE TABLE t1 ( c1 serial PRIMARY KEY, c2 varchar(10) ); NOTICE: CREATE TABLE will create implicit sequence "t1_c1_seq" for serial column "t1.c1" NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t1_pkey" for table "t1" CREATE TABLE PostgreSQL' de sadece oturum boyunca geerli olacak geici tablolar yaratabilirsiniz. Geici tablolar sadece o balant iin geerli olur. Dier balantlar, tabloyu yaratan balant ak olsa bile bu tabloyu gremezler. rnek: pagila=# CREATE TEMP CREATE TABLE TABLE t1 (c1 varchar(20)) ;

Tabloyu yaratrken bir kolona ntanml bir deer verebiliriz: [postgres@[local]:test]=# CREATE TABLE t1 (c1 varchar(20), c2 timestamp DEFAULT now()); CREATE TABLE [postgres@[local]:test]=# INSERT INTO t1 VALUES ('Gne Deniz',DEFAULT); INSERT 0 1 [postgres@[local]:test]=# SELECT * from t1; c1 | c2 -------------+---------------------------Gne Deniz | 2009-02-05 02:24:18.609536 (1 row) rnekte de grdmz gibi INSERT aamasnda DEFAULT anahtar szcn kullanrsanz o kolonun ntanml deeri satra girilir. CREATE TABLE komutuna verebileceiz bir parametre ile geici tablolarn davrann kontrol edebilirsiniz. ON COMMIT ile belirtebileceiz bu davran ile aadakileri yapabilirsiniz: PRESERVE ROWS: ntanml olan davrantr. Transaction commit edildikten sonra commit edilen deerlere birey yaplmaz. DELETE ROWS: Transaction commit edildikten sonra commit edilen satr(lar) silinir. DROP: Transaction commit edildikten sonra geici tablo kaldrlr.

rnekleyelim: pagila=# CREATE TEMP TABLE t1 (c1 varchar(20)) ON COMMIT DELETE ROWS; CREATE TABLE pagila=# BEGIN ; BEGIN pagila=# INSERT INTO t1 VALUES ('Gne Deniz'); INSERT 0 1 pagila=# SELECT * from t1; c1 ------------Gne Deniz (1 row) pagila=# commit; COMMIT pagila=# SELECT * from t1; c1 ---(0 rows) Bir de ON COMMIT DROP rnei verelim: pagila=# BEGIN ; BEGIN pagila=# CREATE TEMP TABLE t1 (c1 varchar(20)) ON COMMIT DROP; CREATE TABLE pagila=# INSERT INTO t1 VALUES ('Gne Deniz'); INSERT 0 1 pagila=# SELECT * from t1; c1 ------------Gne Deniz (1 row) pagila=# commit; COMMIT pagila=# SELECT * from t1; ERROR: relation "t1" does not exist LINE 1: SELECT * from t1; Constraint rnei de verelim: test=# CREATE test=# INSERT test=# ERROR: CREATE TABLE t1 (c1 int CHECK (c1 < 20)); TABLE INSERT INTO t1 VALUES (10); 0 1 INSERT INTO t1 VALUES (40); new row for relation "t1" violates check constraint "t1_c1_check"

DROP
CREATE ile yaratlan nesneler DROP ile kaldrlrlar. Szdizimleri genellikle ayndr.

ALTER
PostgreSQL' de birok nesne zerinde ALTER ile deiiklik yapabilirsiniz. Bu blmde veritaban ve tablolar iin ALTER kullanmndan bahsedeceiz. Kalan ksmlar kitabn ilgili blmlerinde ayr ayr anlattm. ncelikle ALTER DATABASE ile balayalm: Syntax: ALTER DATABASE name [ [ WITH ] option [ ... ] ] where option can be: CONNECTION LIMIT connlimit ALTER DATABASE name RENAME TO newname ALTER DATABASE name OWNER TO new_owner ALTER DATABASE name SET TABLESPACE new_tablespace ALTER DATABASE name SET configuration_parameter { TO | = DEFAULT } ALTER DATABASE name SET configuration_parameter FROM CURRENT ALTER DATABASE name RESET configuration_parameter ALTER DATABASE name RESET ALL

value

rneklendirelim. Bir veritaban iin restart gerektirmeyen ayarlar veritabanna zel olarak belirleyebiliriz: pagila=# ALTER DATABASE pagila SET work_mem to 2048; ALTER DATABASE pagila=# SELECT datconfig from pg_database WHERE datname='pagila'; datconfig ----------------{work_mem=2048} (1 row) SET ile ayarladnz yaplandrma ayarlarn RESET ile orijinal haline getirebilirsiniz: pagila=# ALTER DATABASE pagila RESET work_mem ; ALTER DATABASE pagila=# SELECT datconfig from pg_database WHERE datname='pagila'; datconfig ----------(1 row)

test=# ALTER DATABASE pagila RENAME TO pagila2; ALTER DATABASE

Tablo tanmlarn deitirmek iinse ALTER TABLE kullanlr. nce tam szdizimini grelim: Syntax: ALTER TABLE [ ONLY ] name [ * ] action [, ... ] ALTER TABLE [ ONLY ] name [ * ] RENAME [ COLUMN ] column TO new_column ALTER TABLE name RENAME TO new_name ALTER TABLE name SET SCHEMA new_schema where action is one of: ADD [ COLUMN ] column type [ column_constraint [ ... ] ] DROP [ COLUMN ] column [ RESTRICT | CASCADE ] ALTER [ COLUMN ] column [ SET DATA ] TYPE type [ USING expression ] ALTER [ COLUMN ] column SET DEFAULT expression ALTER [ COLUMN ] column DROP DEFAULT ALTER [ COLUMN ] column { SET | DROP } NOT NULL ALTER [ COLUMN ] column SET STATISTICS integer ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ADD table_constraint DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ] DISABLE TRIGGER [ trigger_name | ALL | USER ] ENABLE TRIGGER [ trigger_name | ALL | USER ] ENABLE REPLICA TRIGGER trigger_name ENABLE ALWAYS TRIGGER trigger_name DISABLE RULE rewrite_rule_name ENABLE RULE rewrite_rule_name ENABLE REPLICA RULE rewrite_rule_name ENABLE ALWAYS RULE rewrite_rule_name CLUSTER ON index_name SET WITHOUT CLUSTER SET WITHOUT OIDS SET ( storage_parameter = value [, ... ] ) RESET ( storage_parameter [, ... ] ) INHERIT parent_table NO INHERIT parent_table OWNER TO new_owner SET TABLESPACE new_tablespace rnek olarak, bir tabloya kolon eklemeyi ve karmay grelim: pagila=# ALTER TABLE staff ADD phone_number char(10); ALTER TABLE pagila=# ALTER TABLE staff DROP phone_number ; ALTER TABLE imdi de tabloya constraint eklemeyi ve tablodan constraint kaldrmay grelim: pagila=# ALTER TABLE staff ADD CONSTRAINT store_id_check CHECK (store_id > 0 AND store_id < 10); ALTER TABLE pagila=# ALTER TABLE staff DROP CONSTRAINT store_id_check; ALTER TABLE

SELECT
PostgreSQL, dier tm SQL tabanl veritabanlar gibi, satrlar ekmek iin SELECT ifadesini kullanr. Aada basit bir SELECT tmcesini grebilirsiniz: pagila=# SELECT * from staff; -[ RECORD 1 ]----------------------------------------staff_id | 1 first_name | Mike last_name | Hillyer address_id | 3 email | Mike.Hillyer@sakilastaff.com store_id | 1 active | t username | Mike password | 8cb2237d0679ca88db6464eac60da96345513964 last_update | 2006-05-16 16:13:11.79328 picture | \211PNG\015\012Z\012 -[ RECORD 2 ]----------------------------------------staff_id | 2 first_name | Jon last_name | Stephens address_id | 4 email | Jon.Stephens@sakilastaff.com store_id | 2 active | t username | Jon password | 8cb2237d0679ca88db6464eac60da96345513964 last_update | 2006-05-16 16:13:11.79328 picture |

Basit WHERE sorgular


Belirli operatrler kullanarak sorgu sonu kmesini daraltabilirsiniz: pagila=# SELECT * from staff WHERE staff_id < 2; -[ RECORD 1 ]----------------------------------------staff_id | 1 first_name | Mike last_name | Hillyer address_id | 3 email | Mike.Hillyer@sakilastaff.com store_id | 1 active | t username | Mike password | 8cb2237d0679ca88db6464eac60da96345513964 last_update | 2006-05-16 16:13:11.79328 picture | \211PNG\015\012Z\012 Bu tr ilemler iin PostgreSQL standart matematiksel operatrleri kullanr: > < >= <= <> (!=) + - / PUCU: staff_id < 2'nin trnak iinde olmadna tiplerinin trnak iine alnmasna gerek yoktur. dikkat edin. Tamsay

Belirli deerlerin arasn semek


Bunun iin de BETWEEN szc kullanlr. rnekleyelim: pagila=# SELECT * FROM language WHERE language_id BETWEEN 2 AND 5; language_id | name | last_update -------------+----------------------+--------------------2 | Italian | 2006-02-15 10:02:19 3 | Japanese | 2006-02-15 10:02:19 4 | Mandarin | 2006-02-15 10:02:19 5 | French | 2006-02-15 10:02:19 (4 rows) rnekte de grld gibi BETWEEN ile belirtilen deerler de sorgu sonucunda gsterilir. Bu sorguyu WHERE language_id >= 2 AND language_id <= 5; eklinde de yazabilirsiniz. Benzer ekilde baka bir aralk sorgusunu da u ekilde yazabilirsiniz: pagila=# SELECT * FROM language WHERE language_id > 2 AND language_id <= 5; language_id | name | last_update -------------+----------------------+--------------------3 | Japanese | 2006-02-15 10:02:19 4 | Mandarin | 2006-02-15 10:02:19 5 | French | 2006-02-15 10:02:19 (3 rows)

Benzerli arama yapmak: LIKE / ILIKE ve regexp kullanmak


PostgreSQL'de benzerli arama yapmak istediinizde LIKE ya da ILIKE kullanabilirsiniz. Benzer ekilde dzenli ifadeler (regular expressions) kullanmak iinse ~ ve ~* kullanabilirsiniz. Yine bir rnekle balayalm ve y ile balayan filmleri sorgulayalm: pagila=# SELECT film_id,language_id FROM film WHERE title ~ '^y'; film_id | language_id ---------+------------(0 rows) ...oysa Y ile balayan film vard. Peki buradaki sorun nedir? LIKE sorgusu byk/kk harfe duyarldr. Film adlar byk harfle balad iin kk harfle yaptmz sorgu bize bir sonu dndrmedi. imdi bu sorguyu ILIKE ile yazalm. ILIKE (Incasesensitive LIKE) sorgusu, byk kk harfe bakmazszn yant dndrr: pagila=# SELECT film_id,language_id FROM film WHERE title ~* '^y'; film_id | language_id ---------+------------995 | 1 996 | 1 997 | 1 (3 rows) LIKE sorgularna birka rnek daha verelim. LIKE ile yazdmz aadaki sorguda y ile balayan ve sonrasnda da snrsz karakter benzerlii olacak filmleri sorgulayalm (% ile):

pagila=# SELECT film_id,language_id FROM film WHERE title ILIKE 'y%'; film_id | language_id ---------+------------995 | 1 996 | 1 997 | 1 (3 rows) imdi de, iinde ay geen filmleri sorgulayalm: pagila=# SELECT film_id,language_id FROM film WHERE title ILIKE '%ay%'; film_id | language_id ---------+------------65 | 1 68 | 1 216 | 1 218 | 1 226 | 1 336 | 1 421 | 1 484 | 1 642 | 1 666 | 1 751 | 1 764 | 1 934 | 1 (13 rows)

JOINLER
temel JOIN tipi vardr: Cross Joinler: ki veri kmesi arasnda Cartesian arpm yapar (apraz arpm da denir). Buna arpm denmesinin nedeni kmeler arasnda bir iliki kurmamasdr. Onun yerine join edilen kmelerin olas her kombinasyonu kaynaklarn birbiri ile arplmas ile bulunarak gsterilir. Inner Joinler: Join edilen kaytlar arasnda belirtilen bir kritere gre iki veri kmesi arasnda Cartesian arpmnn bir alt kmesini yaratr. Belirtilen kriterler satrn join edilen kme iinde olup olmayacan belirten bir boolean deer dndrmelidir. Outer joinler: Inner joinlere benzerdir (iki kme arasnda belirtilen kritere gre veriyi belirler), ama belirtilen kmedeki her satrdan en az bir rnei dndrr. Bu ya bir sol kmedir (JOIN anahtar szcnn solundaki veri kayna), sa kme ( JOIN anahtar szcnn sandaki veri kayna) ya da tm kmeler olabilir -- bu da verilen outer join eidine bal olarak deiir. Satrn bo tarafnda join kriterine uymayan eksik koln deerleri NULL deer olarak dndrlrler.

Basit ya da Doal Joinler


stte WHERE ile veri semeyi renmitir. imdi de aralarnda bir iliki olan birden fazla tablodan veri seelim. rnek olarak yine pagila veritabann kullanacaz: pagila=# SELECT city_id, city FROM city JOIN country ON (city.country_id = country.country_id) WHERE country.country_id = 97 ; city_id | city ---------+------------5 | Adana 50 | Balikesir 58 | Batman 142 | Denizli 163 | Eskisehir 180 | Gaziantep 222 | Inegl 266 | Kilis 281 | Ktahya 384 | Osmaniye 482 | Sivas 504 | Sultanbeyli 529 | Tarsus 538 | Tokat 557 | Usak (15 rows)

LEFT JOIN/RIGHT JOIN Sorgular


Bir LEFT/RIGHT JOIN sorgusu NATURAL JOIN' e benzerdir (ikisi de iki ilikiyi bir nitelendiriciye (qualifier) bal olarak birletirir (x.id = y.id gibi). Ancak LEFT/RIGHT JOIN kullanm nitelendiricinini bir tarafna ncelik verecektir. kinci olarak LEFT/RIGHT JOIN, LEFT OUTER JOIN ve RIGHT OUTER JOIN sorgularna bir ksayoldur. Bir rnek verelim. Burada ehiri olan lkelerin listesini buluyoruz:

pagila=# SELECT city_id,city,city.last_update (country.country_id = city.country_id); city_id | city |

FROM

city

JOIN

country

ON

last_update

---------+----------------------------+--------------------1 | A Corua (La Corua) 2 | Abha 3 | Abu Dhabi 4 | Acua 5 | Adana 6 | Addis Abeba ... | 2006-02-15 09:45:25 | 2006-02-15 09:45:25 | 2006-02-15 09:45:25 | 2006-02-15 09:45:25 | 2006-02-15 09:45:25 | 2006-02-15 09:45:25

Aadaki LEFT greceksiniz:

JOIN sorgusunu altrdnzda ktnn sttekinden farkl olacan

pagila=# SELECT title,rating FROM inventory LEFT JOIN rental USING (inventory_id) LEFT JOIN film ON (inventory.film_id = film.film_id) WHERE rental.return_date IS NULL; Bir rnek daha verelim: SELECT title,rating FROM inventory LEFT JOIN rental USING (inventory_id) LEFT JOIN film ON (inventory.film_id = film.film_id) WHERE rental.return_date IS NULL;

ktlar sralamak
PostgreSQL' de ktlar sralamak iin bir SQL standart szc olan ORDER BY kullanlr. Kullanm basittir:

pagila=# SELECT first_name, last_name FROM staff ORDER BY first_name; first_name | last_name ------------+----------Jon Mike | Stephens | Hillyer

ktlar gruplamak
PostgreSQL' de ktlar gruplamak iin GROUP BY kullanlr:

pagila=# SELECT staff_id from rental GROUP BY staff_id; staff_id ---------1 2 (2 rows)

Aggregate fonksiyonlar
Aggregate fonksiyonlar verilerinizin tiplerini renmek iin kullanabilirsiniz. Aadaki rnekte 1. elemann ka ev kiraladn bulabilirsiniz:

pagila=# SELECT count(*) FROM rental WHERE staff_id = 1; count ------8040 (1 row) Bunu GROUP BY ile eitlendirelim:

pagila=# SELECT count(staff_id),staff_id FROM rental GROUP BY staff_id; count | staff_id -------+---------8040 | 8004 | (2 rows) 1 2

Sonular grsel olarak deitirmek


Kolonlarn ktdaki adlarn deitirmek mmkndr. Bunun iin AS anahtar szcn kullanacaz: pagila=# SELECT count(staff_id) AS "toplam sat",staff_id AS "satc no" FROM rental GROUP BY staff_id; toplam sat | satc no --------------+-----------8040 | 8004 | (2 rows) 1 2

View kavram
Viewlar saklanm sorgular olarak adlandrlabilirler. Birok ama iin kullanlabilirler. rnein normalize edilmemi veri kmesi zerine tanmlanacak bir view ile JOINleri ve WHERE szcklerini dzgn kullanp sanal bir normalizasyon yapabilirsiniz. Aada pagila veritabannda film listesini veren viewu grebilirsiniz: SELECT film.film_id AS fid, film.title, film.description, category.name AS category, film.rental_rate AS price, film.length, film .rating, group_concat((((actor.first_name)::text || ' '::text) || (actor.last_name)::text)) AS actors FROM ((((category LEFT JOIN film_category ON ((category.category_ id = film_category.category_id))) LEFT JOIN film ON ((film_category.film_id = film.film_id))) JOIN film_actor ON ((film.film_id = film_actor.film_id))) JOIN actor ON ( (film_actor.actor_id = actor.actor_id))) GROUP BY film.film_id, film.title, film.description, category.name, film.rental_rate, film.length, film.rating; Viewlar SELECT ifadeleri iin bir tablo gibi davranrlar -- yani viewlar zerinde dier tablolar gibi JOIN ve WHERE kullanabilirsiniz. Ancak tablolardan farkl olarak viewlar indexlenmezler. Index gereksinmeniz varsa bunlar VIEW iindeki tablolarda yaratmalsnz.

Subselect / Subquery kavram


PostgreSQL' de subquery kullanarak sorgularnza esneklik kazandrabilirsiniz. Subquerylere subselect de denir -- bunun nedeni bir baka SQL tmcesinde SELECT ifadelerinin kullanlabilmesidir. Subselectler genelde atomik bir deer olarak tek satr dndrler -- IN anahtar szc ile kullanldklarnda oklu satrlarn deerlerini karlatrmak iin de kullanlabilirler. rnekleyelim:

pagila=# SELECT name FROM language WHERE language_id = (SELECT language_id FROM film WHERE film_id = 3); name ---------------------English (1 row)

Bir rnek daha verelim: pagila=# SELECT first_name,last_name FROM customer WHERE customer_id IN (SELECT distinct(customer_id) FROM rental);

Subselect yerine Join kullanmak

Subselectleri JOIN ile de yazabilirsiniz:

pagila=# SELECT distinct(first_name,last_name) FROM customer JOIN rental ON (rental.customer_id = customer.customer_id); Peki neden JOIN alternatifini anlattm? Subselectleri okumak ve yazmak kolaydr; ancak zellikle veriler bydke subselectler JOIN lere gre her zaman daha yavatr.

UPDATE
Bir UPDATE sorgusu bir tablodaki veriyi belirtilen yeni deerle deitirir. PUCU: UPDATE ilemlerinizi her zaman ekilde veri kaybnn nne geersiniz. rnek verelim: yapn.

bir

transaction

iinde

Bu

pagila=# BEGIN ; BEGIN pagila=# SELECT name from language WHERE language_id = 3; name ---------------------Japanese (1 row)

pagila=# UPDATE language SET name = 'Trke' WHERE language_id = 3; UPDATE 1 pagila=# SELECT name from language WHERE language_id = 3; name ---------------------Trke (1 row)

pagila=# commit; COMMIT

psql' de UPDATE iin \h ile yardm alalm:

Command:

UPDATE

Description: update rows of a table Syntax: UPDATE [ ONLY ] table [ [ AS ] alias ] SET { column = { expression | DEFAULT } | ( column [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...] [ FROM fromlist ] [ WHERE condition | WHERE CURRENT OF cursor_name ] [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ] Yani aslnda UPDATE kullanm daha genitir. rnek verelim:

[postgres@[local]:pagila2]=# UPDATE language_id = 3 RETURNING name; name ---------------------Japanese (1 row)

language

SET

name

'Japanese'

WHERE

UPDATE 1

DELETE
DELETE ile bir tablodan satr ya da satrlar silebilirsiniz. Yine psql' den yardm alalm:

pagila=# \h DELETE Command: DELETE

Description: delete rows of a table Syntax: DELETE FROM [ ONLY ] table [ [ AS ] alias ] [ USING usinglist ] [ WHERE condition | WHERE CURRENT OF cursor_name ] [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

PUCU: DELETE ilemlerinizi de UPDATE ilemleriniz gibi her zaman transaction iinde yapn. Bu ekilde veri kaybnn nne geersiniz. Giri seviyesinde bir DELETE tmcesi yazalm:

bir

[postgres@[local]:pagila2]=# DELETE FROM payment; DELETE 16049 Grdnz gibi, dz bir DELETE tmcesi ile tablodaki tm kaytlar silinir. Ancak bu aamada bir sonraki TRUNCATE maddesini okumanz neriyorum. imdi DELETE sorgusuna koul verelim:

pagila=# DELETE FROM payment WHERE payment_date < '2007-04-01'; DELETE 9113 Grdnz gibi sttekinden daha az sayda satr silindi. RETURNING kullanarak silinen satrlar ile ilgili istediimiz bilgileri alabiliriz:

pagila=# DELETE FROM payment WHERE payment_date < '2007-05-01' RETURNING payment_id; DELETE sildii her bir satr l olarak iaretler; dolaysyla DELETE ileminin arkasndan VACUUM altrmak gereklidir. VACUUM ile ilgili bilgileri kitabmzn ilgili blmnde bulabilirsiniz.

TRUNCATE
Hazr DELETE szcnden bahsetmiken, TRUNCATE' den de bahsetmek gerekli. TRUNCATE tablo ya da tablolardaki tm satrlar siler. DELETE ileminden farkl olarak tabloyu taramad iin ok daha hzldr. Ayrca, yine DELETE ileminden farkl olarak sildii satrlar l olarak iaretlemeden dorudan iletim sistemine verdii iin VACUUM ilemine gerek kalmaz. ncelikle yine kullanmn grelim: Syntax: TRUNCATE [ TABLE ] name [, ... ] [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ] IDENTITY ile ilgili blmler PostgreSQL 8.4 ile gelen zelliktir; eski srmlerde yoktur. TRUNCATE komutu, zerinde alt tabloda ACCESS EXCLUSIVE lock alr. Bu konuda dikkatli olmak gereklidir. Bir dier konu da bu ilemin ON DELETE triggerlar yerine ON TRUNCATE triggerlarn altracak olmasdr. 8.4 ile gelen RESTART/CONTINUE IDENTITY ise TRUNCATE ileminden sonra tabloda (eer

varsa) sequence'larn batan balatlp balatlmayacan belirtir. ntanml deer batan balatlmamasdr (CONTINUE IDENTITY). RESTART IDENTITY ile ilgili bir rnek verelim: [postgres@[local]:test]=# CREATE TEMP TABLE truncatetest (id serial); NOTICE: CREATE TABLE will create implicit sequence "truncatetest_id_seq" for serial column "truncatetest.id" CREATE TABLE [postgres@[local]:test]=# INSERT INTO truncatetest VALUES (DEFAULT), (DEFAULT),(DEFAULT); INSERT 0 3 [postgres@[local]:test]=# SELECT * from truncatetest; id ---1 2 3 (3 rows) [postgres@[local]:test]=# TRUNCATE truncatetest RESTART IDENTITY; TRUNCATE TABLE [postgres@[local]:test]=# INSERT INTO truncatetest VALUES (DEFAULT); INSERT 0 1 [postgres@[local]:test]=# SELECT * from truncatetest; id ---1 (1 row) Eer CONTINUE IDENTITY kullansaydk, durum tabii ki farkl olacakt: [postgres@[local]:test]=# TRUNCATE truncatetest CONTINUE IDENTITY; TRUNCATE TABLE [postgres@[local]:test]=# INSERT INTO truncatetest VALUES (DEFAULT); INSERT 0 1 [postgres@[local]:test]=# SELECT * from truncatetest; id ---4 (1 row)

SET
PostgreSQL'de baz parametreleri alma annda deitirmek olasdr. SET -- change a run-time parameter

Synopsis
SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT } SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT }

Description
The SET command changes run-time configuration parameters. Many of the run-time

parameters listed in Chapter 18 can be changed on-the-fly with SET. (But some require superuser privileges to change, and others cannot be changed after server or session start.) SET only affects the value used by the current session. If SET (or equivalently SET SESSION) is issued within a transaction that is later aborted, the effects of the SET command disappear when the transaction is rolled back. Once the surrounding transaction is committed, the effects will persist until the end of the session, unless overridden by another SET. The effects of SET LOCAL last only till the end of the current transaction, whether committed or not. A special case is SET followed by SET LOCAL within a single transaction: the SET LOCAL value will be seen until the end of the transaction, but afterwards (if the transaction is committed) the SET value will take effect. The effects of SET or SET LOCAL are also canceled by rolling back to a savepoint that is earlier than the command. If SET LOCAL is used within a function that has a SET option for the same variable (see CREATE FUNCTION), the effects of the SET LOCAL command disappear at function exit; that is, the value in effect when the function was called is restored anyway. This allows SET LOCAL to be used for dynamic or repeated changes of a parameter within a function, while still having the convenience of using the SET option to save and restore the caller's value. However, a regular SET command overrides any surrounding function's SET option; its effects will persist unless rolled back.

Note:InPostgreSQLversions8.0through8.2,theeffectsofaSET LOCALwouldbe canceledbyreleasinganearliersavepoint,orbysuccessfulexitfromaPL/pgSQL exceptionblock.Thisbehaviorhasbeenchangedbecauseitwasdeemedunintuitive.

Parameters
SESSION Specifiesthatthecommandtakeseffectforthecurrentsession.(Thisisthedefaultifneither SESSIONnorLOCALappears.) LOCAL Specifiesthatthecommandtakeseffectforonlythecurrenttransaction.AfterCOMMITor ROLLBACK,thesessionlevelsettingtakeseffectagain.NotethatSET LOCALwillappearto havenoeffectifitisexecutedoutsideaBEGINblock,sincethetransactionwillend immediately. configuration_parameter Nameofasettableruntimeparameter.AvailableparametersaredocumentedinChapter18and below. value Newvalueofparameter.Valuescanbespecifiedasstringconstants,identifiers,numbers,or commaseparatedlistsofthese,asappropriatefortheparticularparameter.DEFAULTcanbe writtentospecifyresettingtheparametertoitsdefaultvalue(thatis,whatevervalueitwould

havehadifnoSEThadbeenexecutedinthecurrentsession).
Besides the configuration parameters documented in Chapter 18, there are a few that can only be adjusted using the SET command or that have a special syntax:

NAMES SET NAMES valueisanaliasforSET client_encoding TO value. SEED Setstheinternalseedfortherandomnumbergenerator(thefunctionrandom).Allowedvalues arefloatingpointnumbersbetween0and1,whicharethenmultipliedby2311. Theseedcanalsobesetbyinvokingthefunctionsetseed:
SELECT setseed(value);

TIME ZONE SET TIME ZONE valueisanaliasforSET timezone TO value.ThesyntaxSET TIME ZONEallowsspecialsyntaxforthetimezonespecification.Hereareexamplesofvalid values: 'PST8PDT' ThetimezoneforBerkeley,California. 'Europe/Rome' ThetimezoneforItaly. -7 Thetimezone7hourswestfromUTC(equivalenttoPDT).Positivevaluesareeastfrom UTC. INTERVAL '-08:00' HOUR TO MINUTE Thetimezone8hourswestfromUTC(equivalenttoPST). LOCAL DEFAULT Setthetimezonetoyourlocaltimezone(thatis,theserver'sdefaultvalueoftimezone; ifthishasnotbeenexplicitlysetanywhere,itwillbethezonethattheserver'soperating systemdefaultsto). SeeSection8.5.3formoreinformationabouttimezones.

Notes
The function set_config provides equivalent functionality; see Section 9.23. Also, it is possible to UPDATE the pg_settings system view to perform the equivalent of SET.

Examples
Set the schema search path: SET search_path TO my_schema, public; Set the style of date to traditional POSTGRES with "day before month" input convention: SET datestyle TO postgres, dmy; Set the time zone for Berkeley, California: SET TIME ZONE 'PST8PDT'; Set the time zone for Italy: SET TIME ZONE 'Europe/Rome';

Compatibility
SET TIME ZONE extends syntax defined in the SQL standard. The standard allows only numeric time zone offsets while PostgreSQL allows more flexible time-zone specifications. All other SET features are PostgreSQL extensions.

You might also like