Oracle Database — SQL Temelleri 10 — Veri Tanımlama Dili (DDL)

Merhabalar,

Veri Tanımlama Dili (DDL) yani Data Definition Language, veritabanı veya tablo oluşturmayı, silmeyi ve üzerinde değişiklik yapmaya sağlayan ifadelerdir.

Üç temel komuttan oluşur:

  • CREATE
  • ALTER
  • DROP

Nasıl kullanıldığını örneklerle öğrenelim.

CREATE

Veritabanındaki nesneleri oluşturmak için kullanılır.

Veritabanı nesneleri nelerdir?

oracle-sql-10-1

Bu yazıda sadece tablolar üzerinde duracağım. İlerleyen derste diğer nesneleride detaylı olarak örneklendireceğim.

Tablo Oluşturmak

Tablo: İçinde veri tutan objeledir.

İsimlendirme Kuralları

  • Karakterler ile başlamalısınız.
  • 30 karakteri geçmemelisiniz.
  • A–Z, a–z, 0–9, _, $, ve # kullanabilirsiniz.
  • Bir isimlendirmeyi sadece bir yerde kullanabiliriz. Employees diye tablo varsa employees diye view oluşturamayız.
  • Oracle’ın kendine ayırdığı reserved’ları kullanamayız. Mesela ‘Select’ diye bir tablo ismi yapamayız.
  • İsimlendirme de büyük küçük harf farketmez. Oracle bütün karakterleri büyük harfe çevirerek saklar. Eğer küçük büyük harf duyarlı olmasını istersek isimlendirmeyi tırnak(“ “) içerisin de yapmalıyız.

Syntax:

CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
);

Örnek:

CREATE TABLE ISIMLER (
ISIM_ID NUMBER,
ADI VARCHAR2(20),
SOYADI VARCHAR2(20)
);

İsimler adında bir tablo yarattık. Yarattığım tablo isim_id, adı ve soyadı sütunlarından oluşuyor. Şimdi oluşturduğumuz tabloya veri ekleyelim.

INSERT INTO ISIMLER (ISIM_ID,ADI,SOYADI) VALUES (1,'GOKHAN', 'YAVAS');
oracle-sql-10-1

Oluşturduğumuz tablonun bilgisini almak için DESCRIBE komutunu kullanırız.

DESCRIBE ISIMLER;
oracle-sql-10-2

Kısa ve basit bir şekilde nasıl tablo oluşturulacağını gördükten sonra şimdi data tiplerini inceleyelim.

[vc_tta_pageable no_fill_content_area=”1" autoplay=”4" active_section=”1" pagination_color=”blue” title=”Data Tipleri”][vc_tta_section title=”Karakter Veri Tipleri” tab_id=”1471414105602-e8c81a15-a522"][vc_column_text]CHAR : Sabit uzunluklu karakter setlerini saklamak için kullanılır . Girilen her karakter için 1 byte yer tutar. Yalnız şu duruma dikkat etmeliyiz . Tanımlanan karakter uzunluğundan daha kısa bir veri saklamaya çalışırsak , kaydetmek istediğimiz verinin sonuna boşluk ekler .

Örnek olarak veritabanında char(10) şeklinde bir tanımlama yaptık . “Ali” içeriğini kaydetmek istediğimizde bu veriyi sonunu 10 a tamamlayacak şekilde veritabanına kaydeder . Veritabanındaki son hali “Ali “ olur .Maksimum uzunluğu 8000 karakterdir . Her karakter için bir byte yer ayırır

VARCHAR: Karakter türünden veri tiplerini saklar . Maksimum uzunluğu 8000 karakterdir . Char veri tipinden farkı ise kaydetmek istediğimiz veri tipinin sonuna boşluk eklememesidir .Maksimum uzunluğu 8000 karakterdir . Her karakter için bir byte yer ayırır

VARCHAR(MAX) : 2 GB kadar olan karakter setlerini tutar . 

NCHAR :
Char veri tipine çok benzerdir tek farkı karakter setini unicode olarak tutar . Bu nedenle her karakter veri tabanında 2 byte yer kaplar . Bu nedenle max 4000 karakter tanımlanabilir

NVARCHAR: Varchar veri tipine çok benzerdir tek farkı karakter setini unicode olarak tutar . Bu nedenle her karakter veri tabanında 2 byte yer kaplar . Bu nedenle max 4000 karakter tanımlanabilir.
VARCHAR2 : Varchar veri tipinin yeni versiyonudur . Oracle artık Varchar2 kullanmamızı önerir . Tek farkı ise Varchar null değerlerde boşluk kaydeder . (space) . Varchar2 ise null değerlerde hiçbirşey insert etmez .

NVARCHAR2 : VARCHAR2 veri tipinden tek farkı her karakter 2 byte yer kaplar.

DATE : Tarih ve zaman bilgilerini tutmak için bu veri tipi kullanılır .[/vc_column_text][/vc_tta_section][vc_tta_section title=”Tam Sayı Veri Türleri” tab_id=”1471414105808–544079be-1989"][vc_column_text]BIT : Veritabanında fiziksel olarak 1 bayt veri saklar. 1 yada 0 değerini alır .

TINYINT : Veritabanında 1 byte yer kaplar . 0–255 arası değer alır

SMALLINT : Veritabanında 2 byte yer kaplar . -32768 ve 32767 arasında veri saklar

INT : 4 byte bir yer kaplar

BIGINT : 8 byte bir yer kaplar

INTEGER : ANSI standartlarından dolayı Oracle ın kabul etmiş olduğu veri tipidir. NUMBER(38) veri tipine karşılık gelir . [/vc_column_text][/vc_tta_section][vc_tta_section title=” Ondalıklı Sayıların Veri Türleri” tab_id=”1471414259126–291cffac-f718"][vc_column_text]DECIMAL : Ondalıklı sayıları tutar. Scale den uzun bir veri geldiği durumda ondalıklı sayıları truncate eder

NUMBER : Ondalıklı sayıları tutar. Scale den uzun bir veri geldiği durumda round(yuvarlar) eder

Alttaki tabloda Number tanımlarına göre kaydedilen gerçek veriler listelenmiştir

Input DataSpecified AsStored As

7,456,123.89

NUMBER

7456123.89

7,456,123.89

NUMBER(*,1)

7456123.9

7,456,123.89

NUMBER(9)

7456124

7,456,123.89

NUMBER(9,2)

7456123.89

7,456,123.89

NUMBER(9,1)

7456123.9

7,456,123.89

NUMBER(6)

(not accepted, exceeds precision)

7,456,123.89

NUMBER(7,-2)

7456100

[/vc_column_text][/vc_tta_section][vc_tta_section title=” Tarih Veri Tipleri” tab_id=”1471414301226–3d2407f8-f336"][vc_column_text]DATE : Veri tipinde zaman bilgilerini tutmak için kullanılır .

DD.MM.YYYY HH:MM:SS şeklinde tutulur . 30.09.2013 09:00:00[/vc_column_text][/vc_tta_section][vc_tta_section title=”LOB(Large Object) Veri Tipleri” tab_id=”1471414397713–7c17015a-d682"][vc_column_text]Büyük nesne veri tiplerinin amacı boyutu büyük olan verileri saklamaktır . (örneğin metin, grafik görüntüleri, video klipleri, ses vs. gibi )

LONG , RAW , LONG RAW :
Bu veri tipleri günümüzde pek kullanılmaz . Asıl amacı eskiye yönelik desteği sağlamak . Bu tiplerin yerine BLOP , LOB , BFILE gibi veri tipleri kullanılır .

BLOB : Verileri binary olarak saklar. Max 128 TB a kadar veri saklar . Resim , video gibi dosyalar bu veri tipinde saklanabilir .

CLOB : Verileri karakter olarak saklar . Max 128 TB a kadar veri saklar . TXT dosyalarının içerisindeki verileri CLOB veri tipinde saklayabiliriz

BFILE : İşletim sistemindeki fiziksel dosyaların referansını saklamak için kullanılır .

NCLOP : Multi byte veri tipini saklar .

ROWID
ROWID : Veritabanında ilgili satırın adresini tutar . ROWID tanımladıktan sonra ilgili satırın ROWID değerinin değişmemesi lazım . Hızlı erişimlerde kullanışlıdır

UROWID : ROWID ile yapısı aynıdır . Fakat ROWID geçmişe yönelik destek amacıyla kullanılmaktadır . Oracle yeni versiyon olarak UROWID kullanır .[/vc_column_text][/vc_tta_section][vc_tta_section title=”Diğer Veri Tipleri “ tab_id=”1471414439168–8ad0a1dd-8aed”][vc_column_text]BINARY_DOUBLE : Ondalıklı sayı değeri binary(1–0) olarak tutulur . Bu sayede ondalıklı sayılar üzerindeki işlemlerde yuvarlama , kırpma gibi durumlar olmaz

BINARY_FLOAT :
Ondalıklı sayı değeri binary(1–0) olarak tutulur . Bu sayede ondalıklı sayılar üzerindeki işlemlerde yuvarlama , kırpma gibi durumlar olmaz

URITYPE : Bir URL adresinin bilgisi kaydedilir .

CHAR_VARYING : VARCHAR veri tipiyle aynıdır

CHARACTER_VARYING : VARCHAR veri tipiyle aynıdır

DOUBLE_PRECISION : NUMBER veri tipiyle aynıdır.

NATIONAL_CHAR : NCHAR tipiyle aynıdır .

REAL : FLOAT veri tipine karşılık gelir[/vc_column_text][/vc_tta_section][vc_tta_section title=”National Karakter Veri Tipleri “ tab_id=”1471414472442-eabd74df-b839"][vc_column_text]Oracle veritabanında karakter setlerini national olarak kaydedersek her bir katakter 1 byte yerine 2 byte yer kaplar . Bunun aslı nedeni ise UTF-16 veri formatına göre kaydetmektir . Yani ANSI standartlarında desteklenmeyen karakterler UTF-16 standartlarında olduğu için bu şekilde kaydedilir .

Kaynak: http://serkansakinmaz.blogspot.com.tr/2013/10/oracle-sql-veri-tipleri.html[/vc_column_text][/vc_tta_section][/vc_tta_pageable][vc_column][vc_column_text]

ALTER TABLE

Tabloların değiştirilmesi için ALTER TABLE komutu kullanılır. Tablolar üzerinde yapılabilecek değişikler şuanlardır.

  1. Yeni bir sütun ekleme.
  2. Sütun tanımı ve sütun değerinin değiştirilmesi.
  3. Var olan bir sütunun 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:

ALTER TABLE ISIMLER ADD (EKLEME_TARIHI DATE DEFAULT sysdate, EMAIL VARCHAR(20));

Tabloaya sütun ekleme yukarıdaki sorgu ile yapılır. Çoklu sütun ekleme işlemleri parantez içinde virgülle ayrılarak belirtilir.

oracle-sql-10-3

Tablodaki Sütun Değerini Güncelleme

Bir önceki örnek üzerinden gidelim. Kayıt eklenme tarihini sysdate olarak belirlemiştik bunu sistem saati olarak güncellenmemiz gerektiğinde sorgumuz aşağıdaki şekilde olmalı.

ALTER TABLE ISIMLER MODIFY EKLEME_TARIHI DATE DEFAULT CURRENT_TIMESTAMP;

[dt_tooltip title=”UYARI”]MODIFIY cümlesinde yer alan DEFAULT değer yeni eklenen kayıtları etkiler. Önceden eklenmiş NULL değerler etkilenmez.[/dt_tooltip]

Sütunların Silinmesi

Tablodaki bir sütunu silmek istersek kullanırız. Örneği inceleyelim.

ALTER TABLE ISIMLER DROP COLUMN EMAIL ;

Bir önceki sorguda tabloya eklediğimiz email sütununu sildik. Tek sütunlu işlemler bu şekilde.. Birden fazla sütun ile ilgili işlemlerimizde parantez kullanıyoruz. Örnek için diğer sorgulara bakınız.

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

Bazen bir sütunu kaldırmak yerine kullanım dışı bırakmamız gerekebilir böyle bir durumda örnekteki gibi sorgu yazarız.

ALTER TABLE ISIMLER SET UNUSED COLUMN  EKLEME_TARIHI;

Ekleme tarihi sütununu kullanım dışı bıraktık.

oracle-sql-10-4

Kullanım dışı bırakılan sütunları düşürmek istersek aşağıdaki şekilde SQL cümlesi kullanırız.

ALTER TABLE ISIMLER DROP UNUSED COLUMNS ;

DROP TABLE

Var olan bir tabloyu silmek için kullanılır.

Syntax:

DROP TABLE table_name;

Aşağıdaki sorgu ile ISIMLER Tablosunu sileriz.

DROP TABLE ISIMLER;

Bir tabloyu sildiğimizde:

  1. Tablo tanımı ve 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.

Tablo Adının Değiştirilmesi

Tablonun adını değiştirmek istersek gerekli söz dizimi:

RENAME TABLE table-Name TO new-Table-Name

Örnek:

RENAME TABLE ISIMLER TO KULLANICILAR;

Tablo adı değiştiği zaman oracle tabloya ait bütün yetki vb. şeyleri otomatik olarak aktarır. Başka bir yazıda görüşmek üzere :)