Merhaba arkadaşlar bu yazımda DDL(Data Definition Language-Veri Tanımlama Dili) ‘e ait SQL komutlarını inceleyecegiz ama bu konu çok geniş oldugundan(table,index,view,sequence,synonym vs.) ben burada sadece tablolar üzerinde örnekler yapacagım.

Tablo(table)

Tablo ilişkisel veritabanların da verileri saklamak için kullanılan sütunlar ve satırlardan oluşan iki boyutlu bir yapıdır.

  1. Her tablonun kendisine ait özel bir ismi vardır.
  2. Bir tablo için kullanılan bir isim aynı şema(schema) içerisin de başka bir tabloya daha verilemez.
  3. Tabloda yer alan sütunların veritipi,büyüklük vs. gibi özellikleri vardır.
  4. Aynı tablo içerisinde de aynı sütun ismi birden fazla sütüna verilemez.

NOT : Bir tablonun bilgilerini görmek için USER_TABLES,ALL_TABLES,USER_TAB_COLUMNS, ALL_TAB_COLUMNS views(görüntüleri) kullanılabilir.

  • Aşagıda ki SQL cümlesiyle bulundugumuz kullanıcıda ki tabloların bilgilerini verir.
SELECT * FROM user_tables;

TABLO OLUŞTURMAK(Create Table)

Tablo oluşturmak için gerekli SQL cümlesi için Söz dizimi ;

CREATE TABLE [.]   (sütun1 veritipi  [DEFAULT ifade] [,….] ,…..);

  • Aşagıda ki SQL cümlesiyle deneme adında tablo oluşturur ve no,adi,dogum_tarihi adlı sütunlar ekler.
CREATE TABLE deneme (no NUMBER,adi VARCHAR2(20),dogum_tarihi DATE);

CREATE TABLE’den sonra gelen isim tablo adıdır,sütun isimleri ise parantez içindedir.Tablo ve sütun isimleri her bir tabloyu veya her bir sütunu belirlemek için kullanılır.Tablo ve sütun isimlerini olabildigince ne ile ilgili oldugunu tanımlayıcı olması kullanım açısından avantıjlıdır.Tablo ve sütun isimlendirme kuralları aşagıda ki gibidir.

  1. Tablo ve sütun isimleri en az 1 en fazla 30 karakter olabilir.
  2. Her bir tablo ve sütun isimleri harf ile başlamalıdır ve isim içerisin de sayı kullanılabilir.
  3. Tablo ve sütun isimlerinin içinde ( $ , # , _ )  kullanılabilir.
  4. İsimlendirme de büyük küçük harf farketmez.Oracle bütün karakterleri büyük harfe çevirerek saklar.Eger küçük büyük harf duyarlı olmasını istersek isimlendirmeyi tırnak(“)  içerisin de yapmalıyız.

Bir tablo oluştururken tablo ismi ve sütun isimlerinin dışında aşagıdakileride belirtebiliriz.

  1. Sütunlar için varsayılan degerler belirtilebilir.
  2. Tablo veya sütunlar kısıtlar için belirtilebilir.
  3. Tablonun tipi belirtilebilir(Heap Organized,İndex Organized,Partitioned,Clustured,Hash Clustured,Nested)
  4. Tablonun yer alacagı tablespace belirtilebilir.

NOT : Tabloları oluştururken sütunlar için varsayılan degerler beliritlebilir.Eger tabloya bir kayıt eklerken varsayılan deger belirtilmiş sütun için deger girilmez ise o durumda varsayılan o sütunun degeri olarak kabul edilir.Varsayılan degeri belirtmek için DEFAULT kelimesi kullanılır.

  1. Varsayılan deger için de SYSDATE ,USER,USERNV ve UID kullanılabilir.
  2. Varsayılan deger başka bir sütuna referans verilemez.(LEVEL,NEXTVAL,CURRVAL,ROWNUM ya da PRIOR)
  • Aşagıda ki SQL cümlesiyle deneme_varsayilan_deger adında tablo oluşturur ve no,adi,kayıt_yapan adlı sütunlar ekler,tabloya veri girişi yapılırken kayıt_yapan adlı sütuna veri girişi yapılmazsa otomatik olarak Mustafa verisini ekler.
CREATE TABLE deneme_varsayilan_deger (
no NUMBER,
adi VARCHAR2(20),
kayit_yapan VARCHAR2(20) DEFAULT 'Mustafa');
  • Aşagıda ki SQL cümlesiyle deneme_varsayilan_deger tablosuna veri eklerken kayıt_yapan sütununa veri girilmedigi için Mustafa verisi otomatikman eklenir.
INSERT INTO deneme_varsayilan_deger(no,adı)
VALUES(1,'Bektas');
  • Aşagıda ki SQL cümlesiyle deneme_varsayilan_deger tablosunu sorguladıgımız da Mustafa verisinin eklendigini görürüz.
SELECT * FROM deneme_varsayilan_deger;
NO ADI KAYIT_YAPAN
1 Bektas Mustafa
  • Aşagıda ki SQL cümlesiyle deneme_varsayilan_deger1 adında tablo oluşturur ve no,adi,kayıt_tarihi adlı sütunlar ekler,tabloya veri girişi yapılırken kayıt_tarihi adlı sütuna veri girişi yapılmazsa otomatik olarak sysdate fonksiyonu ile sistem saatini ekler.
CREATE TABLE deneme_varsayilan_deger1 (
no NUMBER,
adi VARCHAR2(20),
kayit_tarihi DATE DEFAULT sysdate);
  • Aşagıda ki SQL cümlesiyle deneme_varsayilan_deger1 tablosuna veri eklerken kayıt_tarihi sütununa veri girilmedigi için sysdate fonksiyonu ile sistem saati otomatikman eklenir.
INSERT INTO deneme_varsayilan_deger1(no,adı)
VALUES(1,'Mustafa');
  • Aşagıda ki SQL cümlesiyle deneme_varsayilan_deger1 tablosunu sorguladıgımız da sistem saatinin verisinin eklendigini görürüz.
SELECT * FROM deneme_varsayilan_deger1;
NO ADI KAYIT_TARIHI
1 Mustafa 28/10/2012

NOT : Tablo ya da sütunlara bilgi vermek amacıyla yorum eklemek mümkündür.Yorum eklemek için COMMENT kelimesi kullanılır.

Tabloya yorum eklemek için.Söz dizimi ;

COMMENT ON TABLE  <tablo_adi> IS  <yorum> ;

Sütuna yorum eklemek için.Söz dizimi ;

COMMENT ON COLUMN <tablo_adı>. <sütun_adı>  IS  <yorum> ;

  • Aşagıda ki SQL cümlesiyle deneme tablosuna yorum ekledik.
COMMENT ON TABLE deneme IS 'Deneme Tablomuza Yorum Ekledik';
  • Aşagıda ki SQL cümlesiyle deneme tablosunda no sütununa yorum ekledik.
COMMENT ON COLUMN
deneme.no IS 'Deneme Tablomuzun no Sütununa Yorum Ekledik';

NOT : Bir tabloda en fazla 1000 sütun olabilir.

NOT : Bir tabloda ki sütunları ve bunların veritiplerini görmek için DESCRIBE komutunu kullanabiliriz.

DESCRIBE deneme;

Geçici Tablo Oluşturma

Tablo oluştururken tablo tipini belirten herhangi bir ifade kullanılmaz ise Oracle kalıcı bir tablo oluşturur.Eger tablo oluştururken GLOBAL TEMPORARY ifadesi kullanılır ise Oracle bu durumda geçici bir tablo oluşturur.

Geçici tablo bütün oturumlar tarafından görülebilir,normal tablodan farkı geçici tabloya bir oturum tarafından eklenen kayıtlar sadece o oturum tarafından görülebilir.

Geçici tablo oluştururken ilgili oturumlarda tabloya eklenen kayıtların durumu ile ilgili olarak ON COMMIT DELETE ROWS veya ON COMMIT PRESERVE ROWS kullanılabilir.Hiç bir şey kullanılmaz ise ON COMMIT DELETE ROWS varsayılan değerdir.

ON COMMIT DELETE ROWS : Kayıtlar herhangi bir COMMIT işlemi sonucunda silinir.

ON COMMIT PRESERVE ROWS : Kayıtlar oturum boyunca varlığını devam ettirir.

  • Aşagıda ki SQL sorgusuyla deneme_gecici_tablo adında geçici bir tablo oluştururuz ve kayıtlar da kullanıcı COMMIT yapınca silinir.
CREATE GLOBAL TEMPORARY TABLE deneme_gecici_tablo(
no NUMBER,
adi VARCHAR2(20))
ON COMMIT DELETE ROWS ;

Alt Sorgu(Sub Query) Kullanarak Tablo Oluşturma

Altsorgu ile tablo oluşturma işleminde Oracle önce tabloyu oluşturur daha sonra ise ilgili altsorgu sonucunda dönen kayıtları tabloya ekler.Söz dizimi ;

CREATE TABLE [ <şema> .] <tablo_adı>  [ ( sütun1  [DEFAULT  ifade] [ ,…]  ) ]  AS  <altsorgu>;

Altsorgu kullanılarak tablo oluşturulmak istenildigin de dikkat edilmesi gerekenler ;

  1. Tablo belirtilen sütun isimleri ile oluşturulur ve altsorgudan dönen kayıtlar tabloya eklenir.
  2. Sütun tanımın da sadece sütun ismi ve varsayılan deger yer alabilir.Sütun very tipi kullanılmaz.
  3. Eger sütun tanımlaması yapılırsa belirtilen sütun sayısı altsorguda ki sütun sayısına eşit olmalıdır.
  4. Eger sütun tanımlaması yapılmaz ise sütun isimleri altsorguda yer alan isimlerdir.
  5. Bütünlük kısıtları yeni tabloya aktarılmazioluşturulan tabloya sadece NOT NULL kısıtı aktarılır.Diger kısıtlar ve varsayılan degerler aktarılmaz.
  • Aşagıda ki SQL cümlesiyle deneme_copy_departments adlı tablo oluşturur,bolum_id,bolum_adi,yonetici_id,bolge_id sütunları ekler ve altsorgu ile departments tablosunda ki verileri tabloya kaydeder.
CREATE TABLE deneme_copy_departments (
bolum_id,bolum_adi,yonetici_id,bolge_id) AS SELECT * FROM departments;
  • Aşagıda ki SQL cümlesiyle deneme_copy_departments1 adlı tablo oluşturur ve altsorgu ile departments tablosunda ki sütunları ve verileri ekler.
CREATE TABLE deneme_copy_departments1 AS SELECT * FROM departments;
  • Aşagıda ki SQL cümlesiyle deneme_copy_departments2 adlı tablo oluşturur ve altsorgu ile departments tablosunda ki sütunları ve verileri ekler ama department_id sütunu 100 den aşagı olan verileri ekler.
CREATE TABLE deneme_copy_departments2
AS SELECT * FROM departments WHERE department_id < 100 ;

TABLO GÜNCELLEŞTİRMEK(Alter Table)

Tabloların değiştirilmesi için ALTER TABLE kelimeleri kullanılır.Tablolar üzerin de yapılabilecek değişiklikler şunlardır ;

  1. Yeni bir sütun eklenmesi
  2. Sütun tanımının ve sütununun varsayılan değerinin değiştirilmesi
  3. Var olan bir sütunun düşürülmesi(silinmesi)
  4. Tablo tanımının değiştirilmesi
  5. Tablo kısıtlarının değiştirilmesi,yeni kısıtların eklenmesi ya da var olan kısıtların düşürülmesi.

Tabloya Sütun Ekleme

Varolan bir tabloya sütun eklemek için aşağıda ki söz dizimini kullanırız ;

ALTER TABLE [ <şema> . ]  < tablo_adı >  ADD  <sütün_tanımı> ;

  • Aşagıda ki SQL cümlesiyle deneme tablosuna soyadi sütunu ekler.
ALTER TABLE deneme ADD soyadi VARCHAR2(20);

Tabloya yeni bir sütun eklendigi zaman daima tablonun en sonuna eklenir.Yeni sütun eklendigi zaman tabloda var olan once ki kayıtların bu sütuna ait degerleri NULL olur.

Eger yeni eklenen sütun için varsayılan deger belirtilmiş ise tabloda yer alan tüm kayıtlara otomatik olarak varsayılan deger atanır.

Eger tabloya birden fazla sütun eklenecek ise sütun tanımları parantez içinde verilmeli ve virgülle birbirinden ayrılmalıdır.

  • Aşagıda ki SQL cümlesiyle deneme tablosuna kayit_tarihi sütunu oluşturur ve varsayılan olarak da sistem satini ekler,bir de deneme tablosuna adres sütunu ekler.
ALTER TABLE deneme ADD
(kayit_tarihi DATE DEFAULT sysdate , adres VARCHAR2(50));

NOT : Tabloya yeni bir sütun eklerken eger tabloda daha önceden kayıt var ise NOT NULL kısıtı belirtilemez.NOT NULL kısıtı belirtmek için aşağıdaki aşamalar takip edilmelidir.

1)      Tabloya yeni sütun NOT NULL kısıtı olmadan eklenmelidir.

2)      Yeni eklenen sütuna  verileri ekleyerek güncelleştirilmelidir.

3)      Sütuna NOT NULL kısııtı eklenmelidir.

Ama tabloya yeni sütunu varsayılan değerle eklemek istersek o zaman NOT NULL kısıtını en başta ekleyebiliriz.

Sütunların Degiştirilmesi

Tabloda var olan bir sütunu değiştirmek için kullanılan söz dizimi ;

ALTER TABLE [ <şema> .] <tablo_adı> MODIFY  <sütun_adı> <sütunun_yeni_özellikleri> ;

Yukarıda ki sözdizimin de <sütunun_yeni_özellikleri> kısmına  veritipi,varsayılan deger veya sütun kısıtları eklenebilir.

Eger birden fazla sütunun özellikleri degiştirilecek ise bunları parantez içinde virgule yazmak gerekir.

  • Aşagıda ki SQL cümlesiyle deneme tablosundaki kayit_tarihi sütununun veri tipini TIMESTAMP yapar.
ALTER TABLE deneme MODIFY  kayit_tarihi TIMESTAMP ;
  • Aşagıda ki SQL cümlesiyle deneme tablosundaki adi sütununun veri tipini CHAR yaparız ve kayit_tarihi sütununun varsayılan verisini sistem saati yaparız.
ALTER TABLE deneme MODIFY
( adi CHAR(10),kayit_tarihi DATE DEFAULT current_timestamp ) ;

NOT : MODIFY cümlesin de yer alan DEFAULT deger sadece tabloya yeni eklenen kayıtları etkiler.Tablo da önceden yer alan NULL degerleri etkilemez.

NOT : Bir sütuna ait varsayılan degeri kaldırmak için DEFAULT NULL ile yeniden tanımlanmalıdır.

Sütun Düşürülmesi(Silinmesi)

Tablodan bir sütunu düşürmek yani silmek istersek aşagıda ki söz dizimini kullanırız ;

ALTER TABLE [ <şema> .] <tablo_adı>  DROP  { COLUMN  <sütun_adı>  |  ( <sütunların adları> ) }  [CASCADE  CONSTRAINTS] ;

Sadece bir sütun düşürülecekse DROP COLUMN kullanılır.Eger birden fazla sütun düşürülecek ise DROP ifadesinden sonra parantez için de virgule ayrılmış biçim de sütun adları verilmelidir.

  • Aşagıda ki SQL cümlesiyle deneme tablosundan soyadi adlı sütunu düşürüyoruz(siliyoruz).
ALTER TABLE deneme DROP COLUMN  soyadi ;
  • Aşagıda ki SQL cümlesiyle deneme tablosundan kayit_tarihi ve adres adlı sütunları düşürüyoruz.
ALTER TABLE deneme DROP (kayit_tarihi,adres) ;

NOT : Tablodan bir sütun düşürüldügü zaman sütunun yer aldıgı indexler ve kısıtlar da düşürülür.Eger düşürülen sütunda foreign key kısıtı kullanılmış ise CASCADE CONSTRAINTS ifadesi ilave edilir.

  • Aşagıda ki SQL cümlesiyle employees tablosundan foreign_key kısıtı olan employee_id sütununu siliyoruz.
ALTER TABLE employees DROP COLUMN employee_id CASCADE CONSTRAINTS ;

NOT : Eger düşürülecek sütun tablodaki son sütun ise Oracle bu sütunun düşürülmesine izin vermez.Bunun yerine tablonun düşürülmesi gerekir.

Sütunu Kullanım Dışı Bırakmak

Bazen sütunu tablodan hemen düşürmek yerine ilgili sütunu kullanım dışı bırakmak daha uygundur.Kullanım dışı bırakılan bir sütun tablo tanımı içerisin de görülmez.

ALTER TABLE [ <şema> .] <tablo_adı>  SET UNUSED  { COLUMN  <sütun_adı>  |  ( <sütunların adları> ) }  [CASCADE  CONSTRAINTS] ;

  • Aşagıda ki SQL cümlesiyle deneme tablosundan dogum_tarihi sütununu devre dışı bırakıyoruz.
ALTER TABLE deneme SET UNUSED COLUMN  dogum_tarihi ;

Kullanım dışı bırakılan sütunu düşürmek istersek aşagıdaki gibi bir SQL cümlesi yazarız.Düşürme işlemi yaparken eger birden fazla kullanım dışı bırakılmış sütun var ise hepsi birden düşürülür.

  • Aşagıda ki SQL cümlesiyle deneme tablosundan devre dışı bıraktıgımız dogum_tarihi adlı sütunu sileriz.
ALTER TABLE deneme DROP UNUSED COLUMNS ;

NOT : DBA_UNUSED_COL_TABS , ALL_UNUSED_COL_TABS , USER_UNUSED_TAB_COLS  views(görüntüler) kullanım dışı sütunlar hakkında bilgi içerir.

TABLO DÜŞÜRÜLMESİ(Silinmesi)(Drop Table)

Aşagıda var olan bir tabloyu düşürmek  yani silmek için gerekli söz dizimi vardır ;

DROP TABLE [ <> .] <>   [CASCADE CONSTRAINT]

  • Aşagıda ki SQL sorgusuyla deneme tablosunu düşürürüz(sileriz).
DROP TABLE deneme ;

Bir tablo düşürüldüğü zaman ;

  1. Tablo tanımı ve tablo verileri silinir
  2. Tablo ile ilgili indexler,kısıtlar,tetikçiler ve yetkiler de düşürülür
  3. Tabloya referans veren view(görüntüler),prosodür veya fonksiyonlar düşürülmez.Geçersiz olarak işaretlenir.
  4. Eger tabloda primary key veya foreign key kısıtları varsa CASCADE CONSTRAINT ifadesi ilave edilmelidir.

Tablo Adının Degiştirilmesi(Rename ..  TO ..)

Tablonun ismini degistermek istersek kullanmamız gereken söz dizimi aşağıda ki gibidir.

RENAME <eski_ad>  TO  <yeni_ad>

  • Aşagıda ki SQL sorgusuyla deneme tablosunun adını test olarak degiştiririz.
RENEMA deneme  TO  test ;

Tablo adı degiştirildigi zaman  Oracle otomatik olarak kısıtları,indexleri ve yetkileri tabloya aktarır.

NOT : Adı degiştirilen tabloyu kullanan nesneler geçersiz kunuma getirilir.(Prosodür,fonksiyon,view vs.)

NOT  : Örneklerimde Oracleda ki DUAL table ’ ı ve HR user ’ ı kullanıyorum.
Yararlı olması Dilegiyle…
Yazar : Mustafa Bektaş Tepe
Java && Oracle

Loading