BSM211 Veritabanı Yönetim Sistemleri - Celal ÇEKEN, İsmail ÖZTEL, Veysel Harun ŞAHİN
Temel SQL (SQL DDL Komutları; CREATE, ALTER, DROP, ADD, SET, CONSTRAINTS)
Konular
Nesne oluşturma, silme, düzenleme
SQL Kısıtları (CONSTRAINTS)
Nesne oluşturma, silme, düzenleme
CREATE
Nesne (veritabanı, şema, tablo, view, fonksiyon vb.) oluşturmak için kullanılır
CREATE DATABASE
Veritabanı oluşturmak için kullanılır.
Copy CREATE DATABASE "AlisVerisUygulamasi"
ENCODING='UTF-8'
LC_COLLATE='tr_TR.UTF-8'-- Bu özellik sonradan değiştirilemez (sıralama (karşılaştırma) işlemleri için)
LC_CTYPE='tr_TR.UTF-8' -- Bu özellik sonradan değiştirilemez (büyük küçük harf dönüşümü, bir veri harf mi? vb.)
OWNER postgres
TEMPLATE=template0;
Windows işletim sistemi için
Copy CREATE DATABASE "AlisVerisUygulamasi"
ENCODING='UTF-8'
LC_COLLATE='Turkish_Turkey.1254'
LC_CTYPE='Turkish_Turkey.1254'
OWNER postgres
TEMPLATE=template0;
CREATE SCHEMA
Veritabanını mantıksal olarak bölümlere ayırmak için kullanılır.
Sabit disklerdeki klasör yapısına benzetilebilir. Bu sayede veritabanı daha kolay yönetilir. Çok sayıda kişinin aynı projede çalışabilmesi (isim uzayı) ve güvenlik kolaylaşır.
Copy CREATE SCHEMA "sema1";
CREATE TABLE
Tablo oluşturmak için kullanılır.
Tablo oluşturulurken sütunlarının veri tipi bildirilir.
PostgreSQL'deki veri tiplerine aşağıdaki sayfadan erişilebilir.
Sütunlar için uygun veri tipinin seçilmesi önemlidir. Bu yapıldığı takdirde;
Hız artar, kaynaklar etkin kullanılır.
Veriler tutarlı olarak saklanır (doğrulama).
Bazı saldırılara karşı önlem alınmış olur.
Copy CREATE TABLE "sema1"."Urunler" (
"urunNo" SERIAL,
"kodu" CHAR(6) NOT NULL,
"adi" VARCHAR(40) NOT NULL,
"uretimTarihi" DATE DEFAULT '2019-01-01',
"birimFiyati" MONEY,
"miktari" SMALLINT DEFAULT 0,
CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
);
DROP TABLE
Copy DROP TABLE "sema1"."Urunler";
DROP SCHEMA
DROP DATABASE
Copy DROP DATABASE "AlisVerisUygulamasi";
TRUNCATE TABLE
Bir tablonun içindeki tüm verileri silmek için kullanılır. Yapısal bir komuttur. Veriler gerçek anlamda silinir ve böylece işgal edilen yer sistem tarafından kullanılabilir hale gelir (Vacuum).
Copy CREATE TABLE "Urunler" (
"urunNo" SERIAL,
"kodu" CHAR(6) NOT NULL,
"adi" VARCHAR(40) NOT NULL,
"uretimTarihi" DATE DEFAULT '2019-01-01',
"birimFiyati" MONEY,
"miktari" SMALLINT DEFAULT 0,
CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
);
Copy INSERT INTO "Urunler"
("kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
VALUES
('ELO001', 'TV', 1300, '2019-10-30', 5);
INSERT INTO "Urunler"
("kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
VALUES
('ELO002', 'TV', 1300, '2019-10-30', 5);
Copy TRUNCATE TABLE "Urunler";
ALTER TABLE
Tablonun yapısını düzenlemek için kullanılır.
Copy CREATE TABLE "Urunler" (
"urunNo" SERIAL,
"kodu" CHAR(6) NOT NULL,
"adi" VARCHAR(40) NOT NULL,
"uretimTarihi" DATE DEFAULT '2019-01-01',
"birimFiyati" MONEY,
"miktari" SMALLINT DEFAULT 0,
CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
);
Copy ALTER TABLE "Urunler" ADD COLUMN "uretimYeri" VARCHAR(30);
Copy ALTER TABLE "Urunler" DROP COLUMN "uretimYeri";
Copy ALTER TABLE "Urunler" ADD "uretimYeri" VARCHAR(30);
Copy ALTER TABLE "Urunler" ALTER COLUMN "uretimYeri" TYPE CHAR(20);
SEQUENCE Nesnesi ve Değeri Otomatik Olarak Artan Alanlar
Otomatik artım örneği - SERIAL kullanımı.
Copy CREATE TABLE "Urunler" (
"urunNo" SERIAL,
"kodu" CHAR(6) NOT NULL,
"adi" VARCHAR(40) NOT NULL,
"uretimTarihi" DATE DEFAULT '2019-01-01',
"birimFiyati" MONEY,
"miktari" SMALLINT DEFAULT 0,
CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
);
Copy INSERT INTO "Urunler"
("kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
VALUES
('ELO004', 'TV', 1300, '2019-10-30', 5);
Otomatik artım örneği - SEQUENCE Kullanımı 1
Copy CREATE TABLE "Urunler" (
"urunNo" INTEGER,
"kodu" CHAR(6) NOT NULL,
"adi" VARCHAR(40) NOT NULL,
"uretimTarihi" DATE DEFAULT '2019-01-01',
"birimFiyati" MONEY,
"miktari" SMALLINT DEFAULT 0,
CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
);
Copy CREATE SEQUENCE "sayac";
Copy ALTER SEQUENCE "sayac" OWNED BY "Urunler"."urunNo";
Copy INSERT INTO "Urunler"
("urunNo", "kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
VALUES
(NEXTVAL('"public"."sayac"'), 'ELO004', 'TV', 1300, '2019-10-30', 5);
SEQUENCE nesnesinin bir sonraki değerini NEXTVAL kullanarak elde edebiliriz.
SEQUENCE işleme fonksiyonlarını aşağıdaki bağlantıdan öğrenebiliriz.
Copy SELECT NEXTVAL('sayac');
Copy SELECT CURRVAL('sayac');
Otomatik artım örneği - SEQUENCE Kullanımı 2
Tablo oluşturulurken de SEQUENCE kullanabiliriz.
Copy CREATE SEQUENCE "sayac";
Copy CREATE TABLE "Urunler" (
"urunNo" INTEGER DEFAULT NEXTVAL('sayac'),
"kodu" CHAR(6) NOT NULL,
"adi" VARCHAR(40) NOT NULL,
"uretimTarihi" DATE DEFAULT '2019-01-01',
"birimFiyati" MONEY,
"miktari" SMALLINT DEFAULT 0,
CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
);
Copy INSERT INTO "Urunler"
("urunNo", "kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
VALUES
(NEXTVAL('sayac'), 'ELO004', 'TV', 1300, '2019-10-30', 5);
Copy INSERT INTO "Urunler"
("kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
VALUES
('ELO004', 'TV', 1300, '2019-10-30', 5);
SQL Kısıtları (CONSTRAINTS)
Veri bütünlüğünün korunmasına yardımcı olur.
NOT NULL
Tanımlandığı alan boş olamaz. Veri girilmek zorundadır.
Copy CREATE TABLE "Urunler" (
"urunNo" SERIAL,
"kodu" CHAR(6) NOT NULL,
"adi" VARCHAR(40) NOT NULL,
"uretimTarihi" DATE DEFAULT '2019-01-01',
"birimFiyati" MONEY,
"miktari" SMALLINT DEFAULT 0,
CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
);
"kodu" alanına veri girilmediği zaman hata alırız.
Copy INSERT INTO "Urunler"
("adi", "birimFiyati", "uretimTarihi", "miktari")
VALUES
('TV', 1300, '2019-10-30', 5);
Copy ALTER TABLE "Urunler" ALTER COLUMN "kodu" DROP NOT NULL;
Copy ALTER TABLE "Urunler" ALTER "kodu" SET NOT NULL;
DEFAULT
Tanımlandığı alana değer girilmemesi durumunda varsayılan bir değerin atanmasını sağlar.
Copy CREATE TABLE "Urunler" (
"urunNo" SERIAL,
"kodu" CHAR(6) NOT NULL,
"adi" VARCHAR(40) NOT NULL,
"uretimTarihi" DATE DEFAULT '2019-01-01',
"birimFiyati" MONEY,
"miktari" SMALLINT DEFAULT 0,
CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
);
Copy INSERT INTO "Urunler"
("kodu", "adi", "birimFiyati", "miktari")
VALUES
('ELO004', 'TV', 1300, 5);
Copy ALTER TABLE "Urunler" ALTER "uretimTarihi" DROP DEFAULT;
Copy ALTER TABLE "Urunler" ALTER COLUMN "uretimTarihi" SET DEFAULT '2019-01-01';
UNIQUE
Tanımlandığı alandaki verilerin eşsiz (tekil, benzersiz) olmasını sağlar.
Copy CREATE TABLE "Urunler" (
"urunNo" SERIAL,
"kodu" CHAR(6) NOT NULL,
"adi" VARCHAR(40) NOT NULL,
"uretimTarihi" DATE DEFAULT '2019-01-01',
"birimFiyati" MONEY,
"miktari" SMALLINT DEFAULT 0,
CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
);
Copy ALTER TABLE "Urunler" DROP CONSTRAINT "urunlerUnique";
Copy ALTER TABLE "Urunler" ADD CONSTRAINT "urunlerUnique" UNIQUE ("kodu");
Copy CREATE TABLE "Urunler" (
"urunNo" SERIAL,
"kodu" CHAR(6) NOT NULL,
"adi" VARCHAR(40) NOT NULL,
"uretimTarihi" DATE DEFAULT '2019-01-01',
"birimFiyati" MONEY,
"miktari" SMALLINT DEFAULT 0,
CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
CONSTRAINT "urunlerUnique" UNIQUE("kodu", "adi"),
CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
);
Copy ALTER TABLE "Urunler" DROP CONSTRAINT "urunlerUnique";
Copy ALTER TABLE "Urunler" ADD CONSTRAINT "urunlerUnique" UNIQUE ("kodu", "adi");
Copy INSERT INTO "Urunler"
("kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
VALUES
('ELO004', 'TV', 1300, '2016-10-24', 5);
Copy INSERT INTO "Urunler"
("kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
VALUES
('ELO005', 'Bilgisayar', 1500, '2019-10-20', 5);
CHECK
Tanımlandığı alandaki değer aralığını sınırlamada kullanılır.
Copy CREATE TABLE "Urunler" (
"urunNo" SERIAL,
"kodu" CHAR(6) NOT NULL,
"adi" VARCHAR(40) NOT NULL,
"uretimTarihi" DATE DEFAULT '2019-01-01',
"birimFiyati" MONEY,
"miktari" SMALLINT DEFAULT 0,
CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
);
Copy ALTER TABLE "Urunler" DROP CONSTRAINT "urunlerCheck";
Copy ALTER TABLE "Urunler" ADD CONSTRAINT "urunlerCheck" CHECK ("miktari" >= 0);
Copy INSERT INTO "Urunler"
("kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
VALUES
('ELO004', 'Bilgisayar', 1300, '2016-04-05', -3);
Birincil Anahtar (PRIMARY KEY)
Copy CREATE TABLE "Urunler" (
"urunNo" SERIAL,
"kodu" CHAR(6) NOT NULL,
"adi" VARCHAR(40) NOT NULL,
"uretimTarihi" DATE DEFAULT '2019-01-01',
"birimFiyati" MONEY,
"miktari" SMALLINT DEFAULT 0,
CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo")
);
Copy ALTER TABLE "Urunler" DROP CONSTRAINT "urunlerPK";
Copy ALTER TABLE "Urunler" ADD CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo");
İki alanlı birincil anahtar örneği.
Copy CREATE TABLE "Urunler1" (
"urunNo" SERIAL,
"kodu" CHAR(6) NOT NULL,
"adi" VARCHAR(40) NOT NULL,
"uretimTarihi" DATE DEFAULT '2019-01-01',
"birimFiyati" MONEY,
"miktari" SMALLINT DEFAULT 0,
CONSTRAINT "urunlerPK1" PRIMARY KEY("urunNo", "kodu")
);
Copy ALTER TABLE "Urunler1" DROP CONSTRAINT "urunlerPK1";
Copy ALTER TABLE "Urunler1" ADD CONSTRAINT "urunlerPK1" PRIMARY KEY("urunNo", "kodu");
Yabancı Anahtar (FOREIGN KEY)
Copy CREATE TABLE "UrunSinifi" (
"sinifNo" SERIAL,
"adi" VARCHAR(30) NOT NULL,
CONSTRAINT "urunSinifiPK" PRIMARY KEY("sinifNo")
);
Copy CREATE SEQUENCE "sayac";
Copy CREATE TABLE "Urunler" (
"urunNo" INTEGER DEFAULT NEXTVAL('sayac'),
"kodu" CHAR(6) NOT NULL,
"adi" VARCHAR(40) NOT NULL,
"sinifi" INTEGER NOT NULL,
"uretimTarihi" DATE DEFAULT '2019-01-01',
"birimFiyati" MONEY,
"miktari" SMALLINT DEFAULT 0,
CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0),
CONSTRAINT "urunSinifiFK1" FOREIGN KEY("sinifi") REFERENCES "UrunSinifi"("sinifNo")
);
Bu ifade yukarıdaki ile aynıdır. ON DELETE ve ON UPDATE durumunda ne yapılacağı belirtilmediğinde varsayılan olarak NO ACTION olur.
Copy CREATE TABLE "Urunler" (
"urunNo" SERIAL,
"kodu" CHAR(6) NOT NULL,
"adi" VARCHAR(40) NOT NULL,
"urunTipi" INTEGER NOT NULL,
"uretimTarihi" DATE DEFAULT '2019-01-01',
"birimFiyati" MONEY,
"miktari" SMALLINT DEFAULT 0,
CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0),
CONSTRAINT "urunlerFK" FOREIGN KEY("urunTipi") REFERENCES "UrunTipleri"("tipNo") ON DELETE NO ACTION ON UPDATE NO ACTION
);
Üç davranış şekli vardır: NO ACTION (varsayılan), RESTRICT, CASCADE
Copy ALTER TABLE "Urunler" DROP CONSTRAINT "urunlerFK";
Copy ALTER TABLE "Urunler"
ADD CONSTRAINT "urunlerFK" FOREIGN KEY("urunTipi")
REFERENCES "UrunTipleri"("tipNo")
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Copy ALTER TABLE "Urunler"
ADD CONSTRAINT "urunlerFK" FOREIGN KEY("urunTipi")
REFERENCES "UrunTipleri"("tipNo")
ON DELETE RESTRICT
ON UPDATE RESTRICT;
Copy ALTER TABLE "Urunler"
ADD CONSTRAINT "urunlerFK" FOREIGN KEY("urunTipi")
REFERENCES "UrunTipleri"("tipNo")
ON DELETE CASCADE
ON UPDATE CASCADE;